Tutoriel sur les forĂȘts alĂ©atoires en R : algorithme et exemple

⚡ RĂ©sumĂ© intelligent

La méthode Random Forest de R construit des centaines d'arbres de décision à partir d'échantillons bootstrapés et combine leurs votes pour obtenir une prédiction robuste. Ce tutoriel explique comment optimiser les paramÚtres mtry, maxnodes et ntree avec l'outil caret et évaluer le modÚle final sur les données de survie du Titanic.

  • 🌳 Principe de base : Le bagging entraĂźne chaque arbre sur un Ă©chantillon bootstrap et un sous-ensemble alĂ©atoire de prĂ©dicteurs, de sorte que les erreurs individuelles s'annulent lors du vote majoritaire.
  • đŸ§Ș Configuration de la validation : trainControl(method = “cv”, number = 10, search = “grid”) fixe une recherche sur grille Ă  dix plis rĂ©utilisĂ©e Ă  chaque Ă©tape de rĂ©glage.
  • (I.e. Ordre d'accordage : Optimisez d'abord mtry, puis maxnodes, puis ntree, en conservant la valeur gagnante Ă  chaque Ă©tape.
  • 📈 Meilleure configuration : mtry = 4, maxnodes = 24 et ntree = 800 ont produit la meilleure prĂ©cision de validation croisĂ©e sur cet ensemble de donnĂ©es.
  • 🧼 RĂ©sultat du test: confusionMatrix() indique une prĂ©cision de 79.43 %, une sensibilitĂ© de 0.9091 et une spĂ©cificitĂ© de 0.6364 sur les donnĂ©es mises de cĂŽtĂ©.

ForĂȘt alĂ©atoire dans R

Qu’est-ce que la forĂȘt alĂ©atoire dans R ?

Les forĂȘts alĂ©atoires reposent sur une idĂ©e simple : « la sagesse de la foule ». L’agrĂ©gation des rĂ©sultats de plusieurs prĂ©dicteurs donne une meilleure prĂ©diction que le meilleur prĂ©dicteur individuel. Un groupe de prĂ©dicteurs est appelĂ© un ensemble. Ainsi, cette technique est appelĂ©e Apprentissage d'ensemble.

Dans un tutoriel prĂ©cĂ©dent, vous avez appris Ă  utiliser arbres de dĂ©cision faire une prĂ©diction binaire. Pour amĂ©liorer notre technique, nous pouvons former un groupe de Classificateurs d'arbre de dĂ©cision, chacun sur un sous-ensemble alĂ©atoire diffĂ©rent de l'ensemble d'entraĂźnement. Pour faire une prĂ©diction, on collecte les prĂ©dictions de tous les arbres individuels et on renvoie la classe qui reçoit le plus de votes. Cette technique est appelĂ©e ForĂȘt alĂ©atoire.

Avant d'Ă©crire la moindre ligne de code, il est utile de voir prĂ©cisĂ©ment comment la forĂȘt est assemblĂ©e Ă  partir de ces arbres individuels.

Comment fonctionne la mĂ©thode Random Forest dans R ?

Comprendre les mĂ©canismes permet de mieux apprĂ©hender chaque paramĂštre de rĂ©glage. Une forĂȘt alĂ©atoire est construite en quatre Ă©tapes.

  1. Bootstrap Ă©chantillonnage. L'algorithme tire un Ă©chantillon alĂ©atoire de lignes. avec remplacement Pour chaque arbre, on extrait de l'ensemble d'entraĂźnement environ un tiers des lignes de chaque Ă©chantillon ; il s'agit des observations hors Ă©chantillon (OOB).
  2. SĂ©lection alĂ©atoire de fonctionnalitĂ©s. À chaque division, seul un sous-ensemble alĂ©atoire de prĂ©dicteurs est pris en compte. La taille de ce sous-ensemble est le mtry Ce paramĂštre permet d'Ă©viter que tous les arbres ne se ressemblent.
  3. Croissance des arbres non taillĂ©s. Chaque arbre pousse jusqu'Ă  ce qu'il s'arrĂȘte.ping rĂšgle telle que nƓuds max or taille du nƓudOn laisse dĂ©libĂ©rĂ©ment chaque arbre sur-apprendre, car ses erreurs ne sont pas corrĂ©lĂ©es.
  4. AgrĂ©gation. Pour la classification, la forĂȘt renvoie la classe ayant le plus de votes ; pour la rĂ©gression, elle renvoie la prĂ©diction moyenne. Cette Ă©tape de moyennage correspond Ă  ce que le terme ensachage (agrĂ©gation par bootstrap) dĂ©crit.

L'Ă©chantillonnage par lignes et par colonnes est la clĂ© du succĂšs. Un arbre profond isolĂ© prĂ©sente un faible biais et une variance trĂšs Ă©levĂ©e ; la moyenne de centaines d'arbres permet de maintenir un faible biais tout en rĂ©duisant la variance.

Erreur de sortie de sac. Comme chaque observation est exclue d'environ un tiers des arbres, R peut évaluer chaque ligne en utilisant uniquement les arbres qui ne l'ont jamais vue. L'erreur OOB qui en résulte est une estimation de validation intégrée et gratuite, fournie par randomForest().

rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4)
print(rf_oob)   # reports the OOB estimate of error rate

