LightGBMは、Microsoftが開発した勾配ブースティング(GBDT)に基づくライブラリで、特に大規模データや高次元データの学習に適した高速かつメモリ効率の良い手法です。LightGBMは、従来のGBDTの枠組みを踏襲しながらも、独自の技術を組み込むことで計算効率や予測精度を向上させています。さらに、ブースティングの方式として「gbdt」「dart」「goss」の3種類を選択でき、データの性質やタスクに応じた柔軟な運用が可能です。
LightGBMの基本概念
基本フレームワーク
LightGBMも他の勾配ブースティングと同様に、複数の決定木を逐次的に学習し、各木が前回の予測誤差(残差)を補正する形で最終的な予測モデルを構築します。一般的な目的関数は以下のように定義されます。$$ \mathcal{L} = \sum_{i=1}^{n} l(y_i, \hat{y}_i) + \sum_{t=1}^{T} \Omega(f_t) $$
ここで、$l(y_i, \hat{y}_i)$ は各サンプルの損失関数、$\Omega(f_t)$ は各決定木の複雑さを抑えるための正則化項です。
1.2 高速化とメモリ効率の向上技術
LightGBMは以下の技術により、従来手法よりも高速に学習を進めることができます。
- ヒストグラムベースの学習
連続値の特徴量をあらかじめビン分割することで、分岐点の探索を高速化し、計算負荷を軽減します。 - Leaf-wise(葉単位)成長戦略
従来のレベルごとに均等に木を成長させる方法に対して、LightGBMは損失の改善が大きい葉を優先的に成長させるため、同じ木のサイズであってもより精度の高い分割が得られる場合があります。ただし、過学習には注意が必要です。 - Exclusive Feature Bundling (EFB)
相関が低い特徴量を束ねることで、次元数の多いデータセットでもメモリ使用量を削減します。 - Gradient-based One-Side Sampling (GOSS)
勾配が大きいサンプルを優先的に残し、勾配が小さいサンプルを一部無視することで、学習データのサイズを効果的に削減しながら、重要な情報は保持します。
boosting_typeパラメータの選択肢とその特徴
LightGBMでは、パラメータ「boosting_type」を設定することでブースティングの方式を切り替えることができます。主な選択肢は以下の通りです。
- gbdt(Gradient Boosting Decision Tree)
デフォルトの手法であり、従来の勾配ブースティングを採用します。安定性や信頼性の面で広く使われています。 - dart(Dropouts meet Multiple Additive Regression Trees)
ドロップアウトの考え方を取り入れた手法で、各反復ごとに一部の決定木をドロップすることで、過学習の抑制に効果があります。特にデータセットが小規模な場合や、モデルが過学習しやすい場合に有効です。 - goss(Gradient-based One-Side Sampling)
内部で学習データのサンプリング戦略として利用される手法です。勾配の大きなサンプルに重点を置くことで、学習速度や精度の向上が期待されますが、実際の運用ではgbdtやdartがより主流に使われるケースも多いです。
つまり、LightGBMは内部でGOSSの技術を取り入れているため、学習プロセスの効率化が実現されていますが、ユーザーが選択するboosting_typeとしては、用途やデータの性質に応じてgbdtやdartがよく利用される傾向にあります。
LightGBMの実装例
LightGBMは、専用API(lightgbm.train
)とscikit-learn風API(LGBMRegressor
や LGBMClassifier
)の両方が提供されています。以下に、それぞれの実装例を示します。
独自API(lightgbm.train)を用いた実装例
pythonCopyimport lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
# Bostonデータセットを例にデータ準備
boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)
# LightGBM用のデータセット形式に変換
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
# ハイパーパラメータの設定(boosting_typeに注目)
params = {
'objective': 'regression',
'metric': 'rmse',
'boosting': 'gbdt', # 'gbdt', 'dart', 'goss'から選択可能
'num_leaves': 31,
'learning_rate': 0.1,
'verbose': -1
}
# モデルの学習
gbm = lgb.train(params,
lgb_train,
num_boost_round=100,
valid_sets=[lgb_train, lgb_eval],
valid_names=['train', 'eval'],
early_stopping_rounds=10)
# 予測
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
scikit-learn風APIを用いた実装例
pythonCopyfrom lightgbm import LGBMRegressor
from sklearn.metrics import mean_squared_error
# scikit-learn風のモデル作成(boosting_typeをパラメータとして指定可能)
lgbm_model = LGBMRegressor(
objective='regression',
boosting_type='dart', # ここではdartを例として採用
n_estimators=100,
num_leaves=31,
learning_rate=0.1
)
# モデルの学習
lgbm_model.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
eval_metric='rmse',
early_stopping_rounds=10,
verbose=False)
# 予測
y_pred = lgbm_model.predict(X_test)
# 評価
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.4f}")
まとめ
この記事では、LightGBMの基本概念や内部で採用される技術(ヒストグラム学習、Leaf-wise戦略、EFB、GOSS)について解説しました。LightGBMは、従来のGBDTの枠組みを柔軟に拡張し、学習速度とメモリ効率を大幅に向上させた強力なツールです。用途やデータの特性に応じたboosting_typeの選択により、最適なモデル構築が可能となります。ぜひ、実際のタスクでLightGBMを活用してみてください。
コメント