我正在使用名为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)
答案 0 :(得分:3)
昨天我向miss CRAN提交了missForest的1.4版本; Windows和Linux软件包已准备就绪,Mac版本即将推出。
新函数有一个额外的参数“parallelize”,允许以并行方式计算单个林(parallelize =“forest”)或同时计算多个变量上的多个林(parallelize =“variables”) )。默认设置是没有并行计算(parallelize =“no”)。
不要忘记注册合适的并行后端,例如:在第一次尝试之前使用“doParallel”包。 “doParallel”插图在第4节中给出了一个说明性的例子。
由于其他一些细节,我不得不暂时从包中删除“missForest”插图。但我会在适当的时候解决这个问题,并将其作为版本1.4-1发布。
答案 1 :(得分:1)
做好并行化missForest功能有点棘手。似乎有两种基本方法:
方法1很容易实现,除了你必须自己计算错误估计,因为randomForest combine
函数不会为你计算它们。但是,如果randomForest对象没有花费那么长的时间来计算并且有很多列包含NA,那么即使聚合操作需要很长时间来计算,你也可能获得很少的加速。
方法2有点难以实现,因为顺序算法在每次randomForest操作后更新xmis
数据帧的列。我认为并行化的正确方法是一次并行处理n
列(其中n
是工作进程的数量),因此需要围绕n
列的另一个循环以处理数据框的所有列。我的实验表明,除非这样做,否则外循环需要更长时间才能收敛,从而失去了并行执行的好处。
通常,为了提高性能,您需要实现这两种方法,并根据输入数据选择使用哪种方法。如果你只有几个NA的列,但randomForest模型需要很长时间来计算,你应该选择方法1.如果你有很多NA的列,你应该选择方法2,即使各个randomForest模型需要很长时间计算的时间,因为这可以更有效地完成,尽管它可能仍然需要外部while循环的额外迭代。
在尝试使用missForest的过程中,我最终开发了该软件包的并行版本。我在GitHub Gist上放了修改后的library.R版本,但是在这种形式下使用它并不简单,特别是没有文档。所以我联系了missForest的作者,他非常有兴趣将我的一些修改合并到官方软件包中,所以希望发布到CRAN的下一版missForest将支持并行执行。