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

3
当我通过拆分单个数据框来创建训练集和测试集,并使用 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”,其中a='unwanted_char',b='4'。

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


这是个很好的问题,但我会把它表述为“randomForest如何外推因子变量”。另外,你将涉及到一些因子处理的棘手问题。我建议编辑你的问题,使用字母作为输入,以明确因子问题。这里是一个可供参考的重写链接:https://gist.github.com/geneorama/6aa6c343506c47b980f0 - geneorama
2个回答

1

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

您创建的df1只有因子变量和4个观测值。在这里,mtry将等于1,这意味着大约一半的树将仅基于b,另一半将仅基于a。当b == "4"时,分类总是1。也就是说- b == 4完美地预测了c。同样地,a == 1完美地预测了c == 0

之所以在单个数据集中创建数据时可以工作,是因为这些变量是因子变量,其中可能的级别存在于traintest中,尽管某些级别在train中的观察数量为0。由于"unwanted_char"是train$a中一个可能的级别(尽管未被观察到),因此对于您的预测而言并不成问题。如果将它们创建为单独的数据集,则将创建不同的因子变量,并且test具有新的级别。

基本上,你的问题在于你不理解因子在R中的工作原理。

我理解因子部分,但“mtry”等于1能否详细说明一下?你的意思是说在这种情况下randomForest()只会创建一个带有单个变量的树吗? - Gaurav
这是针对你的示例实现mtry的代码。请阅读帮助文件和/或Breiman的原始论文。 - alexwhitworth
我不确定randomForest()是如何生成决策树的,但你的意思是说当你生成一片森林时,每个树都只由单个变量构成吗?我会阅读Breiman的论文,正如你所提到的,但只是想确认一下这个疑问... - Gaurav
请参阅?randomForest::randomForest - alexwhitworth

0

我同意Alex的观点,这不是一个好的例子。

以下是你问题的答案:

       str(train)

如果您检查训练数据的结构,您会发现变量'a'具有所有4个级别,因为在创建数据框df1时已经分配了这些级别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接