在missForest包中如何并行化处理?

3

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

目前为什么执行时间很长?是因为单个randomForest操作需要很长时间,还是因为有许多包含NA的列导致了许多randomForest操作,或者需要许多迭代才能收敛,或者以上几种情况的组合? - Steve Weston
Steve:通常是因为使用非常大的数据矩阵(〜500*1000000)。 - hema
你能估计有多少列缺失值吗?这将决定每次迭代计算的randomForest操作数量。 - Steve Weston
2个回答

4
昨天我向CRAN提交了missForest1.4版本;Windows和Linux的包已经准备好,Mac版将很快推出。
新的功能增加了一个参数"parallelize",允许以并行方式计算单个森林(parallelize="forests")或同时在多个变量上计算多个森林(parallelize="variables")。默认设置为不进行并行计算(parallelize="no")。
在第一次尝试之前,请不要忘记注册适当的并行后端,例如使用"doParallel"包。 "doParallel"手册在第4节中提供了一个说明性的示例。
由于某些细节原因,我不得不暂时从包中删除"missForest"手册。但我会及时解决并发布1.4-1版本。

1
这个问题中的missForest函数并行化有点棘手。似乎有两种基本方法:
  1. 并行创建randomForest模型对象;
  2. 对包含NA值的数据框的每列执行多个randomForest操作(创建模型和预测)。
方法1相当容易实现,只是你需要自己计算误差估计,因为randomForest的combine函数不会为你计算它们。然而,如果randomForest对象计算时间不长且包含许多NA值的列,则即使在总体上操作需要很长时间来计算,你可能也几乎没有获得加速。
方法2有点难以实现,因为顺序算法在每次randomForest操作后更新xmis数据框的列。我认为正确的并行化方法是一次并行处理n列(其中n是工作进程的数量),因此需要另一个循环来处理数据框的所有列。我的实验表明,除非这样做,否则外部循环需要更长时间才能收敛,从而失去了并行执行的好处。
通常情况下,为了获得性能提升,您需要同时实现这两种方法,并根据输入数据选择使用哪种方法。如果您只有少数带有NA的列,但是randomForest模型计算时间很长,则应选择方法1。如果您有许多带有NA的列,则可能应该选择方法2,即使单个randomForest模型计算时间很长也可以更有效地完成,尽管可能仍需要外部while循环的额外迭代。
在使用missForest进行实验的过程中,我最终开发了该软件包的并行版本。我将修改后的library.R版本放在GitHub Gist上,但是以这种形式使用并不容易,特别是没有文档的情况下。因此,我联系了missForest的作者,他非常有兴趣将我的部分修改合并到官方软件包中,希望下一个发布到CRAN的missForest版本支持并行执行。

Steve: 非常感謝您實現missForest的平行處理 - 我嘗試將其應用於以下鳶尾花數據集:------------------------ iris.imp <- p_missForest(iris.mis,xtrue = iris,verbose = TRUE)## p_missForest是來自GitHub Gist的missForest功能 ---- 所以,這就是您期望使用p_missForest的方式嗎?再次感謝。 - hema
@hema 从代码中可以看出,您需要注册一个foreach并行后端,并将“enableparallel”参数设置为“columns”或“rf”,另外还要加载适当的软件包。 - Steve Weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接