Arbres de Décision & Forêt Aléatoire
“20 questions récursives : diviser la réalité en régions toujours plus pures”
Comment les arbres de décision divisent les données (Gini, entropie), élagage, puis Random Forest comme ensemble baggé.
Prérequis
Concepts Couverts
∑Formules Clés
Impureté de Gini
Probabilité de mal classer un échantillon aléatoire. Zéro = pureté parfaite
Gain d'Information
Réduction d'entropie obtenue par une division — choisir la division qui maximise ce gain
Entropie
Mesure du désordre / de l'imprévisibilité dans un nœud — nulle si pur, maximale si uniforme
Erreur OOB
Estimation de validation gratuite à partir d'échantillons absent de chaque bootstrap — pas besoin d'ensemble de validation séparé
▶Simulation Interactive
⬡Architecture du Modèle
Le Modèle le Plus Simple et Puissant
Les arbres de décision imitent le raisonnement humain : 'Si âge > 40 ET fumeur ET cholestérol > 200 → risque élevé'. Ils sont interprétables, ne nécessitent pas de mise à l'échelle des caractéristiques, gèrent les types mixtes et capturent les relations non linéaires. Seuls, ils sur-ajustent beaucoup — mais comme bloc de construction pour la Forêt Aléatoire, XGBoost et LightGBM, ils constituent la structure de modèle la plus importante en ML tabulaire.
Partitionnement Binaire Récursif
Un arbre de décision partitionne l'espace des caractéristiques en régions rectangulaires. À chaque étape, il demande : 'Quel seuil de caractéristique unique sépare le mieux les classes ?' Il mesure 'le mieux' en utilisant l'impureté (Gini ou entropie). Le processus récurse sur chaque sous-région jusqu'à atteindre un critère d'arrêt.
Un arbre de décision de profondeur 20 avec des divisions binaires peut représenter 2²⁰ ≈ 1 million de régions différentes. C'est pourquoi ils sur-ajustent si catastrophiquement sur des données brutes.
Gini vs Entropie : Les Critères de Division
Les deux mesurent l'impureté — plus c'est bas, mieux c'est. Le Gini est plus rapide à calculer (sans log). L'entropie est légèrement plus sensible aux probabilités de classe proches de 0,5. En pratique, ils produisent des arbres presque identiques.
Pourquoi la Forêt Aléatoire Fonctionne : Décomposition Biais-Variance
Un arbre profond unique a un faible biais mais une variance catastrophiquement élevée — il mémorise le bruit d'entraînement. La Forêt Aléatoire exploite deux astuces : (1) L'échantillonnage bootstrap fait croître chaque arbre sur un sous-ensemble aléatoire différent de données. (2) Les sous-ensembles aléatoires de caractéristiques (√p caractéristiques par division) décorrèlent les arbres. Faire la moyenne d'estimateurs décorrélés à haute variance réduit la variance sans augmenter le biais.
Le 'aléatoire' dans la Forêt Aléatoire fait référence à la sélection aléatoire des caractéristiques à chaque division, pas seulement au bootstrap. C'est l'insight clé de Breiman (2001).
Algorithme d'Entraînement de la Forêt Aléatoire
Pour t = 1 à T (nombre d'arbres) :
Échantillon bootstrap Dₜ des données d'entraînement (n échantillons avec remplacement)
Faire croître l'arbre de décision hₜ sur Dₜ :
À chaque nœud, sélectionner aléatoirement m = √p caractéristiques
Trouver la meilleure division parmi ces m caractéristiques (Gini/entropie le plus bas)
Développer jusqu'à max_depth ou min_samples_leaf atteint
Prédiction finale : vote majoritaire (classification) ou moyenne (régression)
Estimation OOB : pour chaque échantillon, prédire en utilisant seulement les arbres qui ne l'ont pas vu
Modèle de Production
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score, train_test_split from sklearn.datasets import make_classification import pandas as pd import shap class="tok-comment"># ── Données dclass="tok-str">'exemple ────────────────────────────────────────────────── X_brut, y = make_classification(n_samples=class="tok-num">500, n_features=class="tok-num">10, n_informative=class="tok-num">5, random_state=class="tok-num">42) feature_names = [f"var_{i}" for i in range(X_brut.shape[class="tok-num">1])] X_train, X_test, y_train, y_test = train_test_split( X_brut, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42) class="tok-comment"># Entraînement rf = RandomForestClassifier( n_estimators=class="tok-num">500, max_features='sqrtclass="tok-str">', class="tok-comment"># Sous-ensembles de caractéristiques aléatoires max_depth=None, class="tok-comment"># Entièrement développé (élagué par min_samples_leaf) min_samples_leaf=class="tok-num">1, oob_score=True, class="tok-comment"># Estimation de validation gratuite random_state=class="tok-num">42, n_jobs=-class="tok-num">1 ) rf.fit(X_train, y_train) print(f"Score OOB : {rf.oob_score_:.4f}") class="tok-comment"># Importance des caractéristiques (Diminution Moyenne de l'Impureté) importances = pd.Series(rf.feature_importances_, index=feature_names) importances.nlargest(class="tok-num">20).sort_values().plot(kind=class="tok-str">'barh') class="tok-comment"># SHAP pour l'importance correcte des caractéristiques explainer = shap.TreeExplainer(rf) shap_values = explainer.shap_values(X_test)
Pièges de la Forêt Aléatoire
L'importance des caractéristiques MDI est biaisée vers les caractéristiques à haute cardinalité. Utilisez l'importance par permutation ou SHAP.
Mémoire : 500 arbres profonds peuvent utiliser 2–10 Go. Définissez max_depth=15–20 en production.
Inférence lente : prédire sur 500 arbres en série est lent. Considérez n_estimators=100 pour le déploiement.
Déséquilibre des classes : utilisez class_weight='balanced' ou bootstrap stratifié.
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un ingénieur IA ou data scientist ?
Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.