randomForest() 如何预测不在训练数据中的新因子水平?

How does randomForest() predict for new factor levels not in training data?

当我通过拆分单个数据帧创建训练集和测试集并使用 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')

测试矩阵包含对 a = 'unwanted_char' 和 b = '4' 的最后一次观察的“1”预测。

请注意:当您分别创建测试和训练数据时,预测函数会抛出上述错误而不是进行预测。

我认为这是一个非常糟糕的例子;但是,这是答案:

您创建的 df1 只有因子变量和 4 个观察值。在这里,mtry 等于 1,这意味着大约 1/2 的树将仅基于 b,1/2 仅基于 a。当 b == "4" 时,分类始终为 1。IE- b == 4 完美预测 c。同样 a == 1 完美预测 c == 0

当您在单个数据集中创建数据时,此方法起作用的原因是变量是因子变量,其中可能的水平存在于 traintest 中,尽管观察到的数量对于 train 中的某些级别 == 0。由于 "unwanted_char" 是 train$a 中的可能水平(尽管未观察到),因此您的预测没有问题。如果您将它们创建为单独的数据集,则因子变量将被明确创建并且 test 具有新水平。

也就是说,从本质上讲,您的问题之所以有效,是因为您不了解 R.

中的因子是如何工作的

predict.randomForest() 错误:训练数据中不存在新的因子水平

这个错误比较迷惑,你不妨把你需要预测的数据集和建模型的数据集绑定起来做预测。

post 带 rownum 的预测子集,简单且经过测试的方法

我同意 Alex 的看法,这不是一个很好的例子。

这是您问题的答案:

       str(train)

如果您检查训练数据的结构,您会看到变量 'a' 具有所有 4 个级别,因为这些级别是在您创建数据帧 df1 时指定的。