勾配ブースティングのバグ外推定

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Python の scikit-learn ライブラリを使用して、アウトオブバッグ (OOB) 推定を備えた勾配ブースティング分類器を実装する方法を学びます。OOB 推定は交差検証推定の代替手段であり、繰り返しモデル適合を必要とせずに即座に計算できます。この実験では、以下の手順をカバーします。

  1. データを生成する
  2. OOB 推定を備えた分類器を適合させる
  3. 交差検証を使用して最適な反復回数を推定する
  4. テストデータの最適な反復回数を計算する
  5. 結果をプロットする

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使用して練習します。

場合によっては、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

データを生成する

最初のステップは、モデルの学習とテストに使用できるサンプルデータを生成することです。sklearn.datasets モジュールの make_classification 関数を使用して、3 つの情報的な特徴を持つランダムな 2 値分類問題を生成します。

import numpy as np
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=3, n_informative=3,
                           n_redundant=0, n_classes=2, random_state=1)

OOB 推定を備えた分類器を適合させる

次に、sklearn.ensemble モジュールの GradientBoostingClassifier クラスを使用して、OOB 推定を備えた勾配ブースティング分類器を作成します。推定器の数を 100 に設定し、学習率を 0.1 に設定します。

from sklearn.ensemble import GradientBoostingClassifier

params = {
    "n_estimators": 100,
    "learning_rate": 0.1,
    "subsample": 1.0,
    "max_depth": 3,
    "min_samples_leaf": 1,
    "random_state": 1,
    "oob_score": True
}

clf = GradientBoostingClassifier(**params)
clf.fit(X, y)

交差検証を使用して最適な反復回数を推定する

交差検証を使用して最適な反復回数を推定することができます。5 分割交差検証を使用し、各反復回数に対して負のログ損失を計算します。

from sklearn.model_selection import cross_val_score

cv_scores = []
for i in range(1, params['n_estimators'] + 1):
    clf.set_params(n_estimators=i)
    scores = -1 * cross_val_score(clf, X, y, cv=5, scoring='neg_log_loss')
    cv_scores.append(scores.mean())

テストデータの最適な反復回数を計算する

テストデータの最適な反復回数も計算することができます。テストデータに対する各反復回数について負のログ損失を計算します。

from sklearn.metrics import log_loss
import matplotlib.pyplot as plt

test_scores = []
for i, y_pred in enumerate(clf.staged_predict_proba(X)):
    score = log_loss(y, y_pred)
    test_scores.append(score)

best_n_estimators = np.argmin(test_scores) + 1

結果をプロットする

最後に、異なる反復回数に対するモデルの性能を視覚化するために結果をプロットすることができます。y 軸に負のログ損失を、x 軸に反復回数をプロットします。

plt.figure(figsize=(10, 5))
plt.plot(range(1, params['n_estimators'] + 1), cv_scores, label='CV')
plt.plot(range(1, params['n_estimators'] + 1), test_scores, label='Test')
plt.axvline(x=best_n_estimators, color='red', linestyle='--')
plt.xlabel('Number of iterations')
plt.ylabel('Negative log-loss')
plt.legend()
plt.show()

まとめ

この実験では、バグ外推定付きの勾配ブースティング分類器を実装し、交差検証を使用して最適な反復回数を推定する方法を学びました。また、テストデータの最適な反復回数を計算し、結果をプロットして、異なる反復回数に対するモデルの性能を視覚化しました。