In che modo `predict.randomForest` stima le probabilità della classe?


15

In che modo il randomForestpacchetto stima le probabilità della classe quando uso predict(model, data, type = "prob")?

Stavo usando rangerper addestrare foreste casuali usando l' probability = Targomento per prevedere le probabilità. rangerdice nella documentazione che:

Coltiva una foresta di probabilità come in Malley et al. (2012).

Ho simulato alcuni dati e provato entrambi i pacchetti e ottenuto risultati molto diversi (vedi codice sotto)

inserisci qui la descrizione dell'immagine

Quindi so che utilizza una tecnica diversa (quindi ranger) per stimare le probabilità. Ma quale?

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
Solo per curiosità, quale sarebbe prob_real?
Firebug,

1
La vera probabilità di risposta. Dato che si tratta di una simulazione, ho questo per ogni osservazione
Daniel Falbel,

Risposte:


17

È solo la percentuale di voti degli alberi nell'insieme.

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

In alternativa, se moltiplichi le tue probabilità per ntree, ottieni lo stesso risultato, ma ora nei conteggi anziché nelle proporzioni.

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

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

2
Grazie! Hai idea del perché la percentuale di voti sia migliore delle foreste di probabilità? O pensi che questo accada solo per questo problema? Vedi questo link (in portoghese)
Daniel Falbel,

2
@DanielFalbel Mentre ho una certa familiarità con randomForestnon sono molto ben informato ranger(in realtà, non l'ho mai usato), quindi non sarei in grado di rispondere, mi dispiace. Ma è una domanda interessante, forse potresti fare un'altra domanda su come entrambe le strategie siano diverse.
Firebug,

6

The Malley (2012) è disponibile qui: http://dx.doi.org/10.3414%2FME00-01-0052 . Un riferimento completo è nella parte riferimenti nella documentazione del ranger.

In breve, ogni albero prevede le probabilità di classe e queste probabilità sono calcolate in media per la previsione della foresta. Per due classi, ciò equivale a una foresta di regressione su una risposta codificata 0-1.

Al contrario, randomForestcon type="prob"ogni albero predice una classe e le probabilità sono calcolate da queste classi.

Nell'esempio qui ho provato a usare la distribuzione uniforme invece della distribuzione normale per generare le probabilità, e qui l'altro approccio sembra funzionare meglio. Mi chiedo se queste probabilità siano davvero la verità?

A proposito, gli stessi risultati randomForestdell'esempio sopra possono essere raggiunti con ranger usando la classificazione e il calcolo manuale della probabilità (uso predict.all=TRUEnella previsione).


puoi vedere che queste sono le probabilità di risposta nel codice di simulazione. Guarda: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Ecco come viene generato Y, sommando X1, X2, ..., X10 e quindi ottenendo il quantile della distribuzione normale con media = 5 che la somma rappresenta. Pensi che abbia senso?
Daniel Falbel,

-1

Se desideri stime di probabilità out-of-bag, puoi farlo solo in un pacchetto randomForest in R usando il modello $ voti. Le altre stime di probabilità non sono OOB.


qual è la stima della probabilità OOB?
Utente 158565

È una stima di probabilità fuori borsa. In una foresta casuale, un modo in cui stimano la probabilità associata a ciascuna classe è di calcolare la proporzione degli alberi che hanno votato per ogni classe. La stima OOB farebbe lo stesso, ma conterebbe solo i voti di quegli alberi che l'istanza non è stata utilizzata nella loro formazione (ovvero l'istanza non era in-bag)
Max
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.