Bonjour ! Dans notre dernière leçon, nous avons exploré les arbres de décision et identifié leur principal défaut : une forte tendance au surapprentissage (overfitting). Un arbre unique peut devenir trop spécifique aux données d'entraînement et mal généraliser sur de nouvelles données. Aujourd'hui, nous allons découvrir une solution élégante et puissante à ce problème : l'algorithme des forêts aléatoires (Random Forests).
Comme son nom l'indique, une forêt aléatoire n'est pas un seul arbre, mais un ensemble de nombreux arbres de décision. En combinant les "opinions" de plusieurs arbres diversifiés, ce modèle obtient des prédictions beaucoup plus robustes et précises. L'objectif de cette leçon est de vous faire comprendre comment une forêt aléatoire est construite pour améliorer les performances d'un arbre de décision unique, et comment l'entraîner à l'aide de Scikit-learn.
1. L'idée de base : la sagesse de la foule
L'intuition derrière les forêts aléatoires est simple : si vous posez une question complexe à un seul expert, sa réponse peut être biaisée ou incorrecte. Mais si vous posez la même question à un grand groupe d'experts diversifiés et que vous combinez leurs réponses, la décision collective sera probablement bien meilleure.
Une forêt aléatoire applique ce principe aux arbres de décision. Au lieu de se fier à un seul arbre qui pourrait avoir "surappris", on en construit des centaines (voire des milliers) et on les fait "voter" pour la prédiction finale. Mais pour que cela fonctionne, les arbres doivent être différents les uns des autres. Comment y parvenir ? La réponse se trouve dans le mot "aléatoire". L'algorithme introduit deux sources de hasard.
La vidéo suivante de StatQuest, l'une des meilleures ressources pour l'intuition en machine learning, décompose ce processus de manière très visuelle.
StatQuest: Random Forests Part 1 - Building, Using and Evaluating
Cette vidéo de Josh Starmer explique étape par étape comment une forêt aléatoire est construite et utilisée.
Regardez d'abord la justification des forêts aléatoires ici. Première source de hasard : le Bootstrap. Suivez cette section pour comprendre comment, pour chaque arbre, on crée un nouvel ensemble de données en échantillonnant avec remise à partir des données originales. C'est ce qu'on appelle le bootstrap. Deuxième source de hasard : la sélection de caractéristiques. Regardez ce passage qui explique qu'à chaque nœud de chaque arbre, l'algorithme ne considère qu'un sous-ensemble aléatoire de caractéristiques pour trouver la meilleure division. Voyez comment ces deux techniques créent une grande diversité d'arbres. Enfin, comprenez comment la forêt fait une prédiction finale en faisant voter les arbres. C'est le principe du Bagging (Bootstrap Aggregating), expliqué ici.
Pour résumer les deux mécanismes clés :
-
Bootstrap (échantillonnage de données) : Pour chaque arbre que nous voulons construire, nous ne lui donnons pas l'ensemble des données d'entraînement original. À la place, nous créons un nouvel ensemble de données de la même taille en tirant des échantillons au hasard avec remise. Cela signifie que certaines données originales peuvent apparaître plusieurs fois dans ce nouvel ensemble, tandis que d'autres peuvent ne pas y apparaître du tout. Chaque arbre est donc entraîné sur une version légèrement différente des données.
-
Randomisation des caractéristiques : Lorsque chaque arbre est construit, à chaque fois qu'il doit décider comment diviser un nœud, il ne regarde pas toutes les caractéristiques disponibles. Il en sélectionne un sous-ensemble aléatoire (par exemple, 3 caractéristiques sur 10) et ne cherche la meilleure division que parmi celles-ci. Cela empêche les arbres de toujours se baser sur les mêmes caractéristiques les plus prédictives et les force à explorer d'autres relations dans les données.
Ces deux types de hasard garantissent que les arbres de la forêt sont très différents les uns des autres.
2. Du Bootstrap à l'agrégation (Bagging)
Le processus qui combine le bootstrap et l'agrégation des prédictions s'appelle le Bagging, un acronyme pour Bootstrap Aggregating.

