3

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

 data(iris)
 summary(iris)

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

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

估算缺失值,提供完整的矩阵以供说明。使用“详细”查看迭代之间发生的情况:

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

2 回答 2

4

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

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

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

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

于 2014-01-01T12:15:17.960 回答
1

做好missForest函数的并行化工作有点棘手。似乎有两种基本方法可以做到这一点:

  1. 并行创建 randomForest 模型对象;
  2. 为包含 NA 的数据帧的每一列并行执行多个 randomForest 操作(创建模型和预测)。

方法 1 很容易实现,除了你必须自己计算误差估计,因为 randomForestcombine函数不会为你计算它们。但是,如果 randomForest 对象的计算时间不长,并且有很多列包含 NA,那么即使计算聚合操作需要很长时间,您也可能获得很少的加速。

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

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


在尝试missForest的过程中,我最终开发了一个并行版本的包。我将 library.R 的修改版本放在GitHub Gist 上,但是以这种形式使用并非易事,尤其是在没有文档的情况下。于是我联系了missForest的作者,他非常有兴趣将至少我的一些修改整合到官方包中,所以希望发布到CRAN的下一个版本的missForest能够支持并行执行。

于 2013-11-26T19:06:27.830 回答