XGBoost・LightGBM・CatBoostの比較検証

## 勾配ブースティングについて
勾配ブースティングは**弱学習器が誤差に対して順にフィットしていく学習方法**のことを言います。
つまり、一つの強力なモデルを用いるのではなく、**微力なモデルを複数組み合わせて強力なモデルにします**。
まるでスイミーのように。。。

勾配ブースティングを用いた**XGBoost**や**LightGBM**、**CatBoost**といった手法はかなり強力で
kaggleでも人気の手法です。
![スクリーンショット 2021-07-20 14.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/0723bc7f-8aee-039d-d7c7-16693185576a.png)
[引用] [LightGBMの解説](https://data-analysis-stats.jp/python/lightgbm%e3%81%ae%e8%a7%a3%e8%aa%ac/)


## 本記事について
それぞれの**特徴やアルゴリズムについては触れません**。
本記事では３つの手法における**学習時間と精度**について検証してみようと思います。

ちなみに[CatBoostのチュートリアルでも出てきた論文](https://arxiv.org/abs/1810.11363)ではCatBoostに軍配が上がっておりましたが、[こちらの論文](https://publications.waset.org/10009954/comparison-between-xgboost-lightgbm-and-catboost-using-a-home-credit-dataset)ではLightGBMに軍配が上がっております。

## 検証に先立って

###扱ったデータについて
今回用いるデータはkaggleの[Predict Feature Sales](https://www.kaggle.com/c/competitive-data-science-predict-future-sales/overview)です。

なお、扱ったデータは前処理、特徴量エンジニアリングなどを終えたもので、
実際のコンペでも扱ったデータになります。
扱うデータの概要を下記に記載しておきます。

|       |レコード数    |カラム数  |
|---    |---        |---     |
|train  |7,593,847  |30      |
|valid  |221,718    |30      |
|test   |214,200    |30      |

### ハイパーパラメータおよび評価について
**誤差関数はRMSE**に設定し、他の**ハイパーパラメータはデフォルト**にしてあります。
今回の検証は**学習時間**、train,validの**スコア（小さいほど良い）**で検証したいと思います。

## XGBoostでの検証

```python
import xgboost as xgb
import time
start = time.time()

dtrain = xgb.DMatrix(X_train, label=y_train)
dvalid = xgb.DMatrix(X_val, label=y_val)
dtest = xgb.DMatrix(X_test)

xgb_params = {'eval_metric': 'rmse'}

evals = [(dtrain, 'train'), (dvalid, 'valid')]
 
xgb_model = xgb.train(xgb_params,
                      dtrain,
                      evals=evals)

print('elapsed_time:{}'.format(time.time()-start))
```

Time：51.72
Train：0.884
Valid：0.816

## LightGBMでの検証

```python
import lightgbm as lgb
import time
start = time.time()

lgb_train = lgb.Dataset(X_train, y_train)
lgb_val = lgb.Dataset(X_val, y_val, reference=lgb_train)

params = {'metric' : 'rmse'}

lgb_model = lgb.train(params=params,
                        train_set=lgb_train,              
                        valid_sets=[lgb_train, lgb_val], 
                        valid_names=['Train', 'Valid'])         

print('elapsed_time:{}'.format(time.time()-start))
```
Time：13.50
Train：0.839
Valid：0.820

##CatBoostでの検証

```python
from catboost import CatBoost, Pool
import time
start = time.time()

# 専用の型に変換
catb_train = Pool(X_train, label=y_train) 
catb_valid = Pool(X_val, label=y_val)

# パラメータを設定
params = {'loss_function': 'RMSE'}         

# 学習 
catb_model = CatBoost(params)
catb_model.fit(cat_train, 
               eval_set=[cat_valid], 
               verbose=False)

print('elapsed_time:{}'.format(time.time()-start))
```

Time：326.05
Train：0.782
Valid：0.799

## ３つのモデル比較

|         |Time(s) |Train  |Valid|
|---      |---     |---    |---  |
|XGBoost  |51.72   |0.884  |0.816|  
|LightGBM |13.50   |0.839  |0.820|
|CatBoost |326.05  |0.782  |0.799|

一番いい精度だったのはCatBoostでした！
しかし、学習時間がダントツで長い。

時間をかければ精度が良くなるのは当たり前ですよね〜
その点、LightGBMは圧倒的早さに加え、精度もそれなりにいい！
kaggleで人気なのも頷けますね！

##今後の展望
今回の検証ではパラメータをデフォルトにしていたので
optunaを用いてチューニングを行う。
イテレーションの回数を統一して学習する。
といったことを試していきたいと思います！

何かご指摘がございましたら、
コメントお願いいたします！