Light GBMのイメージ

#What is Light GBM?
決定木アルゴリズムに基づいた勾配ブースティング（Gradient Boosting）の機械学習フレームワーク

####勾配ブースティングのフレームワーク
- XGBoost
- Light GBM

####勾配ブースティング
**「勾配降下法(Gradient)」×「アンサンブル学習(Boosting)」×「決定木(Decision Tree)」**

#Light GBMを理解するための事前知識
##勾配降下法
1. 重みとバイアスを初期化する
2. データ（バッチ）をニューラルネットワークに入力し出力を得る
3. ネットワークの出力と正解ラベルとの誤差を計算する
4. 誤差をへらすように重み（バイアス）を修正
5. 最適な重みやバイアスになるまで繰り返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/b6720b9b-ddf9-5f51-acbd-41ba24aa9e45.png)

##決定木
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/71ec99a9-06c8-e496-6ba7-276ee624dfa5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/40a6b09f-20fb-83a7-aef3-6cb5a6748d4a.png)


決定木では条件に基づいて分岐を行い、ターゲットのクラスへ分類する。実際に決定木を用いると、枝分かれチャートを生成することもできる。推測結果を明確かつ容易に説明することができるのは決定木の大きな特徴の一つ。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/d9c11baf-e5c6-5cc5-6c1e-340629d87bc3.png)|
|:-:|
|図１|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/0e981e4a-efea-85f4-ae5e-86c1c7605a15.png)|
|:-:|
|図２|

6匹の身体データを特徴量として、決定木を使って分類クラスを推測する流れを考える。決定木では図2のように、アルゴリズムを使い特徴量を基準にデータを分岐して推測を行う。
図2のチャートと図1のデータを見比べる。図2の最上部のボックス（これをノードと呼ぶ）には猫3匹、犬3匹の全固体が入っている。最初の分岐は「体重が5kg未満」とあり、分岐条件に応じて2層目は「はい」と「いいえ」で分岐している。さらに三層目は「全長が30cm未満」と「尻尾の長さが22cm以上」の条件で分岐している。

##アンサンブル学習
アンサンブル学習は、複数のモデル（学習器）を融合させて1つの学習モデルを生成する手法。アンサンブル学習は1人で問題を解くより、複数人で意見を出し合って知識を補い合いながら解く方が正答率が上がるのと考え方は同じです。
勾配ブースティングはアンサンブル学習の中の「ブースティング」の手法を使ったものである。
[詳細はここ](https://www.codexa.net/what-is-ensemble-learning/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/a653ef85-f8d7-9173-f4e7-9deacd2dcb96.png)
アンサンブル学習は「バギング」「ブースティング」「スタッキング」の3つの手法に分かれる。

- バギング

それぞれのモデルを並列的に学習を行う。（ランダムフォレスト）

- ブースティング

前の弱学習器の結果を次の学習データに反映させるというのが大きな特徴。

##勾配ブースティング
勾配ブースティングは複数の弱学習器（LightGBMの場合は決定木）を一つにまとめるアンサンブル学習の「ブースティング」を用いた手法。（XGBoost、LightGBM）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/fdc97928-219f-42bb-b49d-3c1d51fb2751.png)

仮に最初に訓練を行う決定木を1号、次に訓練を行う決定木を2号とする。まずは決定木（1号）でモデル訓練を行い推測結果を評価する。決定木（1号）の推測結果と実際の値の「誤差」を訓練データとして、決定木（2号）の訓練を行う。N号の決定木はN-1号の決定木の誤差（Residuals）を学習するということになる。

LightGBMは大規模なデータセットに対して計算コストを極力抑える工夫が施されている。この工夫により、多くのケースで他の機械学習手法と比較しても短時間でモデル訓練が行うことができる。その工夫とは勾配ブースティングで使われる「決定木の扱い方」である。

