2

我想尝试在我目前正在处理的数据集中填写我的缺失值。数据有 13300 个观测值和 9 个特征。我想运行一个随机森林,所以我尝试使用 rfimpute 来填充这些缺失值。我收到以下错误:无法分配大小为 678.4 Mb 的向量。我在具有 8 gb 内存的 Windows 机器上运行它。这是我做的电话:

datos.imputados <- rfImpute(vo~P4.Plan.Esp+P11.Comprador+SegmentoDisipado+PersMcKinsey+Kids+IndefDulceSal+lugarcons+Compania,data=datos,ntrees=300,iter=6)

这里发生了什么?670 mbs 听起来并不多...

4

2 回答 2

3

我在具有 16GB RAM 和超线程四核的 MacMini 上使用 rfImpute 时遇到了同样的问题。对于您的日常数据分析问题,没有什么是它无法处理的。问题是 rfImpute 通过生成邻近矩阵来工作。邻近矩阵为 N x N,这对于您的应用程序意味着 rfImpute 创建一个具有 13300^2 个条目的背景对象。就我而言,它是 93000^2。

您可以做的一件事是将数据分成 K 个不同的段并将 rfImpute 应用于每个切片,然后手动重新组合:

slices <- 8 
idx <- rep(1:slices, each = ceiling(nrow(X)/slices))
idx <- idx[1:nrow(X)]

imputedData <- do.call('rbind', lapply(1:slices, function(SLICE){
    print(SLICE)
    require(randomForest)
    rfImpute(X[idx == slice, ], Y[idx == slice])
  }))

您可以使用 parLapply 将其并行化,如下所示:

slices <- 8 
idx <- rep(1:slices, each = ceiling(nrow(X)/slices))
idx <- idx[1:nrow(X)]

cl <- makeCluster(8)
clusterExport(cl, c('idx', 'slices', 'X', 'Y'))
  imputedData <- do.call('rbind', parLapply(cl, 1:slices, function(SLICE){
    require(randomForest)
    rfImpute(X[idx == SLICE, ], Y[idx == SLICE])
  }))
stopCluster(cl)
于 2014-05-16T19:42:03.020 回答
2

我有同样的问题。如 Roland 评论中所述,您需要额外的 700 MB 内存,而您在此阶段可能没有。

你可以尝试释放你的记忆,或者寻找一种不太复杂的方法来估算。就像impute这里描述的那样https://stackoverflow.com/a/13114887/55070

于 2013-06-17T07:48:28.773 回答