0

我正在尝试在 R 中使用随机森林对一些 kaggle 数据进行分类,但是每当我尝试使用我创建的模型时,我都会收到以下错误。

Error in predict.randomForest(fit, newdata = test, type = "class") : 
  Type of predictors in new data do not match that of the training data

我完全不知道这个错误的原因,谷歌并没有提供太多帮助。任何帮助或见解将不胜感激。下面给出了简单的代码片段,它是对 kaggle 问题之一的响应。

fit = randomForest(as.factor(IsBadBuy) ~ VehicleAge + WheelTypeID + Transmission + WarrantyCost + VehOdo + Auction, 
                   data=training, importance=TRUE, do.trace=100, keep.forest=TRUE)

prediction = predict(fit, newdata=test, type='class')

t = table(observed=test[, 'IsBadBuy'], predict=prediction)
4

4 回答 4

1

对于像我这样的 R 新手......当他们说“错误消息的含义与它所说的完全一样:您的训练数据中至少有一个变量的类型与您的测试数据中的等效变量不匹配”时,他们是对的。

请运行以下命令以确认没有明显不同:
str(training)str(NewData)

这将列出训练和新数据的特征和类型。像我一样,您可能仍然感到困惑的原因是数据类型可能看起来匹配但错误。这可能是虽然两个集合中的一个特征/列被列为一个因素,但水平并不相同。我的新数据要小得多,没有训练数据的所有级别。这会让你因为这个错误而大吃一惊。解决方法是:当您处理新数据并对其进行分解时,请传入所有可能的级别。这会让你匹配,事情会奏效。

dataframe$ColToFactor <- factor(dataframe$ColToFactor, levels=c("PossibleLvl1", "PossibleLvl2", "PossibleLvl3", account for all possible))

那是我的交易。

于 2017-03-30T22:06:35.543 回答
0

这个错误主要是由于分类预测变量,假设一个特定类别的分类预测变量在训练模型时出现在训练集中,但在预测这个错误时没有出现在测试集中

(例如)考虑一个名为“salary level”的分类预测器,其中包含三个级别的低、中、高所有这些类在训练集中至少出现一次,但在测试集中,其中一个类说“中等”根本没有出现然后变量“salary_level”在预测函数的测试测试中被视为具有两个类别的新变量或不同变量。因此错误数据不匹配。

您可以通过使用函数 table(data_name$variable_name) 或 table(data_name[,columnposition]) 分析分类变量的类来克服这个问题

于 2015-03-31T10:21:24.280 回答
0

看看这个页面,可能会有所帮助:

http://gettinggeneticsdone.blogspot.be/2011/02/split-data-frame-into-testing-and.html

它解释了如何使用优雅的函数将数据框拆分为 R 中的测试和训练集,以及如何在随机森林的情况下使用它。

于 2013-04-23T15:53:35.983 回答
0

这是一篇旧帖子,但我看到了几个月前的活动。我自己遇到了这个问题,但在网上找不到解决方案。我用粗略的解决方案解决了我的问题。

其他答案中描述了我们收到此类错误的原因。简而言之,如果训练和测试数据集中变量的因子水平数量不相等,则会出现这样的错误。尽管如果您在训练数据中具有所有级别,但在测试数据中没有所有级别,那么您会遇到这样的问题(至少我遇到了)。

如果您有一个数据集,并且想要将其拆分以进行训练和测试,最好将它们拆分,以便在训练和测试数据集中很好地表示所有级别。但是,如果您想创建一个适用于未见数据的预测器,最好找到一个解决方案。

例如,如果您在“b”列中有一个具有 3 个级别的数据框。

a<-c(1,2,3,1,3,2,4,5)
b<-as.factor(c(1,2,3,2,3,1,1,2))
d<-c(3,2,5,2,4,2,4,4)
dat<-cbind(a,b,d)

如果您的“b”列中只有两个级别的测试数据。

a<-c(1,2,2,1,3)
b<-as.factor(c(1,2,1,1,2))
d<-c(3,2,5,2,4)
testData<-cbind(a,b,d)

然后,您会收到错误消息。在我的肮脏解决方案中,我在测试数据中添加了三行包含因子级别,然后在添加因子级别后将其删除。

testData[,2]<-as.character(testData[,2]) # First changing the factor to character
addition<-testDat[1:3,] ## this will be added to testData
addition[,2]<-c(1,2,3)  ## Changing the content to get the known factor levels
testData<-rbind(addition,testData) ## add the new rows to the testData
testData[,2]<-as.factor(testData) ## And now converting back to factor

## And finally removing the added rows
testData<-testData[4:nrow(testData),]

我的脚本不整洁,修复也不整洁。但是,我一步一步地这样做,以便稍后回来时可以理解。可能有人可以在几行中编写相同的代码。

于 2015-07-14T12:46:33.180 回答