L’algorithme Random Forest (forêt aléatoire) fait partie de la famille des modèles d’agrégation et donne de très bons résultats dans la plupart des problématiques de prédiction. Je vous propose dans ce tutoriel de voir comment appliquer un algorithme Random Forest avec R de la préparation des données jusqu’à la restitution des résultats.
Avant d’aller plus loin, il est quasiment indispensable de comprendre comment fonctionne l’algorithme Random Forest.
Quand utiliser un algorithme Random Forest ?
Vous pouvez l’utiliser aussi bien pour les classifications (variable à prédire qualitative) que pour les régressions (variable à prédire quantitative).
Tutoriel Random Forest avec R :
Nous allons utiliser le dataset Iris qui est disponible directement via R et qui est assez simple. L’objectif est de prédire l’espèce d’Iris (Setosa, Versicolor, Virginica) en fonction des caractéristiques de la fleur.
C’est parti :
1) Pour commencer nous allons charger 2 librairies :
- RandomForest qui va permettre de faire le modèle
- Plotly pour faire des graphiques visuels
# Chargement de la librairie
library(randomForest)
library(plotly)
2) On charge ensuite les données..
et on jette un coup d’oeil à la répartition des variables. Nous avons ici une variable à prédire (Species) et 4 variables quantitatives qui vont nous permettre de calculer la probabilité que chaque fleur appartienne à une des espèces. Comme nous avons peu de variables, on peut se permettre de faire un peu d’exploration en affichant les histogrammes de chacune d’entre elles. Ça nous permet d’identifier s’il y a des valeurs extrêmes ou aberrantes à corriger. Ceci dit, cet algorithme est peu influencé par les variables extrêmes.
Donc à moins d’avoir des choses vraiment aberrantes vous pouvez tester sans correction. Pour cet exemple on considère que tout le travail de préparation des données (enrichissement, dédoublonnage, création de nouveaux indicateurs,…) a déjà été fait.
# Chargement des données data(iris) # description des données summary(iris) plot_ly (x=iris$Sepal.Length, type = "histogram") plot_ly (x=iris$Sepal.Width, type = "histogram") plot_ly (x=iris$Petal.Length,type = "histogram") plot_ly (x=iris$Petal.Width, type = "histogram")![]()
3) On applique l’algorithme Random Forest sur les données
Plusieurs paramètres sont à définir et peuvent être ajustés pour optimiser l’algorithme :
- Le nombre d’arbres que la modèle va utiliser – ntree
- Le nombre de variables testées à chaque division d’un noeud – mtry (vous vous souvenez? Random Forest tire aléatoirement les variables qu’il va utiliser pour chaque division d’un noeud. Si ce n’est pas clair, vous pouvez (re)lire l’article Random Forest, comment ça marche?)
Comme nous avons peu de variables explicatives, nous allons utiliser un modèle avec 100 arbres et une sélection de 2 variables par divisions :
# Algorithme Random Forest iris_RandomForest <- randomForest(Species~.,data=iris, ntree = 100, mtry = 2, na.action = na.roughfix)
4) On analyse les résultats et la performance du modèle
Affichons les résultats de l’algorithme, on y retrouve :
- Les paramètres du modèle Number of trees=ntree et No. of variables tried at each split=mtry
- L’erreur Out Of Bag qui est utilisée pour mesurer la performance des modèles d’agrégation. Il s’agit de l’erreur moyenne calculée, à chaque fois, sur les échantillons qui n’ont pas servis à calculer le modèle.
- La matrice de confusion qui permet d’avoir une vision plus détaillée de la performance du modèle. On peut lire en ligne les valeurs réelles et en colonne les valeurs prédites par l’algorithme. Ainsi, les valeurs sur la diagonale correspondent à de bonnes prédictions tandis que les autres valeurs ont mal été prédites. Ici, on voit par exemple que 5 Virginicas ont été prédites comme étant des Versicolors.
# Résultats de l'algoritme
print(iris_RandomForest)
5) Si besoin, on optimise le modèle
Vous pouvez maintenant modifier les paramètres de l’algorithme pour essayer de diminuer l’Out Of Bag error. Vous pouvez modifier à la main les paramètres pour améliorer le modèle ou utiliser la méthode Grid Search. Une fois que les résultats conviennent, nous allons pouvoir expliciter un peu plus l’algorithme pour être en mesure de l’expliquer.
6) On restitue les résultats
Que serons nous en mesure de donner / d’expliquer aux futurs utilisateurs du modèle ?
- L’importance des variables dans le modèle, pour cela nous allons utiliser l’indice Mean Decrease Gini. Plus cet indicateur est élevé plus la variable est importante dans le modèle (il mesure la diminution de l’indice de Gini si l’on n’intégrait plus cette variable dans le modèle)
- Le lien entre les variables les plus importantes et la variable à prédire
- La performance du modèle avec la matrice de confusion qui est plus détaillée que l’Out Of Bar error.
#Variables d'importance iris_RandomForest$importance[order(iris_RandomForest$importance[, 1], decreasing = TRUE), ] # Impact de Petal.Length et de Petal.Width sur Species plot_ly(data = iris, x = ~Species, y = ~Petal.Length, type ='bar') plot_ly(data = iris, x = ~Species, y = ~Petal.Width,type ='bar')
Bien sur les résultats bruts donnés par R ne sont pas présentables et il faut encore les travailler un peu pour avoir un résultat simple :
Il est toujours important de faire valider vos résultats par des personnes qui connaissent la problématique que vous modélisez. Certaines variables pourraient intervenir dans votre modèle mais pourraient ne pas être pertinentes d’un point de vue métier.
Si vous n’êtes pas convaincus par la performance de Random Forest, vous pouvez refaire le même travail en appliquant un arbre de décision avec R.
Ping : Random Forest, tutoriel pas à pas avec Python – Lovely Analytics
Nous avons appris que le procédé classique du scoring dont fait partir le random forest est de predire une arbre optimal sun un échantillon d’apprentissage et de déployer cet arbre sur l’échantillon test again de mieux apprécier son pouvoir de généralisation. Ici ça n’a pas été le cas. Mon soucis est de savoir comment déployer cet arbre générer et quels sont les comandes r qui permettent de le faire. Merci.
Bonjour,
Effectivement, je me rends compte que dans cet article qui date un peu, je n’ai pas splitté mon dataset en échantillon d’apprentissage et de test et je ne regarde la performance que sur les données d’entrainement. Vous avez raison c’est mieux de le faire sur des données de test.
Je mets dans ma to do list de refaire ce tutoriel pour ajouter cette partie.
Merci pour votre commentaire 🙂
Il faut retenir que ce tutoriel m’a permis d’apprendre a predire par la méthode de randomforest sur un échantillon sur r.
Bonjour Marie-Jeanne,
J’apprécie toujours de consulter vos articles qui sont trés agréables à lire. En ce qui concerne les forêts aléatoires, afin d’optimiser le modèle et choisir ntree et mtry, comment faire pour réaliser une validation croisée, Grid Search avec R ?
Par ailleurs, je me demande en terme de langage, est-ce que les bootstrap (échantillons d’individus tirés aléatoirement avec remise) sont la même chose que les arbres ntree ?
cad 1 bootstrap = 1 ntree ou si le paramètre bootstrap représente le nbre d’individus choisis pour faire 1 arbre (par exemple bootstrap = 200 ind) et peut-on modifier ce paramètre bootstrap ?
En vous remerciant par avance pour votre réponse,
Bien cordialement
Bonjour,
J’avoue que je n’ai jamais réalisé de Grid Search avec R.
Depuis plusieurs années maintenant j’utilise plutôt Python.
ntree permet de choisir le nombre d’arbres qui seront créés dans la forêt. A performance égale on choisit la taille minimale.
mtry permet de choisir le nombre de variables tirées aléatoirement pour chaque noeud.