6

790,000 行と 140 個の予測子を持つ非常に大きなデータ フレームがあります。これらのいくつかは、互いに強い相関関係にあり、異なるスケールで関係しています。randomForestパッケージを使用すると、データの小さなサンプルのみを使用して各コアでフォレストを成長させることができます。次のように、関数を使用しforeachてそれらをマージし、combine()1 つの大きなツリーを取得します。

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さまざまなスケールで変数が相関しているため、パッケージの条件付きランダム フォレストを使用したいと思いますがcombine()、cforest の方法がないため、複数の cforest オブジェクトを組み合わせて 1 つの重要度プロットまたは 1 つの予測を取得する方法がわかりません。

データの小さなサブセットで 1 つの大きな cforest をトレーニングする方法、またはいくつかの小さな cforest を作成してそれらを 1 つの大きな条件付きフォレスト モデルに結合する方法はありますか?

4

1 に答える 1

0

いくつかの小さな cforest を作成し、それらを 1 つの大きな条件付きフォレスト モデルに結合します。

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]])
}
于 2016-11-15T09:48:30.470 に答える