W jaki sposób `przewidywana.losowaLeśność` oszacowuje prawdopodobieństwa klasowe?

16

W jaki sposób randomForestpakiet szacuje prawdopodobieństwa klasowe, kiedy używam predict(model, data, type = "prob")?

Użyłem rangerdo szkolenia losowych lasów, używając probability = Targumentu do przewidywania prawdopodobieństw. rangermówi w dokumentacji, że:

Wyhoduj las prawdopodobieństwa, jak w Malley i in. (2012).

Symulowałem niektóre dane, wypróbowałem oba pakiety i uzyskałem bardzo różne wyniki (patrz kod poniżej)

wprowadź opis zdjęcia tutaj

Wiem więc, że wykorzystuje inną technikę (niż tropiciel) do oszacowania prawdopodobieństwa. Ale który?

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)
Daniel Falbel
źródło
1
Z ciekawości, co by to było prob_real?
Firebug
1
Rzeczywiste prawdopodobieństwo reakcji. Ponieważ jest to symulacja, mam to dla każdej obserwacji
Daniel Falbel

Odpowiedzi:

17

To tylko proporcja głosów drzew w zespole.

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

Alternatywnie, jeśli pomnożysz swoje prawdopodobieństwa ntree, otrzymasz ten sam wynik, ale teraz w liczbach zamiast proporcji.

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

identical(500*p1,p2)
#[1] TRUE
Firebug
źródło
2
Dzięki! Czy masz pojęcie, dlaczego odsetek głosów jest lepszy niż prawdopodobieństwo lasów? Czy uważasz, że dzieje się tak tylko z powodu tego problemu? Zobacz ten link (w języku portugalskim)
Daniel Falbel
2
@DanielFalbel Chociaż jestem dość zaznajomiony z randomForesttym, że nie mam zbyt dużej wiedzy na temat ranger(w rzeczywistości nigdy go nie użyłem), więc nie będę w stanie odpowiedzieć, przepraszam. Ale to interesujące pytanie, być może możesz zadać kolejne pytanie na temat różnic między obiema strategiami.
Firebug
6

The Malley (2012) jest dostępny tutaj: http://dx.doi.org/10.3414%2FME00-01-0052 . Pełne odniesienie znajduje się w części odniesienia w dokumentacji leśniczego.

Krótko mówiąc, każde drzewo przewiduje prawdopodobieństwa klasowe, a te prawdopodobieństwa są uśredniane dla prognozy lasu. W przypadku dwóch klas jest to równoważne lasowi regresji z zakodowaną odpowiedzią 0-1.

Natomiast w randomForestprzy type="prob"każdym drzewie przewiduje klasę i prawdopodobieństwa są obliczane z tych klas.

W tym przykładzie próbowałem użyć rozkładu jednolitego zamiast rozkładu normalnego do wygenerowania prawdopodobieństw, a tutaj inne podejście wydaje się działać lepiej. Zastanawiam się, czy te prawdopodobieństwa są naprawdę prawdą?

Nawiasem mówiąc, te same wyniki, co w randomForestpowyższym przykładzie, można osiągnąć za pomocą komandosa, stosując klasyfikację i ręczne obliczanie prawdopodobieństwa (zastosowanie predict.all=TRUEw prognozowaniu).

mnwright
źródło
widać, że są to prawdopodobieństwa odpowiedzi w kodzie symulacyjnym. Spójrz na: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Tak powstaje Y, sumując X1, X2, ..., X10, a następnie uzyskując kwantyl rozkładu normalnego ze średnią = 5, którą reprezentuje suma. Czy uważasz, że to ma sens?
Daniel Falbel,
-1

Jeśli chcesz oszacować prawdopodobieństwo wyjęcia z torby, możesz to zrobić tylko w losowym pakiecie leśnym w R, używając głosów modelowych. Pozostałe szacunki prawdopodobieństwa nie są OOB.

Max
źródło
jakie jest oszacowanie prawdopodobieństwa OOB?
user158565
Szacuje się, że jest to niemożliwe. W losowym lesie jednym ze sposobów oszacowania prawdopodobieństwa związanego z każdą klasą jest obliczenie proporcji drzew, które głosowały na każdą klasę. Szacunek OOB zrobiłby to samo, ale liczyłby tylko te głosy drzew, że instancja nie została wykorzystana do ich szkolenia (inaczej instancja nie była w torbie)
Max