Каким образом прогнозируемые вероятности класса `gnett.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
Благодарность! Есть ли у вас идеи, почему доля голосов лучше, чем вероятность леса? Или вы думаете, что это происходит только для этой проблемы? Посмотрите эту ссылку (на португальском языке)
Даниэль Фальбель

2
@DanielFalbel Хотя я достаточно знаком с этим, randomForestя не очень осведомлен ranger(фактически, я никогда не использовал его), поэтому я не смог бы ответить, извините. Но это интересный вопрос, возможно, вы могли бы задать другой вопрос о том, насколько обе стратегии различны.
Firebug

6

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

Если вам нужны оценки вероятности выхода из-под сумки, вы можете сделать это только в пакете randomForest в R, используя модель $ voice. Другие вероятностные оценки не являются OOB.


Что такое оценка вероятности OOB?
user158565

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