`predict.randomForest` 如何估计类别概率?

机器算法验证 r 分类 随机森林 预言
2022-01-19 19:32:05

我使用时包如何randomForest估计类概率predict(model, data, type = "prob")

我使用参数来ranger训练随机森林probability = T来预测概率。ranger在文档中说:

像 Malley 等人一样种植概率森林。(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)
3个回答

这只是整体中树木的投票比例。

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

Malley (2012) 可在此处获取: http: //dx.doi.org/10.3414%2FME00-01-0052完整的参考资料在 ranger 文档的参考资料部分。

简而言之,每棵树都预测类别概率,并且这些概率被平均用于森林预测。对于两个类,这相当于 0-1 编码响应上的回归森林。

相反,在randomForesttype="prob"棵树中预测一个类别,并根据这些类别计算概率。

在这里的示例中,我尝试使用均匀分布而不是正态分布来生成概率,而这里另一种方法似乎表现更好。我想知道这些概率是否真的是事实?

顺便说一句,通过使用分类和手​​动概率计算(用于预测)randomForest,ranger 可以实现与上述示例相同的结果。predict.all=TRUE

如果你想要 Out-Of-Bag 概率估计,你只能使用 model$votes 在 R 中的 randomForest 包中进行。其他概率估计不是OOB。