L'erreur OOB est une vérification rapide pratique, mais ce tutoriel utilise une validation croisée à dix plis via caret afin que chaque grille de réglage soit comparée sur des plis identiques.

ForĂȘt alĂ©atoire vs arbre de dĂ©cision dans R

Une forĂȘt alĂ©atoire est un ensemble de forĂȘts alĂ©atoires identiques. arbres de dĂ©cision Ces diffĂ©rences ont Ă©tĂ© abordĂ©es dans le tutoriel prĂ©cĂ©dent ; il est donc important de les Ă©noncer clairement avant de faire votre choix.

CritĂšres Arbre de dĂ©cision ForĂȘt alĂ©atoire
Structure Un arbre Des centaines d'arbres réunis par le vote
Variance ÉlevĂ©, trĂšs sensible Ă  l'Ă©chantillon d'entraĂźnement En faisant la moyenne, on annule les erreurs individuelles.
Risque de surapprentissage Haut sauf s'il est taillĂ© MĂȘme avec des arbres non taillĂ©s, la hauteur est basse.
Interprétabilité EntiÚrement lisible sous forme d'organigramme Seule l'importance variable est lisible
Coût de la formation TrÚs rapide Proportionnel à ntree
Validation intégrée Aucun Estimation de l'erreur hors sac
Fonction R rpart() forĂȘt alĂ©atoire()

Choisissez un arbre unique lorsque vous devez expliquer le processus de dĂ©cision Ă  un public non spĂ©cialisĂ©. PrivilĂ©giez une forĂȘt lorsque la prĂ©cision des prĂ©dictions prime sur la lisibilitĂ© du diagramme.

Avantages et inconvĂ©nients de la forĂȘt alĂ©atoire

Savoir oĂč l'algorithme est fort et oĂč il est faible permet de dĂ©terminer Ă  quel moment les efforts de rĂ©glage Ă  venir valent la peine d'ĂȘtre entrepris.

Avantages

  • PrĂ©cision sans Ă©lagage : La moyenne de nombreux arbres non corrĂ©lĂ©s donne d'excellents rĂ©sultats avec trĂšs peu de rĂ©glages manuels.
  • RĂ©sistant au surajustement : L'ajout d'arbres supplĂ©mentaires n'augmente jamais l'erreur de gĂ©nĂ©ralisation, donc la valeur de ntree peut ĂȘtre augmentĂ©e sans risque.
  • GĂšre les donnĂ©es mixtes : Les prĂ©dicteurs numĂ©riques et factoriels fonctionnent de concert, et la mise Ă  l'Ă©chelle est inutile.
  • Validation et classement gratuits : L'erreur OOB et varImp() n'entraĂźnent aucun coĂ»t de calcul supplĂ©mentaire.

Désavantages

  • PrĂ©dictions opaques : vous ne pouvez pas tracchaque voie de dĂ©cision unique, ce qui est important dans les environnements rĂ©glementĂ©s.
  • Ralentissez dans les grandes forĂȘts : Le temps d'entraĂźnement et de prĂ©diction Ă©volue linĂ©airement avec le nombre d'arbres.
  • Scores d'importance biaisĂ©s : Les variables catĂ©gorielles Ă  plusieurs niveaux peuvent paraĂźtre plus importantes qu'elles ne le sont rĂ©ellement.
  • Extrapolation faible : Pour la rĂ©gression, la forĂȘt ne peut jamais prĂ©dire en dehors de la plage observĂ©e lors de l'entraĂźnement.

Une fois la thĂ©orie et les compromis Ă©tablis, les six Ă©tapes suivantes consistent Ă  construire, optimiser et Ă©valuer de bout en bout une forĂȘt alĂ©atoire sur l'ensemble de donnĂ©es de survie du Titanic.

Étape 1) Importez les donnĂ©es

Pour vous assurer que vous disposez du mĂȘme ensemble de donnĂ©es que dans le didacticiel pour arbres de dĂ©cisionLes ensembles d'entraĂźnement et de test sont hĂ©bergĂ©s en ligne. Vous pouvez les importer sans aucune modification.

library(dplyr)
data_train <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/train.csv")
glimpse(data_train)
data_test <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv") 
glimpse(data_test)

Étape 2) Entraüner le modùle

Une façon d'évaluer les performances d'un modÚle consiste à l'entraßner sur plusieurs petits ensembles de données différents et à les évaluer sur un autre petit ensemble de test. C'est ce qu'on appelle validation croisée k-fold. R Cette fonction divise aléatoirement les données en k sous-ensembles de taille quasi identique. Par exemple, si k = 10, le modÚle est entraßné sur neuf sous-ensembles et évalué sur le sous-ensemble restant. Ce processus est répété jusqu'à ce que tous les sous-ensembles aient été évalués. Cette technique est largement utilisée pour la sélection de modÚles, notamment lorsque le modÚle comporte des paramÚtres à optimiser.

Maintenant que nous avons un moyen d'évaluer notre modÚle, nous devons déterminer quels paramÚtres se généralisent le mieux à des données non observées.