L'article suivant renforce ces concepts avec des explications textuelles claires.
Random Forest in Python (and coding it with Scikit-learn)
Cet article de Data36 détaille le fonctionnement interne des forêts aléatoires.
Lisez les sections jusqu'à la fin de la section "Bagging". Concentrez-vous sur l'explication des deux types de randomisation ("Randomizing the features" et "Bootstrapping") et sur la manière dont l'agrégation ("Bagging") fonctionne pour produire le résultat final.
Pour une explication en arabe qui couvre les mêmes concepts, la vidéo suivante est une excellente ressource.
شرح مبسط و تفصيلي بالعربي للمبتدئين لاحتراف: Random Forest S05E04
Cette vidéo de la chaîne "أجياد العرب" explique les concepts d'ensemble, de Bagging et de Random Forest en arabe.
Regardez la partie sur le Bagging (explication), qui correspond à l'échantillonnage de données et à l'agrégation. Puis, regardez la section sur les Random Forests (explication), qui ajoute la randomisation des caractéristiques au processus.
3. Arbre de décision vs Forêt aléatoire : le compromis
Maintenant que nous comprenons le fonctionnement des forêts aléatoires, comparons-les directement aux arbres de décision.
L'article suivant propose un tableau comparatif très utile que je vous invite à étudier.
A Practical Guide to Random Forests in Machine Learning
Cet article de DigitalOcean compare directement les deux approches et résume leurs avantages et inconvénients.
Lisez la section Randomness Adds Strength, qui récapitule pourquoi on passe d'un arbre à une forêt. Ensuite, étudiez attentivement le tableau comparatif. Il met en évidence le compromis fondamental : Précision vs Interprétabilité : Les forêts aléatoires sont presque toujours plus précises, mais elles perdent la belle interprétabilité d'un arbre unique. Il est difficile de visualiser 100 arbres et de comprendre leur logique combinée, c'est pourquoi on les qualifie parfois de modèles "boîte noire" (black box). Robustesse vs Vitesse : Les forêts sont plus robustes au bruit et au surapprentissage, mais elles sont plus lentes à entraîner et consomment plus de mémoire, car elles doivent construire de nombreux modèles.
4. Entraîner une forêt aléatoire avec Scikit-learn
Heureusement, Scikit-learn rend l'entraînement d'une forêt aléatoire aussi simple que celui d'un arbre de décision. L'objet que nous utiliserons est RandomForestClassifier.
Avant de coder, il est utile de connaître ses principaux hyperparamètres. La plupart sont les mêmes que pour DecisionTreeClassifier (comme max_depth), mais il y en a un de nouveau et de très important.
A Practical Guide to Random Forests in Machine Learning
Cette section de l'article de DigitalOcean décrit les hyperparamètres les plus importants du RandomForestClassifier.
Lisez la description des hyperparamètres suivants : n_estimators : C'est le plus important. Il définit le nombre d'arbres à construire dans la forêt. Plus il y en a, mieux c'est en général, mais cela augmente le temps de calcul. max_features : Contrôle le nombre de caractéristiques à considérer à chaque division. Les autres comme max_depth ou min_samples_leaf que vous connaissez déjà.
Voici comment l'implémenter en Python. Nous utiliserons le même jeu de données sur le cancer du sein que dans la leçon précédente pour pouvoir comparer.
# 1. Importer les bibliothèques
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 2. Charger les données
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
# 3. Séparer les données
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 4. Entraîner un arbre de décision simple (rappel de la leçon précédente)
dt_classifier = DecisionTreeClassifier(random_state=42)
dt_classifier.fit(X_train, y_train)
y_pred_dt = dt_classifier.predict(X_test)
accuracy_dt = accuracy_score(y_test, y_pred_dt)
print(f"Précision de l'arbre de décision unique : {accuracy_dt:.4f}")
# 5. Entraîner une forêt aléatoire
# n_estimators=100 signifie que nous construisons 100 arbres
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier.fit(X_train, y_train)
y_pred_rf = rf_classifier.predict(X_test)
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"Précision de la forêt aléatoire : {accuracy_rf:.4f}")
En exécutant ce code, vous devriez constater que la précision de la forêt aléatoire est supérieure à celle de l'arbre de décision unique. L'arbre unique, sans limite de profondeur, a probablement surappris les données d'entraînement, tandis que la forêt aléatoire, grâce à l'agrégation, a mieux généralisé.
Tout comme un arbre de décision, une forêt aléatoire peut aussi vous donner une estimation de l'importance des caractéristiques (rf_classifier.feature_importances_). Cet indicateur est généralement plus fiable car il est moyenné sur tous les arbres de la forêt.
Conclusion
Dans cette leçon, nous avons fait un grand pas en avant en passant d'un modèle unique à un ensemble de modèles. Les forêts aléatoires sont l'un des algorithmes les plus populaires et les plus efficaces en machine learning classique.
Points clés à retenir :
- Une forêt aléatoire est un ensemble (ou une collection) de plusieurs arbres de décision.
- Elle surmonte le problème de surapprentissage des arbres uniques en introduisant du hasard de deux manières :
- Bootstrap : chaque arbre est entraîné sur un échantillon aléatoire (avec remise) des données.
- Randomisation des caractéristiques : chaque division de nœud ne considère qu'un sous-ensemble aléatoire de caractéristiques.
- La prédiction finale est obtenue par vote majoritaire (en classification) parmi tous les arbres. Ce processus est appelé Bagging.
- Le principal avantage est une précision et une robustesse accrues. L'inconvénient est une perte d'interprétabilité et un coût de calcul plus élevé.
Maintenant que vous savez entraîner des modèles puissants comme les forêts aléatoires, une question se pose : comment choisir les meilleurs hyperparamètres (comme n_estimators ou max_depth) ? Dans la prochaine leçon, nous aborderons les techniques de validation croisée (k-fold cross-validation) et de recherche en grille (GridSearchCV), qui nous permettent d'optimiser méthodiquement nos modèles pour obtenir les meilleures performances possibles.