Le but de ce premier TD est de vous familiariser avec les réseaux de neurones et leur entraînement. Nous allons passer en revue les éléments de base suivant :
données d'apprentissage,
fonction de perte (loss function)
descente de gradient
Pour cela, nous allons utiliser un réseau de neurone (composé d'un seul neurone en fait) pour deux tâches :
une régression linéaire simple
une régression logistique.
Commençons par importer quelques unes des bibliothèques usuelles :
import numpy as np
import random as rd
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.simplefilter('ignore')
Afin de réaliser une régression linéaire simple, nous allongs générer un nuage de points. Exécutez le code de la cellule suivante :
#Data:
def generate(m, sizeNoise, slope, intersect):
x = [rd.random()*50 + 5 for i in range(m)]
noise = [rd.random() * sizeNoise for i in range(m)]#np.rand(m,1) * sizeNoise
y = [intersect + slope*x[i] + noise[i] for i in range(m)]
return np.array([x]), np.array([y])
m = 100
sizeNoise = 10
a = 0.8
b = 20
X, Y = generate(m, sizeNoise, a, b)
plt.grid()
plt.scatter(X, Y)
Comme vu en cours, un neurone formel est représenté comme suit :
Nommez chacun des élements du neurone.
Ecrivez une fonction neuron(x, w, b, f)
permettant d'implémenter ce neurone
id
et sigmoid
définies par :
$$
id(z) = z \mbox{ et } sigmoid(z) = \frac{1}{1+ e^{-z}}.
$$
x = np.array([[1, 2, 3]])
y = np.array([1, 0, 1])
w = np.array([1])
b = [1]
y_hat = neuron(x, w, b, id)
print('x: ', x)
print('y_hat: ', y_hat)
Dans cet exercice, nous allons entraîner un neurone pour réaliser une régression linéaire simple.
Il suffit de prendre $p=1$ et $f=id$ dans le neurone formel de la figure ci-dessus.
Les paramètres à trouver sont $w$ et $b$. Ils correspondent respectivement à $\beta_1$ et $\beta_0$ dans l'expression de la régression linéaire simple (voir votre cours de ACID).
loss(y, y_hat)
définie comme la moyenne des carrés des écarts :
gradient(x, y_hat, y)
retournant le gradient de la fonction $\cal L$.
train(x, y, nu, epochs)
qui réalise une déscente du gradient de la fonction $\cal L$ afin de trouver les paramètres $w$ et $b$ minimisant la valeur de $\cal L$.
linregress
du sous module stats
du module scipy
.
Dans cet exercice, nous allons transformer le neurone afin de l'utiliser pour réaliser une classification. Nous allons nous limiter à une classification bianire : les élements appartiennent soit à une classe 0 soit à une classe 1.
neuron
pour que le fonction d'activation soit la sigmoid ?
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=1000, n_features=1, n_classes=2,
n_informative=1, n_redundant=0, n_repeated=0,
n_clusters_per_class=1)
X_train, X_test, y_train, y_test = train_test_split(X, y)
print(X_train.shape)
print(y_train.shape)
print(np.unique(y))
train(x, y, nu, epochs)
pour réaliser une déscente du gradient de la fonction $\cal L$ afin de trouver les paramètres $w$ et $b$ minimisant la valeur de $\cal L$.
X_train = np.reshape(X_train, (X_train.shape[1], X_train.shape[0]))
print(X_train.shape)
print(y_train.shape)
8.1. Exécutez la cellule suivante pour formater les données de test.
X_test = np.reshape(X_test, (X_test.shape[1], X_test.shape[0]))
8.2. Appliquez votre neurone aux données de test et observez le résultat obtenu.
8.3. Transformez les sorties en 0 et 1 :
8.4. Evaluez la qualité du modèle obtenu