2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

XGBoost・LightGBM・CatBoostの比較検証

勾配ブースティングについて

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

勾配ブースティングを用いたXGBoostLightGBMCatBoostといった手法はかなり強力で
kaggleでも人気の手法です。
スクリーンショット 2021-07-20 14.24.26.png
[引用] 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を用いてチューニングを行う。
イテレーションの回数を統一して学習する。
といったことを試していきたいと思います!

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?