2

在下面的示例中,我尝试使用missForest 来估算缺失值。为了加快我使用 foreach 包的过程。在其中我使用了 100 棵树,然后我将这些树传递给了 missForest 函数。这是平行missForest的正确方法吗?

这是示例和我所做的:

   library(foreach)
   library(missForest)
   data(iris)
   iris.na <- iris
   set.seed(111)

   ## artificially drop some data values.

   for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA
    set.seed(222)

     system.time(rf <- foreach(ntree=100, .combine=combine, 
    .multicombine=TRUE,.packages='missForest') %dopar% 
    { missForest(iris.na)$ximp})
4

2 回答 2

6

我认为这应该可以解决您的问题。

library(doParallel)
library(missForest)
data(iris)
iris.na <- iris
set.seed(111)

## artificially drop some data values.

for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA
set.seed(222)

registerDoParallel(cores=3)
out <- missForest(iris.na, ntree = 100, parallelize = "forests")
于 2016-02-28T11:11:13.073 回答
1

在查看missForest 的代码时,我没有看到一种方法可以在不修改missForest 函数本身的情况下并行化对它的单个调用。您当然可以并行多次调用它,但这似乎不是您想要做的。

关于您的示例代码的一些附加说明:

  • foreach 循环仅使用一次迭代。
  • ntree未使用该变量。
  • 由于missForest(iris.na)$ximp返回数据框,因此不应将结果与combine需要 randomForest 对象的函数结合使用。
  • 没有注册并行后端。
于 2013-11-02T12:42:11.850 回答