勾配ブースティング決定木

バギングやブースティングと同様に、勾配ブースティングは、別の機械学習アルゴリズム上で適用されている手法です。非公式に、勾配ブースティングには次の 2 種類のモデルが含まれます。

  • 「弱い」機械学習モデル。通常は意思決定ツリーです。
  • 「強力な」機械学習モデル。複数の弱いモデルで構成されています。

勾配ブースティングでは、各ステップで新しい電流モデルがトレーニングされ、現在の強いモデルの「誤差」(「疑似応答」と呼ばれます)を予測するようにトレーニングされます。詳細は「エラー」で詳しく説明します。今度は、「エラー」が予測と回帰ラベルとの差であると仮定します。弱いモデル(「エラー」など)が強力なモデルに追加され、負のマークが付加されて、強力なモデルのエラーが低減されます。

勾配ブースは繰り返し行うことができます。それぞれのイテレーションは次の式を呼び出します。

\[ F_{i+1} = F_i - f_i \]

ここで

  • $F_i$ は、ステップ $i$ で学習した強力なモデルです。
  • $f_i$ はステップ $i$ における弱いモデルです。

このオペレーションは、停止基準(最大反復回数)や、(別の)検証用データセットで測定された(強い)モデルが過学習になった場合などに繰り返し行われます。

次に、単純な回帰データセットでの勾配ブースティングについて説明します。

  • 目標は、$x$ から $y$ を予測することです。
  • 強力なモデルは、ゼロ定数($F_0(x) = 0$)で初期化されます。
# Simplified example of regressive gradient boosting.

y = ... # the labels
x = ... # the features

strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.

for i in range(num_iters):

    # Error of the strong model
    error = strong_predictions - y

    # The weak model is a decision tree (see CART chapter)
    # without pruning and a maximum depth of 3.
    weak_model = tfdf.keras.CartModel(
        task=tfdf.keras.Task.REGRESSION,
        validation_ratio=0.0,
        max_depth=3)
    weak_model.fit(x=x, y=error)

    strong_model.append(weak_model)

    weak_predictions = weak_model.predict(x)[:,0]

    strong_predictions -= weak_predictions

このコードを次のデータセットに適用してみましょう。

1 つの特徴 x とそのラベル y の正解のプロット。プロットは、やや減衰したサイン波のセットです。

図 25. 1 つの数値特徴を持つ合成回帰データセット。

 

勾配ブースティング アルゴリズムの最初のイテレーションの後の 3 つのプロットを次に示します。

3 つのプロット。最初のプロットは、勾配 0 と y 切片 0 の直線である強いモデルの予測を示しています。2 番目のプロットは、一連の正弦波である強力なモデルのエラーを示しています。3 番目のプロットは、方形波のセットである弱いモデルの予測を示しています。

図 26. 最初の反復処理の後の 3 つのプロット。

 

図 26 のプロットについては、次の点に注意してください。

  • 最初のプロットは、強力なモデルの予測を示します。現在は常に 0 です。
  • 2 つ目のプロットは、弱いモデルのラベルであるエラーを示しています。
  • 3 つ目のプロットは、弱いモデルを示しています。

最初の弱いモデルはラベルの大まかな表現を学習しており、ほとんどの場合、特徴空間の左側の部分(最も変動が大きい部分、つまり常に正しくないモデルで誤差が大きい部分)に焦点を当てています。

以下は、アルゴリズムの別のイテレーションのプロットです。

3 つのプロット。最初のプロットは、前の図からの弱いモデルの予測のプロットと逆の、強いモデルの予測を示しています。2 つ目のプロットは、強いモデルのエラーを示しています。これは、ノイズの多い正弦波のセットです。3 つ目のプロットは、弱いモデルの予測を示しています。これは、2 つの方形波です。

図 27. 2 回目の反復の後、3 つのプロット。

 

図 27 のプロットについては、次の点に注意してください。

  • 強いモデルには、前の反復の弱いモデルの予測が含まれるようになりました。
  • 強力なモデルの新しいエラーは、やや小さくなります。
  • 弱いモデルの新しい予測は、特徴空間の適切な部分に焦点を当てるようになりました。

アルゴリズムをさらに 8 回反復処理します。

プロットは、強力なモデルが徐々にグラウンド トゥルースに近づき、弱いモデルの予測が徐々に弱くなります。

図 28. 3 回目の反復と 10 回目の反復の後に 3 回のプロットがあります。

 

図 28 では、強力なモデルの予測がデータセットのプロットに類似するようになっていることに注意してください。

これらの図は、デシジョン ツリーを弱い学習者として使用する勾配ブースティング アルゴリズムを示しています。この組み合わせは、勾配ブースティング(決定)ツリーと呼ばれます。

上記のプロットは、勾配ブーストの必要性を示しています。ただし、この例には、次の 2 つの実際のオペレーションはありません。

  • 縮小
  • Newton のメソッドの 1 ステップによるリーフ値の最適化

圧縮

弱いモデル $f_i$ に小さな値 $\nu$(たとえば、$\nu = 0.1$)を掛けてから、強力なモデル $F_i$ に追加します。この小さな値を「圧縮」と呼びます。つまり、イテレーションを行う代わりに、次の数式を使用します。

\[ F_{i+1} = F_i - f_i \]

それぞれのイテレーションは次の式を使用します。

\[ F_{i+1} = F_i - \nu f_i \]

勾配ブースの縮小は、ニューラル ネットワークの学習率に似ています。圧縮は、強力なモデルが学習する速度を制御するため、過学習を抑えます。つまり、圧縮値が 0.0 に近いほど、過学習が 1.0 に近い圧縮値よりも小さくなり、

上記のコードでは、圧縮を次のように実装します。

shrinkage = 0.1   # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions