【问题标题】:parallel prediction with cforest/randomforest prediction (with doSNOW)使用 cforest/randomforest 预测进行并行预测(使用 doSNOW)
【发布时间】:2013-01-23 06:43:04
【问题描述】:

我正在尝试通过拆分测试数据集 (n=35000) 并让 R 在较小的块上运行来加速预测。该模型已使用party::cforest 生成。

但是,当我尝试使用 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 的预测表现类似,不同之处在于,即使 %do% 用于 10x1:10 的预测,也比仅预测 1:100 需要更多的时间 不过,对于 randomForest,我并不在意,因为无论如何预测所有 35k 数据集都不是问题。 顺便提一句。只有我,还是 cforest 需要更多时间和内存来完成所有事情?只有在 randomForest 像魅力一样工作时遇到麻烦..

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这对你有用吗? @hansjaneinvielleicht?我想在巨大的光栅文件上预测一个 RandomForest 对象。你对@SteveWeston 有什么经验吗?
    • @lok​​i 不,我不知道。我想看看工人是否有可能自己读取光栅文件的一部分,而不是让主人发送它们。
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2019-05-06
    • 2016-12-08
    相关资源
    最近更新 更多