La forĂȘt alĂ©atoire choisit un sous-ensemble alĂ©atoire de fonctionnalitĂ©s et crĂ©e de nombreux arbres de dĂ©cision. Le modĂšle fait la moyenne de toutes les prĂ©dictions des arbres de dĂ©cision.

La mĂ©thode des forĂȘts alĂ©atoires possĂšde des paramĂštres modifiables pour amĂ©liorer la gĂ©nĂ©ralisation des prĂ©dictions. Vous utiliserez la fonction `randomForest()` pour entraĂźner le modĂšle.

La syntaxe de randomForest() est :

randomForest(formula, ntree=n, mtry=FALSE, maxnodes = NULL)
Arguments:
- Formula: Formula of the fitted model
- ntree: number of trees in the forest
- mtry: Number of candidate variables drawn at each split. By default, it is the square root of the number of predictors for classification.
- maxnodes: Set the maximum number of terminal nodes each tree can have
- importance=TRUE: Whether independent variables importance in the random forest be assessed

Note: La forĂȘt alĂ©atoire peut ĂȘtre entraĂźnĂ©e sur plus de paramĂštres. Vous pouvez vous rĂ©fĂ©rer au vignette pour voir les diffĂ©rents paramĂštres.

Le rĂ©glage d'un modĂšle est un travail fastidieux. Les combinaisons de paramĂštres possibles sont nombreuses et il n'est pas toujours possible de toutes les tester. Une bonne alternative consiste Ă  laisser la machine trouver la meilleure combinaison. Deux mĂ©thodes sont disponibles :

  • Recherche alĂ©atoire
  • Recherche de grille

Les deux méthodes sont définies ci-dessous, mais ce tutoriel entraßne le modÚle en utilisant la recherche par grille.

Définition de la recherche en grille

La méthode de recherche par grille est simple, le modÚle sera évalué sur toute la combinaison que vous transmettez dans la fonction, par validation croisée.

Par exemple, vous souhaitez essayer le modĂšle avec 10, 20, 30 arbres et chaque arbre sera testĂ© sur un nombre de mĂštres Ă©gal Ă  1, 2, 3, 4, 5. Ensuite, la machine testera 15 modĂšles diffĂ©rents :

    .mtry ntrees
 1      1     10
 2      2     10
 3      3     10
 4      4     10
 5      5     10
 6      1     20
 7      2     20
 8      3     20
 9      4     20
 10     5     20
 11     1     30
 12     2     30
 13     3     30
 14     4     30
 15     5     30	

L'algorithme Ă©valuera :

randomForest(formula, ntree=10, mtry=1)
randomForest(formula, ntree=10, mtry=2)
randomForest(formula, ntree=10, mtry=3)
randomForest(formula, ntree=20, mtry=2)
...

Chaque combinaison est Ă©valuĂ©e par validation croisĂ©e. L'inconvĂ©nient de la recherche par grille rĂ©side dans le nombre d'expĂ©riences : celui-ci augmente de façon exponentielle lorsque le nombre de combinaisons est Ă©levĂ©. Pour pallier ce problĂšme, on peut recourir Ă  une recherche alĂ©atoire.

Définition de la recherche aléatoire

La principale différence entre la recherche aléatoire et la recherche par grille réside dans le fait que la recherche aléatoire n'évalue pas toutes les combinaisons d'hyperparamÚtres de l'espace de recherche. Au lieu de cela, elle choisit une combinaison au hasard à chaque itération. L'avantage est un coût de calcul bien moindre.

Définir le paramÚtre de contrÎle

Vous procĂ©derez comme suit pour construire et Ă©valuer le modĂšle :

  • Évaluer le modĂšle avec le paramĂštre par dĂ©faut
  • Trouver le meilleur nombre de mtry
  • Trouver le meilleur nombre de maxnodes
  • Trouver le meilleur nombre d'arbres
  • Évaluer le modĂšle sur l'ensemble de donnĂ©es de test

Avant de commencer l'exploration des paramĂštres, vous devez installer deux bibliothĂšques.

  • caret : bibliothĂšque d'apprentissage automatique R. Si tu as installer R avec r-essentiel. Il est dĂ©jĂ  dans la bibliothĂšque
  • e1071 : bibliothĂšque d’apprentissage automatique R.

Vous pouvez les importer avec randomForest :

library(randomForest)
library(caret)
library(e1071)

ParamÚtres par défaut

La validation croisée K-fold est contrÎlée par la fonction trainControl()

trainControl(method = "cv", number = n, search ="grid")
arguments
- method = "cv": The method used to resample the dataset. 
- number = n: Number of folds to create
- search = "grid": Use the grid search method. For the randomized method, use "random"
Note: You can refer to the vignette to see the other arguments of the function.

Vous pouvez essayer d'exécuter le modÚle avec les paramÚtres par défaut et voir le score de précision.

Note: Vous utiliserez les mĂȘmes commandes pendant tout le tutoriel.

# Define the control
trControl <- trainControl(method = "cv",
    number = 10,
    search = "grid")

Vous utiliserez la bibliothĂšque caret pour Ă©valuer votre modĂšle. La bibliothĂšque a une fonction appelĂ©e train() pour Ă©valuer presque tout machine learning algorithme. Autrement dit, vous pouvez utiliser cette fonction pour entraĂźner d’autres algorithmes.

