【问题标题】:Type Mismatch Error using randomForest in R在 R 中使用 randomForest 类型不匹配错误
【发布时间】:2013-04-16 21:11:38
【问题描述】:

我正在尝试在 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

我完全不知道这个错误的原因,谷歌并没有提供太多帮助。任何帮助或见解将不胜感激。下面给出了简单的代码 sn-p 及其对 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)

【问题讨论】:

  • 昨天没有回答相同问题的原因是没有代码或数据。怎样才能告诉您我们所看到的只是错误文本的类型存在哪些问题?
  • 发布head(training.set)head(test.set)
  • 错误消息的含义与它的含义完全相同:您的训练数据中至少有一个变量的类型与您的测试数据中的等效变量不匹配。例如,也许 VehicleAge 在训练中是数字,但在测试中是一个因素。找到哪一个的唯一方法是检查str(training)str(test)
  • this 的副本? @joran:不幸的是,这并不是那么简单,因为当因子包含NA 作为级别(workaround)时会出现错误。
  • @joran:对因素的帮助表明这样做是完全有效的。毕竟,“分类变量”的语义意味着一个级别的关联值根本不应该发挥作用。我花了 15 分钟来验证“新数据中的预测器类型确实 与训练数据的预测器类型相匹配”,然后又用了 15 分钟来运行调试器并了解发生了什么。就我的口味而言,足以称其为错误。

标签: r error-handling random-forest kaggle


【解决方案1】:

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

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

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

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

这对我来说是一笔交易。

【讨论】:

    【解决方案2】:

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

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

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

    例如,如果您在“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),]
    

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

    【讨论】:

      【解决方案3】:

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

      (例如)考虑一个名为“salary level”的分类预测器,其中包含三个级别:low、medium、high 所有这些类在训练集中至少出现一次,但在测试集中,其中一个类说“medium”不会出现在全部 那么变量“salary_level”在预测函数的测试测试中被认为是一个新的或不同的变量,具有两个类别。因此错误数据不匹配。

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

      【讨论】:

      • 这是找出问题所在的有用信息。这样的问题有解决办法吗?
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-16
        • 2013-05-08
        • 2014-02-05
        • 1970-01-01
        • 2018-06-08
        • 2012-02-16
        • 2012-02-25
        相关资源
        最近更新 更多