【问题标题】:How to convert random forest prediction probabilities to a single classified response?如何将随机森林预测概率转换为单个分类响应?
【发布时间】:2017-12-25 08:48:51
【问题描述】:

我有许多大型随机森林分类模型(每个运行时间约为 60 分钟),用于使用 type="prob" 选项预测栅格。我对光栅输出(每个 x 类作为光栅堆栈的概率)感到满意。但是,我想要一种简单的方法来将这些概率(具有 x 层的栅格堆栈,其中 x 是类的数量)转换为简单的一层分类(即只有获胜者,没有概率)。这相当于 type="response"。

这是一个简单的例子(它不是栅格,但仍然适用):

library(randomForest)
data(iris)
set.seed(111)
ind <- sample(2, nrow(iris), replace = TRUE, prob=c(0.8, 0.2))
iris.rf <- randomForest(Species ~ ., data=iris[ind == 1,])
iris.prob <- predict(iris.rf, type="prob")
iris.resp <- predict(iris.rf, type="response")

使用 iris.prob 对象获得 iris.resp 的等效输出而不重新运行随机森林的最有效方法是什么(在我的情况下,对于许多大型栅格,这将花费太多小时)?

提前致谢

【问题讨论】:

  • 运行iris.rf 后,predict 函数不需要您重新运行模型。一旦模型运行,预测应该会更快,因为它们只使用模型的输出来计算概率或响应。您是否试图找到运行预测的最有效方法是什么?或者您是否想弄清楚如何从 type = "prob" 中获得与从 type = "response" 中获得的相同值?
  • 是的,我同意。但我无权访问模型 (iris.rf) - 只有输出概率 (iris.prob)。需要一种简单的方法将概率对象转换为单个分类对象
  • 好的,所以有人已经运行了模型以及 iris.prob,而您试图在不运行模型的情况下复制 iris.resp?我知道运行模型需要很多小时,我只是想找出问题
  • 没错。谢谢!

标签: r random-forest prediction


【解决方案1】:

iris.prob 应该包含一个分类结果,一个观察被分类到一个类别的概率。所以只需要提取每行最大值的colname即可。

例如: iris.resp2 = colnames(iris.prob)[apply(iris.prob,1,which.max)]

iris.resp2 == as.character(iris.resp) 应该每次都返回 TRUE

【讨论】:

  • 谢谢,这是大体思路。然而,这种方法在大型栅格堆栈上非常慢。努力提高效率。
  • 嗯...所以我不确定我是否可以提供帮助,它已经非常优化,因为它只是在已经计算的矩阵和向量上以向量化的方式使用内置函数!我的意思是对于具有 1M 行和 100 列的 723 Mb 矩阵,在我的计算机上花费不到 5 秒的时间。我希望你能找到答案;)!祝你好运
【解决方案2】:

如果您尝试使用与iris.prob 相同的一般格式来确定多列的最大值,我会尝试从每一行中找到最大值并返回列名。

colnames(iris.prob)[max.col(iris.prob,ties.method="first")]

another thread 获得了确切的用法,所以如果这不起作用,您可以尝试其他回复

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2021-02-11
    • 2018-10-23
    • 2017-04-24
    • 2021-12-04
    • 2020-07-06
    • 2018-09-13
    • 2017-07-02
    • 2016-01-28
    相关资源
    最近更新 更多