La syntaxe de base est:

train(formula, df, method = "rf", metric= "Accuracy", trControl = trainControl(), tuneGrid = NULL)
argument
- `formula`: Define the formula of the algorithm
- `method`: Define which model to train. Note, at the end of the tutorial, there is a list of all the models that can be trained
- `metric` = "Accuracy": Define how to select the optimal model
- `trControl = trainControl()`: Define the control parameters
- `tuneGrid = NULL`: Return a data frame with all the possible combination

Construisons le modÚle avec les valeurs par défaut.

set.seed(1234)
# Run the model
rf_default <- train(survived~.,
    data = data_train,
    method = "rf",
    metric = "Accuracy",
    trControl = trControl)
# Print the results
print(rf_default)

Code Explication

  • trainControl(method="cv", number=10, search="grid") : Évalue le modĂšle avec une recherche par grille sur 10 plis
  • train(
) : EntraĂźner un modĂšle de forĂȘt alĂ©atoire. Le meilleur modĂšle est choisi avec la mesure de prĂ©cision.

Sortie :

## Random Forest 
## 
## 836 samples
##   7 predictor
##   2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##    2    0.7919248  0.5536486
##    6    0.7811245  0.5391611
##   10    0.7572002  0.4939620
## 
## Accuracy was used to select the optimal model using  the largest value.
## The final value used for the model was mtry = 2.

L'algorithme utilise 500 arbres et a testĂ© trois valeurs diffĂ©rentes de mtry : 2, 6, 10.

La valeur finale utilisée pour le modÚle était mtry = 2, avec une précision de validation croisée de 0.792. Essayons d'obtenir un score plus élevé.

Recherchez le meilleur mtry

Vous pouvez tester le modĂšle avec des valeurs de mtry de 1 Ă  10

set.seed(1234)
tuneGrid <- expand.grid(.mtry = c(1: 10))
rf_mtry <- train(survived~.,
    data = data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 300)
print(rf_mtry)

Code Explication

  • tuneGrid <- expand.grid(.mtry = c(1:10)): Construire un vecteur avec des valeurs de 1 Ă  10

Sortie :

## Random Forest 
## 
## 836 samples
##   7 predictor
##   2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##    1    0.7572576  0.4647368
##    2    0.7979346  0.5662364
##    3    0.8075158  0.5884815
##    4    0.8110729  0.5970664
##    5    0.8074727  0.5900030
##    6    0.8099111  0.5949342
##    7    0.8050918  0.5866415
##    8    0.8050918  0.5855399
##    9    0.8050631  0.5855035
##   10    0.7978916  0.5707336
## 
## Accuracy was used to select the optimal model using  the largest value.
## The final value used for the model was mtry = 4.

La valeur optimale de mtry est 4. Elle est stockĂ©e dans :

rf_mtry$bestTune$mtry

Vous pouvez le stocker et l'utiliser lorsque vous devez régler les autres paramÚtres.

max(rf_mtry$results$Accuracy)

Sortie :

## [1] 0.8110729
best_mtry <- rf_mtry$bestTune$mtry 
best_mtry

Sortie :

## [1] 4

Étape 3) Recherchez les meilleurs maxnodes

Vous devez crĂ©er une boucle pour Ă©valuer les diffĂ©rentes valeurs de maxnodes. Dans le code suivant, vous allez :

  • CrĂ©er une liste
  • CrĂ©ez une variable avec la meilleure valeur du paramĂštre mtry ; Obligatoire
  • CrĂ©er la boucle
  • Stocker la valeur actuelle de maxnode
  • RĂ©sumer les rĂ©sultats
store_maxnode <- list()
tuneGrid <- expand.grid(.mtry = best_mtry)
for (maxnodes in c(5: 15)) {
    set.seed(1234)
    rf_maxnode <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = maxnodes,
        ntree = 300)
    current_iteration <- toString(maxnodes)
    store_maxnode[[current_iteration]] <- rf_maxnode
}
results_mtry <- resamples(store_maxnode)
summary(results_mtry)

Code explication:

  • store_maxnode <- list() : Les rĂ©sultats du modĂšle seront stockĂ©s dans cette liste
  • expand.grid(.mtry=best_mtry) : utiliser la meilleure valeur de mtry
  • for (maxnodes in c(5:15)) { 
 }: Calculer le modĂšle avec des valeurs de maxnodes de 5 Ă  15.
  • maxnodes = maxnodes : À chaque itĂ©ration, maxnodes est Ă©gal Ă  la valeur de la boucle actuelle, c’est-Ă -dire 5, 6, 7, 

  • current_iteration <- toString(maxnodes): Stocke la valeur de maxnodes sous forme de chaĂźne de caractĂšres.
  • store_maxnode[[current_iteration]] <- rf_maxnode: Enregistre le rĂ©sultat du modĂšle dans la liste.
  • resamples(store_maxnode) : Organiser les rĂ©sultats du modĂšle
  • summary(results_mtry) : Imprime le rĂ©sumĂ© de toutes les combinaisons.

Sortie :

