Como o `predict.randomForest` estima probabilidades de classe?


15

Como o randomForestpacote estima probabilidades de classe quando uso predict(model, data, type = "prob")?

Eu estava usando rangerpara treinar florestas aleatórias usando o probability = Targumento para prever probabilidades. rangerdiz 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)

insira a descrição da imagem aqui

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)

1
Apenas por curiosidade, o que seria prob_real?
Firebug

1
A probabilidade real de resposta. Como esta é uma simulação eu tenho isso para cada observação
Daniel Falbel

Respostas:


17

É apenas a proporção de votos das árvores no conjunto.

library(randomForest)

rf = randomForest(Species~., data = iris, norm.votes = TRUE, proximity = TRUE)
p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = TRUE)

identical(p1,p2)
#[1] TRUE

Como alternativa, se você multiplicar suas probabilidades por ntree, obtém o mesmo resultado, mas agora é contado em vez de proporções.

p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = FALSE)

identical(500*p1,p2)
#[1] TRUE

2
Obrigado! Você tem alguma idéia de por que a proporção de votos é melhor do que as florestas de probabilidade? Ou você acha que isso acontece apenas para esse problema? Veja este link (em português)
Daniel Falbel

2
@DanielFalbel Embora eu esteja bastante familiarizado, randomForestnão tenho muito conhecimento ranger(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.
22816 Firebug

6

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 randomForestcom type="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 randomForestexemplo acima podem ser alcançados com o ranger usando classificação e cálculo manual de probabilidade (uso predict.all=TRUEem previsão).


você pode ver que essas são as probabilidades de resposta no código de simulação. Olhe para: 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?
Daniel Falbel

-1

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.


qual é a estimativa de probabilidade OOB?
precisa saber é o seguinte

É uma estimativa de probabilidade fora do saco. Em uma floresta aleatória, uma maneira de estimar a probabilidade associada a cada classe é calcular a proporção de árvores que votaram em cada classe. A estimativa OOB faria o mesmo, mas apenas contar os votos dessas árvores que a instância não foi utilizado na sua formação (aka a instância não estava no-saco)
Max
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.