做好missForest函数的并行化工作有点棘手。似乎有两种基本方法可以做到这一点:
- 并行创建 randomForest 模型对象;
- 为包含 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能够支持并行执行。