繁体   English   中英

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,]

现在,当我们使用train创建森林并按如下方式在测试中运行predict()时...

forest1 <- randomForest(c~a+b,data=train,ntree=500)
test$prediction <- predict(forest1,test,type='response')

测试矩阵包含对最后一个观测值为'1'的预测,其预测值为='unwanted_char'和b ='4'。

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

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

您创建的df1仅包含因子变量和4个观察值。 在这里, mtry将等于1,这意味着大约1/2的树木将根据b单独和1/2上a孤独。 b == "4" ,分类始终为1。IE- b == 4完美地预测了c 同样, a == 1完美地预测c == 0

当你在一个单一的数据集创建数据,这个工作的原因是这两个变量因素变量,其中可能的水平都存在traintest ,尽管在观察量为一些等级== 0 train 由于“ unwanted_char”是train$a一个可能级别(尽管未观察到),因此对您的预测没有问题。 如果将它们创建为单独的数据集,则会分别创建因子变量,并且test具有新的级别。

就是说,从本质上讲,您的问题之所以有效,是因为您不了解R中的因素如何起作用。

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

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

具有行编号的后预测子集,简便易用且经过测试的方法

我同意亚历克斯的观点,这不是一个很好的例子。

这是您问题的答案:

       str(train)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM