バギングやブースティングと同様に、勾配ブースティングは、別の機械学習アルゴリズム上で適用されている手法です。非公式に、勾配ブースティングには次の 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
このコードを次のデータセットに適用してみましょう。
図 25. 1 つの数値特徴を持つ合成回帰データセット。
勾配ブースティング アルゴリズムの最初のイテレーションの後の 3 つのプロットを次に示します。
図 26. 最初の反復処理の後の 3 つのプロット。
図 26 のプロットについては、次の点に注意してください。
- 最初のプロットは、強力なモデルの予測を示します。現在は常に 0 です。
- 2 つ目のプロットは、弱いモデルのラベルであるエラーを示しています。
- 3 つ目のプロットは、弱いモデルを示しています。
最初の弱いモデルはラベルの大まかな表現を学習しており、ほとんどの場合、特徴空間の左側の部分(最も変動が大きい部分、つまり常に正しくないモデルで誤差が大きい部分)に焦点を当てています。
以下は、アルゴリズムの別のイテレーションのプロットです。
図 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