[機械学習のはじめ方] Part18: 勾配ブースティング(XGBoost, LightGBMなど)

1. 勾配ブースティングとは? 🤔

機械学習プロジェクトで高い精度が求められる場面、特にKaggleなどのデータ分析コンペティションで頻繁に目にするのが勾配ブースティングと呼ばれるアルゴリズムです。これは、アンサンブル学習というテクニックの一種です。

アンサンブル学習は、複数の「弱い」学習モデル(単体ではそれほど精度が高くないモデル)を組み合わせて、全体として非常に「強い」学習モデル(高い精度を持つモデル)を作り出す手法です。

勾配ブースティングでは、決定木をベースにしたモデルがよく使われます(これを勾配ブースティング決定木: GBDTと呼びます)。GBDTは、以下のようなステップでモデルを構築していきます。

  1. 最初の決定木モデルを学習させ、予測を行う。
  2. 予測と実際の値との「誤差(残差)」を計算する。
  3. 次の決定木モデルは、この「誤差」を予測するように学習する。
  4. 新しいモデルの予測を前のモデルの予測に加えて、全体の予測を更新する。
  5. ステップ2〜4を繰り返し、モデルを追加していくことで、徐々に全体の誤差を小さくしていく。

この「前のモデルの誤りを次のモデルで修正していく」という逐次的な学習プロセスが、勾配ブースティングの強力さの秘訣です💪。特に、損失関数の勾配情報を使って誤差を最小化していく点が「勾配」ブースティングと呼ばれる所以です。

2. XGBoost, LightGBM, CatBoost – 強力な仲間たち ✨

基本的なGBDTも強力ですが、さらにそれを改良し、計算速度や精度、使いやすさを向上させたライブラリが登場しています。ここでは、特に有名な3つのライブラリを紹介します。

XGBoost (eXtreme Gradient Boosting)

GBDTをベースに、様々な改良が加えられた非常に人気の高いライブラリです。

  • 正則化: モデルが複雑になりすぎる(過学習)のを防ぐ仕組み (L1, L2正則化) が組み込まれています。
  • 並列処理: CPUのマルチコアを活用して、学習プロセスの一部を並列化し、高速化を図っています。
  • 欠損値の自動処理: データに欠損値が含まれていても、特別な前処理なしで学習を進めることができます(内部で最適な分岐を学習)。
  • 木の剪定 (Pruning): 精度向上に寄与しない枝を刈り込むことで、モデルの汎化性能を高めます。

XGBoostは、多くのコンペティションで勝利に貢献しており、その安定した性能と機能の豊富さから広く使われています。

XGBoost Documentation

LightGBM (Light Gradient Boosting Machine)

Microsoftによって開発された、XGBoostよりもさらに高速・軽量な動作を目指したライブラリです。

  • Leaf-wise Growth: XGBoostなどが採用するLevel-wise(層ごと)の木の成長方法とは異なり、最も損失を減らせるLeaf(葉)から分割していく方法を採用し、より効率的に精度を向上させます。ただし、データ数が少ない場合は過学習しやすい側面もあります。
  • 勾配ベースのワンホットエンコーディング (GOSS): 勾配の大きさに注目し、勾配の小さいサンプルをサンプリングすることで計算量を削減します。
  • 排他的特徴バンドリング (EFB): 互いに排他的な(同時に非ゼロ値を取らない)特徴量を束ねて扱うことで、特徴量の次元数を削減し、計算を高速化します。
  • カテゴリカル特徴量の直接サポート: カテゴリカル変数を数値に変換することなく、直接扱うことができます(内部で効率的な処理を行います)。

LightGBMは、特に大規模なデータセットにおいて、XGBoostよりも高速に学習が終わることが多く、メモリ使用量も少ない傾向があります。

LightGBM Documentation

CatBoost (Categorical Boosting)

Yandexによって開発された、特にカテゴリカル特徴量の扱いに優れたライブラリです。

  • カテゴリカル特徴量の高度な処理: ラベルエンコーディングなどの前処理なしに、カテゴリカル特徴量を効果的に扱います。内部では、Target Statisticsという手法を改良したOrdered Target Statisticsを用いて、リークを防ぎながら情報を活用します。
  • Ordered Boosting: 従来の勾配ブースティングとは異なる学習順序を採用し、Target Leakage(目的変数の情報が学習データに漏れること)を防ぎ、より汎化性能の高いモデルを構築します。
  • 対称的な木構造 (Oblivious Trees): 同じ層では全てのノードが同じ特徴量と閾値で分割される、対称的な決定木を構築します。これにより、予測が高速になり、過学習を抑制する効果も期待できます。

CatBoostは、データセットに多くのカテゴリカル特徴量が含まれる場合に、特にその真価を発揮します。また、デフォルトのパラメータでも比較的高精度が出やすいとされています。

CatBoost Documentation

モデル比較の概要

特徴 XGBoost LightGBM CatBoost
主な強み バランスの取れた性能、機能豊富、安定性 高速、省メモリ、大規模データに強い カテゴリカル特徴量の扱い、デフォルトでの高精度
学習速度 速い 非常に速い 比較的速い(データによる)
メモリ使用量 中程度 少ない 中程度〜やや多め
カテゴリカル特徴量 数値変換が必要(One-hotなど) 直接扱える(整数エンコーディング推奨) 直接扱え、得意
欠損値処理 自動処理 自動処理 自動処理
木の成長方法 Level-wise (+ Depth-first) Leaf-wise Oblivious (Symmetric) Trees

