web-dev-qa-db-fra.com

En utilisant le package randomForest dans R, comment obtenir les probabilités du modèle de classification?

TL; DR:

Y a-t-il quelque chose que je peux signaler dans l'originalrandomForest appel pour éviter d'avoir à relancer lepredict fonction pour obtenir probabilités catégoriques prévues, au lieu de la seule catégorie probable?

Détails:

J'utilise le package randomForest .

J'ai un modèle quelque chose comme:

model <- randomForest(x=out.data[train.rows, feature.cols],
                      y=out.data[train.rows, response.col],
                      xtest=out.data[test.rows, feature.cols],
                      ytest=out.data[test.rows, response.col],
                      importance= TRUE)

out.data est une trame de données, avec feature.cols un mélange de caractéristiques numériques et catégoriques, tandis que response.col est une variable binaire TRUE/FALSE, que j'ai forcée dans factor pour que le modèle randomForest la traite correctement comme catégorique.

Tout fonctionne bien et la variable model me revient correctement. Cependant, je n'arrive pas à trouver un indicateur ou un paramètre à passer à la fonction randomForest pour que model me soit retourné avec les probabilités de TRUE ou FALSE. Au lieu de cela, j'obtiens simplement des valeurs prédites. Autrement dit, si je regarde model$predicted, Je vais voir quelque chose comme:

FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.

Au lieu de cela, je veux voir quelque chose comme:

   FALSE  TRUE
1  0.84   0.16
2  0.66   0.34
3  0.11   0.89
4  0.17   0.83
5  0.92   0.08
.   .      .
.   .      .
.   .      .

Je peux obtenir ce qui précède, mais pour ce faire, je dois faire quelque chose comme:

tmp <- predict(model, out.data[test.rows, feature.cols], "prob")

[test.rows capture les numéros de ligne pour ceux qui ont été utilisés lors du test du modèle. Les détails ne sont pas affichés ici, mais sont simples car les ID de ligne de test sont sortis dans model.]

Ensuite, tout fonctionne bien. Le problème est que le modèle est grand et prend beaucoup de temps à exécuter, et même la prédiction elle-même prend quelque temps. Étant donné que la prédiction devrait être totalement inutile (je cherche simplement à calculer la courbe ROC sur l'ensemble de données de test, l'ensemble de données qui aurait déjà dû être calculé), j'espérais sauter cette étape. Y a-t-il quelque chose que je peux signaler dans l'originalrandomForest appel pour éviter d'avoir à relancer lepredict fonction?

19
Mike Williamson

model$predicted Est PAS la même chose retournée par predict(). Si vous voulez la probabilité de la classe TRUE ou FALSE alors vous devez exécuter predict(), ou passer x,y,xtest,ytest Comme

randomForest(x,y,xtest=x,ytest=y), 

x=out.data[, feature.cols], y=out.data[, response.col].

model$predicted Renvoie la classe en fonction de la classe qui avait la plus grande valeur dans model$votes Pour chaque enregistrement. votes, comme @joran l'a souligné est la proportion de "votes" OOB (hors sac) de la forêt aléatoire, un vote ne comptant que lorsque l'enregistrement a été sélectionné dans un échantillon OOB. D'autre part, predict() renvoie la vraie probabilité pour chaque classe basée sur les votes de tous les arbres.

L'utilisation de randomForest(x,y,xtest=x,ytest=y) fonctionne un peu différemment que lors du passage d'une formule ou simplement randomForest(x,y), comme dans l'exemple ci-dessus. randomForest(x,y,xtest=x,ytest=y) RENVOYERA la probabilité pour chaque classe, cela peut sembler un peu bizarre, mais elle se trouve sous model$test$votes, et la classe prédite sous model$test$predicted, qui sélectionne simplement le classe basée sur la classe qui avait la plus grande valeur dans model$test$votes. De plus, lorsque vous utilisez randomForest(x,y,xtest=x,ytest=y), model$predicted Et model$votes Ont la même définition que ci-dessus.

Enfin, juste pour noter, si randomForest(x,y,xtest=x,ytest=y) est utilisé, alors, pour utiliser la fonction Predict (), l'indicateur keep.forest doit être défini sur TRUE.

model=randomForest(x,y,xtest=x,ytest=y,keep.forest=TRUE). 
prob=predict(model,x,type="prob")

prob SERA équivalent à model$test$votes car les données de test entrées sont toutes les deux x.

25
Oscar