はじめに
テーブルデータの機械学習で「とりあえず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と組み合わせたハイパーパラメータチューニングまでできれば、テーブルデータの機械学習で上位を狙えます。
自分らしく働けるエンジニア転職を目指すなら【strategy career】
年収1000万・残業月30時間以下・リモート可の求人多数
※アフィリエイト広告を含みます
![]()


コメント