随机森林:如何处理测试集中的新因子水平?

机器算法验证 r 分类数据 随机森林
2022-03-21 17:48:15

我正在尝试使用 R 中的随机森林模型进行预测。

但是我得到了错误,因为某些因素在测试集中的值与在训练集中的值不同。例如,某个因子在测试集中具有未出现在训练集中的Cat_2值等。34, 68, 76不幸的是,我无法控制测试集......我必须按原样使用它。

我唯一的解决方法是将有问题的因素转换回数值,使用as.numeric(). 可以工作,但我不是很满意,因为这些值是没有数字意义的代码......

你认为会有另一种解决方案,从测试集中删除新值吗?但是在不删除训练和测试中的所有其他因子值(比如说 values1, 2, 14, 32等)的情况下,它们包含可能对预测有用的信息。

4个回答

KingBonoit,此代码段可用于协调关卡:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

它还打印更改了哪些属性。我没有找到一种更优雅地编写它的好方法(使用 ldply 或其他东西)。任何提示表示赞赏。

这是我编写的一些代码,用于解决上述@King 的回复。它修复了错误:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

测试集和训练集应该合并为一组,然后改变训练集的级别。我的代码是:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

这适用于测试中的级别数量多于或少于训练的任何情况。

如果测试集有很多带有新因子值的点,那么我不确定最好的方法是什么。如果它只是少数几个点,您可能能够摆脱一些模糊的东西,例如将错误的因子水平视为缺失数据并使用您认为合适的任何方法对其进行估算。R 实现有几种方法来估算缺失数据,您只需将这些因子级别设置为 NA 以指示它们缺失。