Université Paul Sabatier 2018-2019, M2 SID

Machine learning - TP1

En tête pour charger les fonctions nécessaires au TP. La fonction generateData vous permet de générer autant d'échantillon que vous voulez du processus suivant:

  • $X$ est uniforme sur $[-1,1]$
  • $Y = \sin(5X) + \epsilon$ où $\epsilon$ est une gaussienne de moyenne $0$ et de variance $1/10$.

On commence avec un échantillon d'entrainement fixé.

In [1]:
%matplotlib inline
from matplotlib import pyplot
import math
import numpy as np
import scipy.misc
import numpy.random as npr
import sklearn as sk
from sklearn import neighbors

def generateData(n,seed=1):
    npr.seed(seed)
    x = npr.rand(n)*2 - 1
    y = np.sin(x*5) + npr.normal(size=n) / np.sqrt(10)
    return(np.array(x).reshape(-1,1),np.array(y).reshape(-1,1))

(xn,yn) = generateData(50,2)
xSeq = np.array(np.linspace(-1,1,100)).reshape(-1,1)
pyplot.plot(xn,yn,'.')
pyplot.plot(xSeq,np.sin(xSeq * 5),'--')
Out[1]:
[<matplotlib.lines.Line2D at 0x7fe3ffbeec10>]

Question 2: implémenter l'estimateur $k$-NN.

L'échantillon d'entrainement est fixé. Dessiner l'estimateur de régression $k$-NN pour $k = 1,5,15$. Regarder la documentation de scikit-learn.

In [2]:
 
Out[2]:
<matplotlib.legend.Legend at 0x7fe3ff8b2a10>

Question 2: risque de l'estimateur knn pour un échantillon fixé.

L'échantillon d'entrainement est fixé. Pour chaque valeur de $k$, vous avez une fonction de décision $f_k$ donnée par l'estimateur $k$-NN. Estimer et dessiner le risque de $f_k$, en fonction de $k$ variant entre 1 et 10. Vous pouvez générer autant d'échantillon que vous voulez. Pour rappel, pour une fonction de décision $f$ donnée, son risque est donnée par: $$\mathbb{E}_{X,Y}\left[(Y-f(X)^2 \right]$$ Quel est la valeur de $k$ assurant le risque le plus faible?

In [3]:
 
Out[3]:
[<matplotlib.lines.Line2D at 0x7fe3ff975cd0>]

Question 3: décomposition biais variance.

Vous savez que $\mathbb{E}[Y|X=x] = \sin(5x)$ et que l'erreur de Bayes est de $1/10$ (pourquoi?).
La taille de l'échantillon d'entrainement est fixée à 50, vous pouvez générer autant d'échantillon que vous voulez. Estimer et dessiner la décomposition biais variance de l'erreur de prediction de l'estimateur $k$-NN en $x = 0.5$ en fonction de $k$ variant entre 1 et 20. Pour rappel, pour un estimateur $\hat{f}_n$ dépendant d'un échantillon $\left\{(X_i, Y_i)\right\}_{i=1}^n$, le biais et la variance sont donnés respectivement par: $$\mathbb{E}_n\left[f^*(0.5) - \hat{f}_n(0.5) \right]^2 \qquad\qquad \text{Var}_n\left[ \hat{f}_n(0.5)\right] $$ où $f^*$ désigne la règle de Bayes et $\mathbb{E}_n$ et $\text{Var}_n$ désignent l'espérance et la variance pour le tirage de l'échantillon. Quelle est la valeur de $k$ assurant le risque le plus faible?

In [4]:
 
Out[4]:
<matplotlib.legend.Legend at 0x7fe3ff74ab50>

Question 4: mêmes questions pour la régression polynomiale.

Répondez aux questions précédentes en remplaçant la régression $k$-NN par une régression polynomiale de degré $d$ variant de $1$ à $10$. Si vous avez des problèmes numériques vous pourrez utiliser les polynomes de Chebychev. Si vous avez fini, vous pourrez mettre en oeuvre les mêmes expériences avec un régression polynomiale de degré 10 et une régularisation (somme des carrés des coefficients, variation totale sur [-1,1]).