## 
## Call:
## summary.resamples(object = results_mtry)
## 
## Models: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
## Number of resamples: 10 
## 
## Accuracy 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 5  0.6785714 0.7529762 0.7903758 0.7799771 0.8168388 0.8433735    0
## 6  0.6904762 0.7648810 0.7784710 0.7811962 0.8125000 0.8313253    0
## 7  0.6904762 0.7619048 0.7738095 0.7788009 0.8102410 0.8333333    0
## 8  0.6904762 0.7627295 0.7844234 0.7847820 0.8184524 0.8433735    0
## 9  0.7261905 0.7747418 0.8083764 0.7955250 0.8258749 0.8333333    0
## 10 0.6904762 0.7837780 0.7904475 0.7895869 0.8214286 0.8433735    0
## 11 0.7023810 0.7791523 0.8024240 0.7943775 0.8184524 0.8433735    0
## 12 0.7380952 0.7910929 0.8144005 0.8051205 0.8288511 0.8452381    0
## 13 0.7142857 0.8005952 0.8192771 0.8075158 0.8403614 0.8452381    0
## 14 0.7380952 0.7941050 0.8203528 0.8098967 0.8403614 0.8452381    0
## 15 0.7142857 0.8000215 0.8203528 0.8075301 0.8378873 0.8554217    0
## 
## Kappa 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 5  0.3297872 0.4640436 0.5459706 0.5270773 0.6068751 0.6717371    0
## 6  0.3576471 0.4981484 0.5248805 0.5366310 0.6031287 0.6480921    0
## 7  0.3576471 0.4927448 0.5192771 0.5297159 0.5996437 0.6508314    0
## 8  0.3576471 0.4848320 0.5408159 0.5427127 0.6200253 0.6717371    0
## 9  0.4236277 0.5074421 0.5859472 0.5601687 0.6228626 0.6480921    0
## 10 0.3576471 0.5255698 0.5527057 0.5497490 0.6204819 0.6717371    0
## 11 0.3794326 0.5235007 0.5783191 0.5600467 0.6126720 0.6717371    0
## 12 0.4460432 0.5480930 0.5999072 0.5808134 0.6296780 0.6717371    0
## 13 0.4014252 0.5725752 0.6087279 0.5875305 0.6576219 0.6678832    0
## 14 0.4460432 0.5585005 0.6117973 0.5911995 0.6590982 0.6717371    0
## 15 0.4014252 0.5689401 0.6117973 0.5867010 0.6507194 0.6955990    0

La meilleure précision moyenne dans cette plage (0.8099) est obtenue pour maxnodes = 14, en haut de l'intervalle testé. Comme la valeur optimale se situe à la limite de la grille, il convient d'étendre la recherche vers le haut.

store_maxnode <- list()
tuneGrid <- expand.grid(.mtry = best_mtry)
for (maxnodes in c(20: 30)) {
    set.seed(1234)
    rf_maxnode <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = maxnodes,
        ntree = 300)
    key <- toString(maxnodes)
    store_maxnode[[key]] <- rf_maxnode
}
results_node <- resamples(store_maxnode)
summary(results_node)

Sortie :

## 
## Call:
## summary.resamples(object = results_node)
## 
## Models: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 
## Number of resamples: 10 
## 
## Accuracy 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 20 0.7142857 0.7821644 0.8144005 0.8075301 0.8447719 0.8571429    0
## 21 0.7142857 0.8000215 0.8144005 0.8075014 0.8403614 0.8571429    0
## 22 0.7023810 0.7941050 0.8263769 0.8099254 0.8328313 0.8690476    0
## 23 0.7023810 0.7941050 0.8263769 0.8111302 0.8447719 0.8571429    0
## 24 0.7142857 0.7946429 0.8313253 0.8135112 0.8417599 0.8690476    0
## 25 0.7142857 0.7916667 0.8313253 0.8099398 0.8408635 0.8690476    0
## 26 0.7142857 0.7941050 0.8203528 0.8123207 0.8528758 0.8571429    0
## 27 0.7023810 0.8060456 0.8313253 0.8135112 0.8333333 0.8690476    0
## 28 0.7261905 0.7941050 0.8203528 0.8111015 0.8328313 0.8690476    0
## 29 0.7142857 0.7910929 0.8313253 0.8087063 0.8333333 0.8571429    0
## 30 0.6785714 0.7910929 0.8263769 0.8063253 0.8403614 0.8690476    0
## 
## Kappa 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 20 0.3956835 0.5316120 0.5961830 0.5854366 0.6661120 0.6955990    0
## 21 0.3956835 0.5699332 0.5960343 0.5853247 0.6590982 0.6919315    0
## 22 0.3735084 0.5560661 0.6221836 0.5914492 0.6422128 0.7189781    0
## 23 0.3735084 0.5594228 0.6228827 0.5939786 0.6657372 0.6955990    0
## 24 0.3956835 0.5600352 0.6337821 0.5992188 0.6604703 0.7189781    0
## 25 0.3956835 0.5530760 0.6354875 0.5912239 0.6554912 0.7189781    0
## 26 0.3956835 0.5589331 0.6136074 0.5969142 0.6822128 0.6955990    0
## 27 0.3735084 0.5852459 0.6368425 0.5998148 0.6426088 0.7189781    0
## 28 0.4290780 0.5589331 0.6154905 0.5946859 0.6356141 0.7189781    0
## 29 0.4070588 0.5534173 0.6337821 0.5901173 0.6423101 0.6919315    0
## 30 0.3297872 0.5534173 0.6202632 0.5843432 0.6590982 0.7189781    0

