PR

【機械学習】CatBoostの早期停止とベストモデル決定の仕組み

AI

本記事では、CatBoostの早期停止機能とベストモデル(ベストイテレーション)選択の仕組みをわかりやすく解説。過学習抑制や学習効率化のポイントを具体的なコード例付きで紹介します。


はじめに

CatBoostは勾配ブースティング系の機械学習ライブラリとして高い精度と使いやすさを兼ね備えています。その中でもモデルの汎化性能を高め、過学習を抑制するための仕組みとして「早期停止(Early Stopping)」があります。本記事では、CatBoostの学習時に指定できる引数use_best_model=Trueがどのように働き、どんなメリットがあるのかを解説します。


use_best_modelとは何か?

  • 定義
    • use_best_model は、CatBoostClassifier.fit()CatBoostRegressor.fit()の引数です。
    • デフォルトはFalseで、Trueを指定すると「学習途中で最も良かったイテレーション(木の数)をモデルとして保存」します。
  • 必要条件
    1. 評価用データ(eval_set を渡す
    2. 早期停止の設定od_type='Iter'od_wait=N または early_stopping_rounds=N
    これらがあることで、CatBoostは各イテレーション後に評価用データでのスコアを計算し、一定回数改善が見られなければ学習を終了します。
WAN
WAN

早期停止とベストモデルの決定プロセスは似てるのできちんと理解しておこう(‘ω’)

どちらも評価(検証)データ「eval_set」が必要だよ!


use_best_model=Trueの動作フロー

  1. イテレーションごとの評価
    学習が進むごとに、eval_set上の評価指標(例えばAUCやRMSE)を計測。
  2. 最良イテレーションの記録
    評価指標が過去最高(分類ならAUC最大、回帰ならRMSE最小など)を更新したイテレーション番号を保持。
  3. 早期停止判定
    指定した連続イテレーション数(od_waitearly_stopping_rounds)で改善がない場合、学習をストップ。
  4. ベストモデルの出力
    停止時点で最後に記録された「最良イテレーション数」を持つモデルを返却。
    • 例えば、iterations=1000まで学習設定していても、途中のイテレーション番号550で評価指標が最良だった場合、最終モデルは550本の木で構成されます。

メリット・デメリット

メリット

  • 過学習の抑制
    不要に多くの決定木を追加して過学習するリスクを低減します。
  • 自動チューニング感覚
    最大イテレーション数よりも少ないイテレーションで自動的に学習を打ち切るため、イテレーション数の調整作業を軽減。
  • 学習時間の短縮
    早期停止によって学習を打ち切ることで、余分な計算リソースを削減できます。

デメリット

  • 評価用データの必要性
    use_best_model=Trueを有効にするには、必ず検証用データを渡す必要があります。
  • 評価指標への過度な依存
    検証データに対する評価指標だけを最適化するため、別の指標やデータ分布には最適でない場合があります。
  • 再現性の確保
    早期停止のタイミングが微妙にずれると、同じパラメータでも毎回異なるモデル深さになる可能性があります。

実装例

from catboost import CatBoostClassifier

# サンプルデータ読み込み(省略)
X_train, y_train = …
X_valid, y_valid = …

model = CatBoostClassifier(
    iterations=1000,          # 最大イテレーション数
    learning_rate=0.1,
    depth=6,
    od_type='Iter',           # 早期停止タイプ
    od_wait=50,               # 改善が無い場合50イテレーション後に停止
    use_best_model=True,      # ベストモデルを選択
    eval_metric='AUC',        # 評価指標
    verbose=100
)

model.fit(
    X_train, y_train,
    eval_set=(X_valid, y_valid),
    plot=False
)

print(f"最適なイテレーション数: {model.get_best_iteration()}")
  • 上記コードでは、最大1,000木の学習を試みますが、検証データのAUCが50イテレーション改善しないと判断した時点で停止し、最良だったイテレーション数(model.get_best_iteration())を持つモデルを返します。

まとめ

use_best_model=TrueはCatBoostの早期停止機能と組み合わせて利用するオプションであり、過学習の抑制や学習時間の短縮を自動的に行ってくれます。特にイテレーション数のチューニングに悩んでいる場合やモデルの汎化性能を重視したい場合には、ぜひ設定を検討してみてください。


参考リンク

(※実際のプロジェクトでは、必ず複数の評価指標やクロスバリデーションと組み合わせてモデルの汎化性能を確認してください。)

オンラインコミュニティ

こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。

タイトルとURLをコピーしました