Як `predict.randomForest` оцінює ймовірності класу?


16

Як randomForestоцінює ймовірність класу пакетів, коли я використовую predict(model, data, type = "prob")?

Я використовував rangerдля навчання випадкових лісів, використовуючи probability = Tаргумент для прогнозування ймовірностей. rangerв документації говорить, що це:

Вирощувати ймовірнісні ліси, як у Malley et al. (2012 р.).

Я імітував деякі дані і спробував обидва пакети та отримав дуже різні результати (див. Код нижче)

введіть тут опис зображення

Тому я знаю, що для оцінки ймовірностей використовується інша техніка (тоді рейнджер). Але який?

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
Щойно з цікавості, що б це було prob_real?
Firebug

1
Реальна ймовірність відповіді. Оскільки це симуляція, я маю це для кожного спостереження
Даніель Фальбел

Відповіді:


17

Це просто частка голосів дерев в ансамблі.

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

Крім того, якщо ви помножите свої ймовірності на ntree, ви отримаєте той самий результат, але тепер у підрахунках замість пропорцій.

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

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

2
Спасибі! Чи маєте ви уявлення, чому частка голосів краще, ніж імовірність лісів? Або ви думаєте, що це відбувається саме з цієї проблеми? Дивіться це посилання (португальською мовою)
Daniel Falbel

2
@DanielFalbel Хоча я досить добре знайомий, randomForestя мало знаю ranger(насправді, я ніколи цього не використовував), тому мені не вдасться відповісти, вибачте. Але це цікаве питання, можливо, ви можете поставити ще одне питання про те, чим обидві стратегії відрізняються.
Firebug

6

The Malley (2012) доступний тут: http://dx.doi.org/10.3414%2FME00-01-0052 . Повна посилання знаходиться у частині посилань у рейнджерській документації.

Коротше кажучи, кожне дерево прогнозує ймовірності класу, і ці ймовірності усереднюються для прогнозування лісу. Для двох класів це еквівалентно регресійному лісу за кодованою відповіддю 0-1.

На відміну від цього , в randomForestс type="prob"кожним деревом пророкує клас і ймовірності обчислюються з цих класів.

У прикладі тут я намагався використовувати рівномірний розподіл замість нормального розподілу для генерації ймовірностей, і тут інший підхід здається краще. Цікаво, чи справді ці ймовірності?

До речі, такі ж результати, як у randomForestнаведеному вище прикладі, можна досягти з рейнджером за допомогою класифікації та ручного обчислення ймовірностей (використання predict.all=TRUEв прогнозуванні).


Ви можете бачити, що це ймовірність відповіді в коді симуляції. Подивіться: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Ось так генерується Y, підсумовуючи X1, X2, ..., X10, а потім отримуючи квантил нормального розподілу із середнім = 5, яке представляє сума. Як ви вважаєте, це має сенс?
Даніель Фальбель

-1

Якщо ви хочете оцінити ймовірність Out-Of-Bag, ви можете це зробити лише у пакеті randomForest в R, використовуючи модель $ голосів. Інші оцінки ймовірності не є OOB.


що таке оцінка ймовірності OOB?
користувач158565

Оцінка ймовірності сумки не є У випадковому лісі один із способів оцінювання ймовірності, пов'язаної з кожним класом, полягає в тому, що вони обчислюють частку дерев, які проголосували за кожен клас. Оцінка OOB зробила б те ж саме, але підрахувала лише голоси тих дерев, які екземпляр не використовувався в їх навчанні (він також не мав)
Макс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.