Le machine learning en partant de zéro · Leçon 5.1 · 26 sur 33 leçons prêtes · 10 min
Arbres de décision : le jeu des vingt questions
En bref
Un arbre de décision classe en posant des questions oui/non, chacune choisie pour séparer au mieux les données. L’exemple : qui a survécu au Titanic.
Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
Vous connaissez le jeu des vingt questions ? « Est-ce vivant ? » « Est-ce plus grand qu’un chat ? » Un bon joueur ne pose pas des questions au hasard ; il pose celle qui coupe à peu près en deux les possibilités restantes. Un arbre de décision est un modèle qui joue à ce jeu avec des données – et comme ses questions sont formulées en clair, c’est l’un des rares modèles qu’on peut lire comme un organigramme.
Choisissez une réponse et votre degré de certitude.
Répondez pour débloquer le labo.
Labo interactif
Ce labo interactif fonctionne dans un navigateur avec JavaScript activé. Le texte qui l’entoure décrit ce qu’il montre.
Voir la réponse
Bonne réponse : Le peu profond (profondeur 1)
La profondeur 20 obtient 98,7 % à l’entraînement mais 73,9 % au test. La profondeur 1 obtient 79,3 % à l’entraînement et 77,2 % au test. L’arbre profond a appris les passagers par cœur (114 de ses 145 feuilles couvrent 5 personnes ou moins) ; le meilleur score de test, 79,5 %, vient de la profondeur 3.
À vous de jouer
- Réglez le curseur de profondeur maximale sur 1. L’arbre n’a droit qu’à une question. Lisez-la dans la liste des divisions : quelle variable l’algorithme a-t-il jugée la plus informative ?
- Montez la profondeur maximale cran par cran. Regardez l’exactitude d’entraînement grimper et comparez-la à l’exactitude de test à chaque profondeur.
- Poussez le curseur de profondeur maximale au maximum. L’exactitude d’entraînement est-elle presque parfaite ? Qu’est devenue l’exactitude de test ?
- Trouvez la profondeur où l’exactitude de test est la meilleure et lisez-y les premières divisions. Pourriez-vous expliquer cet arbre à quelqu’un en deux phrases ?
L’idée en quelques mots
Voyons maintenant ce que vous venez de manipuler, en termes simples.
Un arbre de décision prédit en posant une suite de questions oui/non sur les variables : « Le passager a-t-il moins de tel âge ? », « A-t-il voyagé en première classe ? ». Chaque réponse envoie l’exemple dans une branche, et la question suivante dépend des réponses précédentes. Au bout de chaque chemin se trouve une feuille portant une prédiction – en général l’étiquette la plus fréquente parmi les exemples d’entraînement arrivés là.
Dans cette leçon, nous utilisons des données sur 891 passagers du Titanic, dont 342 ont survécu. Les variables comprennent la classe du billet, le sexe, l’âge, le nombre de proches à bord et le prix payé. L’arbre apprend quelles questions sur ces variables séparent le mieux les survivants des autres.
Pensez à une infirmière d’accueil aux urgences qui fait le tri. Elle ne calcule pas de somme pondérée ; elle suit une courte chaîne de questions – respire-t-il ? saigne-t-il ? est-il conscient ? –, chacune réduisant ce qu’il faut faire. Un arbre, c’est cette chaîne, apprise à partir de données au lieu d’être écrite par des médecins.
Pourquoi ça marche
L’arbre se construit par le haut, une question à la fois. À chaque étape, l’algorithme essaie chaque variable et chaque valeur de coupure possible, et se demande : quelle question sépare ce groupe en deux groupes aussi purs que possible, c’est-à-dire contenant chacun surtout une seule étiquette ? Une mesure d’impureté répandue est l’indice de Gini d’un groupe :
Gini = 1 − Σ pₖ²
où pₖ est la part de l’étiquette k dans le groupe. Un groupe où tout le monde a la même étiquette a un Gini de 0 ; un groupe partagé moitié-moitié entre deux étiquettes a un Gini de 0,5, la pire valeur possible pour deux classes. L’algorithme choisit la question qui fait le plus baisser l’impureté moyenne, puis répète la procédure séparément dans chaque branche. Cette recherche gloutonne, étape par étape, ne garantit pas le meilleur arbre possible, mais elle est rapide et marche bien en pratique.
Livré à lui-même, l’arbre continue de se diviser jusqu’à ce que chaque feuille soit pure – même si une feuille ne contient qu’un seul passager. À ce stade, il a appris par cœur les données d’entraînement, bruit compris : le surapprentissage de la leçon 7 sous un nouveau costume. Le principal réglage est la profondeur maximale, le nombre de questions autorisées le long d’un chemin. Un arbre peu profond est facile à lire mais peut manquer de vraies tendances ; un arbre profond colle presque parfaitement aux données d’entraînement et généralise moins bien. La validation croisée de la leçon 8 est la façon honnête de choisir la profondeur.
Erreur fréquente
Une division n’explique pas une cause. L’arbre interroge la variable qui sépare le mieux les étiquettes dans ces données, et elle peut en représenter une autre : la classe du billet et le prix vont de pair, et tous deux disent quelque chose de l’endroit du navire où dormait un passager. La seconde erreur est de faire confiance à un arbre profond parce que ses règles ont l’air si précises. Une règle comme « âge entre 31,5 et 32,5 et billet au-dessus d’une certaine valeur » décrit généralement un ou deux passagers, pas une tendance. De petits changements dans les données peuvent aussi modifier la première division et donc l’arbre entier, ce qui rend les arbres isolés instables.
Cette instabilité est une faiblesse, mais on peut la transformer en force. Dans la prochaine leçon, nous faisons pousser beaucoup d’arbres différents et nous les laissons voter.
Quiz
Trois questions pour vérifier vos acquis. Choisissez une réponse ou dépliez la solution sous chaque question. Au clavier : les flèches choisissent, Entrée ou Espace valide.
À retenir
- Un arbre de décision prédit par une chaîne de questions oui/non qu’on peut lire comme un organigramme.
- Chaque division est choisie de façon gloutonne pour rendre les groupes obtenus aussi purs que possible, par exemple selon l’indice de Gini.
- La profondeur maximale règle la complexité : les arbres peu profonds sous-apprennent, les arbres profonds apprennent par cœur.
- Une division montre ce qui sépare les étiquettes dans les données, pas ce qui cause le résultat.
Pour aller plus loin : formule, code, pratique
Les maths
Pour un groupe dont les parts de labels sont pₖ, Gini = 1 − Σ pₖ². Pour deux classes, il va de 0 (un seul label) à 0,5 (moitié-moitié). Le tableau complet du Titanic, 342 survivants sur 891, a Gini = 1 − (342/891)² − (549/891)² ≈ 0.473.
Une coupure envoie n_L lignes à gauche et n_R lignes à droite, n = n_L + n_R. Sa qualité est la baisse d’impureté : Δ = G(parent) − (n_L/n) · G(left) − (n_R/n) · G(right). L’arbre retient la question de plus grand Δ, puis recommence dans chaque branche. L’entropie, −Σ pₖ log₂ pₖ, est une autre mesure d’impureté qui se comporte de façon semblable.
Un arbre de profondeur d a au plus 2^d feuilles. Une feuille prédit le label majoritaire de ses lignes d’entraînement, donc une feuille d’un seul passager prédit exactement le label de ce passager.
En code (Python)
Les 891 passagers avec six variables (sexe codé 0/1, âges manquants remplis avec la médiane d’entraînement) et un découpage de test stratifié à 30 %. C’est le même genre d’expérience que dans le lab, mais avec un autre découpage, donc les nombres diffèrent un peu de ceux du lab. Le notebook lié sous la sortie télécharge lui-même les données.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/titanic.csv")
X = pd.DataFrame({"female": (df["sex"] == "female").astype(int)}).join(df[["pclass", "age", "sibsp", "parch", "fare"]])
Xtr, Xte, ytr, yte = train_test_split(X, df["survived"], test_size=0.3, stratify=df["survived"], random_state=1)
Xtr, Xte = Xtr.fillna({"age": Xtr["age"].median()}), Xte.fillna({"age": Xtr["age"].median()}) # médiane d'entraînement pour les deux
print(f"passengers {len(df)}, survived {df['survived'].sum()}")
for d in (1, 3, 20):
t = DecisionTreeClassifier(max_depth=d, random_state=0).fit(Xtr, ytr)
print(f"depth {d:2d}: train {t.score(Xtr, ytr):.3f}, test {t.score(Xte, yte):.3f}, leaves {t.get_n_leaves()}")
Sortie
passengers 891, survived 342
depth 1: train 0.780, test 0.802, leaves 2
depth 3: train 0.833, test 0.802, leaves 8
depth 20: train 0.986, test 0.780, leaves 141
Un arbre de profondeur 1 est une seule question. L’arbre de profondeur 20 est presque parfait sur les passagers d’entraînement et moins bon que la question unique sur les passagers de test.
Télécharger le notebook (.ipynb). Ouvrez-le dans Jupyter ou importez-le dans Google Colab ; il télécharge lui-même les données manquantes.
Pour les praticiens
- Limitez l’arbre :
max_depth,min_samples_leafouccp_alpha(élagage). Choisissez la valeur par validation croisée, pas d’après l’exactitude d’entraînement. - Ne lisez pas un arbre profond comme un ensemble de règles. Une feuille de quelques passagers, c’est de la mémoire, pas un motif.
- Les arbres n’ont pas besoin de variables mises à l’échelle, mais ils ont besoin de nombres. Codez les catégories (par exemple le sexe en 0/1) et décidez quoi faire des valeurs manquantes. Ajustez l’imputation sur le jeu d’entraînement seulement.
- Un arbre seul est instable : un petit changement dans les données peut changer la première coupure. Si seule l’exactitude vous importe, un ensemble d’arbres est un choix plus sûr.
- Une coupure est une affirmation sur ces données, pas sur une cause. La classe du billet et le tarif se remplacent l’un l’autre, donc l’arbre peut choisir l’un ou l’autre.
Cela vous a-t-il aidé ?
Merci ! Cela nous aide à nous améliorer.
Aller plus loin dans l’Atlas
Articles de l’encyclopédie sur les notions de cette leçon :