勾配ブースティング
田中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つのライブラリの比較
| 項目 | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| 学習速度 | 普通 | 高速 | やや遅い |
| 大規模データ | 良い | 最適 | 良い |
| カテゴリカル変数 | 手動エンコーディング | 部分サポート | 自動処理 |
| デフォルト精度 | 高い | 高い | 最も高い |
| 過学習制御 | 良い | 良い | 最も良い |
| 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分