并行化missForest包中的进程

时间:2013-05-23 17:09:20

标签: r parallel-processing

我正在使用名为missForest的软件包来估计数据集中的缺失值。 我的问题是:我们如何并行化这个过程以缩短获得结果所需的时间? 请参考这个例子(来自missForest包):

 data(iris)
 summary(iris)

数据包含四个连续变量和一个分类变量。 使用prodNA函数人为地生成缺失值:

set.seed(81)
iris.mis <- prodNA(iris, noNA = 0.2)
summary(iris.mis)

估算缺失值,提供完整的图示矩阵。使用'verbose'查看迭代之间发生的事情:

iris.imp <- missForest(iris.mis, xtrue = iris, verbose = TRUE)

2 个答案:

答案 0 :(得分:3)

昨天我向miss CRAN提交了missForest的1.4版本; Windows和Linux软件包已准备就绪,Mac版本即将推出。

新函数有一个额外的参数“parallelize”,允许以并行方式计算单个林(parallelize =“forest”)或同时计算多个变量上的多个林(parallelize =“variables”) )。默认设置是没有并行计算(parallelize =“no”)。

不要忘记注册合适的并行后端,例如:在第一次尝试之前使用“doParallel”包。 “doParallel”插图在第4节中给出了一个说明性的例子。

由于其他一些细节,我不得不暂时从包中删除“missForest”插图。但我会在适当的时候解决这个问题,并将其作为版本1.4-1发布。

答案 1 :(得分:1)

做好并行化missForest功能有点棘手。似乎有两种基本方法:

  1. 并行创建randomForest模型对象;
  2. 对包含NA的数据框的每一列并行执行多个randomForest操作(创建模型和预测)。
  3. 方法1很容易实现,除了你必须自己计算错误估计,因为randomForest combine函数不会为你计算它们。但是,如果randomForest对象没有花费那么长的时间来计算并且有很多列包含NA,那么即使聚合操作需要很长时间来计算,你也可能获得很少的加速。

    方法2有点难以实现,因为顺序算法在每次randomForest操作后更新xmis数据帧的列。我认为并行化的正确方法是一次并行处理n列(其中n是工作进程的数量),因此需要围绕n列的另一个循环以处理数据框的所有列。我的实验表明,除非这样做,否则外循环需要更长时间才能收敛,从而失去了并行执行的好处。

    通常,为了提高性能,您需要实现这两种方法,并根据输入数据选择使用哪种方法。如果你只有几个NA的列,但randomForest模型需要很长时间来计算,你应该选择方法1.如果你有很多NA的列,你应该选择方法2,即使各个randomForest模型需要很长时间计算的时间,因为这可以更有效地完成,尽管它可能仍然需要外部while循环的额外迭代。


    在尝试使用missForest的过程中,我最终开发了该软件包的并行版本。我在GitHub Gist上放了修改后的library.R版本,但是在这种形式下使用它并不简单,特别是没有文档。所以我联系了missForest的作者,他非常有兴趣将我的一些修改合并到官方软件包中,所以希望发布到CRAN的下一版missForest将支持并行执行。