勾配ブースティング決定木(GBDT)とXGBoostの基礎と実装手法

勾配ブースティング決定木(GBDT)の概要

勾配ブースティング決定木(GBDT: Gradient Boosting Decision Tree)は、複数の決定木を逐次的に構築し、各ステップで前段のモデルが引き起こした誤差を修正していくアンサンブル学習アルゴリズムです。GBDTはBoosting手法の一種であり、通常は「回帰決定木」を弱学習器として使用します。

GBDTの核となる考え方は、損失関数の勾配(負の勾配)を新しいモデルの学習ターゲットにすることです。これにより、回帰だけでなく分類問題にも柔軟に対応でき、非常に高い予測精度を実現します。

残差のフィッティングによる精度向上

ブースティングの直感的な理解として「残差の学習」が挙げられます。例えば、ある人物の年齢が100歳であるとします。

  • ステップ1: 最初のモデルが80歳と予測。残差は 100 - 80 = 20。
  • ステップ2: 次のモデルはこの「20」を目標に学習し、16と予測。残差は 20 - 16 = 4。
  • ステップ3: さらに次のモデルが「4」を目標に学習し、3.2と予測。残差は 4 - 3.2 = 0.8。

これらを統合すると、80 + 16 + 3.2 = 99.2 となり、元の値に限りなく近づきます。GBDTではこのプロセスに勾配降下法の概念を導入し、一般的な損失関数に対しても最適化を可能にしています。

GBDTのPython実装例

Scikit-learnを使用して、カリフォルニアの住宅価格データセットを用いた回帰モデルの実装例を以下に示します。

from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# データセットのロード
housing_data = fetch_california_housing()
X, y = housing_data.data, housing_data.target

# 学習データとテストデータに分割
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.25, random_state=123)

# GBDTモデルの構築
regressor = GradientBoostingRegressor(
    n_estimators=150, 
    learning_rate=0.05, 
    max_depth=4, 
    random_state=42
)

# モデルの学習
regressor.fit(train_X, train_y)

# 予測と評価
predictions = regressor.predict(test_X)
mse_score = mean_squared_error(test_y, predictions)
print(f"Mean Squared Error: {mse_score:.4f}")

XGBoost:GBDTの進化形

XGBoost(eXtreme Gradient Boosting)は、GBDTをより効率的かつ強力に最適化したライブラリです。計算速度の向上と過学習の抑制が強化されています。主な特徴は以下の通りです。

  • 正則化の導入: 損失関数にL1(Lasso)およびL2(Ridge)正則化項を追加し、モデルの複雑さを制御します。
  • 二次勾配の利用: 勾配の一次導関数だけでなく、二次導関数(ヘッシアン)を利用してより正確な最適化を行います。
  • 並列処理: 木の構築プロセスの並列化を実現し、学習速度を大幅に短縮しています。

XGBoostによる分類モデルの実装

ワインの分類データセットを用いて、多クラス分類を行う実装例を紹介します。

import xgboost as xgb
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import classification_report

# データの準備
wine = load_wine()
X_data, y_label = wine.data, wine.target

x_train, x_test, y_train, y_test = train_test_split(
    X_data, y_label, test_size=0.2, stratify=y_label, random_state=7
)

# XGBoost分類器の定義
xgb_model = xgb.XGBClassifier(
    objective='multi:softmax',
    num_class=3,
    eval_metric='mlogloss',
    use_label_encoder=False
)

# 学習
xgb_model.fit(x_train, y_train)

# 予測
y_pred = xgb_model.predict(x_test)
print(classification_report(y_test, y_pred))

ハイパーパラメータの最適化

モデルの性能を最大化するためには、グリッドサーチなどの手法を用いて最適なパラメータを探索することが不可欠です。

from sklearn.model_selection import StratifiedKFold

# パラメータグリッドの定義
search_params = {
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1],
    'n_estimators': [100, 200]
}

# 交差検証の設定
cv_strategy = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)

# グリッドサーチの実行
grid_search = GridSearchCV(
    estimator=xgb_model,
    param_grid=search_params,
    cv=cv_strategy,
    scoring='accuracy'
)

grid_search.fit(x_train, y_train)
print(f"Best Parameters: {grid_search.best_params_}")
print(f"Best Score: {grid_search.best_score_:.4f}")

GBDTやXGBoostを扱う際は、学習率(learning_rate)と決定木の数(n_estimators)のトレードオフを意識し、早期停止(Early Stopping)を活用することで、効率的なモデル構築が可能となります。

タグ: GBDT xgboost MachineLearning Scikit-learn EnsembleLearning

10月3日 20:09 投稿