---
### 決定木の使い方
勾配ブースティングの訓練過程において、決定木の扱い方には「Level-Wise」と「Leaf-Wise」の2つの手法が存在する。
####Level-wise
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/430cdaa4-96ca-d847-cae0-809e134e25ce.png)
「Level-wise」とは決定木のlevel（つまり層）が成長していく。決定木を訓練する場合、こちらが一般的。
####Leaf-wise
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242925/25a0e624-0fc5-9b65-c770-3859c54292d1.png)
「Leaf-wise」では決定木のleaf（つまり葉）に準じて成長していく。LightGBMはこの「Leaf-wise」という手法を採用しています。従来の「Level-wise」に比べてLightGBMが採用している「Leaf-wise」は**訓練時間が短くなる傾向**にあります。

---
決定木モデルの訓練において、一つの課題として最適な枝分かれのポイントを探すための計算コストがあり、従来の決定木では厳密な枝分かれポイントを探すため、全てのデータポイントを読み込む必要があった。
LightGBMでは**訓練データの特徴量を階級に分けてヒストグラム化することで、意図的に厳密な枝分かれを探さず大規模なデータセットに対しても計算コストを抑えることが可能**になっている。

#LightGBMとXGBoostの比較
正直ほぼ変わらない。一緒と思ってもいい。ってMicrosoftも言ってるらしい。
（LightGBMは計量値（Continuous Values）をヒストグラムとして扱うため高速化している。XGBoostにはこの実装は元々はなかったが、現在はパラメータtree_method = histとすることで、ヒストグラムベースのアルゴリズムを採用することも可能になった。）

# 引数の種類
参照は[こちら](https://lightgbm.readthedocs.io/en/latest/Parameters.html)と[こちら](https://testlightgbm.readthedocs.io/en/latest/Parameters-tuning.html)．
必要そうなものだけ記載．上のような形で辞書に対してパラメータ名を指定し，値として設定したいものを与える．

## objective（目的関数） 
### regression
回帰を解く．
metric(誤差関数の測定方法)としては，
絶対値誤差関数(L1)ならばmae, 
2乗誤差関数(L2)ならばmseと指定．

### binary
二値分類．ラベルは 0 or 1．
metricとしては，
binary_logloss(クロスエントロピー)とbinary_error(正答率)の2つ．

### multiclass
多クラス分類．
metricとしては，
multi_logloss(softmax関数)とmulti_error(正答率)の2つ．
また，クラスの数をnum_classとして設定することが推奨されている．

## learning_rate
学習率．デフォルトは0.1．大きなnum_iterationsを取るときは小さなlearning_rateを取ると精度が上がる．

## num_iterations
木の数．他に num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, num_boost_round, n_estimators という名前で呼び出すことも可能．デフォルトは100．

## num_leaves
木にある分岐の個数．${\bf sklearnのmax\\_depth}$との関係は
$num\\_leaves = 2^{max\\_depth}$
デフォルトは31．大きくすると精度は上がるが過学習が進む．

## max_depth
木構造の深さを限定するための変数．データが少ないときに過学習を防ぐために設定する．デフォルト値は-1で0以下の値は制限なしを意味する．

## verbosity
学習途中の中継的な情報を表示するかしないか．
デフォルトでは表示になっており，-1を指定すると表示しなくなる．

# マニアックな引数

## max_bin
一つの分岐に入るデータ数の最大値を指定．小さい数を指定することで強制的なデータ間の分離を可能にして精度を上げることができるが，大きな数を指定することにより一般性を強めることができる．結果として過学習抑制につながる．

## min_data_in_bin, min_data_in_leaf
正直，違いがわからないが設定されている値のオーダーが異なるので別物．
大きくすることでデータと分岐が1対1対応することを防ぎ，結果として過学習を抑制する．

## feature_fraction
学習の高速化と過学習の抑制に使用される．データの特徴量のfeature_fraction * 100 % だけ使用する．

## weight_column
各列に対して，評価時の重要度を変更可能

[data0, data1, data2,..., dataN]に対して，
[1.0, 0.5, 0.7, ..., 0.4]というような重みをつけることが可能．


#参考にさせていただいた記事
[勾配ブースティング決定木ってなんぞや](https://qiita.com/kuroitu/items/57425380546f7b9ed91c)
[codexa](https://www.codexa.net/lightgbm-beginner/)（この記事から広告をすりおろしたのが本記事）
[アンサンブル学習](https://www.codexa.net/what-is-ensemble-learning/)
[]()