Как 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)
r
random-forest
prediction
Даниэль Фальбел
источник
источник
prob_real
?Ответы:
Это просто доля голосов деревьев в ансамбле.
В качестве альтернативы, если вы умножите свои вероятности на
ntree
, вы получите тот же результат, но теперь в количествах вместо пропорций.источник
randomForest
я не очень осведомленranger
(фактически, я никогда не использовал его), поэтому я не смог бы ответить, извините. Но это интересный вопрос, возможно, вы могли бы задать другой вопрос о том, насколько обе стратегии различны.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, которое представляет сумма. Как вы думаете, это имеет смысл?Если вам нужны оценки вероятности выхода из-под сумки, вы можете сделать это только в пакете randomForest в R, используя модель $ voice. Другие вероятностные оценки не являются OOB.
источник