R 并行训练森林

R 并行训练森林,r,parallel-processing,random-forest,party,R,Parallel Processing,Random Forest,Party,我有一个非常大的数据框,有790000行和140个预测值。其中一些相互之间有着很强的相关性,并且在不同的尺度上。使用randomForest包,我可以只使用一小部分数据在每个核心上生长一个林,使用foreach并将它们与combine()函数合并,得到一棵大树,如下所示: rf.STR = foreach(ntree=rep(125, 8), .combine=combine, .multicombine=TRUE, .packages='randomForest') %dopar% { s

我有一个非常大的数据框,有790000行和140个预测值。其中一些相互之间有着很强的相关性,并且在不同的尺度上。使用
randomForest
包,我可以只使用一小部分数据在每个核心上生长一个林,使用
foreach
并将它们与
combine()
函数合并,得到一棵大树,如下所示:

rf.STR = foreach(ntree=rep(125, 8), .combine=combine, .multicombine=TRUE, .packages='randomForest') %dopar% {
  sample.idx = sample.int( nrow(dat), size=sample.size, replace=TRUE)
  randomForest(x=dat[sample.idx,-1, with=FALSE], 
               y=dat[sample.idx, retention], ntree=ntree)
  }
不同尺度上的相关变量使我想使用
party
包中的条件随机林,但没有用于cforest的
combine()
方法,因此我不确定如何组合多个cforest对象以获得一个重要图或一个预测


有没有一种方法可以在较小的数据子集上训练一个大cforest,或者制作几个小cforest并将它们组合成一个较大的条件林模型?

制作几个小cforest并将它们组合成一个较大的条件林模型

library(snowfall)
library(party)
cforestmt<-function(formula, data = list(), subset = NULL, weights = NULL, controls = cforest_unbiased(), xtrafo = ptrafo, ytrafo = ptrafo, scores = NULL, threads=8) {

    if(controls@ntree<threads) {    # if there are less trees than threads single thread
        return(cforest(formula, data = data, subset=subset, weights=weights, controls=controls, xtrafo=xtrafo, ytrafo=ytrafo, scores=scores))
    }

    # round off threads
    fsize=controls@ntree/threads
    if(fsize-round(fsize)!=0) {
            fsize=ceiling(fsize)
            message("Rounding forest size to ",fsize*threads)
    }
    controls@ntree=as.integer(fsize)

    # run forests in parallel
    sfInit(parallel=T, cpus=threads, type="SOCK")
    sfClusterEval(library(party))
    sfExport('formula','data','subset','weights','controls','xtrafo','ytrafo','scores')
    fr<-sfClusterEval(cforest(formula, data = data, subset=subset, weights=weights, controls=controls, xtrafo=xtrafo, ytrafo=ytrafo, scores=scores))
    sfStop()

    # combine/append forest
    fr[[1]]@ensemble<-unlist(lapply(fr,function(y) {y@ensemble}),recursive=F)
    fr[[1]]@where<-unlist(lapply(fr,function(y) {y@where}),recursive=F)
    fr[[1]]@weights<-unlist(lapply(fr,function(y) {y@weights}),recursive=F)

    #first forest has result
    return(fr[[1]])
}
图书馆(降雪)
图书馆(党)

cforestmtTry可下载的
h2o
软件包。非常快,开源,并行运行。更新如此之快,以至于他们的文档有时缺乏一致性。谢谢你的提示!通过阅读RF文档,它似乎没有条件树。由于我的一些预测值是强相关的,如果我运行通常的RF,变量重要性将把一组高度预测但相关的变量放在顶部,这比它只选择其中一个变量有用。实现
party::cforest
不支持并行化(据我所知)。在(较慢的)重新实现中,
partykit::cforest
我们增加了对并行化的支持,但目前,
partykit
版本尚未提供旧
实现的所有功能。具体而言,目前没有实施可变重要性措施。因此,这对您没有多大用处。您可以直接联系
团队
维护人员(托尔斯滕·霍霍恩),看他是否有关于如何分配
团队::cforest
学习的建议。谢谢,阿希姆。这可能是我在这个问题上要做的最好的了。如果您将其作为完整答案提交,我将接受它,直到partykit获得一个重要性()函数:)。作为一个答案,它确实非常不令人满意,以至于一条评论足以令人尴尬:-)嗨,请在代码中添加一些解释,因为这有助于理解您的代码。只有密码的答案是不受欢迎的。