TP, scikit-learn - Alexis Lechervy

M1 Informatique UMI2C
Fouille de donn´ees et Apprentissage
TP
Alexis Lechervy
alexis.lechervy@unicaen.fr
17/02/2014
1
Introduction
L’objectif de ce premier TP est de se familiariser avec des outils d’apprentissage statistique. Ce TP
sera r´ealis´e en python 2.7 `
a l’aide de la biblioth`eque scikit-learn. Une documentation compl`ete de cette
biblioth`eque est disponible `
a l’adresse http://scikit-learn.org.
Commencez par t´el´echarger les sources de la biblioth`eque scikit-learn `a l’adresse https://pypi.
python.org/pypi/scikit-learn puis lancez l’installation de la biblioth`eque `a l’aide de la commande
python setup.py install –user
2
La base d’apprentissage
Nous allons utiliser dans ce tp, la base Iris (vous trouverez des informations compl´ementaires sur
cette base `
a l’adresse http://archive.ics.uci.edu/ml/datasets/Iris). C’est une base comportant
trois types d’Iris (Iris Setosa, Iris Versicolour et l’Iris Virginica). Chacune des fleurs est d´ecrite par 4
attributs (la longueur et la largeur du s´epale et du p´etale). L’objectif est d’utiliser les diff´erentes m´ethodes
d’apprentissage vu en cours pour distinguer les trois types d’Iris.
Commencez par charger la base de donn´ee dans votre console python `a l’aide du code suivant :
from m a t p l o t l i b import p y p l o t a s p l t
from s k l e a r n . d a t a s e t s import l o a d i r i s
import numpy a s np
data = l o a d i r i s ( )
f e a t u r e s = data [ ’ data ’ ]
f e a t u r e s n a m e s = data [ ’ f e a t u r e n a m e s ’ ]
t a r g e t = data [ ’ t a r g e t ’ ]
Dans un premier temps nous travaillerons uniquement avec les deux premi`eres dimensions d´ecrivant
nos images (la longueur et la largeur du s´epale). Afficher `a l’´ecran les points de la base d’apprentissage
en fonction uniquement de ces deux dimensions. Vous pouvez utiliser le code suivant :
f o r t , marker , c in z i p ( xrange ( 3 ) , ”>ox ” , ” rgb ” ) :
p l t . s c a t t e r ( f e a t u r e s [ t a r g e t == t , 0 ] ,
f e a t u r e s [ t a r g e t == t , 1 ] ,
marker=marker , c=c )
p l t . show ( )
Que remarquez vous sur la disposition des points de cette base ?
1
3
Les k-plus-proche-voisins (kNN)
Nous allons commencer par classer notre base `a l’aide de la m´ethode kNN. Commencez par r´ecup´erer
la base de donn´ee Iris et prenez uniquement les deux premi`eres dimensions des descripteurs :
import pylab a s p l
from m a t p l o t l i b . c o l o r s import ListedColormap
from s k l e a r n import n e i g h b o r s , d a t a s e t s
import numpy a s np
# i m p o r t some d a t a t o p l a y w i t h
i r i s = datasets . l o a d i r i s ()
X = i r i s . data [ : , : 2 ] # we o n l y t a k e t h e f i r s t two f e a t u r e s . We c o u l d
# a v o i d t h i s u g l y s l i c i n g by u s i n g a two−dim d a t a s e t
y = i r i s . target
R´ealisez ensuite l’apprentissage d’un kNN avec 15 voisins en utilisant le code suivant :
# we c r e a t e an i n s t a n c e o f N e i g h b o u r s C l a s s i f i e r and f i t t h e d a t a .
c l f = n e i g h b o r s . K N e i g h b o r s C l a s s i f i e r ( 1 5 , w e i g h t s= ’ uniform ’ )
c l f . f i t (X, y )
Affichez ensuite le r´esultat du classifieur en d´ecoupant l’espace en trois parties correspondants `
a
chacune des classes :
c m a p l i g h t = ListedColormap ( [ ’#FFAAAA ’ , ’#AAFFAA ’ , ’#AAAAFF ’ ] )
cmap bold = ListedColormap ( [ ’#FF0000 ’ , ’#00FF00 ’ , ’ #0000FF ’ ] )
h = . 0 2 # s t e p s i z e i n t h e mesh
# P l o t t h e d e c i s i o n boundary . For t h a t , we w i l l a s s i g n a c o l o r t o each
# p o i n t i n t h e mesh [ x min , m max ] x [ y min , y max ] .
x min , x max = X [ : , 0 ] . min ( ) − 1 , X [ : , 0 ] . max ( ) + 1
y min , y max = X [ : , 1 ] . min ( ) − 1 , X [ : , 1 ] . max ( ) + 1
xx , yy = np . meshgrid ( np . a r a n g e ( x min , x max , h ) ,
np . a r a n g e ( y min , y max , h ) )
Z = c l f . p r e d i c t ( np . c [ xx . r a v e l ( ) , yy . r a v e l ( ) ] )
# Put t h e r e s u l t i n t o a c o l o r p l o t
Z = Z . r e s h a p e ( xx . shape )
pl . f i g u r e ()
p l . p c o l o r m e s h ( xx , yy , Z , cmap=c m a p l i g h t )
Ajoutez les exemples d’apprentissages a` votre affichage :
# Plot also the training points
p l . s c a t t e r (X [ : , 0 ] , X [ : , 1 ] , c=y , cmap=cmap bold )
p l . xlim ( xx . min ( ) , xx . max ( ) )
p l . ylim ( yy . min ( ) , yy . max ( ) )
p l . show ( )
Vous devez obtenir un affichage similaire `a la figure Fig.3.
Le classifieur kNN de scikit-learn admet plusieurs param`etres notamment le nombre de voisin et le
type de pond´eration de ces derniers. La pond´eration uniforme que vous venez d’utiliser permet de donner
la mˆeme importance `
a chaque voisin dans le vote de la classe de l’exemple. Vous pouvez changer ce poids
en donnant plus d’importance aux exemples les plus proches du point `a tester et moins d’importance aux
exemples plus ´eloign´e. Pour cela changer l’option weights=’uniform’ par weights=’distance’. Essayez
diff´erentes combinaisons de param`etres (changer le type de pond´eration et le nombre de voisin).
2
4
Classifieur bay´
esien
Nous allons changer de type de classifieur. R´ealiser les mˆeme op´eration que pr´ec´edemment avec un
classifieur bay´esien `
a une gaussienne ; Commencez par importer les fonctions n´ecessaire :
from s k l e a r n . n a i v e b a y e s import GaussianNB
Puis r´ealisez l’apprentissage :
c l f = GaussianNB ( )
c l f . f i t (X, y )
Faites en sorte d’obtenir un affichage similaire `a la partie pr´ec´edente.
5
Classifieur SVM
Recommencer les ´etapes pr´ec´edentes avec des SVM. Utilisez les deux impl´ementation possible des
SVM de la libraires (svm.SVC et svm.LinearSVC ). L’une de ces impl´ementation ne fonctionne que dans
le cas lin´eaire. Testez ´egalement plusieurs type de noyaux (polynomial, gaussien...), en vous inspirant des
lignes suivantes :
from s k l e a r n import svm , d a t a s e t s
...
C = 1 . 0 # SVM r e g u l a r i z a t i o n parameter
s v c = svm . SVC( k e r n e l= ’ l i n e a r ’ , C=C ) . f i t (X, Y)
r b f s v c = svm . SVC( k e r n e l= ’ r b f ’ , gamma=0.7 , C=C ) . f i t (X, Y)
p o l y s v c = svm . SVC( k e r n e l= ’ p o l y ’ , d e g r e e =3, C=C ) . f i t (X, Y)
l i n s v c = svm . LinearSVC (C=C ) . f i t (X, Y)
Changez les param`etres des noyaux et regardez comment est modifi´e la s´eparation des classes.
6
Bilan
Vous allez chercher maintenant le meilleur algorithme et les meilleurs param`etres pour r´esoudre notre
probl`eme de classification. Vous utiliserez dor´enavant toutes les dimensions des descripteurs.
Le code suivant permet de calculer le nombre d’erreur de classification du classifieur (ypred est le
vecteur des pr´edictions calcul´e pr´ealablement) :
print ( ”Number o f m i s l a b e l e d p o i n t s : %d” % ( i r i s . t a r g e t != y p r e d ) . sum ( ) )
3
Pourquoi n’est il pas pertinent de calculer l’erreur du classifieur sur l’ensemble d’apprentissage pour
connaitre les performances de l’algorithme d’apprentissage ?
Lisez la page suivante de la doc : http://scikit-learn.org/stable/modules/cross_validation.
html#computing-cross-validated-metrics et ´ecrivez les lignes de codes n´ecessaire pour trouver le
meilleur classifieur et le meilleur jeux de param`etres pour classer ces Iris.
7
Impl´
ementation
R´ecrivez le code de l’algorithme knn et v´erifiez que votre impl´ementation donne des r´esultats similaires
a celle de scikit-learn.
`
4