Ce document présente la mise en oeuvre de la méthode Random Forest pour les analyses de données
Les packages nécessaire à la mise en oeuvre de la random forest avec R sont dplyr (manipulation des données), randomForest (réalisation du modèle), randomForestExplainer (graphiques) et ggplot2 (graphiques).
Le style des graphiques générés par le package ggplot2 peut être paramétré (voir objet “my.theme”).
library(dplyr)
library(randomForest)
library(randomForestExplainer)
library(ggplot2)
my.theme <- theme_bw() + theme(
axis.title.x = element_text(face="bold", color="black", size=12),
axis.title.y = element_text(face="bold", color="black", size=12),
axis.text = element_text(size=12))
L’exemple utilisé ici provient du jeu de données Fat Filled 2018 et portera sur la recherche des facteurs d’influence de la teneur en eau des poudres.
Dataset <- read.table("I:/R&D/Mathieu/01.Projets/01.Fat Filled/01.Fat Filled/01.Mouillabilité/Suivi de productions/Data/Données CSV/Suivi FF 2018 - jeu de données final - 285 productions.csv",header=TRUE, sep=";", na.strings="NA", dec=",", strip.white=TRUE)
Certaines variables quantitatives présentant autant de niveau que d’individus, comme la date ou l’horodatage par exemple, peuvent être supprimées avant de mettre en oeuvre la random forest.
Il peut également être utile de supprimer les valeurs manquantes ou les variables présentant de nombreuses valeurs manquantes, voir de passer les nombres décimaux en nombres entiers.
Dataset$Date.Fab.=NULL
Le jeu de données Dataset va être découpé en deux jeu de données :
train qui est le jeu de données sur lequel on va entraîner le modèle et qui correspond à 80% des données de Dataset.
test qui est le jeu de données sur lequel on va tester le modèle créé sur le jeu de données train pour évaluer la performance du modèle, et qui correspond à 20% des données de Dataset.
train <- Dataset %>% sample_frac(0.8)
test<-anti_join(Dataset, train)
Pour l’exemple ici, on va essayer de modéliser la teneur en eau en fonction de toutes les autres variables du jeu de données.
set.seed(123) # permet de fixer les paramètres aléatoires de la rf
rf=randomForest(Teneur.en.eau~ . , data = train,importance=T,ntree=500)
rf
##
## Call:
## randomForest(formula = Teneur.en.eau ~ ., data = train, importance = T, ntree = 500)
## Type of random forest: regression
## Number of trees: 500
## No. of variables tried at each split: 10
##
## Mean of squared residuals: 0.01941609
## % Var explained: 56.45
La variable que l’on cherche à modéliser ici est une variable quantitative, on réalise donc une random forest de type régression. On observe ici que la variance expliquée par le modèle créé est d’un peu plus de 55% et l’erreur résiduelle de 0,020 environ.
On peut ensuite regarder si le nombre d’arbres choisi par défaut (ntree=500) était suffisant.
plot(rf)
On observe qu’avec 500 arbres nous avons une erreur minimale.
On pourrait même ici réduire à 200 ou 300 arbres pour gagner en temps de calcul sans dégrader la qualité du modèle.
On peut donc continuer et observer l’importance des variables dans le modèle créé.
varImpPlot(rf)
Deux graphiques sont générés ici :
%IncMSE : correspond au “poids” de la variable dans la diminution de l’erreur par le modèle.
IncNodePurity : correspond à la capacité de la variable à bien discriminer les individus à son noeud.
Il est alors possible de visualiser les variables du modèles en fonction de ces deux paramètres.
importance_frame <- measure_importance(rf)
plot_multi_way_importance(importance_frame, x_measure = "mse_increase", y_measure = "node_purity_increase", size_measure = "p_value")
On observe alors qu’ici, les variables ayant le plus d’impact sur la teneur en eau dans notre jeu de données sont :
La température de la plaque
La pression des buses
La température de la poudre
Le mois de l’année
On va ensuite vérifier que le modèle réalisé est pertinent en essayant de prédire la teneur en eau des individus du jeu de données test.
rf.results <- predict(rf,test)
results <- data.frame(actual = test$Teneur.en.eau, prediction = rf.results)
head(results)
On peut alors construire un graphique pour comparer la teneur en eau des individus du jeu de données test et celle prédite par la random forest.
ggplot(results, aes(x=actual, y=prediction)) + geom_point(size=4,alpha = 0.5,color="darkblue") + my.theme + ggtitle("Random Forest - Teneur en eau") + xlab(label="Actual") + ylab(label="Prediction") + theme(legend.position = "none") + stat_smooth(method = "lm",se = T, size = 1,color="red")
On observe bien que le modèle généré par la random forest permet de prédire la teneur en eau des poudres fat filled.