Comment interpréter l'OOB et la matrice de confusion pour les forêts aléatoires?

35

J'ai reçu un script R de quelqu'un pour exécuter un modèle de forêt aléatoire. Je l'ai modifié et l'ai exécuté avec certaines données d'employé. Nous essayons de prédire les séparations volontaires.

Voici quelques informations supplémentaires: ceci est un modèle de classification où 0 = employé bloqué, 1 = employé licencié, nous examinons actuellement une dizaine de variables prédictives, les données sont "non équilibrées" en ce sens que les enregistrements terminés représentent environ 7 % du total des enregistrements.

Je lance le modèle avec différentes sélections de fichiers et de fichiers, mais je m'installe au-dessous. Le taux de rendement opérationnel est de 6,8%, ce qui est, à mon avis, bon, mais la matrice de confusion semble raconter une histoire différente pour prédire les termes puisque le taux d'erreur est assez élevé, à 92,79% . le taux d'erreur élevé pour prédire les termes? ou puis-je faire quelque chose pour utiliser RF et obtenir un taux d'erreur plus faible pour prédire les termes?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908
daniellopez46
la source

Réponses:

20

La matrice de confusion est calculée à un point spécifique déterminé par la coupure des votes. Selon vos besoins, c'est-à-dire une meilleure précision (réduire le nombre de faux positifs) ou une meilleure sensibilité (réduire le nombre de faux négatifs), vous préférerez peut-être un seuil différent.

Pour ce faire, je vous recommande de tracer (i) une courbe ROC , (ii) une précision de rappel et (iii) une courbe d'étalonnage afin de sélectionner la valeur de coupure la mieux adaptée à vos besoins. Tous ces éléments peuvent être facilement représentés à l’aide des 2 fonctions suivantes de la bibliothèque ROCR R (disponibles également sur CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Par exemple:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);
Itamar
la source
Je suis intéressé par votre réponse, j'ai comploté avec le code que vous avez partagé. voulez-vous me donner des ressources pour trouver un peu plus de détails sur l'intrigue que vous avez suggérée. ou va écrire quelques phrases sur la façon de l'interpréter. Merci d'avance.
MKS
Je suggère que vous commenciez par l'entrée pour la courbe ROC qui est liée aux entrées ci-dessus et aux autres entrées mentionnées ici.
Itamar
La réponse ne traite pas directement de la limitation de l'arbre de décision dans un ensemble de données fortement asymétrique.
SmallChess
19

Votre jeu est nettement déséquilibré - RF échoue généralement dans ce scénario (c'est-à-dire qu'il ne prédit bien que la classe la plus grande).

Vous devriez essayer d’équilibrer votre ensemble en échantillonnant la classe "0" uniquement pour avoir à peu près la même taille que la classe "1" ou en jouant avec le classwtparamètre.


la source
1
Malgré l'existence d'un classwtparamètre, je ne pense pas qu'il soit encore implémenté dans la randomForest()fonction du randomForestpackage dans R. Per Link . L'avez-vous déjà utilisé? Je l'ai essayé avec des valeurs différentes, mais j'ai obtenu des résultats identiques à ceux par défaut classwt=NULL.
Zhubarb
9

Sur la base de votre matrice de confusion, vous avez 5 908 points de données et la grande majorité d'entre eux sont de type 0 ("employé est resté"). Le classificateur peut donc se permettre d'être "paresseux" et de choisir la classe majoritaire à moins d'être absolument certain qu'un exemple appartient à l'autre classe. Notez que votre taux d'erreur global est d'environ 7%, ce qui est assez proche du pourcentage d'exemples de Class1!

Vous avez quelques options:

  • Supprimez les exemples de Classe0 jusqu'à ce que vous ayez des classes équilibrées. Je ne sais pas s'il existe de la littérature sur la manière de choisir un sous-ensemble parfaitement représentatif (peut-être que quelqu'un d'autre peut intervenir?), Mais vous pouvez commencer par laisser tomber des exemples au hasard. Vous pouvez passer un subsetargument à randomForest, ce qui devrait rendre cela trivial à tester.

  • Ajustez les poids de votre fonction / classe de perte pour compenser le nombre disproportionné de Class0. Vous voulez essentiellement rendre beaucoup plus coûteux pour le classificateur de classer de manière erronée un exemple Class1 par rapport à un exemple Class0. Il peut être judicieux d’essayer Class0 = 1 / 0,07 ~ = 14x Class1 pour commencer, mais vous pouvez ajuster ce paramètre en fonction des demandes de votre entreprise (l’importance d’un type d’erreur). Je pense que le classwtparamètre est ce que vous recherchez ici.

  • Utilisez un échantillonnage stratifié pour vous assurer que vous avez des exemples des deux classes dans les données de formation des arbres. Il est possible que certaines de vos arborescences n'aient été formées que sur des données Class0, ce qui est évidemment de piètre augure pour leurs performances en matière de généralisation. Découvrez l' strataargument.

Matt Krause
la source
Choisir au hasard dans la classe dominante semble raisonnable. Ils n'ont pas besoin d'être égaux: même un ratio de 1: 5 devrait être une amélioration.
Itamar
@ Itmar, c'est certainement ce que j'essaierais en premier. Cependant, il semble qu'il doit exister un moyen de s'assurer que les exemples que vous conservez sont représentatifs de l'ensemble de données plus vaste.
Matt Krause
1
Une option pourrait consister à exécuter la PCA (analyse des composants principaux) sur le plus grand ensemble, à regrouper les points en fonction du premier composant principal et à prélever un échantillon de chaque cluster.
Itamar