ツリーのブーストとバギング(XGBoost、LightGBM)


17

ツリーのバギング ブースティングのアイデアに関する多くのブログ記事、YouTubeビデオなどがあります。私の一般的な理解では、それぞれの擬似コードは次のとおりです。

バギング:

  1. サンプルのx%および特徴のy%のN個のランダムサンプルを取得します
  2. Nのそれぞれにモデル(決定木など)を適合させる
  3. 各Nで予測
  4. 予測を平均して最終予測を取得する

ブースティング:

  1. モデル(意思決定ツリーなど)をデータに適合させる
  2. 残差を取得する
  3. モデルを残差に適合させる
  4. N回のブースティングラウンドで2に進む
  5. 最終予測は、順次予測子の加重合計です。

上記の私の理解を明確にするために説明しますが、私の意図する質問は次のとおりです。

XGBoostとLightGBMの両方には、バギングを許可するパラメーターがあります。このアプリケーションは、バギングまたはブースティング(すべてのブログ投稿で述べられていること)ではなく、バギングブースティングです。バギングとブースティングの組み合わせが行われる場所とタイミングの擬似コードは何ですか?

「Bagged Boosted Trees」になると思っていましたが、「Boosted Bagged Trees」のようです。違いは大きいようです。

バギングブーストツリー:

  1. サンプルのx%および特徴のy%のN個のランダムサンプルを取得します
  2. N個のサンプルのそれぞれにブーストされたツリーをフィット
  3. 各Nで予測
  4. 予測を平均して最終予測を取得する

これが最善の方法のようです。結局、ブーストのリスクは過剰適合であり、バギングの主な利点は過剰適合を減らすことです。ブーストされたモデルの束をまとめることは素晴らしいアイデアのようです。

ただし、たとえば、scikit-learn gradient_boosting.py(サンプルのバギングを行いますが、ランダムな特徴選択は行いません)を調べ、LightGBMとXGBoostに関する投稿全体のいくつかの小さなナゲットを組み合わせると、XGBoostとLightGBMは次のように機能します。

ブーストバギングツリー:

  1. 決定木をデータに適合させる
  2. Nブーストラウンドのiの場合:
    • 残差を取得する
    • bag_frequency == 0の場合(つまり、5ラウンドごとにバッグする):
      • サンプルのx%と特徴のy%の単一のランダムサンプルを取得します。今後このランダムなサンプルを使用してください
    • 木を残差に適合させる
  3. 最終予測は、順次予測子の加重合計です。

ここで私の理解を修正し、詳細を入力してください。Boosted Bagged Tree(bag_frequencyごとにランダムツリーが1つだけ)は、Bagged Boosted Treeほど強力ではないようです。


2
面白くて非常によく練られた質問に対して+1。そしてサイトへようこそ。
mkt-モニカの復活

ブーストするには「計算エラー」が必要です。バラバラになってしまった。重みはadaboostにとって重要です。それは生の残差ではありません。...ブーストに必要な確率的勾配については説明していませんが、速度は向上します。
EngrStudent-モニカの復元18年

これがブーストバッグです。各シリーズステップの新しいツリーの代わりに、平均出力を持つ新しいフォレストを取得します。ユージン・トゥブとカリ・トルコラ。 jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
EngrStudent-モニカの復活

バギングされたブーストは、一連のアンサンブルのフォレストを作成し、平均出力を取得します。シリーズ(ブーストされた)アンサンブルが作成できるオーバーフィッティングに関与し、より堅牢な出力を提供する可能性がありますが、ゲインは大きくなりません。
EngrStudent-モニカの復活

回答:


13

バギング:サンプルのx%およびフィーチャのy%のN個のランダムサンプルを取得します

インスタンスはBaggingで繰り返しサブサンプリングされますが、Featureではありません。(RandomForestsXGBoostCatBoost両方を行います)。

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Boosting擬似コードに初期化手順を含めて、冗長性を取り除きます。

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bagged Boosted Trees(あなたがそれを呼ぶ)は確かに合理的なアプローチですが、XGBoostCatBoostとは異なります:

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoostCatBoostは両方ともBoostingに基づいており、トレーニングデータ全体を使用します。また、ブースト反復ごとに1回サブサンプリングすることにより、バギングを実装します。

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

「残差にモデルを適合」に固執したい場合、これは「ブートストラップサンプルのデータの残差にモデルを適合」と同等です。


さらなる発言

あなたが提案するような「それをする最善の方法」はありません(無料のランチ定理はありません)。「Bagged Boosted Trees」は、特定のデータセットでXGBoostを上回る場合があります。

サンプルのx%のランダムサンプルを1つ取得します

この行は紛らわしいです。これはどこから入手しましたか?

bag_frequency == 0の場合(つまり、5ラウンドごとにバッグする):

これは、擬似コードで言及されるべきではありません。特に、他の重要なパラメーターが残されている場合(ブースティングの学習率など)。


(+1)いい答えです!明確にするために:「XGBoostとLightGBMの両方にバギングを許可するパラメーターがあります」と述べているOPは間違っていますか?
mkt-モニカの復元18年

どちらも、袋詰めを可能に:bagging_fractionLightGBMサブサンプルXGBoostを。よくわからない、なぜ私がずっとCatBoostに言及したのか。ただし、質問に関してはすべて同じように機能します。
ラクサンネイサン

私の間違い、私はあなたの答えの中でそれについて言及している行を逃しました。「ブースティング反復ごとに1回サブサンプリングする」ことを説明してください。各ブースティング反復で、多くのサブサンプルが取得され、ツリーが各サブサンプルに適合し、誤分類率がバギングされたツリーに基づいて計算され、最終的に重みが更新されるということですか?もしそうなら、あなたの擬似コードでこれを明確にできますか?
mkt-モニカの復元18年

多くのサブサンプルは描画されず、1つだけです:モデルをすべての重み付きインスタンスに適合させる代わりに、モデルはブートストラップサンプルでトレーニングされます。
ラクサンネイサン

「サンプルのx%のランダムサンプルを1つ取得する」ことについて 「行のx%の単一サンプルを取得する」方がよいでしょう。私はここからそれを得
ジョナサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.