こんにちは。
Gradient Boostingについて調べたのでまとめました。その他の手法やBoostingってそもそも何的な説明は以下の記事でしています。
◯Gradient Boostingとは
Gradient Boostingの誕生の経緯とかはこちらに書かれているので、そちらを参照してもらうとして、ここではGradient Boostingのアルゴリズムについて解説します。
AdaBoostと同じく、Gradient Boostingは予測器を連続的に予測器を修正、追加してアンサンブルにします。AdaBoostではデータの重みを変えていましたが、Gradient Boostingでは残差誤差にフィットするように予測器を修正します。
以下の図はそのイメージです。以下の図では、決定木を用いて回帰を行っているんですが、まず一番最初はふつうに決定木で学習して予測器を創ります(図1段目)。その次に、残差誤差に対して同じく決定木で学習します(図2段め)。
引用:Géron, Aurélien. "Hands on Machine Learning with scikit-learn and Tensorflow." (2017).
図の2段目の右図は一回目の決定木と二回目の決定木のアンサンブルしたものですが、より正確に予測できていることがわかります。コレと同じようにして三段目も学習されています。
超直感的にですが、誤差にフィットする予測器を作って加算すればなんとなく誤差を修正するのと同じ枠組みのものができそうな雰囲気が伝わってきます。
◯アルゴリズム
理論的な枠組みについては、こちらの資料を細かく参照したい方は見るとして、ここでは少しだけ理論面について描いておこうかと思います。
まず、Gradient Boostingのアルゴリズムは以下のとおりです。
アルゴリズムの説明をしていきます。
一般的に誤差関数というものに対して、それを最小にするようなパラメーターを持つ学習器を構築することは困難です。そこで、観測データに従って以下のような勾配をまず計算します。
この勾配に対して $t$ ステップ目の弱学習器がフィットするように学習を行います。つまり、やっていることとしては以下の式のように、勾配と弱学習機の誤差が最小になるように、弱学習器を学習することをしています。
アルゴリズム上では、ステップ5で別の表現が使われていますが、やっていることとしては同じです。
誤差関数を小さくするような方向に対して誤差関数を移動させるために、弱学習器を"勾配"とみなして学習するというようなイメージです。
Gradient Boostingの弱学習機としては決定木がよく用いられる印象なのと、決定木を用いてGradient Boostingを行うと高速に計算ができることからかわかりませんが、Gradient Tree Boostingという風に、何故か決定木を用いた場合は名前がついています(誰か理由知っている人がいたら教えてください笑)。
またGradient Boostingの正則化として学習率が提案されています。これは新しく学習して追加する $t$ ステップ目の式にかけるものです。学習率を低くするとパフォーマンスが良くなるということが一般的に知られていて、学習率を低くするとその分最適な反復回数は大きくなると言われています。
それではこんな感じで。
◯参考文献
- A Kaggle Master Explains Gradient Boosting | No Free Hunch
- Greedy Function Approximation: A Gradient Boosting Machine on JSTOR
- Friedman, Jerome H. "Greedy function approximation: a gradient boosting machine." Annals of statistics (2001): 1189-1232.
- Gradient boosting machines, a tutorial
- Gradient Boosting explained [demonstration]
- Arcing the Edge, L. Breiman (1997).
- 勾配ブースティング決定木を理解する - hiyoko9t’s blog