La meilleure précision moyenne, soit 0.8135, est obtenue avec maxnodes = 24 (maxnodes = 27 donne une moyenne identique, mais son troisiÚme quartile est inférieur). Vous utiliserez donc maxnodes = 24 pour les étapes suivantes.

Étape 4) Recherchez les meilleurs ntrees

Maintenant que vous disposez de la meilleure valeur de mtry et maxnode, vous pouvez rĂ©gler le nombre d'arbres. La mĂ©thode est exactement la mĂȘme que celle de maxnode.

store_maxtrees <- list()
for (ntree in c(250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000)) {
    set.seed(5678)
    rf_maxtrees <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = 24,
        ntree = ntree)
    key <- toString(ntree)
    store_maxtrees[[key]] <- rf_maxtrees
}
results_tree <- resamples(store_maxtrees)
summary(results_tree)

Sortie :

## 
## Call:
## summary.resamples(object = results_tree)
## 
## Models: 250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000 
## Number of resamples: 10 
## 
## Accuracy 
##           Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 250  0.7380952 0.7976190 0.8083764 0.8087010 0.8292683 0.8674699    0
## 300  0.7500000 0.7886905 0.8024240 0.8027199 0.8203397 0.8452381    0
## 350  0.7500000 0.7886905 0.8024240 0.8027056 0.8277623 0.8452381    0
## 400  0.7500000 0.7886905 0.8083764 0.8051009 0.8292683 0.8452381    0
## 450  0.7500000 0.7886905 0.8024240 0.8039104 0.8292683 0.8452381    0
## 500  0.7619048 0.7886905 0.8024240 0.8062914 0.8292683 0.8571429    0
## 550  0.7619048 0.7886905 0.8083764 0.8099062 0.8323171 0.8571429    0
## 600  0.7619048 0.7886905 0.8083764 0.8099205 0.8323171 0.8674699    0
## 800  0.7619048 0.7976190 0.8083764 0.8110820 0.8292683 0.8674699    0
## 1000 0.7619048 0.7976190 0.8121510 0.8086723 0.8303571 0.8452381    0
## 2000 0.7619048 0.7886905 0.8121510 0.8086723 0.8333333 0.8452381    0
## 
## Kappa 
##           Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 250  0.4061697 0.5667400 0.5836013 0.5856103 0.6335363 0.7196807    0
## 300  0.4302326 0.5449376 0.5780349 0.5723307 0.6130767 0.6710843    0
## 350  0.4302326 0.5449376 0.5780349 0.5723185 0.6291592 0.6710843    0
## 400  0.4302326 0.5482030 0.5836013 0.5774782 0.6335363 0.6710843    0
## 450  0.4302326 0.5449376 0.5780349 0.5750587 0.6335363 0.6710843    0
## 500  0.4601542 0.5449376 0.5780349 0.5804340 0.6335363 0.6949153    0
## 550  0.4601542 0.5482030 0.5857118 0.5884507 0.6396872 0.6949153    0
## 600  0.4601542 0.5482030 0.5857118 0.5884374 0.6396872 0.7196807    0
## 800  0.4601542 0.5667400 0.5836013 0.5910088 0.6335363 0.7196807    0
## 1000 0.4601542 0.5667400 0.5961590 0.5857446 0.6343666 0.6678832    0
## 2000 0.4601542 0.5482030 0.5961590 0.5862151 0.6440678 0.6656337    0

Vous avez votre modĂšle final. Vous pouvez entraĂźner la forĂȘt alĂ©atoire avec les paramĂštres suivants :

  • ntree = 800 : 800 arbres seront entraĂźnĂ©s
  • mtry = 4 : 4 caractĂ©ristiques candidates sont tirĂ©es Ă  chaque division.
  • maxnodes = 24 : Chaque arbre est limitĂ© Ă  24 nƓuds terminaux (feuilles).
fit_rf <- train(survived~.,
    data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 800,
    maxnodes = 24)

Étape 5) Évaluer le modùle

Le curseur de bibliothÚque a pour fonction de faire des prédictions.

predict(model, newdata= df)
argument
- `model`: Define the model evaluated before. 
- `newdata`: Define the dataset to make prediction
prediction <-predict(fit_rf, data_test)

Vous pouvez utiliser la prédiction pour calculer la matrice de confusion et voir le score de précision

confusionMatrix(prediction, data_test$survived)

Sortie :

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  110  32
##        Yes  11  56
##                                          
##                Accuracy : 0.7943         
##                  95% CI : (0.733, 0.8469)
##     No Information Rate : 0.5789         
##     P-Value [Acc > NIR] : 3.959e-11      
##                                          
##                   Kappa : 0.5638         
##  Mcnemar's Test P-Value : 0.002289       
##                                          
##             Sensitivity : 0.9091         
##             Specificity : 0.6364         
##          Pos Pred Value : 0.7746         
##          Neg Pred Value : 0.8358         
##              Prevalence : 0.5789         
##          Detection Rate : 0.5263         
##    Detection Prevalence : 0.6794         
##       Balanced Accuracy : 0.7727         
##                                          
##        'Positive' Class : No             
## 

