在 R 中使用 randomForest 包,如何从分类模型中获取概率?

Posted

技术标签:

【中文标题】在 R 中使用 randomForest 包,如何从分类模型中获取概率?【英文标题】:Using randomForest package in R, how to get probabilities from classification model? 【发布时间】:2014-11-01 03:44:28 【问题描述】:

TL;DR:

我可以在原始文件中标记什么 randomForest 调用以避免重新运行 strong> predict 函数获取预测的分类概率,而不仅仅是可能的类别?

详情:

我正在使用randomForest 包。

我有一个类似的模型:

model <- randomForest(x=out.data[train.rows, feature.cols],
                      y=out.data[train.rows, response.col],
                      xtest=out.data[test.rows, feature.cols],
                      ytest=out.data[test.rows, response.col],
                      importance= TRUE)

其中out.data 是一个数据框,feature.cols 是数字和分类特征的混合,而response.col 是一个TRUE / FALSE 二进制变量,我将其强制输入factor 以便@ 987654332@ 模型会正确地将其视为分类。

一切运行良好,变量model 已正确返回给我。但是,我似乎找不到要传递给randomForest 函数的标志或参数,因此modelTRUE概率FALSE。相反,我得到了简单的预测值。也就是说,如果我查看model$predicted,我会看到类似的内容:

FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.

相反,我希望看到类似的内容:

   FALSE  TRUE
1  0.84   0.16
2  0.66   0.34
3  0.11   0.89
4  0.17   0.83
5  0.92   0.08
.   .      .
.   .      .
.   .      .

我可以得到以上,但为了做到这一点,我需要做一些类似的事情:

tmp <- predict(model, out.data[test.rows, feature.cols], "prob")

[test.rows 捕获模型测试期间使用的行号。此处未显示详细信息,但很简单,因为测试行 ID 会输出到 model。]

然后一切正常。 问题是模型很大,运行时间很长,甚至预测本身也需要一段时间。由于预测 应该 完全没有必要(我只是想在测试数据集上计算 ROC 曲线,应该已经计算过的数据集),我是希望跳过这一步。 我可以在原始文件中标记什么 randomForest 调用以避免重新运行 @ 987654345@ 功能?

【问题讨论】:

randomForest 函数可用于任何类型的分析;这个问题可以从reproducible example 中受益,该reproducible example 准确地显示了您使用一些样本/代表性数据运行的内容。我想如果你只做predict(model, type="prob") 它会更快。在这里,您需要从适合的模型中进行预测,因此无需传入 newdata= 参数。但是由于您没有提供任何测试方法,因此很难说这是否能解决您的问题。 所以你没有注意到随机森林对象的投票组件吗?文档中有很清楚的描述。 谢谢,@joran ...我认为“投票”可能只是表示概率。 (例如,如果观察者经历的 300 / 500 棵树投票“真”,那么它将给出 60% 的真值。)但是,这在统计上似乎并不“严格”,因为 IID 是由代理假设的。由于接近度和其他数据可用,我认为可以通过以某种方式调整权重来提取更精确的概率。我想这还没有完成。感谢您的确认! 你的评论让我觉得你应该花一些时间阅读一些关于随机森林的参考资料,尤其是 Breiman 的原始论文(参考 pckg 文档)。正如votes 的文档所述,比例是针对OOB(out of bag)投票,所以每个案例只在一个不在引导样本中的树上运行。关于 OOB 错误率的计算方式还有一些其他细微之处(请参阅 oob.times),但 votes 中的内容相当严格...... ...有一些关于 OOB 错误率的批评,但我再次建议阅读有关该主题的 RF 文献。 【参考方案1】:

model$predictedpredict() 返回的相同。如果你想要TRUEFALSE类的概率,那么你必须运行predict(),或者通过x,y,xtest,ytestlike

randomForest(x,y,xtest=x,ytest=y), 

x=out.data[, feature.cols], y=out.data[, response.col].

model$predicted 根据每个记录的 model$votes 中哪个类具有较大值返回类。 votes,正如@joran 指出的那样,是随机森林中 OOB(out of bag)“投票”的比例,只有在 OOB 样本中选择记录时才计算投票。另一方面,predict() 根据所有树的投票返回每个类的真实概率。

使用randomForest(x,y,xtest=x,ytest=y) 函数与传递公式或简单地使用randomForest(x,y) 函数略有不同,如上面给出的示例所示。 randomForest(x,y,xtest=x,ytest=y) 将返回每个类的概率,这听起来可能有点奇怪,但是在model$test$votes 下找到,而在model$test$predicted 下的预测类,它只是根据哪个类具有较大的值来选择类model$test$votes。另外,使用randomForest(x,y,xtest=x,ytest=y)时,model$predictedmodel$votes的定义同上。

最后,请注意,如果使用了randomForest(x,y,xtest=x,ytest=y),那么为了使用 predict() 函数,keep.forest 标志应该设置为 TRUE。

model=randomForest(x,y,xtest=x,ytest=y,keep.forest=TRUE). 
prob=predict(model,x,type="prob")

prob 等同于model$test$votes,因为测试数据输入都是x

【讨论】:

嗨,Oscar,我确实提供了并且一直在提供“测试”数据集。抱歉,我最初没有指定...我已经编辑了我的原始帖子。感谢您指定它在“$test$votes”下......这正是我正在寻找的,尽管它似乎仍然做了很多假设,比如 IID。 (据我所知,没有进行协方差测试或执行任何操作。)谢谢! 嗨,迈克,很高兴你得到它。如果您想使用predict() 功能,请不要忘记设置keep.forest=TRUE,以防万一您想通过其他测试数据点。我认为没有协方差检验,但我没有研究过,所以我不确定。

以上是关于在 R 中使用 randomForest 包,如何从分类模型中获取概率?的主要内容,如果未能解决你的问题,请参考以下文章

如何替换包 randomForest r 中的引导步骤

r语言randomforest包下载不了

将随机森林变成决策树 - 在 R 中使用 randomForest 包

R包 randomForest 进行随机森林分析

用于 R 中回归的 RandomForest

R语言使用randomForest包构建随机森林模型(Random forests)使用importance函数查看特征重要度使用table函数计算混淆矩阵评估分类模型性能包外错误估计OOB