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


16

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

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

与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)

1
只是出于好奇,那会是prob_real什么?
Firebug

1
实际响应概率。因为这是一个模拟,所以我对每个观察都具有此效果
Daniel Falbel

Answers:


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 '16

2
@DanielFalbel虽然我很熟悉,randomForest但是我并不了解ranger(事实上​​,我从未使用过),所以我无法回答,对不起。但这是一个有趣的问题,也许您可​​以就两种策略有何不同提出另一个问题。
Firebug

6

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

简而言之,每棵树都预测类别概率,并将这些概率平均进行森林预测。对于两个类,这等效于0-1编码响应上的回归林。

相反,在randomForesttype="prob"每棵树预测类和概率从这些类来计算。

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

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


您可以在模拟代码中看到这些是响应的概率。看:Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5))。这就是生成Y的方法,将X1,X2,...,X10相加,然后得到均值= 5的正态分布的分位数。您认为这有意义吗?
丹尼尔·法贝尔

-1

如果要进行袋外概率估计,则只能使用model $ votes在R中的randomForest包中进行。其他概率估计值不是OOB。


什么是OOB概率估计?
user158565'1

这是无用的概率估计。在随机森林中,他们估算与每个类别相关联的概率的一种方法是,计算为每个类别投票的树木所占的比例。OOB估计将执行相同的操作,但只计算实例未在其训练中使用的树的票数(又称实例不在包内)
Max
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.