7

勾配ブースティング モデルを 10 ~ 15 ミリ秒未満の範囲で使用して予測を行うための戦略を推奨できる人はいますか (速いほど良い)?

Rのパッケージを使用してきgbmましたが、最初の予測には約 50 ミリ秒かかります (その後のベクトル化された予測は平均 1 ミリ秒なので、おそらく C++ ライブラリの呼び出しでオーバーヘッドがあるようです)。ガイドラインとして、最大 10 ~ 50 の入力と最大 50 ~ 500 のツリーがあります。タスクは分類であり、予測される確率にアクセスする必要があります。

そこにはたくさんのライブラリがあることは知っていますが、それらの大まかな予測時間でさえ、情報を見つけるのはほとんど運がありませんでした. トレーニングはオフラインで行われるため、高速である必要があるのは予測だけです。また、予測は、トレーニングを行うものとは完全に分離されたコード/ライブラリから取得される場合があります (ツリーを表す共通の形式がある限り)。 .

4

1 に答える 1

18

私は、Pythonでの勾配ブースティング回帰ツリーの実装であるscikit-learn 勾配ブースティングモジュールの作成者です。この方法は低遅延環境(特にランキングの問題)を対象としているため、予測時間の最適化にいくらか努力しました。予測ルーチンはCで記述されていますが、Python関数呼び出しによるオーバーヘッドがあります。そうは言っても、最大50の特徴と約250のツリーを持つ単一のデータポイントの予測時間は<<1msである必要があります。

私のユースケースでは、予測時間は特徴抽出のコストによって左右されることがよくあります。オーバーヘッドの原因を特定するためにプロファイリングを強くお勧めします(Pythonを使用している場合は、line_profilerをお勧めします)。

オーバーヘッドの原因が特徴抽出ではなく予測である場合、単一のデータポイントを予測する代わりにバッチ予測を実行できるかどうかを確認して、Python関数呼び出しによるオーバーヘッドを制限できます(たとえば、ランキングでは、多くの場合、トップをスコアリングする必要があります- Kドキュメント。最初に特徴抽出を実行してから、Kxn_featuresマトリックスでpredictを実行できます。

これでも問題が解決しない場合は、ツリーの数を制限してみてください。予測の実行時コストは基本的にツリーの数に比例するためです。モデルの精度に影響を与えずにツリーの数を制限するには、いくつかの方法があります。

  1. 学習率の適切な調整。学習率が小さいほど、より多くのツリーが必要になるため、予測が遅くなります。

  2. L1正則化を使用したGBMの後処理(Lasso); 統計学習の要素セクション16.3.1を参照してください-各ツリーの予測を新しい機能として使用し、L1正則化線形モデルを介して表現を実行します-重みがないツリーを削除します。

  3. 完全に修正された体重の更新。最新のツリーに対してのみライン探索/重みの更新を行う代わりに、すべてのツリーを更新します([Warmuth2006]および[Johnson2012]を参照)。より良い収束-より少ない木。

上記のどれもうまくいかない場合は、カスケードまたは早期出口戦略を調査できます([Chen2012]を参照)。

参照:

[Warmuth2006] M. Warmuth、J。Liao、およびG.Ratsch。マージンを最大化する完全に修正されたブースティングアルゴリズム。2006年の機械学習に関する第23回国際会議の議事録。

[Johnson2012] Rie Johnson、Tong Zhang、正則化された貪欲な森を使用した非線形関数の学習、arxiv、2012年。

[Chen2012] Minmin Chen、Zhixiang Xu、Kilian Weinberger、Olivier Chapelle、Dor Kedem、機能評価コストを最小化するための分類子カスケード、JMLR W&CP 22:218-226、2012。

于 2012-10-30T10:46:08.057 に答える