如何在R中使用缺少值的随机森林?


74
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的因子。


以目前的状态,这个问题将很难回答。您可以使用一些示例数据来更新您的问题吗?
大通

1
@ MattO'Brien同样有趣的是,问题的质量是根据观看次数而不是问题本身的优劣来讨论的。答案是肯定的,因为@ Joran毫无疑问地找出了要问的内容,并提供了似乎是解决问号者问题的好方法。
user7610 2014年

Answers:


118

我对这个问题的最初反应是,它没有进行太多的研究工作,因为“每个人”都知道随机森林不会处理预测变量中的缺失值。但是经过检查,?randomForest我必须承认这可能会更加明确。

(尽管,文档中链接的Breiman PDF确实明确指出,根本不处理缺少的值。)

我可以看到的官方文档中唯一明显的线索na.actionna.fail,该参数的默认值为,对于新用户而言可能太神秘了。

无论如何,如果您的预测变量缺少值,则(基本上)有两个选择:

  1. 使用其他工具(rpart很好地处理缺失值。)
  2. 估算缺失值

毫不奇怪,randomForest程序包具有执行此功能的功能rfImpute。本文档?rfImpute提供了一个基本用法示例。

如果只有少数案例缺少值,则您也可以尝试设置na.action = na.omit以简单地删除这些案例。

当然,这个答案有点猜测您的问题确实只是缺少值。


您碰巧知道WIN ~ . OP的第一个参数是什么意思吗?当然,这不是问这个问题的最佳地点,但想知道您是否会知道。谢谢。
阿梅利奥·瓦兹克斯·雷纳

1
问题是响应变量中缺少值,而不是预测变量。
Brigitte

23

随机森林所基于的布雷曼随机森林实际上可以处理预测变量中的缺失值。在randomForest包中,您可以设置

   na.action = na.roughfix

它将首先使用中位数/众数作为缺失值,但随后将生长一个森林并计算邻近度,然后使用这些新填充的值进行迭代并构造一个森林,等等。randomForest文档(p10)中对此没有很好的解释。它只说

.... NA被列中位数代替....这被用作随机森林插补缺失值的起点

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

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

仅在训练集上使用具有k次迭代的接近度,将mfixrep = k与missfill = 2进行k替换的速度较慢,但​​通常更有效。(要求nprox> 0)。


7
这个答案比被接受的答案更具信息性(和礼貌)。-_-
杜哈特先生

3

如果缺少的值有提供信息的可能性,则可以输入缺少的值并添加其他二进制变量(使用new.vars<-is.na(your_dataset)),并检查它是否降低了错误;如果new.var设置的值太大而无法添加,your_dataset则可以单独使用它,并选择带有varImpPlot并加入他们your_dataset,你也可以尝试添加单个变量your_dataset,其对数量NAnew.var <- rowSums(new.vars)

这不是题外话的答案,如果缺少的变量可以提供信息,因为仅由于不完善的插补程序,它们就可以纠正模型误差的增加。

缺失值具有参考价值,然后由于非随机原因而产生,这在社会实验环境中尤为常见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.