在并行环境下训练cforest

6

我有一个非常大的数据框,包含790,000行和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包的条件随机森林,以处理不同比例的相关变量,但是在cforests中没有combine()方法,因此我不确定如何将几个cforest对象组合起来,以获取一个重要性图或一个预测结果。

是否有一种方法可以对数据的较小子集进行训练,并形成一个大型的cforest,或是制作多个小型cforests并将它们组合成一个更大的条件森林模型呢?


尝试使用h2o包,可以在这里下载。非常快速、开源且可以并行运行。更新速度非常快,有时文档的一致性会有所欠缺。 - Stereo
谢谢指点!从阅读RF文档来看,它似乎没有条件树。由于我的一些预测变量之间强相关,如果我运行通常的RF,变量重要性将把一堆高度预测但相关的变量放在顶部,这比只选择其中一个不太有用。 - Christopher Aden
2
实现party :: cforest不支持并行处理(据我所知)。在(较慢的)重新实现的“partykit :: cforest”中,我们已经添加了并行化支持,但是目前“partykit”版本还没有提供旧版“party”的所有功能。特别是,目前尚未实施任何变量重要性措施。因此,这对您没有太大用处。您可以直接联系“party”维护者(Torsten Hothorn),了解他是否有建议如何拆分学习“party :: cforest”。 - Achim Zeileis
谢谢,阿希姆。这可能是我在这个话题上做的最好的了。如果你把它作为一个完整的答案提交,我会接受它,直到partykit有一个importance()函数 :)。 - Christopher Aden
哈!好吧,说得也有道理。似乎条件随机森林的状态相对于其他随机森林变体而言还不够发展。唉,算了。 - Christopher Aden
显示剩余2条评论
1个回答

0

制作几个小的条件森林,将它们组合成一个更大的条件森林模型。

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]])
}

1
嗨,加上一些解释会有助于理解您的代码。仅提供代码的答案是不受欢迎的。 - Bhargav Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接