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