どのモデルが最適かは、データの特性(サイズ、特徴量の種類など)や、計算リソース、求める精度によって異なります。実際に試してみて、性能を比較検討することが重要です📊。

3. Pythonでの実装例 🐍

XGBoostとLightGBMは、Pythonのライブラリとして簡単に利用できます。ここでは、scikit-learnライクなAPIを使った基本的な分類問題の実装例を示します。

まず、必要なライブラリをインストールします(まだの場合)。


pip install xgboost lightgbm scikit-learn pandas numpy
      

次に、サンプルデータを作成し、XGBoostとLightGBMで学習・予測を行います。


import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score

# XGBoostとLightGBMのインポート
import xgboost as xgb
import lightgbm as lgb

# 1. サンプルデータの生成 (分類問題)
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=42)
X = pd.DataFrame(X, columns=[f'feature_{i}' for i in range(20)])
y = pd.Series(y)

# 2. 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# --- XGBoost ---
print("--- XGBoost ---")
# 3. モデルの初期化 (XGBClassifierを使用)
xgb_model = xgb.XGBClassifier(objective='binary:logistic',  # 目的関数 (二値分類)
                              n_estimators=100,            # 木の数 (ブースティングの反復回数)
                              learning_rate=0.1,           # 学習率
                              max_depth=3,                 # 木の深さの最大値
                              subsample=0.8,               # 各木で使うデータの割合
                              colsample_bytree=0.8,        # 各木で使う特徴量の割合
                              random_state=42,
                              use_label_encoder=False,     # Scikit-learn API使用時の推奨設定
                              eval_metric='logloss')       # 評価指標

# 4. モデルの学習
xgb_model.fit(X_train, y_train)

# 5. テストデータで予測
y_pred_xgb = xgb_model.predict(X_test)

# 6. 精度評価
accuracy_xgb = accuracy_score(y_test, y_pred_xgb)
print(f"XGBoost Accuracy: {accuracy_xgb:.4f}")


# --- LightGBM ---
print("\n--- LightGBM ---")
# 3. モデルの初期化 (LGBMClassifierを使用)
lgb_model = lgb.LGBMClassifier(objective='binary',         # 目的関数 (二値分類)
                              n_estimators=100,           # 木の数
                              learning_rate=0.1,          # 学習率
                              max_depth=3,                # 木の深さ (-1で無制限)
                              num_leaves=31,              # Leafの最大数 (max_depthと関連)
                              subsample=0.8,              # データサンプリング率
                              colsample_bytree=0.8,       # 特徴量サンプリング率
                              random_state=42,
                              metric='binary_logloss')    # 評価指標

# 4. モデルの学習
lgb_model.fit(X_train, y_train)

# 5. テストデータで予測
y_pred_lgb = lgb_model.predict(X_test)

# 6. 精度評価
accuracy_lgb = accuracy_score(y_test, y_pred_lgb)
print(f"LightGBM Accuracy: {accuracy_lgb:.4f}")

      

このコードは、分類用のダミーデータを生成し、それを訓練用とテスト用に分割します。そして、XGBoost (XGBClassifier) と LightGBM (LGBMClassifier) それぞれでモデルを学習させ、テストデータに対する精度 (Accuracy) を計算しています。

回帰問題の場合は、XGBRegressorLGBMRegressor を使用し、objectivemetric を回帰に適したもの(例: 'reg:squarederror', 'rmse' など)に変更します。

重要なハイパーパラメータ:

  • n_estimators: 作成する木の数。増やしすぎると過学習のリスクがあります。
  • learning_rate (eta): 学習率。各木の寄与度を調整します。小さいほど慎重に学習しますが、n_estimators を増やす必要があります。
  • max_depth: 各木の最大の深さ。深いほど複雑なモデルになりますが、過学習しやすくなります。
  • subsample: 各木を学習させる際に使用する訓練データの割合。過学習を防ぐ効果があります。
  • colsample_bytree: 各木を学習させる際に使用する特徴量の割合。これも過学習を防ぎます。
  • num_leaves (LightGBMのみ): Leaf-wiseの木における葉の最大数。max_depth よりも直接的にモデルの複雑さを制御します。

これらのパラメータは、モデルの性能に大きく影響します。最適な組み合わせを見つけるためには、次のステップで学ぶハイパーパラメータチューニングが重要になります。

4. 次のステップへ 🚶‍♀️🚶‍♂️

今回は、強力なアンサンブル学習手法である勾配ブースティングと、その代表的なライブラリであるXGBoost, LightGBM, CatBoostについて学びました。これらのアルゴリズムは、多くの実践的な場面で高い性能を発揮します。

しかし、最高の性能を引き出すためには、モデルがどれだけうまく予測できているかを正しく評価し、ハイパーパラメータを適切に調整することが不可欠です。

次の「Step 4: モデル評価と改善手法」では、作成したモデルの性能を測るための様々な指標(混同行列、精度、再現率、F1スコア、ROC曲線、AUCなど)や、モデルを改善するためのテクニック(交差検証、グリッドサーチ、ランダムサーチなど)について詳しく学んでいきます。

勾配ブースティングモデルをさらに使いこなし、より良い予測モデルを構築するために、ぜひ次のステップに進んでみましょう!🎉