LightGBM 実践
高速・省メモリな LightGBM の特徴(leaf-wise・num_leaves・カテゴリ対応)と使い方を学びます。
LightGBM とは#
LightGBM は、Microsoft 製の高速・省メモリな 勾配ブースティング(GBDT) 実装です。 大規模データでも速く、Kaggle のテーブルコンペで最もよく使われる主力の一つです。
leaf-wise 成長#
XGBoost が階層ごと(level-wise)に木を広げるのに対し、LightGBM は **損失が最も減る葉から伸ばす(leaf-wise)**ため、少ない分割で高精度になりやすい反面、 深くなりすぎて過学習しやすい面もあります。
そのため木の複雑さは max_depth ではなく num_leaves で制御するのが要点です。
import lightgbm as lgb
model = lgb.LGBMClassifier(
n_estimators=2000,
learning_rate=0.05,
num_leaves=31, # 木の複雑さ(2^max_depth より小さく保つ)
subsample=0.8,
colsample_bytree=0.8,
reg_lambda=1.0,
random_state=42,
)
model.fit(
X_tr, y_tr,
eval_set=[(X_va, y_va)], eval_metric="auc",
callbacks=[lgb.early_stopping(100), lgb.log_evaluation(0)],
)カテゴリ変数のネイティブ対応#
LightGBM はカテゴリ変数を category 型にしておくと、One-Hot 化せずに直接扱えます。
for c in cat_cols:
X_tr[c] = X_tr[c].astype("category")
# fit 時に categorical_feature=cat_cols を指定(または category 型を自動認識)注意
num_leaves を大きくしすぎると一気に過学習します。num_leaves は 2^max_depth
より小さく保ち、min_child_samples と合わせて複雑さを調整しましょう。
ヒント
理解度チェック#
次のステップ#
次は、カテゴリ変数の扱いに強い CatBoost を実践します。