26.01.2015 Views

TP 2 – M1 Info – Arbres de décisions 1 Apprendre un arbre de ...

TP 2 – M1 Info – Arbres de décisions 1 Apprendre un arbre de ...

TP 2 – M1 Info – Arbres de décisions 1 Apprendre un arbre de ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>TP</strong> 2 – <strong>M1</strong> <strong>Info</strong> – <strong>Arbres</strong> <strong>de</strong> décisions<br />

Le logiciel scikit-learn propose l’implantation <strong>de</strong> plusieurs algorithmes d’apprentissage d’<strong>arbre</strong>s<br />

<strong>de</strong> décision. L’objectif <strong>de</strong> ce <strong>TP</strong> est triple :<br />

– Découvrir <strong>de</strong>s <strong>arbre</strong>s <strong>de</strong> décision et leurs performances selon la nature <strong>de</strong>s échantillons,<br />

– Découvrir le sur-apprentissage, ses liens avec complexité <strong>de</strong> l’espace d’hypothèses,<br />

– Se familiariser avec l’entropie <strong>de</strong> Shannon.<br />

Ce <strong>TP</strong> est noté (<strong>de</strong>ux premières sections, la troisième en Bonus) : à l’issue du <strong>TP</strong> (<strong>un</strong><br />

envoi après 16h07 ne sera pas considéré), envoyez à votre enseignant <strong>un</strong>e archive contenant tout<br />

ce que vous avez réalisé (l’archive doit stocker vos programmes, vos commentaires et réponses aux<br />

questions sous forme txt – à taper au fur et à mesure –, quelques images en pdf ou png).<br />

Le sujet <strong>de</strong> l’email doit contenir l’expression ML<strong>M1</strong><strong>TP</strong>2 et votre nom, sous peine <strong>de</strong> se perdre dans les<br />

méandres <strong>de</strong>s spams.<br />

Une version finale <strong>de</strong> votre travail pourra être envoyée avant le dimanche 18 novembre 23h59.<br />

ATTENTION. Si les correcteurs remarquent <strong>de</strong>s similitu<strong>de</strong>s entre <strong>de</strong>ux rendus d’étudiants, similitu<strong>de</strong>s<br />

statistiquement impossibles par hasard, les <strong>de</strong>ux étudiants auront la note 0 (zéro). Les<br />

correcteurs s’appuient sur <strong>de</strong>s logiciels qui détectent automatiquement ces similitu<strong>de</strong>s (l’apprentissage<br />

automatique est très fort pour la détection <strong>de</strong> plagiats !), avec contrôle humain si nécessaire.<br />

En conséquence, ne trichez pas. Si vous avez réalisé le travail à plusieurs (ce n’est pas tricher, sauf<br />

si vous le cachez), dites le, avec <strong>un</strong> pourcentage <strong>de</strong> travail pour chaque auteur. La note finale sera<br />

logarithmiquement diminuée en fonction du nombre d’auteurs. C’est toujours mieux que 0.<br />

1 <strong>Apprendre</strong> <strong>un</strong> <strong>arbre</strong> <strong>de</strong> décision<br />

Le package sklearn.tree propose <strong>de</strong>s algorithmes d’apprentissage fondés sur les <strong>arbre</strong>s <strong>de</strong> décision<br />

(classification, régression), mais aussi la possibilité <strong>de</strong> visualiser les <strong>arbre</strong>s obtenus. Chaque algorithme<br />

d’apprentissage est paramétrable.<br />

Dans cette partie, l’objectif est <strong>de</strong> comparer, pour <strong>de</strong>ux échantillons <strong>de</strong> données, les performances<br />

<strong>de</strong>s <strong>arbre</strong>s <strong>de</strong> décision et celles du classifieur naïf <strong>de</strong> Bayes. On utilisera l’algorithme DecisionTree-<br />

Classifier.<br />

Pour ce faire :<br />

1. Produire <strong>un</strong> programme Python qui charge le jeu <strong>de</strong> données Iris, et qui estime, par validation<br />

croisée, les erreurs en généralisation du classifieur naïf <strong>de</strong> Bayes et d’<strong>un</strong> <strong>arbre</strong> <strong>de</strong> décision avec<br />

le paramétrage par défaut. Quelles performances obtenez-vous <br />

2. Est-ce que les performances <strong>de</strong> l’<strong>arbre</strong> <strong>de</strong> décision produit avec le critère Gini sont meilleures<br />

– égales – ou inférieures, aux performances obtenues avec le critère Entropie <br />

3. Quid <strong>de</strong>s performances <strong>de</strong> ces <strong>de</strong>ux algorithmes avec le jeu le données digits <br />

2 A la découverte <strong>de</strong> l’influence <strong>de</strong>s paramètres<br />

La fonction DecisionTreeClassifier <strong>de</strong> scikit-learn offre <strong>de</strong> nombreux paramètres.<br />

L’algorithme implémenté actuellement ne réalise pas d’élagage, et par défaut, la construction <strong>de</strong><br />

l’<strong>arbre</strong> est arrêtée lorsqu’<strong>un</strong> <strong>arbre</strong> parfait a été obtenu (ou lorsqu’il n’y a plus <strong>de</strong> progression <strong>de</strong><br />

l’erreur d’apprentissage).<br />

