使用cforest / randomforest预测进行并行预测(使用doSNOW)

时间:2013-02-07 16:59:13

标签: r foreach parallel-processing random-forest party

我正在尝试通过将测试数据集(n = 35000)拆分并让R在较小的块上运行来加速测试数据集的预测。 (此外,party对35k行的cforest预测不起作用,因为我的RAM不够。这是另一件我不理解的事情,但是很好......)

但是,在尝试将foreach%dopar%一起使用时,我无法让R计算最小的部分。

我的预测功能大约需要7秒 predict(fit,newdata=a[1:100,])foreach(i=1:10) %do% {predict(fit,newdata=a[1:10,])}

但是当我尝试使用%dopar%时,R似乎会冻结。 不应该:

foreach(i=1:10, .packages=c('party')) %dopar% {predict(fit,newdata=a[1:10,])}

更快?或者并行化本身是否会以某种方式降低R?

使用其他函数测试运行(按建议here重复计算sqrt(3))已经显示出显着的改进,因此%dopar%也正在运行。

使用randomForest的预测行为相似,不同之处在于,对于10x1:10预测,这里甚至%do%比预测1:100需要更多的时间 对于randomForest,我并不在乎,因为无论如何预测所有35k数据集都不是问题。 顺便说一句。它只有我,还是cforest为一切花费更多的时间和内存?只有在randomForest像魅力一样工作时才会遇到麻烦。

(在Windows 7,x64,8GB RAM,4核/ 8线程上运行 - 在doSNOW并行化集群中使用6个节点)

1 个答案:

答案 0 :(得分:0)

您的示例的主要问题是foreach会自动将整个a数据框导出到每个工作人员。相反,尝试类似:

library(itertools)
foreach(1:10, suba=isplitRows(a, chunkSize=10), .packages='party') %dopar% {
    predict(fit, newdata=suba)
}

1:10用于测试目的,将循环限制为仅10次迭代,就像您在示例中所做的那样。

这仍然需要将fit导出到所有工作人员,并且可能非常大。但由于任务比工作人员多得多,如果predict与发送测试数据的时间相比需要足够的时间,那么并行化预测可能是值得的。