当我通过拆分单个数据框创建训练集和测试集并使用 randomForest
包构建随机森林时,对于训练数据中不存在的某些因子级别, predict()
函数仍会抛出输出 . 虽然这没有给出错误(这是我在相关问题中寻找的),但我的问题是 randomForest()
模型预测该值的基础是什么,因为它理想情况下应该抛出以下错误...
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')
测试矩阵包含对最后一次观察的'1'的预测,其具有='unwanted_char'和b ='4' .
请注意:当您创建测试和训练数据 separately 时,预测函数会抛出上述错误而不是预测 .
3 回答
我的观点是,这是一个非常糟糕的例子;但是,这是答案:
您创建的
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 . 由于"unwanted_char"是train$a
中的一个可能级别(虽然未被观察到),但它对您的预测没有问题 . 如果将它们创建为单独的数据集,则会明确创建因子变量,并且test
具有新的级别 .也就是说,基本上,你的问题是有效的,因为你不了解因素在_1066708中是如何运作的 .
predict.randomForest()中的错误:训练数据中不存在的新因子级别
这个错误非常令人困惑,您可能希望调整需要使用构建模型的数据集进行预测的数据集并进行预测 .
使用rownum的后期预测子集,简单且经过测试的方法
我同意Alex的观点,这不是一个好例子 .
以下是您的问题的答案:
如果检查列车数据的结构,您将看到变量“a”具有所有4个级别,因为在创建数据帧df1时分配了级别 .