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

Bor*_*lis 71 r random-forest

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

library(randomForest)
rf.model <- randomForest(WIN ~ ., data = learn)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Error in na.fail.default(list(WIN = c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L,  : 
missing values in object
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 113

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

(虽然Breiman 在文档中链接的PDF确实明确表示根本没有处理缺失的值.)

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

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

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

毫不奇怪,该randomForest软件包具有完成此功能的功能rfImpute.该文档?rfImpute贯穿其使用的基本示例.

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

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


Bri*_*tte 32

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

   na.action = na.roughfix
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 这个答案比公认的答案更丰富(也更有礼貌)。-_- (8认同)

Qbi*_*bik 5

如果有可能缺失值的信息,那么你可以inpute缺失值,并添加额外的二元变量(含new.vars<-is.na(your_dataset)),并检查它是否降低误差,如果new.var过大集将它添加到your_dataset,那么你可以单独使用它,挑significiant变量varImpPlot并将它们添加到your_dataset,您也可以尝试添加单个变量来your_dataset计算NA's 的数量new.var <- rowSums(new.vars)

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

缺失值是有用的,然后它们由于非随机原因而出现,这在社会实验环境中尤其常见。