Random Forest (Forêt Aléatoire)
Random Forest est un algorithme d’ensemble qui entraîne un grand nombre d’arbres de décision sur des sous-échantillons aléatoires des données, puis agrège leurs prédictions (vote majoritaire en classification, moyenne en régression) pour produire un modèle robuste et précis.
Inventé par Leo Breiman en 2001, Random Forest est l’un des algorithmes les plus utilisés en machine learning grâce à son excellent compromis entre performance, facilité d’utilisation et interprétabilité. Il fonctionne aussi bien en classification qu’en régression, gère naturellement les features numériques et catégorielles, nécessite peu de prétraitement, et fournit nativement une mesure d’importance des features. C’est souvent le premier modèle non linéaire à essayer après une baseline linéaire.
- Auteur
- Leo Breiman (2001)
- Type
- Ensemble learning (bagging d’arbres de décision)
- Tâches
- Classification + Régression
- Principe
- Entraîner N arbres sur des sous-échantillons, agréger les prédictions
- Hyperparamètres clés
n_estimators,max_depth,max_features,min_samples_split- Feature importance
- Oui (Gini importance + permutation importance)
- Calcul Python
sklearn.ensemble.RandomForestClassifier/RandomForestRegressor
Comment fonctionne Random Forest
Le bagging : la fondation
Random Forest repose sur le bagging (Bootstrap Aggregating). Chaque arbre est entraîné sur un sous-échantillon bootstrap des données : on tire aléatoirement N observations avec remplacement (certaines apparaissent plusieurs fois, d’autres pas du tout). En moyenne, chaque arbre voit environ 63,2 % des données originales. Les ~36,8 % restantes (échantillons « out-of-bag », OOB) servent d’ensemble de validation interne.
La randomisation des features : la clé
La différence entre Random Forest et un simple bagging d’arbres est la sélection aléatoire des features. À chaque noeud de chaque arbre, seul un sous-ensemble aléatoire de features est considéré pour le split. Cela force les arbres à être différents les uns des autres (décorrélés), ce qui améliore la diversité de l’ensemble et réduit la variance des prédictions.
Le nombre de features considérées à chaque split est contrôlé par max_features. Les valeurs par défaut de scikit-learn sont 'sqrt' (racine carrée du nombre total de features) pour la classification et 1.0 (toutes les features) pour la régression.
L’agrégation des prédictions
En classification, chaque arbre vote pour une classe. La classe qui reçoit le plus de votes gagne (vote majoritaire). En régression, chaque arbre produit une valeur. La prédiction finale est la moyenne de toutes les valeurs.
Cette agrégation de centaines d’arbres imparfaits produit un modèle beaucoup plus stable et précis que n’importe quel arbre individuel. C’est le principe de la « sagesse des foules » appliqué aux modèles de ML.
Les hyperparamètres clés
| Paramètre | Défaut (sklearn) | Effet | Conseil de tuning |
|---|---|---|---|
n_estimators |
100 | Nombre d’arbres dans la forêt | Plus = mieux (jusqu’à un plateau). 200-500 est généralement suffisant. |
max_depth |
None (illimité) | Profondeur maximale de chaque arbre | Limiter à 10-30 pour réduire l’overfitting et la mémoire. |
max_features |
‘sqrt’ (classif) | Features considérées par split | ‘sqrt’ ou ‘log2’. Baisser pour plus de diversité entre arbres. |
min_samples_split |
2 | Min échantillons pour diviser un noeud | Augmenter (5-20) pour réduire l’overfitting. |
min_samples_leaf |
1 | Min échantillons dans une feuille | Augmenter (5-10) pour des arbres plus simples. |
bootstrap |
True | Utiliser le bootstrap (échantillonnage avec remplacement) | Garder True (c’est le fondement du Random Forest). |
class_weight |
None | Pondération des classes | ‘balanced’ pour les datasets déséquilibrés. |
Random Forest en Python avec scikit-learn
Classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import classification_report
# Charger les données
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
# Entraîner le modèle
rf = RandomForestClassifier(n_estimators=200, max_depth=20,
random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)
# Évaluation
print(f"Score test : {rf.score(X_test, y_test):.4f}")
print(f"Score OOB : {rf.oob_score_:.4f}" if hasattr(rf, 'oob_score_') else "")
print(classification_report(y_test, rf.predict(X_test)))
Régression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
rf_reg = RandomForestRegressor(n_estimators=200, max_depth=15,
random_state=42, n_jobs=-1)
rf_reg.fit(X_train, y_train)
y_pred = rf_reg.predict(X_test)
print(f"R² : {r2_score(y_test, y_pred):.4f}")
print(f"RMSE : {np.sqrt(mean_squared_error(y_test, y_pred)):.4f}")
L’importance des features : la force de Random Forest
L’une des raisons majeures d’utiliser Random Forest est sa capacité native à mesurer l’importance des features. Trois méthodes existent.
Importance par impureté (Gini importance)
Calculée pendant l’entraînement, gratuitement. Pour chaque feature, on mesure combien elle réduit en moyenne l’impureté (Gini pour la classification, variance pour la régression) à chaque split. C’est l’attribut .feature_importances_ de scikit-learn.
import pandas as pd
import matplotlib.pyplot as plt
# Importance Gini
importances = rf.feature_importances_
feature_names = load_breast_cancer().feature_names
feat_imp = pd.Series(importances, index=feature_names)
feat_imp.nlargest(10).plot(kind='barh', color='#7c3aed')
plt.xlabel('Gini Importance')
plt.title('Top 10 features (Gini)')
plt.tight_layout()
plt.show()
Permutation importance
Plus fiable que la Gini importance. On mélange aléatoirement les valeurs d’une feature et on mesure la baisse de performance du modèle. Si la performance chute fortement, la feature est importante. Calculée sur le jeu de test, elle est insensible aux biais de la Gini importance.
from sklearn.inspection import permutation_importance
result = permutation_importance(rf, X_test, y_test,
n_repeats=10, random_state=42,
n_jobs=-1)
perm_imp = pd.Series(result.importances_mean,
index=feature_names)
perm_imp.nlargest(10).plot(kind='barh', color='#f97316')
plt.xlabel('Mean Accuracy Decrease')
plt.title('Top 10 features (Permutation)')
plt.tight_layout()
plt.show()
SHAP values
Les valeurs SHAP (SHapley Additive exPlanations) quantifient la contribution de chaque feature à chaque prédiction individuelle. C’est la méthode la plus complète et la plus rigoureuse, mais aussi la plus coûteuse en calcul. Particulièrement utile pour l’explicabilité du modèle.
Le score Out-of-Bag (OOB)
Grâce au bootstrap, chaque arbre n’a pas vu ~36,8 % des données. Random Forest peut utiliser ces échantillons non vus pour estimer la performance du modèle sans jeu de validation séparé. C’est le score OOB, activé avec oob_score=True.
rf = RandomForestClassifier(n_estimators=200, oob_score=True,
random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)
print(f"Score OOB : {rf.oob_score_:.4f}")
Le score OOB est une estimation honnête de la performance de généralisation, similaire à une validation croisée mais gratuite en calcul. Il est particulièrement utile pour estimer rapidement si le modèle overfitte.
Random Forest vs Gradient Boosting
| Critère | Random Forest | XGBoost / LightGBM |
|---|---|---|
| Méthode d’ensemble | Bagging (parallèle) | Boosting (séquentiel) |
| Performance brute | Très bonne | Souvent meilleure (surtout après tuning) |
| Risque d’overfitting | Faible (plus d’arbres = mieux) | Plus élevé (nécessite du tuning) |
| Tuning nécessaire | Peu (fonctionne bien « out of the box ») | Significatif (learning rate, depth, etc.) |
| Parallélisation | Naturelle (arbres indépendants) | Limitée (arbres séquentiels) |
| Feature importance | Gini + permutation | Gain + permutation + SHAP |
| Données manquantes | Supporté nativement (sklearn 1.8) | Supporté nativement |
| Quand préférer | Baseline rapide, peu de tuning, interprétabilité | Performance maximale, compétitions Kaggle |
En résumé : Random Forest est le meilleur choix quand vous voulez un modèle performant rapidement, sans passer des heures à tuner des hyperparamètres. XGBoost/LightGBM sont le choix quand vous cherchez la performance maximale et êtes prêt à investir dans le tuning.
Pourquoi Random Forest est si populaire
Peu de prétraitement : pas besoin de normaliser les features (les arbres sont invariants aux transformations monotones). Gère les features numériques et catégorielles (avec encodage). Supporte nativement les valeurs manquantes (scikit-learn 1.8).
Robustesse : résistant aux outliers (les arbres les isolent naturellement), peu sensible aux hyperparamètres (fonctionne bien avec les défauts), et le risque d’overfitting diminue (ou stagne) quand on augmente le nombre d’arbres.
Interprétabilité : feature importance native, possibilité d’inspecter les arbres individuels, compatible avec SHAP et LIME pour l’explicabilité.
Polyvalence : classification, régression, feature selection, détection d’anomalies (via Isolation Forest, un cousin), et estimation de l’incertitude (via la variance entre les arbres).
Limites de Random Forest
Performance inférieure au gradient boosting : sur la plupart des datasets tabulaires, XGBoost/LightGBM surpassent Random Forest de quelques points de pourcentage après tuning. La différence est souvent faible, mais elle existe.
Mémoire et vitesse : une forêt de 500 arbres profonds consomme beaucoup de mémoire et peut être lente en inférence. Pour la production, envisagez de limiter la profondeur ou d’utiliser HistGradientBoostingClassifier (natif scikit-learn, beaucoup plus rapide).
Extrapolation impossible : un Random Forest ne peut pas prédire en dehors de la plage des données d’entraînement. Si la cible est un prix qui a augmenté de 20 % depuis l’entraînement, le modèle ne pourra pas capter cette tendance. Les modèles linéaires n’ont pas ce problème.
Données de très haute dimension avec peu d’échantillons : quand d >> n (beaucoup plus de features que d’observations), Random Forest peut overfitter malgré le bagging. Une réduction de dimensionnalité ou une sélection de features en amont est recommandée.
Verdict
Random Forest est le couteau suisse du ML tabulaire. Pas toujours le meilleur modèle absolu, mais presque toujours dans le top 3, et de loin le plus facile à déployer. C’est le modèle que tout data scientist devrait essayer en premier après une baseline linéaire : il établit un plancher de performance élevé avec un minimum d’effort.
Notre recommandation : commencez par Random Forest avec les défauts de scikit-learn (200-500 arbres), examinez les feature importances, puis décidez si le gain potentiel de XGBoost/LightGBM justifie le temps de tuning supplémentaire. Dans de nombreux cas industriels, la réponse est non.
Questions fréquentes sur Random Forest
Combien d’arbres faut-il dans un Random Forest ?
En général, 200 à 500 arbres suffisent. La performance s’améliore rapidement avec les premiers arbres, puis plafonne. Augmenter au-delà de 500 apporte rarement un gain significatif mais augmente le temps de calcul et la mémoire. Commencez par 200, tracez la courbe OOB score vs n_estimators, et arrêtez quand le score se stabilise. Un avantage de Random Forest : plus d’arbres ne cause jamais d’overfitting (contrairement au gradient boosting).
Faut-il normaliser les données avant Random Forest ?
Non, ce n’est pas nécessaire. Les arbres de décision (et donc Random Forest) sont invariants aux transformations monotones : normaliser, standardiser ou appliquer une transformation log ne change pas les splits. C’est un avantage majeur par rapport aux modèles linéaires, SVM ou réseaux de neurones qui nécessitent une normalisation.
Quelle est la différence entre Random Forest et XGBoost ?
Random Forest utilise le bagging (arbres entraînés indépendamment en parallèle, résultats moyennés). XGBoost utilise le boosting (arbres entraînés séquentiellement, chaque arbre corrigeant les erreurs du précédent). XGBoost est souvent plus performant après tuning, mais Random Forest est plus simple à utiliser, moins sensible aux hyperparamètres, et le risque d’overfitting est moindre. Commencez par Random Forest, puis essayez XGBoost si vous avez besoin de quelques points de performance en plus.
Comment interpréter la feature importance de Random Forest ?
La Gini importance (.feature_importances_) mesure combien chaque feature réduit l’impureté en moyenne à travers tous les arbres. Elle est rapide mais biaisée vers les features à haute cardinalité. La permutation importance (permutation_importance()) mesure la baisse de performance quand on mélange les valeurs d’une feature, et est plus fiable. Utilisez les deux et comparez. Si une feature est importante dans les deux méthodes, vous pouvez avoir confiance. Si elle n’est importante que dans la Gini importance, méfiez-vous.
Random Forest peut-il gérer les données déséquilibrées ?
Oui, avec le paramètre class_weight='balanced' qui pondère les classes inversement à leur fréquence. Cela force le modèle à accorder plus d’importance à la classe minoritaire. Vous pouvez aussi combiner Random Forest avec du sur-échantillonnage (SMOTE) de la classe minoritaire. Et bien sûr, utilisez des métriques adaptées (F1-Score, AUC-ROC, MCC) au lieu de l’accuracy pour évaluer les performances.