如何在R中使用随机森林处理缺失值?

84
library(randomForest)
rf.model <- randomForest(WIN ~ ., data = learn)

我想拟合一个随机森林模型,但我得到了这个错误:

Error in na.fail.default(list(WIN = c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L,  : 
missing values in object

我有一个数据框,其中包含16个数字特征和一个名为WIN的因子,其级别为0和1。


以目前的状态来看,这个问题很难回答。你能否更新你的问题并提供一些样本数据? - Chase
1
@MattO'Brien 还有趣的是,关于一个问题的质量如何被讨论时,基于的是它的浏览量而不是问题本身的优点。而且答案也是一样,因为 @Joran 没有遇到什么问题就能理解正在被问的内容,并提供了对提问者的问题似乎是一个很好的解决方案。 - user7610
3个回答

123

如果您的数据存在缺失值,您基本上有两种选择:

  1. 使用其他工具(rpart可以很好地处理缺失值)。
  2. 填充缺失值。

不出所料,randomForest包中有一个专门用于此目的的函数rfImpute。在?rfImpute的文档中,通过一个基本示例演示了它的使用方法。

还有na.roughfix,它会用中位数/众数替换缺失值。当调用randomForest时,您可以通过设置na.action = na.roughfix来使用它。

如果只有少量案例存在缺失值,您还可以尝试设置na.action = na.omit来简单地删除这些案例。

当然,这个答案只是猜测您的问题可能实际上只是存在缺失值。


你知道 OP 的第一个参数中的 WIN ~ . 是什么意思吗?这肯定不是问问题的最佳场所,但我想知道你是否知道。谢谢。 - Amelio Vazquez-Reina
1
问题是关于响应变量中的缺失值,而不是预测变量。 - Brigitte

43
布雷曼的随机森林算法实际上可以处理预测变量中的缺失值,而基于此算法的randomForest包也可以。在randomForest包中,您可以设置{{XX}}参数来指定处理缺失值的方法。
   na.action = na.roughfix

它将从使用中位数/众数来处理缺失值开始,然后生成一组森林并计算相似性,接着迭代并构建一个使用这些新填充的值的森林等。这在randomForest 文档(p10)中没有很好地解释。它只说明:

...NAs用列中位数替换....这用作通过随机森林填充缺失值的起点

在Breiman的主页上,您可以找到更多信息:

missfill=1,2快速替换训练集中的缺失值(如果等于1),并进行更仔细的替换(如果等于2)。

mfixrep=k与missfill=2一起使用时,仅在训练集上进行k次迭代,使用相似性进行较慢但通常更有效的替换。(需要nprox>0)。


10
这个回答比被采纳的那个回答更加详尽(并且礼貌)。-_- - Mr. Duhart

5
如果缺失值具有信息意义,则可以填充缺失值并添加额外的二进制变量(使用new.vars<-is.na(your_dataset)),并检查是否降低误差。如果new.var太大而无法添加到your_dataset中,则可以单独使用它,使用varImpPlot选择重要变量并将其添加到your_dataset中。您还可以尝试向your_dataset中添加单个变量,该变量计算NA的数量new.var <- rowSums(new.vars)
这不是离题的答案,如果缺失变量具有信息性,则考虑它们可以纠正由于不完美的插补过程而导致模型误差增加的情况。
如果缺失值具有信息意义,则说明它们是由于非随机原因而产生的,这在社会实验设置中特别常见。

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