勾配ブースティングについて
勾配ブースティングは弱学習器が誤差に対して順にフィットしていく学習方法のことを言います。
つまり、一つの強力なモデルを用いるのではなく、微力なモデルを複数組み合わせて強力なモデルにします。
まるでスイミーのように。。。
勾配ブースティングを用いたXGBoostやLightGBM、CatBoostといった手法はかなり強力で
kaggleでも人気の手法です。
[引用] LightGBMの解説
本記事について
それぞれの特徴やアルゴリズムについては触れません。
本記事では3つの手法における学習時間と精度について検証してみようと思います。
ちなみにCatBoostのチュートリアルでも出てきた論文ではCatBoostに軍配が上がっておりましたが、こちらの論文ではLightGBMに軍配が上がっております。
検証に先立って
###扱ったデータについて
今回用いるデータはkaggleのPredict Feature Salesです。
なお、扱ったデータは前処理、特徴量エンジニアリングなどを終えたもので、
実際のコンペでも扱ったデータになります。
扱うデータの概要を下記に記載しておきます。
レコード数 | カラム数 | |
---|---|---|
train | 7,593,847 | 30 |
valid | 221,718 | 30 |
test | 214,200 | 30 |
ハイパーパラメータおよび評価について
誤差関数はRMSEに設定し、他のハイパーパラメータはデフォルトにしてあります。
今回の検証は学習時間、train,validの**スコア(小さいほど良い)**で検証したいと思います。
XGBoostでの検証
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での検証
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での検証
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
3つのモデル比較
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を用いてチューニングを行う。
イテレーションの回数を統一して学習する。
といったことを試していきたいと思います!
何かご指摘がございましたら、
コメントお願いいたします!