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 lepredict
fonction 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)
où 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 lepredict
fonction?
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),
où 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
.