如何在R中构建具有缺失(NA)值的随机森林?

时间:2011-12-03 19:44:34

标签: r machine-learning random-forest na missing-data

我想要一个随机的森林模型,但是当我打电话时

library(randomForest)
cars$speed[1] <- NA # to simulate missing value
model <- randomForest(speed ~., data=cars)

我收到以下错误

Error in na.fail.default(list(speed = c(NA, 4, 7, 7, 8, 9, 10, 10, 10,  : 
   missing values in object

3 个答案:

答案 0 :(得分:111)

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

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

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

在任何情况下,如果你的预测者有缺失值,你(基本上)有两个选择:

  1. 使用其他工具(rpart很好地处理缺失值。)
  2. 归档缺失值
  3. 毫不奇怪,randomForest包具有执行此操作的功能rfImpute?rfImpute上的文档贯穿其使用的基本示例。

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

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

答案 1 :(得分:3)

如果缺失值有可能提供信息,那么您可以输入缺失值并添加其他二进制变量(使用new.vars<-is.na(your_dataset))并检查是否会降低错误,如果new.var太大而无法添加它可以your_dataset然后你可以单独使用它,用varImpPlot选择有意义的变量并将它们添加到your_dataset,你也可以尝试将单个变量添加到your_dataset来计算数字NA的{​​{1}}

这不是非常难以回答的答案,如果遗漏变量是信息性的,那么它们可以纠正由于不完全的插补程序而导致的模型误差的增加。

缺失值是信息性的,然后由于非随机原因而出现,在社会实验环境中尤其常见。

答案 2 :(得分:0)

randomForest包所基于的

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

   na.action = na.roughfix

它将首先使用中位数/众数作为缺失值,但随后将生长一个森林并计算邻近度,然后使用这些新填充的值进行迭代并构造一个森林,等等。randomForest {{3} }。它仅说明

  

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

在Breiman的documentation (p10)上,您会发现更多信息

  

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

     

mfixrep = k与misfill = 2相比,仅使用训练集上进行k次迭代的邻近替换速度较慢,但​​通常更有效。 (需要nprox> 0)。