当我通过拆分单个数据框并使用randomForest
包构建随机林来创建训练集和测试集时,对于训练数据中不存在的某些因子级别,predict()
函数仍然会输出一个输出。虽然这没有给出任何错误(这是我在相关问题中寻找的),但我的问题是randomForest()
模型预测值的基础是什么,因为理想情况下它应该抛出以下错误... < / p>
Error in predict.randomForest() :
New factor levels not present in the training data
如果randomForest()
方法对测试数据中的新因子水平做出一些固有假设,那么只想了解好奇心。
这是一个可重复的例子:
seq1 <- c(5,3,1,3,1,"unwanted_char",4,2,2,3,0,4,1,1,0,1,0,1)
df1 <- matrix(seq1,6)
df1 <- as.data.frame(df1)
colnames(df1) <- c("a","b","c")
train <- df1[1:4,]
test <- df1[5:6,]
现在,当我们使用火车创建一个森林并按照以下标准运行predict()
时......
forest1 <- randomForest(c~a+b,data=train,ntree=500)
test$prediction <- predict(forest1,test,type='response')
测试矩阵包含对&#39; 1&#39;的预测。最后一次观察有一个=&#39; unwanted_char&#39;和b =&#39; 4&#39;。
请注意:当您创建测试并训练数据单独时,预测功能会抛出上述错误而不是预测。
答案 0 :(得分:1)
我的观点是,这是一个非常糟糕的例子;但是,这里的答案是:
您创建的df1
只有因子变量和4个观察值。在这里,mtry
将等于1,这意味着大约1/2的树将仅基于b
,仅基于a
的1/2。当b == "4"
分类始终为1. IE- b == 4
完全预测c
。同样地,a == 1
完全预测c == 0
。
当您在单个数据集中创建数据时,这种方法起作用的原因是变量是因子变量,其中train
和test
中存在可能的级别,尽管某些变量存在train
中的等级== 0。因为&#34; unwanted_char&#34;是train$a
中的一个可能级别(虽然没有观察到)但它对您的预测没有问题。如果将它们创建为单独的数据集,则会明确创建因子变量,test
具有新的级别。
也就是说,基本上,您的问题有效,因为您不了解因素在 R 中的作用。
答案 1 :(得分:0)
predict.randomForest()中的错误:训练数据中不存在的新因子水平
这个错误非常令人困惑,您可能希望对需要使用构建模型的数据集进行预测的数据集进行调整,并进行预测。
使用rownum的后期预测子集,简单且经过测试的方法
答案 2 :(得分:0)
我同意Alex的观点,这不是一个好例子。
以下是您的问题的答案:
str(train)
如果您检查列车数据的结构,您会看到该变量&#39; a&#39;具有所有4个级别,因为在创建数据帧df1时分配了级别。