在missForest包中并行化进程



我正在使用一个名为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)

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

新函数有一个额外的参数"parallelize",它允许以并行方式计算单个森林(parallelize="forests")或同时计算多个变量上的多个森林(parallelize="variables")。默认设置为不进行并行计算(parallelize="no")。

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

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

要很好地并行化missForest函数有点棘手。似乎有两种基本方法:

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

方法1很容易实现,除了你必须自己计算误差估计,因为randomForest combine函数不会为你计算它们。然而,如果随机森林对象不需要很长时间来计算,并且有许多列包含NA,你可能会得到很少的加速,即使这些操作总共需要很长时间来计算。

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

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


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

最新更新