mtry - random forest rpubs
Usando el paquete randomForest en R, ¿cómo obtener probabilidades del modelo de clasificación? (1)
TL; DR:
¿Hay algo que pueda marcar en la llamada original randomForest
para evitar tener que volver a ejecutar la función de predict
para obtener probabilidades categóricas predichas, en lugar de solo la categoría probable?
Detalles:
Estoy usando el paquete randomForest .
Tengo un modelo algo como:
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)
donde out.data
es un marco de datos, con feature.cols
una mezcla de características numéricas y categóricas, mientras que response.col
es una variable binaria TRUE
/ FALSE
, que randomForest
a factor
en factor
para que el modelo randomForest
lo trate como categórico.
Todo funciona bien, y el model
variable se me devuelve correctamente. Sin embargo, parece que no puedo encontrar una bandera o parámetro para pasar a la función randomForest
, de modo que el model
sea devuelto con las probabilidades de TRUE
o FALSE
. En lugar de eso, simplemente obtengo valores predichos. Es decir, si miro el model$predicted
, veré algo como:
FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.
En cambio, quiero ver algo como:
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
. . .
. . .
. . .
Puedo obtener lo anterior, pero para hacerlo, necesito hacer algo como:
tmp <- predict(model, out.data[test.rows, feature.cols], "prob")
[ test.rows
captura los números de fila de aquellos que se usaron durante la prueba del modelo. Los detalles no se muestran aquí, pero son simples ya que las ID de fila de prueba se envían al model
.]
Entonces todo funciona bien. El problema es que el modelo es grande y tarda mucho tiempo en ejecutarse, e incluso la predicción en sí toma un tiempo. Como la predicción debería ser totalmente innecesaria (simplemente estoy buscando calcular la curva ROC en el conjunto de datos de prueba, el conjunto de datos que ya debería haberse calculado), esperaba omitir este paso. ¿Hay algo que pueda marcar en la llamada original randomForest
para evitar tener que volver a ejecutar la función de predict
?
model$predicted
NO es lo mismo que predict()
. Si desea la probabilidad de la clase TRUE
o FALSE
, debe ejecutar predict()
o pasar x,y,xtest,ytest
como
randomForest(x,y,xtest=x,ytest=y),
donde x=out.data[, feature.cols], y=out.data[, response.col]
.
model$predicted
devuelve la clase en función de qué clase tuvo el mayor valor en el model$votes
para cada registro. votes
, como @joran señaló es la proporción de ''votos'' OOB (fuera de bolsa) del bosque aleatorio, un voto que solo cuenta cuando se seleccionó el registro en una muestra OOB. Por otro lado, predict()
devuelve la probabilidad real para cada clase basada en los votos de todos los árboles.
El uso de randomForest(x,y,xtest=x,ytest=y)
funciona un poco diferente al pasar una fórmula o simplemente randomForest(x,y)
, como se muestra en el ejemplo anterior. randomForest(x,y,xtest=x,ytest=y)
devolverá la probabilidad para cada clase, esto puede sonar un poco raro, pero se encuentra bajo el model$test$votes
, y la clase predicha bajo el model$test$predicted
, que simplemente selecciona la clase en función de qué clase tenía el mayor valor en el model$test$votes
. Además, cuando se usa randomForest(x,y,xtest=x,ytest=y)
, el model$predicted
y el model$votes
tienen la misma definición que arriba.
Finalmente, solo para tener en cuenta, si se randomForest(x,y,xtest=x,ytest=y)
, entonces, para usar la función predict (), el indicador keep.forest se debe establecer en TRUE.
model=randomForest(x,y,xtest=x,ytest=y,keep.forest=TRUE).
prob=predict(model,x,type="prob")
prob
SERÁ equivalente al model$test$votes
ya que la entrada de datos de prueba es x
.