web-dev-qa-db-ja.com

キャレット(R)でのモデルトレーニング速度の改善

20個の特徴と約300,000個の観測値で構成されるデータセットがあります。私はキャレットを使用して、doParallelと4つのコアを使用してモデルをトレーニングしています。私が試した方法(rf、nnet、adabag、svmPoly)では、データの10%のトレーニングでさえ8時間以上かかります。ブートストラップを3回使用してリサンプリングしていて、tuneLengthは5です。この非常に遅いプロセスを高速化するためにできることはありますか?基盤となるライブラリを使用すると、プロセスを10倍も高速化できると誰かが提案しましたが、そのルートを進む前に、他に選択肢がないことを確認したいと思います。

12
Alexander David

phiverは頭に釘を打ちますが、この状況では、いくつかの提案があります。

  • 並列処理を使用して、システムメモリを使い果たしていないことを確認してください。 [〜#〜] x [〜#〜]ワーカーを使用する場合、メモリ内のデータの[〜#〜] x [〜#〜]追加コピーを作成しています。
  • クラスの不均衡がある場合、 追加のサンプリング が役立ちます。ダウンサンプリングは、パフォーマンスの向上と時間の短縮に役立つ可能性があります。
  • 別のライブラリを使用します。 ranger の代わりに randomForestxgboost または C5. の代わりに gbm 。アンサンブル手法は、大量の構成モデルに適合しており、適合には時間がかかることを理解する必要があります。
  • パッケージには レーシングタイプのアルゴリズム パラメータを短時間で調整するための機能があります
  • githubの開発バージョンには、多くの調整パラメーターを持つモデルのランダム検索メソッドがあります。

マックス

17
topepo

基礎となるモデルとキャレットの使用を比較するときに人々が忘れているのは、キャレットには多くの余分なことが起こっているということです。

ランダムフォレストを例にとってみましょう。したがって、ブートストラップ、番号3、およびtuneLength5です。したがって、3回リサンプリングし、tuneLengthがあるため、mtryに適した値を見つけようとします。合計で15のランダムフォレストを実行し、これらを比較して最終モデルに最適なフォレストを取得します。これに対して、基本的なランダムフォレストモデルを使用する場合は1つだけです。

また、4つのコアで並列実行しており、ランダムフォレストには利用可能なすべての観測値が必要であるため、すべてのトレーニング観測値はメモリ内で4回実行されます。おそらく、モデルをトレーニングするためのメモリがあまり残っていません。

私のアドバイスは、bootstrap numberを1に設定し、長さをデフォルトの3に戻すなど、速度を上げることができるかどうかを確認するためにスケールダウンを開始することです。または、traincontrolメソッドを「none」に設定することもできます。 "、モデルが最小設定でリサンプリングなしでどれだけ高速であるかを知るためだけに。

15
phiver

@phiverと@topepoによる素晴らしいインプット。同様の問題について行ったSO投稿検索)の少しから収集したいくつかのポイントを要約して追加しようと思います。

  • はい、並列処理はより少ないメモリでより多くの時間を要します。 8コアと64GBRAMの場合、経験則では、せいぜい5〜6人のワーカーを使用することです。
  • キャレットの前処理に関する@topepoのページ ここ は素晴らしいです。これは段階的に有益であり、ダミー変数などの前処理の手作業を置き換え、複数の共線/線形結合変数と変換を削除するのに役立ちます。
  • RandomForestやその他のモデルが非常に遅くなる理由の1つは、カテゴリ変数の要素の数が原因です。クラブファクターを使用するか、可能であれば序数/数値変換に変換することをお勧めします。
  • アンサンブルモデルでは、キャレットでTunegrid機能を最大限に活用してみてください。データのサンプルのmtry/ntreeの最小値から始めて、精度の向上の観点からどのように機能するかを確認します。
  • this SOページは、parRFが主に提案されている場合に非常に役立つことがわかりました。RF parRFを使用しますが、試してみることができます。データフレームの代わりにdata.tableを使用し、数式の代わりに予測子/応答データを使用することもできます。速度が大幅に向上します。ただし、注意点があります。 、予測子/応答データ(x = X、y = Y data.tablesを提供)のパフォーマンスも、何らかの形で予測精度を向上させ、式(Y〜。)を使用しているときに変数重要度テーブルを因子ごとの分割から変更するようです。
2
KarthikS