Comment changer le seuil de classification dans R randomForests?

10

Toute la littérature sur la modélisation de la répartition des espèces suggère que lors de la prévision de la présence / absence d'une espèce à l'aide d'un modèle qui génère des probabilités (par exemple, RandomForests), le choix de la probabilité seuil par laquelle classer réellement une espèce comme présence ou absence est important et il faut pas toujours compter sur la valeur par défaut de 0,5. J'ai besoin d'aide avec ça! Voici mon code:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

À partir de cela, j'ai déterminé que le seuil que j'aimerais utiliser pour classer la présence à partir des probabilités prédites est de 0,7, pas la valeur par défaut de 0,5. Je ne comprends pas totalement quoi faire de ces informations. Dois-je simplement utiliser ce seuil lors de la création d'une carte de ma sortie? Je pourrais facilement créer une sortie mappée avec des probabilités continues, puis simplement reclasser celles ayant des valeurs supérieures à 0,7 comme présentes et celles <0,7 comme absentes.

Ou, est-ce que je veux prendre ces informations et relancer ma modélisation randomForests, en utilisant le paramètre de coupure? Que fait exactement le paramètre de coupure? Cela change-t-il le vote qui en résulte? (dit actuellement qu'il est "majoritaire"). Comment utiliser ce paramètre de coupure? Je ne comprends pas la documentation! Merci!

qch
la source
2
Je dirais que cela peut appartenir ici: La question de (1) les estimations de probabilité de RF, (2) si vous pouvez imposer une fonction de coût au modèle ou devoir l'intégrer dans le modèle, et (3) comment implémenter des fonctions de coût en RF sont des problèmes récurrents qui ne sont pas simplement liés à la programmation.
charles

Réponses:

7

# définir le seuil ou la valeur de coupure à 0,7

cutoff=0.7

# toutes les valeurs inférieures à la valeur seuil 0,7 seront classées comme 0 (présentes dans ce cas)

RFpred[RFpred<cutoff]=0

# toutes les valeurs supérieures à la valeur seuil 0,7 seront classées comme 1 (absent dans ce cas)

 RFpred[RFpred>=cutoff]=1
inondation
la source
1
Pourriez-vous développer un peu votre réponse? À tout le moins, il serait utile d'annoter votre code.
Patrick Coulombe
2
FWIW, je pense que cela est parfaitement suffisant.
Sycorax dit Réintégrer Monica
Cette réponse est parfaitement valable. Je suis d'accord.
Seanosapien
7

Désolé, vous ne l'avez pas obtenu et les tentatives de réponses. Je recommanderais le livre de Max Kuhn pour la couverture de ce problème. C'est une question assez large. Ajoutez juste quelques bits:

  1. Les courbes ROC sont populaires, mais n'ont de sens que si vous essayez de comprendre le compromis entre les résultats de faux négatifs et de faux positifs. Si CostFN = CostFP alors pas sûr qu'ils aient du sens. La statistique c et d'autres mesures dérivées sont toujours utiles. Si vous voulez maximiser la précision - ajustez simplement votre modèle pour cela (le package caret rend cela facile), n'allez pas faire une courbe ROC.
  2. Tout le monde utilise les probabilités dérivées des modèles RF. Je pense qu'il faudrait réfléchir à cela - ce ne sont pas des modèles probabilistes, ils ne sont pas conçus pour cela. Cela fonctionne souvent. Au minimum, je produirais un tracé de validation des probabilités RF sur de nouvelles données si j'étais vraiment intéressé par les probabilités
  3. La manière la plus simple serait d'utiliser "simplement reclasser ceux dont les valeurs supérieures à 0,7 sont présentes et celles <0,7 comme absentes".
  4. Si le coût (FN) n'est pas égal au coût (FP), alors vous devez rendre le RF sensible aux coûts. R ne rend pas cela facile. La fonction de pondération dans le package RandomForest ne fonctionne pas. La meilleure option est de jouer avec l'échantillonnage, cas majoritaire de sous-échantillonnage pour obtenir la fonction de coût que vous souhaitez. Mais la relation entre le taux d'échantillonnage et le coût n'est pas directe. Donc, vous voudrez peut-être rester avec (3)

Mise à jour concernant les poids de classe Andy Liaw:
"L'option" classwt "actuelle dans le package randomForest existe depuis le début, et est différente de la façon dont le code Fortran officiel (version 4 et ultérieure) implémente les poids de classe. Il tient simplement compte de la classe poids dans le calcul de l'indice de Gini lors de la division des nœuds, exactement comme la façon dont un seul arbre CART est fait lorsque les poids de classe sont donnés. les pondérations de l'indice de Gini ne semblent pas avoir beaucoup aidé dans les données extrêmement déséquilibrées (disons 1: 100 ou pire). Si l'utilisation de Gini pondéré vous aide dans votre situation, faites-le par tous les moyens. Je peux seulement dire que dans le passé, cela ne nous a pas donné le résultat que nous attendions. "

Charles
la source
Pourriez-vous expliquer en détail le sous-point (4) pourquoi l'argument de pondération ne fonctionne pas?
Sycorax dit Réintégrer Monica
2
Ma compréhension était qu'il est correctement implémenté dans le code Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) mais pas dans le package R. Ceci est discuté: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) et se concentre sur la nécessité d'utiliser des poids à toutes les étapes de la construction d'arbres - pas seulement Gini split. Donc l'implémentation actuelle de R - qui n'utilise que la pondération lors du fractionnement ne fonctionne pas très bien
charles