100個の数値特徴を持つ50k以上の例で勾配ブースティングモデルをトレーニングしようとしています。XGBClassifier
は500を処理します私のマシンでは43秒以内に木がありますが、GradientBoostingClassifier
は1分2秒で10本の木(!)しか処理しません:(500本の木を育てようとはしませんでした。時間。同じlearning_rate
とmax_depth
の設定を使用しています。以下を参照してください。
XGBoostの特徴より速く?sklearnの人が知らない勾配ブースティングのためのいくつかの新しい実装を使用しますか?それとも「角を切り」そしてより浅い木を育てますか?
ps私はこの議論を知っています: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey しかし、そこで答えを得ることができませんでした…
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.05, max_delta_step=0, max_depth=10, min_child_weight=1, missing=None, n_estimators=500, nthread=-1, objective="binary:logistic", reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) GradientBoostingClassifier(init=None, learning_rate=0.05, loss="deviance", max_depth=10, max_features=None, max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, presort="auto", random_state=None, subsample=1.0, verbose=0, warm_start=False)
コメント
- 私は'すぐに" LightGBMがXGBoostよりもはるかに高速なのはなぜですか? " 🙂
回答
「数値」と言っているので「機能、あなたの機能はカテゴリではなく、高いアリティを持っていると思います(それらは多くの異なる値を取る可能性があるため、可能な分割点がたくさんあります)。このような場合、評価する[多くの機能$ \ times $多くの分割点]があるため、樹木を育てるのは困難です。
最大の効果は、XGBoostという事実から来ると思います。分割点の近似を使用します。 10000分割の可能性がある連続機能がある場合、XGBoostはデフォルトで「最良の」300分割のみを考慮します(これは単純化です)。この動作はsketch_eps
パラメータによって制御され、ドキュメントで詳細を読むことができます。あなたはそれを下げてみて、それが作る違いをチェックすることができます。 scikit-learnのドキュメントには記載されていないため、利用できないと思います。 XGBoostメソッドが彼らの論文(arxiv)で何であるかを学ぶことができます。
XGBoostもそのような分割点の評価に近似を使用します。 scikitがどの基準で分割を評価しているかはわかりませんが、残りの時差を説明することはできます。
コメントへの対応
分割点の評価について
しかし、どういう意味ですか? 「XGBoostは、そのような分割点の評価にも近似を使用します」?私が理解している限り、評価には、論文の式(7)に示されているように、最適な目的関数の正確な削減を使用しています。
分割点を評価するには、$ L(y、H_ {i-1} + h_i)$を計算する必要があります。ここで、$ L $はコスト関数、$ y $はターゲット、$ H_ {i- 1} $これまでに構築されたモデル、および$ h_i $現在の追加。これはXGBoostが行っていることではないことに注意してください。それらはテイラー展開によってコスト関数$ L $を単純化しており、計算するのに非常に単純な関数になります。 $ H_ {i-1} $に関して$ L $の勾配とヘッセ行列を計算する必要があり、ステージ$ i $ですべての潜在的な分割にこれらの数値を再利用できるため、全体的な計算が高速になります。詳細については、テイラー展開による損失関数近似(CrossValidated Q / A)、または論文での導出を確認できます。
重要なのは、彼らが$ L(y、H_ {i-1} + h_i)$を効率的に近似する方法を見つけたということです。最適化や回避、冗長な計算を可能にするインサイダーの知識がなくても、$ L $を完全に評価すると、分割ごとにより多くの時間がかかります。これに関しては、概算です。ただし、他の勾配ブースト実装もプロキシコスト関数を使用して分割を評価し、この点でXGBoost近似が他の実装よりも速いかどうかはわかりません。
コメント
- @Winksに感謝します。論文を読み、分割候補を選択するための近似アルゴリズムの意味を確認しました。ただし、" XGBoostは、このような分割点の評価にも近似を使用します"とはどういう意味ですか?私が理解している限り、評価には、論文の式(7)に示されているように、最適目的関数の正確な縮小を使用しています。
- コメントに対応するために回答を編集しました。分割点の評価の詳細については、このQ / A を確認してください。
- ありがとうございます、@ Winks!ここで私のより詳細な質問にも答えていただければ幸いです: datascience.stackexchange.com/q/10997/16050
- これは素晴らしい答えです。ハットトリック!