Como o randomForest
pacote estima probabilidades de classe quando uso predict(model, data, type = "prob")
?
Eu estava usando ranger
para treinar florestas aleatórias usando o probability = T
argumento para prever probabilidades. ranger
diz na documentação que:
Cultive uma floresta de probabilidade como em Malley et al. (2012).
Simulei alguns dados e tentei ambos os pacotes e obtive resultados muito diferentes (veja o código abaixo)
Então eu sei que ele usa uma técnica diferente (então guarda florestal) para estimar probabilidades. Mas qual deles?
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
fonte
fonte
prob_real
?Respostas:
É apenas a proporção de votos das árvores no conjunto.
Como alternativa, se você multiplicar suas probabilidades por
ntree
, obtém o mesmo resultado, mas agora é contado em vez de proporções.fonte
randomForest
não tenho muito conhecimentoranger
(na verdade, nunca o usei), então não seria capaz de responder, desculpe. Mas é uma pergunta interessante, talvez você possa fazer outra pergunta sobre como as duas estratégias são diferentes.The Malley (2012) está disponível aqui: http://dx.doi.org/10.3414%2FME00-01-0052 . Uma referência completa está na parte de referências na documentação da guarda florestal.
Em resumo, cada árvore prediz probabilidades de classe e essas probabilidades são calculadas para a predição florestal. Para duas classes, isso é equivalente a uma floresta de regressão em uma resposta codificada em 0-1.
Em contraste, em
randomForest
comtype="prob"
cada árvore prevê uma classe e probabilidades são calculados a partir dessas classes.No exemplo aqui, tentei usar a distribuição uniforme em vez da distribuição normal para gerar as probabilidades, e aqui a outra abordagem parece ter um desempenho melhor. Gostaria de saber se essas probabilidades são realmente a verdade?
A propósito, os mesmos resultados que no
randomForest
exemplo acima podem ser alcançados com o ranger usando classificação e cálculo manual de probabilidade (usopredict.all=TRUE
em previsão).fonte
Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5))
. É assim que Y é gerado, somando X1, X2, ..., X10 e obtendo o quantil da distribuição normal com média = 5 que a soma representa. Você acha que isso faz sentido?Se você deseja estimativas de probabilidade prontas para uso, você pode fazê-lo apenas no pacote randomForest em R usando o modelo $ votes. As outras estimativas de probabilidade não são OOB.
fonte