※画像はイメージです。本文と直接の関係はありません
初心者が最初に選ぶべき LightGBM – 7 つのポイントと留意点
1. 結論(この記事で伝えたいこと)
テーブルデータの予測タスクでは、前処理を最小限に抑えて学習が高速である点が重要です。
LightGBM は適切にチューニングすれば高精度が得られ、初心者にとって有力な選択肢となります。
以下の 7 つのポイントさえ押さえれば、実務やコンペで手軽に効果を実感できるでしょう。
2. LightGBM が「初手」に向く 7 つのポイント
欠損値をそのまま扱える
- 欠損列を補完せずに
lgb.Datasetに渡すだけで学習が可能です。 - 欠損率が極端に高い場合は情報が失われ、精度が低下するリスクがあります。
- 欠損列を補完せずに
カテゴリ変数を直接指定できる
categorical_featureに列名を渡すだけで内部エンコードが実行され、次元爆発を防げます。- ユニーク数が多いとメモリ使用量が増加する点に注意が必要です。
特徴量のスケーリングが不要
- 決定木ベースのため、一般的にはスケール差に対してロバストです。
- ただし差が極端に大きいと分割基準が偏ることがあるので、対数変換や標準化を検討してください。
feature importance がすぐ取得できる
- 学習後に
model.feature_importance(importance_type='gain')で重要度を数値化し、次の特徴量エンジニアリングに活用できます。 - 過学習している場合は重要度がデータに偏るため、解釈に注意が求められます。
- 学習後に
高い精度が出やすい
- 二値分類や回帰などの典型タスクで、過去のコンペや実務で高精度が報告されています。
- データやタスクの性質に依存するため、必ずしも全ケースで最上位になるとは限りません。
大規模データでも高速
- ヒストグラム化と leaf‑wise 成長方式により、他の勾配ブースティング実装に比べて学習が速く、メモリ使用量も抑えられます。
- leaf‑wise は情報利得が最大の葉を優先的に分割するため、木の深さが不均一になりやすく過学習しやすい点があるので、
num_leavesや early stopping の設定が重要です。
ハイパーパラメータの経験則が蓄積
- コンペ経験から共有された目安(例:学習率 0.1、葉の数 31 など)があるため、完全なチューニングが難しくても合理的な設定でまずは走らせられます。
- 実務データはコンペとは性質が異なることが多く、デフォルト設定だけで最適になるとは限らないため、必要に応じてチューニングを行いましょう。
3. 実装イメージ
3‑1. データの分割と lgb.Dataset への変換
import lightgbm as lgb
from sklearn.model_selection import train_test_split
# データ分割
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.2, random_state=42)
# LightGBM 用データセットに変換
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)
lgb.Dataset に変換すると内部でヒストグラム化が行われ、学習がスムーズに開始されます。
3‑2. カテゴリ変数の指定例
categorical_cols = ['Embarked', 'Sex'] # カテゴリ列名のリスト
train_data = lgb.Dataset(
X_train, label=y_train, categorical_feature=categorical_cols)
列名を渡すだけで LightGBM が自動的にエンコードを実行します。
3‑3. 基本パラメータと early stopping の設定
params = {
'objective' : 'binary',
'metric' : 'auc',
'boosting_type' : 'gbdt',
'learning_rate' : 0.1,
'num_leaves' : 31,
'verbosity' : -1
}
model = lgb.train(
params,
train_data,
valid_sets=[valid_data],
num_boost_round=1000,
early_stopping_rounds=50) # バリデーションが改善しなくなったら学習停止
early_stopping_rounds を設定すると、バリデーションスコアが改善しなくなった時点で自動的に学習が停止し、過学習リスクを抑制できます。
3‑4. 重要度の取得と可視化
import matplotlib.pyplot as plt
importance = model.feature_importance(importance_type='gain')
feat_names = model.feature_name()
plt.barh(feat_names, importance)
plt.title('Feature importance (gain)')
plt.xlabel('Gain')
plt.show()
gain は情報利得に基づく重要度で、モデルがどの特徴量にどれだけ依存しているかを直感的に把握できます。
4. 他アルゴリズムとの簡易比較(参考)
LightGBM
- 成長方式は leaf‑wise(葉単位)
- 学習速度はヒストグラム化により高速
- メモリ使用量は抑制される
- カテゴリ変数は直接指定可能
- 高精度が報告されるケースが多い
- 前処理が最小限で済む点が初心者向き
XGBoost
- 成長方式は level‑wise(レベル単位)
- 学習速度は高速だが leaf‑wise ほどではない
- メモリはやや大きめ
- カテゴリ変数は事前エンコードが必要
- 高精度が報告されるケースが多い
CatBoost
- 成長方式は leaf‑wise
- 学習速度は同程度に高速
- メモリは類似
- カテゴリ変数は直接指定可能だが独自設定が必要
- 高精度が報告されるケースが多い
※上記は実装上の特徴を整理したもので、**「どちらが必ず優れている」**という結論ではありません。タスクやデータの特性に合わせて選択してください。
5. 使い分けのヒント
手軽にベースラインを作りたい
LGBMClassifier(scikit‑learn 互換)をfitするだけで十分です。
欠損が多く、カテゴリが多数ある
categorical_featureと欠損のまま学習し、前処理コストを最小化します。
大規模データで高速に試したい
- デフォルトに近い
num_leavesとlearning_rateを設定し、early stopping で自動終了させます。
- デフォルトに近い
特徴量の寄与度をすぐに把握したい
model.feature_importance('gain')を取得し、可視化で洞察を得ます。
6. まとめ
- 欠損・カテゴリをそのまま投入できる → 前処理コストが大幅に削減されます。
- スケーリングは一般的に不要 → データの単位や分布を意識せずに学習可能です。ただし、スケール差が極端に大きい場合は対数変換や標準化を検討してください。
- 高速かつメモリ効率が良い → ヒストグラム化と leaf‑wise 成長方式が要因です。
- feature importance が簡単に取得できる → 次の特徴量設計にすぐ活用できます。
- 実績が豊富 → 多くのコンペや実務で高精度が報告されています。
以上の理由から、テーブルデータを扱うプロジェクトの 「初手」アルゴリズムとして LightGBM は検討に値する選択肢 です。まずはデフォルト設定で試し、結果を踏まえてパラメータ調整を行うことをおすすめします。
参考URL
- https://upura.hatenablog.com/entry/2019/10/29/184617
- https://qiita.com/ryo18/items/acbe45daacc8c6aa898d
- https://note.shiftinc.jp/n/nd1da3518e0c9
- https://www.codexa.net/lightgbm-beginner/
- https://lightgbm.readthedocs.io/en/stable/