1

ランダム フォレスト (dim: 47600811*9) の膨大なトレーニング データがあります。複数の (1000 としましょう) 次元 10000*9 のブートストラップ サンプル (実行ごとに 9000 のネガティブ クラスと 1000 のポジティブ クラスのデータポイントを取得) を取得し、それらすべてのツリーを繰り返し生成してから、それらすべてのツリーを 1 つのフォレストに結合します。必要なコードの大まかなアイデアを以下に示します。実際のtrainDataから置換を使用してランダムサンプルを生成し、それらのツリーを最適に繰り返し生成する方法を教えてもらえますか? とても助かります。ありがとう

library(doSNOW)
library(randomForest)
cl <- makeCluster(8)
registerDoSNOW(cl)

for (i=1:1000){
B <- 1000 
U <- 9000 
dataB <- trainData[sample(which(trainData$class == "B"), B,replace=TRUE),] 
dataU <- trainData[sample(which(trainData$class == "U"), U,replace=TRUE),] 
subset <- rbind(dataB, dataU)

実際のtrainDataからサブセットを何度も(1000回)生成する最適な方法であるかどうかはわかりません。

rf <- foreach(ntree=rep(125, 8), .packages='randomForest') %dopar% {
  randomForest(subset[,-1], subset$class, ntree=ntree)
}
}
crf <- do.call('combine', rf)
print(crf)
stopCluster(cl)
4

2 に答える 2

2

あなたの例は外側のループではなく内側のループを並列化しますが、内側の foreach ループの実行に数秒以上かかる限り、かなりうまく機能する可能性があります。ただし、プログラムにはバグがあります。つまり、最初の 999 個の foreach 結果を破棄し、最後の結果のみを処理しています。これを修正するには、長さ 1000*8 のリストを事前に割り当て、外側の for ループの反復ごとに foreach からの結果をそれに割り当てます。例えば:

library(doSNOW)
library(randomForest)
trainData <- data.frame(a=rnorm(20), b=rnorm(20),
                        class=c(rep("U", 10), rep("B", 10)))
n <- 1000         # outer loop count
chunksize <- 125  # value of ntree used in inner loop
nw <- 8           # number of cluster workers
cl <- makeCluster(nw)
registerDoSNOW(cl)
rf <- vector('list', n * nw)
for (i in 1:n) {
  B <- 1000
  U <- 9000
  dataB <- trainData[sample(which(trainData$class == "B"), B,replace=TRUE),]
  dataU <- trainData[sample(which(trainData$class == "U"), U,replace=TRUE),]
  subset <- rbind(dataB, dataU)
  ix <- seq((i-1) * nw + 1, i * nw)
  rf[ix] <- foreach(ntree=rep(chunksize, nw),
                    .packages='randomForest') %dopar% {
    randomForest(subset[,-1], subset$class, ntree=ntree)
  }
}
cat(sprintf("# models: %d; expected # models: %d\n", length(rf), n * nw))
cat(sprintf("expected total # trees: %d\n", n * nw * chunksize))
crf <- do.call('combine', rf)
print(crf)

これにより、あなたが私に向けたコメントで言及した問題が修正されるはずです。

于 2016-09-18T03:09:18.480 に答える