¿Cómo randomForest
calcula el paquete las probabilidades de clase cuando lo uso predict(model, data, type = "prob")
?
Estaba usando ranger
para entrenar bosques al azar usando el probability = T
argumento para predecir probabilidades. ranger
dice en la documentación que:
Cultivar un bosque de probabilidad como en Malley et al. (2012)
Simulé algunos datos, probé ambos paquetes y obtuve resultados muy diferentes (vea el código a continuación)
Entonces sé que usa una técnica diferente (entonces guardabosques) para estimar las probabilidades. ¿Pero cual?
simulate_data <- function(n){
X <- data.frame(matrix(runif(n*10), ncol = 10))
Y <- data.frame(Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>%
pnorm(mean = 5)
) %>%
as.factor()
)
dplyr::bind_cols(X, Y)
}
treino <- simulate_data(10000)
teste <- simulate_data(10000)
library(ranger)
modelo_ranger <- ranger(Y ~., data = treino,
num.trees = 100,
mtry = floor(sqrt(10)),
write.forest = T,
min.node.size = 100,
probability = T
)
modelo_randomForest <- randomForest(Y ~., data = treino,
ntree = 100,
mtry = floor(sqrt(10)),
nodesize = 100
)
pred_ranger <- predict(modelo_ranger, teste)$predictions[,1]
pred_randomForest <- predict(modelo_randomForest, teste, type = "prob")[,2]
prob_real <- apply(teste[,1:10], 1, sum) %>% pnorm(mean = 5)
data.frame(prob_real, pred_ranger, pred_randomForest) %>%
tidyr::gather(pacote, prob, -prob_real) %>%
ggplot(aes(x = prob, y = prob_real)) + geom_point(size = 0.1) + facet_wrap(~pacote)
r
random-forest
prediction
Daniel Falbel
fuente
fuente
prob_real
?Respuestas:
Es solo la proporción de votos de los árboles en el conjunto.
Alternativamente, si multiplica sus probabilidades por
ntree
, obtendrá el mismo resultado, pero ahora en recuentos en lugar de proporciones.fuente
randomForest
que no tengo mucho conocimientoranger
(de hecho, nunca lo usé), por lo que no podría responder, lo siento. Pero es una pregunta interesante, tal vez podría hacer otra pregunta sobre cómo ambas estrategias son diferentes.El Malley (2012) está disponible aquí: http://dx.doi.org/10.3414%2FME00-01-0052 . Una referencia completa está en la parte de referencias en la documentación del guardabosques.
En resumen, cada árbol predice las probabilidades de clase y estas probabilidades se promedian para la predicción del bosque. Para dos clases, esto es equivalente a un bosque de regresión en una respuesta codificada 0-1.
En contraste, en
randomForest
latype="prob"
que cada árbol predice una clase y las probabilidades se calcularon a partir de estas clases.En el ejemplo aquí intenté usar la distribución uniforme en lugar de la distribución normal para generar las probabilidades, y aquí el otro enfoque parece funcionar mejor. Me pregunto si estas probabilidades son realmente la verdad.
Por cierto, los mismos resultados que en el
randomForest
ejemplo anterior se pueden lograr con el guardabosques utilizando la clasificación y el cálculo de probabilidad manual (usopredict.all=TRUE
en predicción).fuente
Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5))
. Así es como se genera Y, sumando X1, X2, ..., X10 y luego obteniendo el cuantil de la distribución normal con media = 5 que representa la suma. ¿Crees que esto tiene sentido?Si desea estimaciones de probabilidad de fuera de bolsa, solo puede hacerlo en el paquete randomForest en R usando el modelo $ votes. Las otras estimaciones de probabilidad no son OOB.
fuente