Le modĂšle atteint une prĂ©cision de 0.7943, soit 79.43 % sur l'ensemble de test non utilisĂ© pour l'entraĂźnement, ce qui est supĂ©rieur Ă  la configuration par dĂ©faut. Sa sensibilitĂ© est de 0.9091 et sa spĂ©cificitĂ© de 0.6364 ; le modĂšle identifie donc les patients dĂ©cĂ©dĂ©s avec une fiabilitĂ© bien supĂ©rieure Ă  celle des survivants.

Étape 6) Visualiser le rĂ©sultat

Enfin, vous pouvez examiner l'importance des caractéristiques avec la fonction `varImp()`. Les caractéristiques les plus importantes sont le sexe et l'ùge. Cela n'est pas surprenant, car les caractéristiques importantes ont tendance à se situer prÚs de la racine de l'arbre, tandis que les caractéristiques moins importantes se trouvent généralement prÚs des feuilles.

varImp(fit_rf)

Sortie :

## rf variable importance
## 
##              Importance
## sexmale         100.000
## age              28.014
## pclassMiddle     27.016
## fare             21.557
## pclassUpper      16.324
## sibsp            11.246
## parch             5.522
## embarkedC         4.908
## embarkedQ         1.420
## embarkedS         0.000		

ForĂȘt alĂ©atoire dans R : Guide rapide des fonctions

Le tableau ci-dessous répertorie chaque fonction utilisée au cours des six étapes, le package qui la fournit et les paramÚtres qu'elle attend.

BibliothĂšque Objectif Fonction ParamĂštres
alĂ©atoireforĂȘt CrĂ©er une forĂȘt alĂ©atoire forĂȘt alĂ©atoire() formule, ntree=n, mtry=FALSE, maxnodes = NULL
caret Créer une validation croisée à k plis trainControl() méthode = « cv », nombre = n, recherche = « grille »
caret EntraĂźner une forĂȘt alĂ©atoire former() formule, df, mĂ©thode = « rf », metric = « PrĂ©cision », trControl = trainControl(), tuneGrid = NULL
caret Prédire hors échantillon prévoir modÚle, newdata= df
caret Matrice de confusion et statistiques confusionMatrix() modĂšle, y test
caret Importance variable varImp() modĂšle

Annexe : ModĂšles disponibles chez caret

La fonction `train()` peut s'adapter Ă  bien plus de modĂšles que les forĂȘts alĂ©atoires. ExĂ©cutez la commande ci-dessous pour afficher tous les identifiants de modĂšles pris en charge par `caret`, puis transmettez-en un Ă  l'argument de la mĂ©thode.

names(getModelInfo())

Sortie :

