LESSON

勾配ブースティング

田中VPoE:「ランダムフォレストは『多くの木を独立に作って平均する』方法だった。勾配ブースティングは違う。『前の木が間違えた部分を次の木が修正する』という逐次的な学習だ。」

あなた:「一つずつ弱点を補っていくんですね。」

田中VPoE:「そうだ。Kaggle のコンペティションでも、表形式データではほぼ勾配ブースティングが勝っている。XGBoost、LightGBM、CatBoost を使いこなせれば、実務でも強力な武器になる。」

ブースティングの原理

バギング vs ブースティング

項目バギング(ランダムフォレスト)ブースティング
学習方法並列(独立)逐次(依存)
各木の役割独立に予測前の木の誤りを修正
過学習リスク低いやや高い
精度高いより高い(通常)

勾配ブースティングの流れ

1. 最初のモデルで予測 → 残差(誤差)を計算
2. 2番目のモデルで残差を学習 → 予測を更新
3. 3番目のモデルでさらに残差を学習 → ...
4. N番目まで繰り返し → 最終予測 = 全モデルの和

XGBoost

最も広く使われる勾配ブースティング実装です。

from xgboost import XGBClassifier
from sklearn.metrics import f1_score, classification_report

xgb = XGBClassifier(
    n_estimators=200,
    max_depth=6,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    eval_metric='logloss',
    random_state=42,
)

# Early Stopping 付きの学習
xgb.fit(
    X_train, y_train,
    eval_set=[(X_val, y_val)],
    verbose=False,
)

y_pred = xgb.predict(X_test)
print(f"F1スコア: {f1_score(y_test, y_pred):.3f}")
print(classification_report(y_test, y_pred, target_names=['継続', '離反']))

LightGBM

高速で大規模データに強い実装です。

import lightgbm as lgb

lgbm = lgb.LGBMClassifier(
    n_estimators=200,
    max_depth=6,
    learning_rate=0.1,
    num_leaves=31,
    subsample=0.8,
    colsample_bytree=0.8,
    random_state=42,
    verbose=-1,
)

lgbm.fit(
    X_train, y_train,
    eval_set=[(X_val, y_val)],
    callbacks=[lgb.early_stopping(50), lgb.log_evaluation(0)],
)

y_pred = lgbm.predict(X_test)
print(f"F1スコア: {f1_score(y_test, y_pred):.3f}")

LightGBM の特徴

  • Leaf-wise 成長: 誤差が最も大きいリーフを優先的に分割(高速・高精度)
  • ヒストグラムベース: 連続値をビンに離散化して高速化
  • カテゴリカル変数サポート: エンコーディングなしで直接処理可能

CatBoost

カテゴリカル変数の処理に優れた実装です。

from catboost import CatBoostClassifier

cat_features = ['device_type', 'membership_rank', 'payment_method']

catboost = CatBoostClassifier(
    iterations=200,
    depth=6,
    learning_rate=0.1,
    cat_features=cat_features,
    random_state=42,
    verbose=0,
)

catboost.fit(X_train, y_train, eval_set=(X_val, y_val))
y_pred = catboost.predict(X_test)
print(f"F1スコア: {f1_score(y_test, y_pred):.3f}")

3つのライブラリの比較

項目XGBoostLightGBMCatBoost
学習速度普通高速やや遅い
大規模データ良い最適良い
カテゴリカル変数手動エンコーディング部分サポート自動処理
デフォルト精度高い高い最も高い
過学習制御良い良い最も良い
GPU対応ありありあり

使い分けの目安

  • データが大規模: LightGBM(速度重視)
  • カテゴリカル変数が多い: CatBoost
  • 汎用的に使いたい: XGBoost(最も情報が多い)
  • とりあえず試す: LightGBM(速くて精度も高い)

主要パラメータ

# 共通的に重要なパラメータ
params = {
    'n_estimators': 200,       # 木の数(多いほど精度↑、過学習リスク↑)
    'max_depth': 6,            # 木の深さ(深いほど複雑、浅いほどシンプル)
    'learning_rate': 0.1,      # 学習率(小さいほど慎重、大きいほど高速)
    'subsample': 0.8,          # 各木で使うサンプル割合
    'colsample_bytree': 0.8,   # 各木で使う特徴量割合
    'min_child_weight': 5,     # 葉ノードの最小ウェイト(過学習防止)
}

# learning_rate を小さくする場合は n_estimators を増やす
# learning_rate=0.01, n_estimators=1000 のような組み合わせ

不均衡データへの対応

# scale_pos_weight で不均衡を補正
neg_count = (y_train == 0).sum()
pos_count = (y_train == 1).sum()
scale_weight = neg_count / pos_count

xgb_balanced = XGBClassifier(
    scale_pos_weight=scale_weight,  # 陽性クラスの重み
    n_estimators=200,
    random_state=42,
)
xgb_balanced.fit(X_train, y_train)

まとめ

  • 勾配ブースティングは前の木の誤りを次の木が修正する逐次学習
  • XGBoost: 汎用的で最も広く使われている
  • LightGBM: 高速で大規模データに最適
  • CatBoost: カテゴリカル変数の自動処理に優れる
  • learning_rate と n_estimators のバランスが重要
  • 不均衡データには scale_pos_weight で対応

チェックリスト

  • バギングとブースティングの違いを説明できる
  • XGBoost/LightGBM/CatBoost の特徴と使い分けを理解した
  • 主要パラメータの役割を把握した
  • 不均衡データへの対応方法を理解した

次のステップへ

次のレッスンでは、ここまで学んだモデルの比較方法と選定基準を学びます。


推定読了時間: 30分