TP ML Supervise
TP ML Supervise
TP ML Supervise
Apprentissage supervisé
Les sources et liens utiles sont sur le site du cours et/ou de l'auteur. Commencez par télécharger des
chiers utiles pour ce TP :
le chier source tp_ML_supervise_source.py
un exemple de scripte d'utilisation tp_ML_supervise_scripte.py
- Découverte de Python -
Consulter les pages suivantes pour démarrer ou bien trouver quelques rappels
??? http://perso.telecom-paristech.fr/~gramfort/liesse_python/1-Intro-Python.html
??? http://perso.telecom-paristech.fr/~gramfort/liesse_python/2-Numpy.html
??? http://perso.telecom-paristech.fr/~gramfort/liesse_python/3-Scipy.html
??? http://scikit-learn.org/stable/index.html
?? http://www.loria.fr/~rougier/teaching/matplotlib/matplotlib.html
?? http://jrjohansson.github.io/
- Classification binaire -
Introduction
Dénitions et notations
On rappelle que dans la cadre de la classication binaire supervisée on utilise les notations :
Y l'ensemble des étiquettes (ou labels en anglais), communément Y = {−1, 1} dans le cas de la
classication binaire,
x = (x1 , . . . , xp ) ∈ X ⊂ Rp est un attribut (ou un feature en anglais),
Dn = {(xi , yi ), i = 1, . . . n} un ensemble d'apprentissage contenant n exemples et leurs étiquettes,
Il existe un modèle probabiliste qui gouverne la génération de nos observations selon des variables
i.i.d
aléatoires X et Y : ∀i ∈ {1, . . . , n}, (xi , yi ) ∼ (X, Y ).
On cherche à construire à partir de l'ensemble d'apprentissage Dn une fonction fˆ : X 7→ {−1, 1}
qui pour un point inconnu ( i.e., qui n'est pas présent dans l'ensemble d'apprentissage) prédit son
étiquette : fˆ(x).
2. Sauvegardez quelques jeux de données an de les utiliser dans la suite : pour chacun, il faudra
sauver dans une variable les données sous forme d'un tableau à deux colonnes, et dans une autre
les labels correspondants à chaque exemple.
page 1
Travaux Pratiques Joseph Salmon
"Un contre un". Dans le cas où l'on cherche à prédire un label pouvant prendre K ≥ 3 modalités, on
2
peut considérer toutes les paires de labels (k, l) possibles, 1≤k<l≤K (il y en a CK ) et ajuster un
classieur Ck,l (X) pour chacune d'entre elles. La prédiction correspond alors au label qui a gagné le plus
de "duels".
"Un contre tous". Pour chaque modalité k, on apprend un classieur permettant de discriminer entre
les populations Y =k et Y 6= k . À partir des estimations des probabilités a posteriori, on aecte le label
estimé le plus probable.
Le nom anglais est Linear Discirmiant Analysis (LDA) et il est utile pour trouver de l'aide pour la
partie numérique.
Aspect théorique
On considère deux populations gaussiennes dans Rp ayant la même structure de covariance. On
observe des points dans le mélange de ces deux populations.
Les lois conditionnelles de X sachant Y = +1 (respectivement Y = −1) sont des gaussiennes multiva-
riéesNp (µ+ , Σ) (respectivement Np (µ− , Σ)). On notera leur densités respectives f+ et f− . Les vecteurs µ+
p
et µ− sont dans R et la matrice Σ est (symétrique) de taille p × p. On note également π+ = P{Y = +1}.
On rappelle que la densité p-dimensionnelle de la loi Np (µ, Σ) est donnée par :
1 1 > −1
f (x) = p exp − (x − µ) Σ (x − µ) .
(2π)p/2 det(Σ) 2
Σ = E (X −E(X))(X −E(X))> ) .
et que la matrice de covariance d'un vecteur aléatoire X est dénie par
1. En utilisant la formule de Bayes donner la formule des probabilités a posteriori : P{Y = +1 | X = x},
P{Y = −1 | X = x}, comme fonctions de f+ , f− et π+ .
2. Exprimer le log-ratio des deux classes :
P{Y = +1 | X = x}
log
P{Y = −1 | X = x}
en fonction de π+ , µ+ , µ− et Σ.
3. On dispose à présent d'un échantillon de ce mélange et on suppose que π+ , µ+ , µ− et Σ sont
des paramètres inconnus. On suppose que l'échantillon considéré contient
Pn n observations notées
(x1 , y1 ), . . . , (xn , yn ) et que i=1 1{yi = +1} = m. En utilisant la méthode des moments utilisée
5. Que se passe-t-il lorsque les matrices de covariance ne sont pas égales ? Quelle forme prend la
frontière ?
page 2
Travaux Pratiques Joseph Salmon
Mise en oeuvre
Il s'agit ici d'appliquer concrètement la méthode ci-dessus sur des observations simulées puis à une
base de données réelles. Dans ce dernier cas, on scindera aléatoirement les données en deux échantillons :
un échantillon d'apprentissage (70% des données environ) à partir duquel les paramètres régissant le score
seront estimés et un échantillon test (les 30% restant) sur lequel on évaluera la performance de la règle
de score précédemment apprise.
Le paquet sklearn met à disposition un grand nombre d'algorithmes usuels de l'apprentissage sta-
tistique. Pour commencer, importez le paquet sklearn.lda qui contient en particulier la classe LDA qui
nous servira d'exemple dans la suite.
Pour utiliser ces algorithmes, il est nécessaire de procéder par étape en Python. Nous allons voir en
détail le processus pour l'analyse discriminante linéaire tout d'abord.
my_lda = LDA()
Vous pouvez paramétrer le modèle lors de sa création (en passant des arguments) ou bien par la
suite directement par l'intermédiaire de la variable.
8. An d'apprendre le modèle sur une matrice de données dataX et de labels dataY, on utilise fit.
my_lda.fit(dataX,dataY)
9. Appliquer l'analyse discriminante linéaire sur les données du mélange de gaussiennes générées par
rand_bi_gauss. Estimer son erreur de prédiction au moyen de l'échantillon test (comparer l'esti-
mation à l'"erreur d'apprentissage"). Tracer la frontière.
10. Appliquer la classication par régression logistique sur les données non gaussiennes rand_clown et
rand_checkers.
Régression logistique
Pour utiliser ces algorithmes, il est nécessaire de procéder par étape en Python. Nous allons voir en
détail le processus pour la régression logistique.
my_log = linear_model.LogisticRegression()
Vous pouvez paramétrer le modèle lors de sa création (en passant des arguments) ou bien par la
suite directement par l'intermédiaire de la variable
2. An d'apprendre le modèle sur une matrice de données dataX et de labels dataY, on utilise fit
my_log.fit(dataX,dataY)
page 3
Travaux Pratiques Joseph Salmon
Le perceptron
Un perceptron est un classieur linéaire binaire qui projette chaque observation x dans R. L'ensemble
des frontières de décision considérées est alors l'ensemble des hyperplans (ane) de Rp dénis pour un
certain vecteur w = (w0 , w1 , · · · , wp ) ∈ Rp+1 par
p
( )
X
Hw = x : fˆw (x) = w0 + wi xi = 0 .
i=1
l'hyperplan Hw . Cela revient à prédire comme étiquette de x la valeur de sign fˆw (x) , où la fonction
L'objectif est de trouver l'hyperplan qui sépare au mieux les données selon leur étiquette. Le vecteur w
est appelé vecteur de poids (et w0 l'ordonnée à l'origine, ou intercept en anglais).
Perceptron simple
Nous supposerons dans cette partie introductive que nos données sont en deux dimensions (p = 2).
Utilisez les données articielles pour illustrer les questions suivantes.
1. A quoi correspond la frontière de décision du perceptron ? Trouvez (à la main) une bonne séparatrice.
Quand est-ce que fˆw (x) est grand ? négatif ? positif ? Quelle signication géométrique ?
2. Codez une fonction predict(x,w) qui à partir d'une matrice x et d'un vecteur poids w renvoie
le vecteur de prédiction fˆw (x). Codez de même une fonction predict_class(x,w) qui renvoie le
vecteur d'étiquettes prédites sign fˆw (x) .
Fonction de coût
An de mesurer l'erreur sur l'ensemble d'un jeu de données Dn il est nécessaire de se xer une fonction
+
`
de perte
h : Y × R →
7 i R qui mesure le coût d'une erreur lors de la prédiction d'un exemple. Le coût
Cw = E `(fˆw (x), y) est l'espérance de la fonction de perte sur l'ensemble des données.
3. Codez ces trois fonctions (en bloc de préférence, de manière à ce que x soit la matrice de données,
et y le vecteur des labels et qu'elles renvoient le vecteur des pertes).
4. Pour un w xé, sur un exemple 2D, comment varient ces fonctions en fonction de fˆw (x) ? Et de x?
Quelle est l'interprétation géométrique ?
5. Comment observer graphiquement l'évolution de ces fonctions selon w pour une base d'exemples
xée en 2D (pensez à l'utilité de w0 ) ? Tracer en 2D (grâce à la fonction fonction frontiere par
exemple) le coût sur une base d'exemple en fonction de w. Où se situe le vecteur
n
!
∗ 1X ˆ
w ∈ arg min `(fw (xi ), yi )
w∈Rp+1 n i=1
page 4
Travaux Pratiques Joseph Salmon
Algorithme 1 : Perceptron
Data : les observations et leurs étiquettes Dn = {(xi , yi ) : 1 ≤ i ≤ n} ; le pas de gradient : ;
le nombre maximal d'itérations : niter ;
Result : w
initialiser (aléatoirement) w; initialiser j=0
while j ≤ niter do
wold ← w
for i = 1 to n do
w ← wold − ∇w `(fˆwold (xi ), yi )
j ←j+1
6. Expérimentez sur diérents jeux de données : utiliser soit les fonctions fournies, soit le paquet
sklearn. On peut aussi utiliser à cet eet la fonction SGD (pour Stochastique Gradient Descent )
dont une description est donnée sur la page : http://scikit-learn.org/stable/modules/sgd.
html
from sklearn.linear_model import SGDClassifier
Étudiez les performances au moins selon les points suivants : nombre d'itérations, le choix de la
fonction de coût, la diculté du problème. Observez vous des comportements étranges ? Quelles
raisons ?
7. Une variante de l'algorithme, dite stochastique (le précédent est communément appelé batch, i.e., lot
ou stock en français), consiste à ne prendre en compte la correction que sur un exemple tiré aléa-
toirement à chaque itération. Modiez le code en conséquence. Étudiez comme précédemment le
comportement de l'algorithme. Quelles conclusions en tirez-vous ? Dans quel cas doit-on utiliser
quelle variante ?
8. Question optionnelle : Étudier numériquement la vitesse de convergence dans le cas suivant : les Xi
sont des points uniformément repartis sur les segments {0} × [0, M ] (alors les yi valent −1) ou bien
sur le segment {δ} × [0, M ] (alors les yi valent −1). De plus la proportion de de 1 est égal à 1/2.
On regardera l'impact de δ, M et n sur le temps de convergence du perceptron.
9. Proposez des variantes sur les conditions d'arrêt de l'algorithme.
11. Trouver un fonction de perte telle que l'algorithme du perceptron soit équivalent à la version suivante
(qui est la version initiale de l'algorithme) :
2. Proposez une méthode pour réussir à classier le jeu de données clown. Peut-on généraliser au
delà ? On pourra utiliser la fonction poly2 du chier source associé au TP, qui plonge les données
bi-dimensionnel dans l'espace des fonction polynomiale de degré 2 en les données. Comment l'utiliser
pour apprendre un perceptron ?
page 5
Travaux Pratiques Joseph Salmon
3. Sur le jeu de données clown, faites quelques expériences en transformant vos données et tracez les
frontières de décision.
page 6
Travaux Pratiques Joseph Salmon
L'algorithme des k-plus proches voisins (k -nn : pour k-neighrest neighbors en anglais) est un algorithme
intuitif, aisément paramétrable et souvent performant pour traiter un problème de classication.
Le principe de l'algorithme est le suivant : pour chaque point x on commence par déterminer les k
plus proches voisins Vk (x) = {x1 , . . . , xk }. La classe associée à x est la classe majoritaire dans Vk (x).
De manière formelle, soit une distance d : Rp × R p 7 → R et une fonction poids α : R+ 7→ R+
décroissante, la décision pour un point x est
X
fˆk (x) ∈ arg max α(d(x, v)) .
y∈{−1,1}
v∈Vk (x) : (v,y)∈Dn
y = −1 y = −1
x x
fˆk (x) = −1 fˆk (x) = −1
y=1 y=1
Figure 1 Exemple des plus proches voisins pour deux valeurs du paramètres
4. Faites varier le nombre de voisins pris en compte. Quels sont les nombres remarquables ?
5. Expérimenter en comparant les frontières de décisions apprises : dans quelles cas la frontière est
complexe ? simple ?
6. Un autre poids très utilisée est un poids gaussien, qui renvoie une valeur proportionelle à e−d . À
quel type de problème répond l'utilisation de poids variable en fonction de la distance ?
7. Quel est le taux d'erreur sur vos données d'apprentissage ? est-ce normal ? Que dire des prédictions
sur de nouveaux exemples ? Quels points sont les plus sujet à erreurs ? Comment évaluer empiri-
quement mais de manière précise l'erreur sur les données articielles ? Qu'en concluez vous pour
des données réelles ?
8. Sur plusieurs jeux de données, sous plusieurs conditions de bruits, tracez les diérentes courbes
d'erreurs. Quel est la meilleure valeur de k? Est-ce toujours la même ?
9. A votre avis, quels sont les avantages et les inconvénients des k -nn : optimalité ? temps de calcul ?
expressivité ? passage à l'échelle ? interprétabilité ?
10. Appliquer la méthode k -nn (version multi-classe) aux données issues de la base zipcode de
scikitlearn avec diérents choix de K ≥ 1. On pourra se référer à http://scikit-learn.org/
stable/_downloads/plot_digits_classification.py pour le chargement et la manipulation de
la base de donnée.
Estimer la matrice de confusion (P{Y = i, CK (X) = j})i, j associée au classieur CK ainsi obtenu.
Proposer une méthode pour choisir K et la mettre en oeuvre.
page 7
Travaux Pratiques Joseph Salmon
On pourra se référer à [2], chapitre 9.2 pour plus de détails sur les arbres. La source la plus détaillée
sur le sujet étant le livre fondateur [1].
Avec scikitlearn on peut construire et élaguer des arbres de régression grâce au package tree.
from sklearn import tree
2. Tester les diérents classieurs obtenus sur de nouvelles données, et estimer leur risque.
3. Mettre en évidence le phénomène d' overtting (ou sur-apprentissage en français) et l'équilibre biais-
variance à trouver.
4. Eectuer le même genre de comparaison sur les données issues de la base zipcode.
page 8
Travaux Pratiques Joseph Salmon
Il est rare de disposer en pratique d'un ensemble de test (on préfère inclure le plus grand nombre de
données dans l'ensemble d'apprentissage). Pour sélectionner un modèle tout en considérant le plus grand
nombre d'exemples possible pour l'apprentissage, on utilise généralement une procédure dite de sélection
par validation croisée. Pour chaque paramétrisation du problème, une estimation de l'erreur empirique
du classieur appris est faîte selon la procédure suivante :
l'ensemble d'apprentissage est partitionné en N ensembles
pour les N combinaisons possibles, un classieur est appris sur N −1 sous-ensembles et testé sur
le dernier sous-ensemble
l'erreur estimée est la moyenne de l'erreur des classieurs appris.
Utiliser par exemple la fonction sklearn.cross_validation.cross_val_score et testez la en faisant
varier le nombre de divisions envisagées. On pourra se servir de cette fonction avec pour choisir le nombre
de voisins à considérer dans les méthodes des k plus proches voisins.
Références
[1] L. Breiman, J. H. Friedman, R. A. Olshen, and C. J. Stone. Classication and regression trees.
Wadsworth Statistics/Probability Series. Wadsworth Advanced Books and Software, Belmont, CA,
1984. 8
[2] T. Hastie, R. Tibshirani, and J. Friedman. The elements of statistical learning. Springer Series in
Statistics. Springer, New York, second edition, 2009. 8
[3] S. Shalev-Shwartz. Online learning and online convex optimization. Foundations and Trends in
Machine Learning, 4(2) :107194, 2011. http://www.cs.huji.ac.il/~shais/papers/OLsurvey.
pdf. 5
page 9