XGBoostとLightGBMの違いと使い分け【Kaggleプロ直伝の選択基準】

XGBoostとLightGBMの違いと使い分け【Kaggleプロ直伝の選択基準】 AIツール・レビュー

はじめに

テーブルデータの機械学習で「とりあえずLightGBM」という方も多いと思いますが、XGBoostとLightGBMにはそれぞれ特性があり、使い分けを知ることで精度向上につながります。SignateやKaggleのコンペで両方を試した経験からまとめます。

両者の共通点

XGBoostもLightGBMも勾配ブースティング(Gradient Boosting)というアルゴリズムをベースにしています。弱い決定木を順番に学習して、前の木の誤差を次の木が補正していく方法です。どちらもKaggle・Signateのテーブルデータコンペで圧倒的な強さを誇ります。

主な違い

学習速度の面では、LightGBMの方がはるかに高速です。葉優先(Leaf-wise)成長という戦略で効率的に学習します。XGBoostは深さ優先(Level-wise)で安定していますが遅いです。精度の面では、大規模データではLightGBMが有利、小規模データではXGBoostが安定することがあります。メモリ効率の面では、LightGBMはヒストグラムベースの手法で使用メモリが少ないです。欠損値の扱いに関しては、どちらも欠損値をそのまま扱えますが、XGBoostは欠損値を自動的に最適な方向に分岐させます。

実際の速度比較

import lightgbm as lgb
import xgboost as xgb
from sklearn.datasets import make_classification
import time

# データ生成(10万件)
X, y = make_classification(n_samples=100000, n_features=50, random_state=42)

# LightGBM
start = time.time()
lgb_model = lgb.LGBMClassifier(n_estimators=500, random_state=42)
lgb_model.fit(X, y)
lgb_time = time.time() - start

# XGBoost
start = time.time()
xgb_model = xgb.XGBClassifier(n_estimators=500, random_state=42, eval_metric='logloss')
xgb_model.fit(X, y)
xgb_time = time.time() - start

print(f'LightGBM: {lgb_time:.1f}秒')
print(f'XGBoost:  {xgb_time:.1f}秒')
# LightGBMの方が2〜5倍速いことが多い

使い分けの指針

LightGBMが向くケースとして、データが10万件以上の大規模データ、高速な実験サイクルが必要な場合、カテゴリ特徴量が多い場合が挙げられます。XGBoostが向くケースとして、データが1万件以下の小規模データ、過学習しやすい場合(depth制御が細かい)、scikit-learnのエコシステムとの親和性が必要な場合が挙げられます。

ハイパーパラメータのチューニング例

import optuna
from sklearn.model_selection import cross_val_score

# LightGBMのOptunaチューニング
def lgb_objective(trial):
    params = {
        'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
        'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),
        'num_leaves': trial.suggest_int('num_leaves', 20, 200),
        'max_depth': trial.suggest_int('max_depth', 3, 12),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
        'subsample': trial.suggest_float('subsample', 0.5, 1.0),
        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),
        'reg_alpha': trial.suggest_float('reg_alpha', 1e-8, 10.0, log=True),
        'reg_lambda': trial.suggest_float('reg_lambda', 1e-8, 10.0, log=True),
        'random_state': 42
    }
    model = lgb.LGBMClassifier(**params)
    score = cross_val_score(model, X, y, cv=5, scoring='roc_auc').mean()
    return score

study = optuna.create_study(direction='maximize')
study.optimize(lgb_objective, n_trials=50)
print(f'最良パラメータ: {study.best_params}')
print(f'最良AUC: {study.best_value:.4f}')

まとめ

LightGBMは速度・大規模データに強く、XGBoostは安定性・小規模データに向いています。コンペや実務では両方を試してみることが重要です。Optunaと組み合わせたハイパーパラメータチューニングまでできれば、テーブルデータの機械学習で上位を狙えます。

💼 ITエンジニア転職特化

自分らしく働けるエンジニア転職を目指すなら【strategy career】

年収1000万・残業月30時間以下・リモート可の求人多数

💼 無料で転職相談する →

※アフィリエイト広告を含みます

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました