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

randomForest()如何预测不在训练数据中的新因子水平?,r,random-forest,R,Random Forest,当我通过拆分单个数据帧创建训练集和测试集,并使用randomfreest包构建随机林时,对于训练数据中不存在的某些因子级别,predict()函数仍会抛出一个输出。虽然这没有给出错误(这是我在相关问题中寻找的),但我的问题是randomForest()模型预测值的依据是什么,因为理想情况下它应该抛出以下错误 predict.randomForest()中的错误: 培训数据中不存在新的系数级别 出于好奇,想知道randomForest()方法是否对测试数据中的新因子水平做出了一些固有的假设 下面是

当我通过拆分单个数据帧创建训练集和测试集,并使用
randomfreest
包构建随机林时,对于训练数据中不存在的某些因子级别,
predict()
函数仍会抛出一个输出。虽然这没有给出错误(这是我在相关问题中寻找的),但我的问题是
randomForest()
模型预测值的依据是什么,因为理想情况下它应该抛出以下错误

predict.randomForest()中的
错误:
培训数据中不存在新的系数级别

出于好奇,想知道
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,]
测试矩阵包含对最后一个观测值的“1”的预测,该观测值具有a=“多余的字符”和b=“4”


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

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

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

当您在单个数据集中创建数据时,这起作用的原因是变量是因子变量,其中可能的级别存在于
train
test
中,尽管在
train
中观察到的某些级别的数量==0。由于“不需要的字符”在
train$a
中是一个可能的级别(尽管未被观察到),因此您的预测不会有问题。如果将这些作为单独的数据集创建,则会清楚地创建因子变量,
test
具有新的级别


也就是说,从本质上讲,您的问题之所以有效,是因为您不了解predict.randomForest()中因子如何在R错误中起作用:训练数据中不存在新的因子级别

这个错误非常令人困惑,您可能希望用构建模型的数据集来检索需要预测的数据集,并进行预测


使用rownum的后预测子集,简单且经过测试的方法学

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

以下是你问题的答案:

       str(train)

如果检查列车数据的结构,您将看到变量“a”具有所有4个级别,因为创建数据帧df1时分配了这些级别。

我了解有关因素的部分,但您能否详细说明“mtry”等于1。您的意思是说在这种情况下,
randomForest()
只创建带有单个变量的树吗?这就是您的示例中的
mtry
的实现。阅读帮助文件和/或Breiman的原始论文。我不知道如何
randomForest()
生成树,但您的意思是说,在生成林时,每个树仅由单个变量组成吗?我会读你提到的布雷曼的论文,但只是问这个来确认一个疑问…见
?randomForest::randomForest
,我想你还没有理解我的问题,请再读一遍。。。我不是在问如何消除错误……这是一个很好的问题,但我想用“如何
randomForest
外推因子变量”来形容它。此外,您在因子处理方面遇到了一些棘手的问题。我建议编辑您的问题,使用字母作为输入,以明确因素问题。下面是一个候选重写:
       str(train)