##   [1] "ada"                 "AdaBag"              "AdaBoost.M1"        ##   [4] "adaboost"            "amdai"               "ANFIS"              ##   [7] "avNNet"              "awnb"                "awtan"              ##  [10] "bag"                 "bagEarth"            "bagEarthGCV"        ##  [13] "bagFDA"              "bagFDAGCV"           "bam"                ##  [16] "bartMachine"         "bayesglm"            "binda"              ##  [19] "blackboost"          "blasso"              "blassoAveraged"     ##  [22] "bridge"              "brnn"                "BstLm"              ##  [25] "bstSm"               "bstTree"             "C5.0"               ##  [28] "C5.0Cost"            "C5.0Rules"           "C5.0Tree"           ##  [31] "cforest"             "chaid"               "CSimca"             ##  [34] "ctree"               "ctree2"              "cubist"             ##  [37] "dda"                 "deepboost"           "DENFIS"             ##  [40] "dnn"                 "dwdLinear"           "dwdPoly"            ##  [43] "dwdRadial"           "earth"               "elm"                ##  [46] "enet"                "evtree"              "extraTrees"         ##  [49] "fda"                 "FH.GBML"             "FIR.DM"             ##  [52] "foba"                "FRBCS.CHI"           "FRBCS.W"            ##  [55] "FS.HGD"              "gam"                 "gamboost"           ##  [58] "gamLoess"            "gamSpline"           "gaussprLinear"      ##  [61] "gaussprPoly"         "gaussprRadial"       "gbm_h3o"            ##  [64] "gbm"                 "gcvEarth"            "GFS.FR.MOGUL"       ##  [67] "GFS.GCCL"            "GFS.LT.RS"           "GFS.THRIFT"         ##  [70] "glm.nb"              "glm"                 "glmboost"           ##  [73] "glmnet_h3o"          "glmnet"              "glmStepAIC"         ##  [76] "gpls"                "hda"                 "hdda"               ##  [79] "hdrda"               "HYFIS"               "icr"                ##  [82] "J48"                 "JRip"                "kernelpls"          ##  [85] "kknn"                "knn"                 "krlsPoly"           ##  [88] "krlsRadial"          "lars"                "lars2"              ##  [91] "lasso"               "lda"                 "lda2"               ##  [94] "leapBackward"        "leapForward"         "leapSeq"            ##  [97] "Linda"               "lm"                  "lmStepAIC"          ## [100] "LMT"                 "loclda"              "logicBag"           ## [103] "LogitBoost"          "logreg"              "lssvmLinear"        ## [106] "lssvmPoly"           "lssvmRadial"         "lvq"                ## [109] "M5"                  "M5Rules"             "manb"               ## [112] "mda"                 "Mlda"                "mlp"                ## [115] "mlpKerasDecay"       "mlpKerasDecayCost"   "mlpKerasDropout"    ## [118] "mlpKerasDropoutCost" "mlpML"               "mlpSGD"             ## [121] "mlpWeightDecay"      "mlpWeightDecayML"    "monmlp"             ## [124] "msaenet"             "multinom"            "mxnet"              ## [127] "mxnetAdam"           "naive_bayes"         "nb"                 ## [130] "nbDiscrete"          "nbSearch"            "neuralnet"          ## [133] "nnet"                "nnls"                "nodeHarvest"        ## [136] "null"                "OneR"                "ordinalNet"         ## [139] "ORFlog"              "ORFpls"              "ORFridge"           ## [142] "ORFsvm"              "ownn"                "pam"                ## [145] "parRF"               "PART"                "partDSA"            ## [148] "pcaNNet"             "pcr"                 "pda"                ## [151] "pda2"                "penalized"           "PenalizedLDA"       ## [154] "plr"                 "pls"                 "plsRglm"            ## [157] "polr"                "ppr"                 "PRIM"               ## [160] "protoclass"          "pythonKnnReg"        "qda"                ## [163] "QdaCov"              "qrf"                 "qrnn"               ## [166] "randomGLM"           "ranger"              "rbf"                ## [169] "rbfDDA"              "Rborist"             "rda"                ## [172] "regLogistic"         "relaxo"              "rf"                 ## [175] "rFerns"              "RFlda"               "rfRules"            ## [178] "ridge"               "rlda"                "rlm"                ## [181] "rmda"                "rocc"                "rotationForest"     ## [184] "rotationForestCp"    "rpart"               "rpart1SE"           ## [187] "rpart2"              "rpartCost"           "rpartScore"         ## [190] "rqlasso"             "rqnc"                "RRF"                ## [193] "RRFglobal"           "rrlda"               "RSimca"             ## [196] "rvmLinear"           "rvmPoly"             "rvmRadial"          ## [199] "SBC"                 "sda"                 "sdwd"               ## [202] "simpls"              "SLAVE"               "slda"               ## [205] "smda"                "snn"                 "sparseLDA"          ## [208] "spikeslab"           "spls"                "stepLDA"            ## [211] "stepQDA"             "superpc"             "svmBoundrangeString"## [214] "svmExpoString"       "svmLinear"           "svmLinear2"         ## [217] "svmLinear3"          "svmLinearWeights"    "svmLinearWeights2"  ## [220] "svmPoly"             "svmRadial"           "svmRadialCost"      ## [223] "svmRadialSigma"      "svmRadialWeights"    "svmSpectrumString"  ## [226] "tan"                 "tanSearch"           "treebag"            ## [229] "vbmpRadial"          "vglmAdjCat"          "vglmContRatio"      ## [232] "vglmCumulative"      "widekernelpls"       "WM"                 ## [235] "wsrf"                "xgbLinear"           "xgbTree"            ## [238] "xyf"

FAQ

Commencez par 500, la valeur par dĂ©faut de randomForest(). La prĂ©cision se stabilise gĂ©nĂ©ralement entre 300 et 1000 arbres. Augmenter ntree n'affecte pas la prĂ©cision, seulement le temps d'exĂ©cution ; augmentez-le donc jusqu'Ă  ce que la courbe d'erreur s'aplatisse.

L'erreur hors échantillon (out-of-bag) évalue chaque observation en utilisant uniquement les arbres entraßnés sans elle. C'est une estimation rapide et non biaisée qui remplace souvent la validation croisée, bien que la validation croisée k-fold reste préférable pour comparer des grilles d'optimisation sur des plis identiques.

Oui. Fournissez une rĂ©ponse numĂ©rique et randomForest() calculera la moyenne des prĂ©dictions de l'arbre au lieu d'effectuer un vote. Dans caret, conservez method = « rf Â» et remplacez l'argument metric par RMSE au lieu de Accuracy.

Les forĂȘts alĂ©atoires demeurent une rĂ©fĂ©rence pour les problĂšmes d'IA tabulaires tels que le taux de dĂ©sabonnement, la fraude et l'Ă©valuation des risques. Les Ă©quipes Ă©valuent souvent les performances d'une forĂȘt alĂ©atoire avant d'opter pour le gradient boosting ou les rĂ©seaux de neurones.

Oui. Les assistants IA peuvent créer des grilles de réglage, expliquer les résultats du rééchantillonnage et suggérer des plages de valeurs mtry pertinentes. Il est toujours conseillé de réexécuter le code généré avec une valeur initiale fixe afin de garantir la reproductibilité de la précision obtenue.

Résumez cet article avec :