`Pred.randomForest` sınıf olasılıklarını nasıl tahmin ediyor?


17

Kullandığımda randomForestpaket sınıf olasılıklarını nasıl tahmin ediyor predict(model, data, type = "prob")?

Ben kullanıyordum rangerkullanarak rastgele ormanlar yetiştirilmesi probability = Tolasılıklarını tahmin etmek argüman. rangerbelgelerde şöyle diyor:

Malley ve ark. (2012).

Bazı verileri simüle ettim ve her iki paketi de denedim ve çok farklı sonuçlar elde ettim (aşağıdaki koda bakın)

resim açıklamasını buraya girin

Bu yüzden olasılıkları tahmin etmek için farklı bir teknik (sonra ranger) kullandığını biliyorum. Fakat hangisi?

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
Sadece meraktan ne olurdu prob_real?
Firebug

1
Gerçek tepki olasılığı. Bu bir simülasyon olduğu için her gözlem için bu var
Daniel Falbel

Yanıtlar:


17

Sadece topluluktaki ağaçların oy oranı.

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

Alternatif olarak, olasılıklarınızı ile çarparsanız ntree, aynı sonucu elde edersiniz, ancak şimdi oranlar yerine sayım yaparsınız.

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

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

2
Teşekkürler! Oy oranının olasılık ormanlarından neden daha iyi olduğu hakkında bir fikriniz var mı? Yoksa bunun sadece bu sorun için olduğunu mu düşünüyorsunuz? Bu bağlantıya bakın (portekizce)
Daniel Falbel

2
@DanielFalbel Oldukça randomForestbilgiliyken ranger(aslında hiç kullanmadım), bu yüzden cevap veremezdim , özür dilerim. Ama bu ilginç bir soru, belki de her iki stratejinin nasıl farklı olduğu hakkında başka bir soru sorabilirsiniz.
Firebug

6

Malley (2012) burada mevcuttur: http://dx.doi.org/10.3414%2FME00-01-0052 . Tam bir referans, ranger belgelerindeki referanslar kısmındadır.

Kısacası, her ağaç sınıf olasılıklarını tahmin eder ve bu olasılıkların orman tahmini için ortalaması alınır. İki sınıf için bu, 0-1 kodlu bir yanıt üzerindeki regresyon ormanına eşdeğerdir.

Buna karşılık, içinde randomForestolan type="prob"her ağacın bir sınıf tahmin eder ve olasılıklar bu sınıflardan hesaplanır.

Buradaki örnekte, olasılıkları oluşturmak için normal dağılım yerine eşit dağılım kullanmaya çalıştım ve burada diğer yaklaşım daha iyi performans gösteriyor gibi görünüyor. Acaba bu olasılıklar gerçek mi?

Bu arada, randomForestyukarıdaki örnekteki ile aynı sonuçlar, sınıflandırma ve manuel olasılık hesaplaması ( predict.all=TRUEtahminlerde kullanım ) kullanılarak ranger ile elde edilebilir .


bunların simülasyon kodundaki yanıt olasılıkları olduğunu görebilirsiniz. Bak: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Y bu şekilde üretilir, X1, X2, ..., X10'u toplar ve sonra toplamın ortalama = 5 ile normal dağılımın kantilini elde eder. Bunun mantıklı olduğunu düşünüyor musunuz?
Daniel Falbel

-1

Çanta Dışı olasılık tahminleri istiyorsanız, bunu sadece $ $ modelini kullanarak R'deki randomForest paketinde yapabilirsiniz. Diğer olasılık tahminleri OOB değildir.


OOB olasılık tahmini nedir?
user158565

Çanta olasılık tahmini dışında. Rastgele bir ormanda, her sınıfla ilişkili olasılığı tahmin etmenin bir yolu, her sınıf için oy veren ağaçların oranını hesaplamalarıdır. OOB tahmini aynı şeyi yapardı, ancak yalnızca örneklerin eğitiminde kullanılmadığı ağaçların oylarını sayar (örneğin, çantada değildi)
Max
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.