いくつかのランダム フォレスト (回帰用) をトレーニングして、それらを競合させ、どの機能選択とどのパラメーターが最適なモデルを提供するかを確認しようとしています。
しかし、トレーニングには非常に時間がかかるようで、何か間違ったことをしているのだろうかと思っています.
私がトレーニングに使用しているデータセット (以下で呼び出されtrain
ます) には 217,000 行、58 列があります (ランダム フォレストで予測子として機能するのはそのうちの 21 のみです。クラスのブール値を除いて、それらはすべてnumeric
orです) .出力は) です。integer
character
y
numeric
次のコードを 4 回実行して、値4
、100
、500
、2000
を指定しましたnb_trees
。
library("randomForest")
nb_trees <- #this changes with each test, see above
ptm <- proc.time()
fit <- randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
+ x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19
+ x20 + x21,
data = train,
ntree = nb_trees,
do.trace=TRUE)
proc.time() - ptm
それぞれのトレーニングにかかった時間は次のとおりです。
nb_trees | time
4 4mn
100 1h 41mn
500 8h 40mn
2000 34h 26mn
私の会社のサーバーには 12 コアと 125Go の RAM があるので、この回答に従って、トレーニングを並列化できると考えました(ただし、doParallel
パッケージを使用したのdoSNOW
は、.私が見た場所も見つけられませんでしたdoParallel
、申し訳ありません)。
library("randomForest")
library("foreach")
library("doParallel")
nb_trees <- #this changes with each test, see table below
nb_cores <- #this changes with each test, see table below
cl <- makeCluster(nb_cores)
registerDoParallel(cl)
ptm <- proc.time()
fit <- foreach(ntree = rep(nb_trees, nb_cores), .combine = combine, .packages = "randomForest")
%dopar% {
randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
+ x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19
+ x20 + x21,
data = train,
ntree = ntree,
do.trace=TRUE)}
proc.time() - ptm
stopCluster(cl)
実行すると、並列化されていないコードよりも時間がかかりません。
nb_trees | nb_cores | total number of trees | time
1 4 4 2mn13s
10 10 100 52mn
9 12 108 (closest to 100 with 12 cores) 59mn
42 12 504 (closest to 500 with 12 cores) I won't be running this one
167 12 2004 (closest to 2000 with 12 cores) I'll run it next week-end
とはいえ、まだまだ時間がかかると思いますよね?ツリーを最終的なフォレストに結合するのに時間がかかることは承知しているので、12 コアで 12 倍高速になるとは思っていませんでしたが、〜 2 倍しか高速ではありません...
- これは正常ですか?
- そうでない場合、実行時間を根本的に短縮するために、データやコードでできることはありますか?
- そうでない場合は、サーバーの担当者にもっと高速にする必要があることを伝えるべきですか?
回答ありがとうございます。
ノート :
- このサーバーを使用しているのは私だけです
- 次のテストでは、ランダム フォレストで使用されていない列を削除します。
randomForest(predictors,decision)
の代わりに呼び出すことで実行時間を改善できることにかなり遅れて気づきましたrandomForest(decision~.,data=input)
。これからもそうしますが、上記の質問はまだ有効だと思います。