Exercice 87 / 100

ML — Decision Tree

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

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 B Sinon : 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

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}')

Les features les plus utilisées dans les splits ont une importance plus élevée.

⚠ Régularisation

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

max_depth=5 profondeur max min_samples_split=20 minimum d'exemples pour split un nœud min_samples_leaf=10 minimum dans une feuille max_features='sqrt' sous-ensemble de features à considérer à chaque split

À régler par cross-validation.

Exemple complet

import numpy as np from sklearn.tree import DecisionTreeClassifier from 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_tree plot_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.

exercise.py

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