snowパッケージを使ってrandomForestを並列化
通常と並列化の比較
通常のランダムフォレスト
library(randomForest) library(kernlab) data(spam) set.seed(777) system.time(fit.rf<-randomForest(type~.,data=spam,ntree=1000))
ユーザ | システム | 経過 |
---|---|---|
21.584 | 0.213 | 21.919 |
並列化のランダムフォレスト
library(snow) cl <- makeCluster(4,type="SOCK") invisible(clusterEvalQ(cl,{ library(randomForest) library(kernlab) data(spam) })) set.seed(777) print(system.time(fit.rf <- clusterApply(cl,rep(250,4),function(ntree) randomForest(type~.,spam,ntree=ntree)))) fit.rf.all<-do.call("combine",fit.rf) stopCluster(cl)
ユーザ | システム | 経過 |
---|---|---|
0.053 | 0.036 | 11.525 |
並列化方法解説
他のプロセスでもライブラリや変数を利用するために通常の読み込みとは別に事前準備が必要となる。また、関数内で並列化を行う場合引数を利用することはできない(引数はclusterExportすることができない)。
- クラスターの生成
cl <- makeCluster(4,type="SOCK")
アクティビティモニタを利用するとプロセスが4つになっていることが確認できる。
- ライブラリなどの読み込み
invisible(clusterEvalQ(cl,{ library(randomForest) library(kernlab) data(spam) })))
- 変数の利用方法
clusterExport(cl,"value1")
- クラスターの終了
stopCluster(cl)
エラーなどによって正常に終了することができなくて放置すると
一度Rを終了させればリセットされる。