Exercice 87 / 100

ML — Decision Tree

ConsigneEntraîne un arbre de décision et analyse son importance

📖 Cours

Un arbre de décision construit une série de questions oui/non sur les features pour classer (ou prédire). Très visuel et interprétable.

Si feat_0 > 0.5 : Si feat_2 > 0.3 → classe A Sinon → classe BSinon : Si feat_1 > 0 → classe B Sinon → classe A

Fonctionnement (très simplifié)

À chaque nœud, l'algorithme cherche la question qui minimise l'impureté (Gini ou entropie) des deux groupes obtenus. On répète récursivement jusqu'à un critère d'arrêt (profondeur max, taille min...).

Un arbre de décision cherche à chaque étape la question qui sépare le mieux les classes : celle qui laisse les deux groupes les plus purs possible est celle qu'il retient
Un arbre de décision cherche à chaque étape la question qui sépare le mieux les classes : celle qui laisse les deux groupes les plus purs possible est celle qu'il retient

Workflow sklearn

from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=3, random_state=42)tree.fit(X_train, y_train)acc = tree.score(X_test, y_test)

Feature importance

Après fit, l'arbre fournit l'importance de chaque feature (somme = 1) :

for name, imp in zip(features, tree.feature_importances_): print(f' {name}: {imp:.3f}')

L'importance ne compte pas les splits : elle additionne la baisse d'impureté que la feature apporte, pondérée par le nombre d'exemples concernés. Une feature utilisée une seule fois près de la racine pèse donc souvent bien plus que dix découpes faites tout en bas de l'arbre.

⚠ Régularisation

Sans contrainte, un arbre peut être très profond et overfitter (mémoriser le bruit). Limitations courantes :

max_depth=5 profondeur maxmin_samples_split=20 minimum d'exemples pour split un nœudmin_samples_leaf=10 minimum dans une feuillemax_features='sqrt' sous-ensemble de features à considérer à chaque split

À régler par cross-validation.

Exemple complet

import numpy as npfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_split
np.random.seed(42)X = np.random.randn(200, 4)y = ((X[:, 0] > 0) & (X[:, 2] > 0)).astype(int)features = ['feat_0', 'feat_1', 'feat_2', 'feat_3']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
tree = DecisionTreeClassifier(max_depth=3, random_state=42)tree.fit(X_train, y_train)
print(f'Accuracy: {tree.score(X_test, y_test):.2%}')for n, imp in zip(features, tree.feature_importances_): print(f' {n}: {imp:.3f}')

Visualisation

from sklearn.tree import plot_treeplot_tree(tree, feature_names=features, class_names=['0','1'], filled=True)

Un arbre seul est souvent moyen. Combiné en forêt (leçon 88), il devient un des meilleurs modèles classiques.

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →