Anda di halaman 1dari 3

ARF ARF 2017fev anne 2016-2017

TME 1 - Arbres de dcision, slection de modles

Lessentiel sur les arbres de dcision

Un arbre de dcision est un modle de classification hirarchique : chaque nu d de


larbre est associ un test sur une des dimensions xi de la forme xi {, >, =}s (s une valeur
relle) qui indique le nud fils qui doit tre slectionn (par exemple pour un arbre binaire,
le fils gauche quand le test est vrai, le fils droit sinon). A chaque feuille de larbre est
associe une tiquette. Ainsi, la classification dun exemple consiste en une succession de
tests sur les valeurs des dimensions de lexemple, selon un chemin dans larbre de la racine
une des feuilles. La feuille atteinte donne la classe prdite.
Lapprentissage de larbre seffectue de manire rcursive top-down : chaque nud, lal-
gorithme choisit le split vertical (seuillage dune variable) qui optimise une mesure dho-
mognit sur la partition obtenue (usuellement lentropie de shanon ou lindex de Gini :
lentropie dune partition est dautant plus petite quune classe prdomine dans chaque
sous- ensemble de la partition, elle est nulle lorsque la sparation est parfaite).
Bien que lalgorithme pourrait continuer rcursivement jusqu nobtenir que des feuilles
contenant un ensemble pur dexemples (dune seule classe), on utilise souvent des critres
darrts (pourquoi ? - nous y reviendrons lors de ce TP). Les plus communs sont le nombre
dexemples minimum que doit contenir un nud pour tre divis et la profondeur maximale
de larbre.
P
1. Coder une fonction entropie(vect) qui calcule lentropie dun vecteur (H(x) = i pi log(pi ),
pi correspond aux probabilits des diffrentes valeurs du vecteur). Pensez utiliser
lobjet Counter du module collections qui permet de faire un histogramme des
lments dune liste.
2. Coder une fonction entropie_cond(vect1,vect2 qui calcule lentropie condition-
nelle de la variable reprsente
P par le premier vecteur par rapport celle reprsente
par le deuxime (H(Y|X) = i pj H(Y|X = i)).
Le code suivant permet de charger la base imdb.
# data : tableau (films,features), id2titles : dictionnaire id -> titre film, fields : id
[data, id2titles, fields]=cPickle.load(file("imdb_extrait.pkl"))
# la derniere colonne est le vote
datax=data[:,:32]
datay=np.array([1 if x[33]>6.5 else -1 for x in data])

Chaque ligne du tableau data correspond la description dun film (le titre dans
id2titles, chaque colonne un attribut (dont la signification est donne par fields).
La plupart sont des genres (action, comdie, ...), la valeur 1 indique lappartenance du
film au genre, 0 sinon. Les dernires colonnes concernent lanne de production, la
dure du film, le budget, le nombre de vote et la note moyenne attribu au film. On
binarise la note moyenne afin davoir deux classes, les films de note suprieure 6.5,
et les autres ( vecteur datay).
3. Calculer pour chaque attribut lentropie et lentropie conditionnelle du vote binaris
par rapport lattribut. Calculez galement la diffrence entre ces 2 valeurs pour
chaque attribut. A quoi correspond une valeur de 0 ? une valeur de 1 pour les attributs
binaires ?
ARF ARF 2017fev page 2

Quelques expriences prliminaires

Tous les modles dapprentissage que nous tudierons seront sur le mme schema : soit
par exemple la classe Classifieur :
cration du classifieur : mon_classifieur=Classifier()
rglage des paramtres, par exemple dans la suite la profondeur maximale : mon_classifieur.max_
= 5
apprentissage du classifieur : mon_classifieur.fit(data,labels), data un ta-
bleau de taille (nombre dexemple, nombre de dimension) et labels un vecteur de
labels
prediction pour de nouveaux exemples : mon_classifieur.predict(data)
score du classifieur (prcision, pourcentage dexemples bien classs) :mon_classifieur.score(dat
Tlcharger larchive sur le site de lUE. Le code suivant permet de crer, dapprendre un
arbre de dcision et de lutiliser :
from decisiontree import
import cPickle
[data, id2titles, fields]=cPickle.load(file("imdb_extrait.pkl"))
datax=data[:,:32]
datay=np.array([1 if x[33]>6.5 else -1 for x in data])
dt = DecisionTree()
dt.max_depth = 5 #on fixe la taille de larbre a 5
dt.fit(datax,datay)
dt.predict(datax[:5,:])
print dt.score(datax,datay)
dt.to_pdf("/tmp/test_tree.pdf",fields) # dessine larbre dans un fichier pdf

1. Sur la base de donnes imdb, apprenez quelques arbres de profondeurs diffrentes.


Visualisez-les. Que remarquez-vous quant au nombre dexemples spars chaque
niveau en fonction de la profondeur ? est-ce normal ?
2. Calculez les scores de bonnes classification. Comment ils voluent en fonction de la
profondeur ? Est-ce normal ?
3. Ces scores sont-ils un indicateur fiable du comportement de lalgorithme ? Comment
obtenir un indicateur plus fiable ?

Sur et sous apprentissage

Pour obtenir une meilleure estimation de lerreur du classifieur appris, il est usuel dutiliser
deux ensembles dexemples tiquets :
lensemble dapprentissage : lapprentissage du classifieur ne se fait que sur ce sous-
ensemble dexemples ;
lensemble de test : cet ensemble sert valuer lerreur du classifieur.
Ces deux sous-ensembles sont tirs de manire alatoire en faisant une partition en 2
parties des exemples disponibles. Lerreur fate sur lensemble dapprentissage sappelle
lerreur dapprentissage, celle sur lensemble de test lerreur de test.
1. Pour diffrents partitionnement, (faites varier le nombre dexemples de chaque en-
semble, par exemple un partage (0.2/0.8), (0.5, 0.5), (0.8, 0.2)), tracez les courbes de ler-
reur en apprentissage et de lerreur en test en fonction de la profondeur du modle.
ARF ARF 2017fev page 3

2. Que remarquez vous quand il y a peu dexemples dapprentissage ? Comment pro-


gresse lerreur ? De mme quand il y a beaucoup dexemples dapprentissage. Est-ce
le mme comportement pour les deux erreurs ?
3. Vos rsultats vous semble-t-ils fiables et stables ? Comment les amliorer ?

Validation croise : slection de modle

Il est rare de disposer en pratique dun ensemble de test (on prfre inclure le plus grand
nombre de donnes dans lensemble dapprentissage). Pour slectionner un modle tout
en considrant le plus grand nombre dexemples possible pour lapprentissage, on utilise
gnralement une procdure dite de slection par validation croise. Pour chaque param-
trisation de lalgorithme, une estimation de lerreur empirique du classifieur appris est fate
selon la procdure suivante :
lensemble dapprentissage Eapp est partitionn en n ensembles dapprentissage {Ei }
Pour i = 1..n
I larbre est appris sur Eapp Ei
I lerreur en test err(Ei ) est value sur Ei (qui na pas servi lapprentissage cette
itration) P
I lerreur moyenne err = n1 ni=1 err(Ei ) est calcule, le modle slectionn est celui
qui minimise cette erreur
Refaites les expriences prcdentes avec cette fois de la validation croise (pensez la
fonction np.random.shuffle).

Anda mungkin juga menyukai