DEVELOPER’s BLOG
技術ブログ
GBDTの仕組みと手順を図と具体例で直感的に理解する
LightgbmやXgboostを利用する際に知っておくべき基本的なアルゴリズム「GBDT」を直感的に理解できるように数式を控えた説明をしています。
対象者
- GBDTを理解してLightgbmやXgboostを活用したい人
- GBDTやXgboostの解説記事の数式が難しく感じる人
※GBDTを直感的に理解してもらうために、簡略化された説明をしています。
GBDTのメリット・良さ
- 精度が比較的高い
- 欠損値を扱える
- 不要な特徴量を追加しても精度が落ちにくい
- 汎用性が高い(下図を参照)
- LightgbmやXgboostの理解に役立つ
引用元:門脇大輔、阪田隆司、保坂佳祐、平松雄司(2019)『Kaggleで勝つデータ分析の技術』技術評論社(230)
GBDTとは
G... Gradient(勾配)
B... Boosting(ブースティング) = アンサンブル手法の1つ
D... Decision(決定)
T... Tree(木)
つまり、GBDTとは「勾配降下法(Gradient)」と「Boosting(アンサンブル)」、「決定木(Decision Tree)」を組み合わせた手法です。
まずは、GBDTの基本となる上3つの概念について直感的に理解していきましょう。
勾配降下法
機械学習アルゴリズムの主な目的は、正確な予測を行うことです。予測が正確かどうかは「誤差の大きさ」で判断することができます。
「誤差が小さい = 予測が正確」
と言うことができますよね。
その誤差を小さくする方法の1つが、「勾配降下法」です。
勾配降下法は、名前の通り「勾配」(傾斜)を降下する最適化の手法で、精度の誤差を最適化する役割をもっているわけです。
これは誤差関数のグラフで、「誤差の大きさ」を表しています。
このグラフの場合、真ん中に近づくに連れて誤差が小さくなっていますね。
誤差関数の勾配(傾斜)を下れば下るほど、「誤差が小さくなる=予測が正確になる」わけです。
Boosting(アンサンブルの1種)
アンサンブルとは、精度の低い学習器を複数組み合わせて、精度を高くする手法です。アンサンブルを表現することわざで、
「三人寄れば文殊の知恵」
というものがあります。
「凡人でも三人で集まって相談すれば、文殊に劣らぬほどよい知恵が出るものだ。」
つまり、弱学習器(予測の精度があまり高くないもの)を複数組み合わせることで強学習機(精度の高いもの)を作ることができるのです。
アンサンブルの手法には、さまざまな手法がありますが、その中でもGBDTに利用されているのが「Boosting」です。
決定木(Decision Tree)
決定木は、データから決定木を作る機械学習の手法のことです。
例えば、ECサイトで「商品Xを購入するかどうか」を予測したいとしましょう。
ECサイトに訪れた人が商品Xを購入するかどうかは、そのページに訪れた回数や、関連する商品Yを調べた回数などさまざまな要因から予測することができるかもしれません。このときに、
「商品Xのページに訪れた回数が5回以上」 → 商品Xを購入するだろう
「商品Xのページに訪れた回数が5回未満」 → 商品Xを購入しないだろう
このように条件を用意し予測を行う手法が決定木です。
GBDTの手順
- 目的変数の平均を計算する
- 誤差を計算する
- 決定木を構築する
- アンサンブルを用いて新たな予測値を求める
- 再び誤差を計算する
- 3~5を繰り返す
- 最終予測を行う
具体的に解説
こちらのデータを使って解説していきます。
労働時間、好きな果物、性別のデータを用いて給料を求めます。
ステップ1.給料の平均を求める
計算結果を予測1とします。
これをベースにして予測を行います。
ステップ2.誤差を計算する
「誤差1」=「給料の値」ー「予測1」で誤差を求めています。
例えば・・・
誤差1 = 900 - 650 = 250
カラム名は「誤差1」とします。
ステップ3.誤差を予測する目的で決定木を構築する
茶色の部分にはデータを分ける条件が入り、緑色の部分(葉)には各データごとの誤差の値が入ります。
葉の数よりも多く誤差の値がある場合は、1つの葉に複数の誤差の値が入り、平均します。
ステップ4.アンサンブルを用いて新たな予測値を求める
ここでは、決定木の構築で求めた誤差を用いて、給料の予測値を計算します。
予測2 = 予測1(ステップ1) + 学習率 * 誤差
これを各データに対して計算を行います。
例えば・・・
予測2 = 650 + 0.1 * 200 = 670
このような計算を行って予測値を求めます。
ここで、予測2と予測1の値を比べてみてください。
若干ではありますが、実際の値に予測2の方が近づいていて、誤差が少しだけ修正されています。
この「誤差を求めて学習率を掛けて足す」という作業を何度も繰り返し行うことで、精度が少しずつ改善されていきます。
※学習率を乗算する意味
学習率を挟むことで、予測を行うときに各誤差に対して学習率が乗算され、
何度もアンサンブルをしなければ予測値が実際の値に近づくことができなくなります。その結果過学習が起こりづらくなります。
学習率を挟まなかった場合と比べてみてください!
ステップ5.再び誤差を計算する
ここでは、予測2と給料の値の誤差を計算します。ステップ3と同じように、誤差の値を決定木の葉に使用します。
「誤差」=「給料の値」ー「予測2」
例えば・・・
誤差 = 900 - 670 = 230
このような計算をすべてのデータに対して行います。
ステップ6.ステップ3~5を繰り返す
つまり、
・誤差を用いた決定木を構築
・アンサンブルを用いて新たな予測値を求める
・誤差を計算する
これらを繰り返します。
ステップ7.最終予測を行う
アンサンブル内のすべての決定木を使用して、給料の最終的な予測を行います。
最終的な予測は、最初に計算した平均に、学習率を掛けた決定木をすべて足した値になります。
GBDTのまとめ
GBDTは、
-予測値と実際の値の誤差を計算
-求めた誤差を利用して決定木を構築
-造った決定木をそれ以前の予測結果とアンサンブルして誤差を小さくする→精度があがる
これらを繰り返すことで精度を改善する機械学習アルゴリズムです。この記事を理解した上で、GBDTの派生であるLightgbmやXgboostの解説記事を見てみてみると、なんとなくでも理解しやすくなっていると思いますし、Kaggleでパラメータチューニングを行うのにも役に立つと思いますので、ぜひ挑戦してみてください。
Twitter・Facebookで定期的に情報発信しています!
Follow @acceluniverse