如何使用 Caret 以概率获取 randomForest 模型输出?

How to get randomForest model output in probability using Caret?

我正在尝试使用 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

而是当我取出 "type" 时,它给了我

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

如何获得概率输出?

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

尽量保持 type = "prob",这样预测将是:

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

但在 Caret 中做任何事情:

as.factor(as.numeric(prd >= .5))

它适用于插入符号 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)]) 没有完全相同的列。

更新:我通过 here 找到了解决方案。显然,caret 的训练不适合处理目标变量中的 0 和 1 二进制 class 值。将它们更改为任何字符串('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 

你可能很久以前就解决了这个问题......但是在插入符的当前版本中,输入 = "prob" 2 级因子输出 2 列:0 的概率,1 的概率(或任何你2 个级别)。