77
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 的因素。

4

3 回答 3

122

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

(尽管,文档中链接到的 Breiman 的PDF确实明确表示根本不处理缺失值。)

我能看到的官方文档中唯一明显的线索是na.action参数的默认值为na.fail,这对于新用户来说可能太神秘了。

在任何情况下,如果您的预测变量有缺失值,您(基本上)有两种选择:

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

毫不奇怪,该randomForest包具有执行此操作的功能,rfImpute. 文档?rfImpute贯穿了其使用的基本示例。

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

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

于 2011-12-04T02:10:54.097 回答
33

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

   na.action = na.roughfix

它将首先对缺失值使用中值/模式,然后它会生成一个森林并计算近似值,然后使用这些新填充的值等迭代并构建一个森林。这在 randomForest文档 (p10)中没有得到很好的解释。它只说明

.... NA 被列中位数替换 .... 这被用作通过随机森林估算缺失值的起点

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

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

mfixrep= k with misfill=2 使用仅在训练集上进行 k 次迭代的近似替换进行较慢但通常更有效的替换。(需要 nprox >0)。

于 2019-07-08T14:21:53.607 回答
5

如果缺失值可能提供信息,那么您可以输入缺失值并添加额外的二进制变量(使用new.vars<-is.na(your_dataset))并检查它是否降低错误,如果new.var设置太大而无法添加,your_dataset那么您可以单独使用它,使用varImpPlot并将它们添加到your_dataset,您也可以尝试添加单个变量来your_dataset计算NA's 的数量new.var <- rowSums(new.vars)

这不是题外话的答案,如果缺失的变量能够提供信息,则可以纠正仅由于不完美的插补程序而导致的模型误差增加。

缺失值是信息丰富的,然后它们是由于非随机原因而出现的,这在社会实验环境中特别常见。

于 2017-02-19T13:01:16.030 回答