R中的随机森林包在进行预测时,如果测试数据中存在新的因子水平,则会显示错误。有没有什么方法可以避免这个错误?

4

我的训练数据有30个预测变量的水平。在测试数据中,同样的预测变量也有30个水平,但是其中一些水平不同。随机森林算法需要完全匹配才能进行预测,否则会出现错误提示,如下所示: Error in predict.randomForest(model,test) New factor levels not present in the training data

意思是测试数据中存在训练数据中不存在的新水平,无法进行预测。


1
它究竟应该如何为之前从未“见过”的东西构建预测? - IRTFM
一种常见的解决方法是将因子的不频繁水平分组到一个“其他”水平中,该水平还包括未观察到的值。 另一个想法(如果有许多变量)是放弃使用具有未观察到的值的变量的树。 - Vincent Zoonekynd
4个回答

10

我发现的一个解决方法是先将训练集和测试集中的因子变量转换为字符变量。

test$factor <- as.character(test$factor)

然后为每个表格添加一个测试/训练标志的列,例如:

test$isTest <- rep(1,nrow(test))
train$isTest <- rep(0,nrow(train))

然后使用rbind将它们合并

fullSet <- rbind(test,train)

然后将其转换回因子变量

fullSet$factor <- as.factor(fullSet$factor)

这将确保测试集和训练集具有相同的级别。然后您可以重新拆分:

test.new <- fullSet[fullSet$isTest==1,]
train.new <- fullSet[fullSet$isTest==0,]

你可以删掉每个集合中的isTest列。然后你会得到具有相同级别的数据集,可以用于训练和测试。可能有更优雅的解决方案,但这在过去曾经对我有用,并且如果需要经常重复,你可以把它写成一个小函数。


2
使用此方法使得级别匹配(这里的测试和训练是指测试数据集和训练数据集中的列)。
test<-factor(test, levels=levels(train))

这就是解决方案! - mathematix

1

这个问题的简单解决方案是:

  • 将测试数据和训练数据合并
  • 进行预测
  • 从预测结果中筛选出合并数据的子集

0

当你的测试数据级别与训练数据级别不匹配时,这就是出现的问题。

一个简单的修复方法:

  • 将字符列作为因子加载测试数据
  • 然后使用rbind()将测试数据与训练数据进行合并
  • 现在从步骤2中子集化测试数据行并进行预测

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