【问题标题】:parallelize process in missForest package在missForest包中并行化进程
【发布时间】:2023-03-15 01:01:04
【问题描述】:

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

【问题讨论】:

  • 为什么当前执行需要很长时间?是因为单个 randomForest 操作需要很长时间,还是因为您有许多包含 NA 的列导致许多 randomForest 操作,或者是否需要多次迭代才能收敛,或者这些的某种组合?
  • Steve:通常是因为使用了非常大的数据矩阵(~500 *100 0000)
  • 你能估计出有缺失值的列数吗?这决定了每次迭代计算的 randomForest 操作的数量。

标签: r parallel-processing


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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


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

    【讨论】:

    • Steve: 非常感谢你并行missForest——我尝试将它应用到 iris 数据集上,如下所示:----------------- ------ iris.imp
    • @hema 您应该能够从代码中看到,除了加载合适的包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2014-01-31
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多