【问题标题】:How to get randomForest model output in probability using Caret?如何使用 Caret 以概率获得 randomForest 模型输出?
【发布时间】:2017-09-07 21:24:15
【问题描述】:

我正在尝试使用 Caret 来构建随机森林模型以进行二元分类。我过去曾使用 randomForest 源包来执行此操作,它运行良好,但使用 Caret 我的输出是二进制而不是概率。 type='prob' 会报错

[.data.frame(out, , obsLevels, drop = FALSE) 中的错误:选择了未定义的列

我对两者都使用相同的语法(我希望)。这是我过去通过 source randomForest 包获得的。

>fit = randomForest(x = a[,-1], y = as.factor(a[,1]),ntree=120)
>head(predict(fit, newdata = test_data[,-c(1:2)], type = "prob")[,2])
         1          2          3          4          5          6 
0.04166667 0.03333333 0.55833333 0.80000000 0.87500000 0.04166667

现在,使用 Caret 我正在尝试做同样的事情,但它在预测函数中不接受“type='prob'”,这给了我错误

>rf_model<-train(x = a[,-1], y = as.factor(a[,1]),method="rf",ntree=120)
>head(predict(rf_model, test_data[,-c(1:2)], type="prob"))
Error in `[.data.frame`(out, , obsLevels, drop = FALSE) : 
undefined columns selected

当我拿出“类型”时,它给了我

>head(predict(rf_model, test_data[,-c(1:2)]))
[1] 0 0 1 1 1 0
Levels: 0 1

如何获得概率输出?

在此之后我需要创建多个算法,我认为 Caret 会更加同质化。我确定我在这里遗漏了一些东西,但是对 Caret 来说是新手,我不知道是什么。

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    更新:我通过here 找到了解决方案。显然,插入符号的训练不适用于处理目标变量中的 0 和 1 二进制类值。将它们更改为任何字符串('r' 和 's')都非常有效。

    > a$dv<-gsub('0','r',a$dv)
    > a$dv<-gsub('1','s',a$dv)
    > rf_model<-train(x = a[,-c(1:2)], y = as.factor(a[,2]),method="rf",ntree=120)
    > head(predict(rf_model, test_data[,-c(1:2)], type="prob"))
          r           s
    1 0.9750000 0.025000000
    2 0.9916667 0.008333333
    3 0.2583333 0.741666667
    4 0.2833333 0.716666667
    5 0.1583333 0.841666667
    6 1.0000000 0.000000000 
    

    【讨论】:

      【解决方案2】:

      尽量保留type = "prob",这样预测会是:

      prd &lt;- predict(rf_model, test_data[,-c(1:2)], type="prob")

      但是在插入符号中做任何事情:

      as.factor(as.numeric(prd &gt;= .5))

      【讨论】:

      • 感谢您的回复!我不确定您所说的“尝试保持...”是什么意思,因为我已经尝试过了,并且从 R 中得到了错误(在帖子中提到)。
      • 将预测保留在概率中,但在 Caret 中使用时将它们分解,因为 Caret 适用于 0-1 二元变量。概率 >= 0.5 为“1”,
      • “将预测保留在概率中”..但这就是我想在这里得到的输出!!我的整个目标是获得概率预测而不是二进制 (0,1),因为 type="prob" 在 predict 命令中使用时会返回错误。我没有听懂你想说的话。
      【解决方案3】:

      它适用于插入符号 v6.0-41:

      library(caret)
      set.seed(1)
      rf_model <- train(x = iris[,-5], y = as.factor(iris[,5]), method="rf", ntree=120)
      tail(predict(rf_model, iris[, -5], type="prob"))
      
          setosa  versicolor virginica
      145      0 0.000000000 1.0000000
      146      0 0.000000000 1.0000000
      147      0 0.008333333 0.9916667
      148      0 0.000000000 1.0000000
      149      0 0.000000000 1.0000000
      150      0 0.025000000 0.9750000
      

      R 版本 3.0.3 (2014-03-06) 平台:x86_64-w64-mingw32/x64(64位)

      我认为问题出在您的训练数据 (a[,-1]) 和测试数据 (test_data[,-c(1:2)])没有完全相同的列。

      【讨论】:

      • 不,我都检查过了。两者都有相同的列数和名称。 test_data 中的“-c(1:2)”只是我已经在数据集“a”中删除的数据清理部分。不过,您的带有 isis 数据的代码正在运行。
      • 是的,确实,无论你拥有多少作为类的数字,它都失败了,我尝试了几种组合并得到了同样的错误。
      【解决方案4】:

      您可能很久以前就解决了这个问题...但是在插入符号的当前版本中,type = "prob" for a 2 level factor 输出 2 列:概率为 0,概率为 1(或任何您的 2 个级别) .

      【讨论】:

        猜你喜欢
        • 2017-05-27
        • 2014-11-01
        • 2016-04-04
        • 2020-06-09
        • 2018-10-17
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多