En utilisant le paquet randomForest dans R, Comment obtenir des probabilités à partir 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 lepredictfonction pour obtenir prédites probabilités catégoriques, au lieu de seulement la catégorie probable?

Détails:

j'utilise le randomForest package.

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 base de données, avec feature.cols un mélange de caractères numériques et catégoriques, alors que response.col est un TRUE/FALSE variable binaire, que j'ai forcé dans factor alors que randomForest modèle le traitera correctement comme catégorique.

Tout fonctionne bien, et la variable model est retourné à moi correctement. Cependant, je ne trouve pas de drapeau ou de paramètre à passer à randomForest que model me revient avec le probabilitésTRUE ou FALSE. Au lieu de cela, j'obtiens simplement des valeurs prédites. C'est, si je regarde model$predicted, je vais voir quelque chose comme:

FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.

a la place, 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 de la ci-dessus, mais pour ce faire, j'ai besoin de faire quelque chose comme:

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

[test.rows capture les nombres de lignes pour ceux qui ont été utilisés lors de l'essai du modèle. Les détails ne sont pas indiqués ici, mais sont simples puisque les ID de ligne de test sont produits dans model.]

alors tout fonctionne bien. problème c'est que le modèle est grand et prend un temps très long à exécuter, et même la prédiction elle-même prend du temps. Depuis la prédiction devrait<!-(Je cherche simplement à calculer la courbe ROC sur le jeu de données d'essai, le jeu de données qui aurait déjà dû être calculé), j'espérais ignorez cette étape. y a-t-il quelque chose que je peux signaler dans l'originalrandomForest appel pour éviter d'avoir à relancer lepredictfonction?

19
demandé sur Mike Williamson 2014-09-08 02:57:44

1 réponses

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

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

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

model$predicted renvoie la classe basée sur quelle classe avait la plus grande valeur dans model$votes pour chaque enregistrement. votes, comme @joran l'a fait remarquer est la proportion de "votes" (out of bag) de la forêt aléatoire, un vote ne comptant que lorsque le record a été sélectionné dans un échantillon OOB. Sur l'autre main predict() renvoie la vraie probabilité pour chaque classe basée sur les votes de tous les arbres.

en utilisant randomForest(x,y,xtest=x,ytest=y) fonctionne un peu différemment qu'en passant une formule ou tout simplement randomForest(x,y), comme dans l'exemple donné ci-dessus. randomForest(x,y,xtest=x,ytest=y) retournera la probabilité pour chaque classe, cela peut sembler un peu bizarre, mais il se trouve sous model$test$votes, et la classe prédite sous model$test$predicted, qui sélectionne simplement la classe basée sur la classe a la valeur la plus grande model$test$votes. Aussi, lors de l'utilisation de randomForest(x,y,xtest=x,ytest=y),model$predicted et model$votes ont la même définition que ci-dessus.

enfin, à noter, si randomForest(x,y,xtest=x,ytest=y) est utilisé, puis, afin d'utiliser la fonction predict() le keep.le drapeau de la forêt doit être placé à TRUE.

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

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

25
répondu Oscar 2014-09-08 06:39:16