我正在尝试使用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不熟悉我不知道是什么。
答案 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个等级是什么)