Nous allons voir que ces paramètres influencent la complexité <strong>de</strong> l’<strong>arbre</strong>, et sur ses performances.<br />

1. Expliquer les paramètres criterion, max <strong>de</strong>pth, min samples split et max features.<br />

2. Sur le jeu <strong>de</strong> données digits, faire varier la profon<strong>de</strong>ur maximum <strong>de</strong> 1 à 40, pour obtenir<br />

<strong>un</strong>e dizaine d’<strong>arbre</strong>s plus simples que l’<strong>arbre</strong> parfait (lorsque ce <strong>de</strong>rnier existe), le 10ème <strong>arbre</strong><br />

<strong>de</strong>vant contenir <strong>un</strong> seul test. Pour chac<strong>un</strong> <strong>de</strong> ces <strong>arbre</strong>s, indiquer :<br />

Université Aix-Marseille – 2013-2014


<strong>TP</strong> 2 – <strong>M1</strong> <strong>Info</strong> – <strong>Arbres</strong> <strong>de</strong> décisions<br />

– L’<strong>arbre</strong> lui-même (via la fonction sklearn.tree.export graphviz 1 ), son nombre <strong>de</strong> tests<br />

et sa profon<strong>de</strong>ur.<br />

– L’erreur en apprentissage.<br />

– Un estimation <strong>de</strong> l’erreur réelle par validation croisée.<br />

Qu’observe-t-on – à valeur croissante <strong>de</strong> la profon<strong>de</strong>ur maximum – quant à l’évolution <strong>de</strong>s<br />

erreur d’apprentissage et réelle Que constate-t’on lorsque l’erreur en apprentissage <strong>de</strong>vient<br />

nulle <br />

3. De la même façon, faire varier les trois autres paramètres. Dresser <strong>un</strong> tableau <strong>de</strong> résultats<br />

(erreur app. et erreur réelle) en fonction <strong>de</strong> plusieurs valeurs <strong>de</strong> chaque paramètre <strong>de</strong> l’algorithme.<br />

Peut-on indiquer quel est le meilleur <strong>arbre</strong> obtenu, et justifier <br />

4. On <strong>de</strong>man<strong>de</strong> maintenant d’ajouter du bruit aux données, c’est-à-dire que pour <strong>un</strong> certain<br />

nombre d’exemples <strong>de</strong> l’échantillon, leur classe est aléatoirement modifiée. Ce bruit – appelé<br />

bruit <strong>de</strong> classification – gêne évi<strong>de</strong>mment l’obtention d’<strong>un</strong> bon apprenant.<br />

Ce bruitage peut se réaliser grâce à la fonction ci-<strong>de</strong>ssous :<br />

import random<br />

from sklearn import datasets<br />

# ds : <strong>un</strong> echantillon<br />

# txb : le pourcentage d’exemples modifies<br />

<strong>de</strong>f add_noise(ds, txb=10):<br />

nb_samples = len(ds.data)<br />

nb_classes = len(ds.target_names)<br />

for i in range(nb_samples*txb/100):<br />

nc = random.randint(0, nb_classes-1)<br />

ni = random.randint(0, nb_samples-1)<br />

ds.target[ni]=nc<br />

return ds<br />

Reprendre les calculs et estimations <strong>de</strong>s erreurs en apprentissage et réelles, pour plusieurs<br />

profon<strong>de</strong>urs max <strong>de</strong> l’<strong>arbre</strong>, après bruitage <strong>de</strong> 5, 10 et 20% <strong>de</strong> l’échantillon. Que remarquet’on<br />

quand à l’évolution <strong>de</strong> ces erreurs Pouvez-vous commenter ce phénomène <br />

3 Stump, vous avez dit stump (non noté, mais du bonus)<br />

Un stump est <strong>un</strong> <strong>arbre</strong> <strong>de</strong> décision constitué d’<strong>un</strong> seul test à la racine, avec s réponses possibles à<br />

ce test. A chaque réponse possible, <strong>un</strong>e classe doit être attribuée.<br />

Créer <strong>un</strong>e fonction Python qui, à partir d’<strong>un</strong> dataset – data et target – (multiclasses, attributs<br />

continus, comme digits), calcule <strong>un</strong> stump en se fondant sur le critère d’entropie <strong>de</strong> Shannon pour<br />

calculer le gain en information : tester les performances <strong>de</strong> cet algorithme sur le jeu <strong>de</strong> données<br />

digits.<br />

Précisions : nous supposons travailler sur <strong>de</strong>s attributs continus, donc nous définissons s le nombre<br />

d’intervalles envisagé pour l’attribut à choisir : 2 ≤ s ≤ 10. Dans <strong>un</strong> premier temps, la fonction<br />

d’apprentissage considèrera que s est fixe (par exemple 2) ; puis, si le temps le permet, on fera varier<br />

s pour sélectionner le meilleur modèle <strong>de</strong> stump.<br />

1. Cette fonction exporte <strong>un</strong> <strong>arbre</strong> sous format DOT. On peut alors convertir ce format en PNG via la comman<strong>de</strong><br />

shell : dot -Tpng <strong>arbre</strong>15.dot -o <strong>arbre</strong>15.png<br />

Université Aix-Marseille – 2013-2014

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!