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

时间:2015-11-23 21:29:06

标签: r r-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我试图做同样但不接受"类型='概率' "在预测功能,给我错误

>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

当我取出&#34;类型&#34;时,它给了我

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

如何获得概率输出?

我需要在此之后创建多个算法,我认为Caret会更加同质。我相信我在这里错过了一些东西,但对Caret不熟悉我不知道是什么。

3 个答案:

答案 0 :(得分:2)

更新:我通过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 

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你可能很久以前就已经解决了这个问题......但是根据当前的插入符号,输入2列的类型=“prob”输出2列:概率为0,概率为1(或者你的2个等级是什么)