プログラミングを頑張る土木系専攻大学院生のブログ

主にプログラミングについて開発備忘録的な形で投稿しています。

LightGBMのearly_stopping_roundsのエラー解消法 

今回の記事の内容

early_stopping_rounds に関するエラーの原因とその解消方法について、私の開発備忘録としてまとめた記事です。

  • GitHub Copilotのエージェント機能を使ってLightGBMモデルを構築したところ、9割以上の確率でエラーが発生

  • 特に early_stopping_rounds を指定した場合にエラーが出やすい

  • エラーの原因は、LightGBMの記述方式が公式アップデートで変更されたこと


はじめに:early_stopping_roundsとは?

early_stopping_rounds は、LightGBMなどの勾配ブースティング系モデルで使用される機能で、一定回数スコアが改善しなければ学習を打ち切るという早期終了の手法です。

これにより、過学習を防ぎつつ、計算リソースの節約が可能になります。


AIが出力したコード(エラー)

VSCode内でGithub Copilotを利用して、以下の指示を出しました

learning\data_science\SIGNATE\phone-price\src\light_gbm.py
を編集してください。
現在のコードの続きに記述してください。
記述内容は
lightGBMのモデルで学習し、モデルの評価をF1マクロ平均で出力させる
ことです。


それに対して、GitHub Copilotが提案したコードです。

model = lgb.train(
    params,
    lgb_train,
    valid_sets=[lgb_train, lgb_valid],
    num_boost_round=1000,
    early_stopping_rounds=50,
    verbose_eval=100
)

発生したエラー内容

TypeError: train() got an unexpected keyword argument 'early_stopping_rounds'

これはつまり、lgb.train() 関数が early_stopping_roundsキーワード引数として受け取れないということです。


原因:early_stopping_roundsの書き方が変わった!

以前は early_stopping_rounds=50 のように直接指定できましたが、LightGBM (2021年末)以降は、コールバック関数として指定する方式に変わったそうです。


LightGBMのearly_stoppingの仕様が変わったので、使用法を調べてみた #Python - Qiita

 

✅ 正しくは → callbacks=[lgb.early_stopping(stopping_rounds=50)]

これは 公式ドキュメント にも記載されています。


参考:正しい記述方法

model = lgb.train(
    params,
    lgb_train,
    valid_sets=[lgb_train, lgb_valid],
    num_boost_round=1000,
    callbacks=[
        lgb.early_stopping(stopping_rounds=50),
        lgb.log_evaluation(period=100)  # verbose_evalの代替
    ]
)

ポイントは以下の2つ:

  • early_stopping_rounds=50 → ❌ エラーになる

  • callbacks=[lgb.early_stopping(stopping_rounds=50)] → ✅ 正解!

また、verbose_eval=100 の代わりに lgb.log_evaluation(period=100) を使うようにしましょう。


おわりに

今回のようなLightGBMの仕様変更などで、Copilotが出力したコードが古い仕様で書かれていることも多々あり、このような場合エラーの解消にエージェント機能が機能しなくなるケースがあります。

今回のような「キーワード引数が認識されない」エラーは、コールバック関数としての記述に変わった可能性を疑うのがポイントです。

エラーでつまずいたら、まずは公式ドキュメントやエラーの解消法についてのブログ等を確認してみましょう!


📝 備忘録ポイント

  • early_stopping_roundscallbacks で指定

  • verbose_evallog_evaluation に置き換える

  • GitHub Copilotは古い情報を参照する可能性があり、
    エラーの解消ができない場合がある