きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

LightGBMの目的関数、評価関数の話

しっかり調べられてないけど、
考えを整理するためにメモっておく。


LightGBMの目的関数は、パラメーターでobjectiveを何にするかによって決まるのが原則。
binaryを選んだ場合、src/objective/binary_objective.hppが使われる。
これはBinaryLoglossになる。


このような対応関係は、src/objective/objective_function.cppを読めば分かる。


目的関数を独自のものにする場合、lgb.trainやcvにfobjを渡す。


一方で、fevalというのがある。
これは目的関数ではない。
early_stoppingの時には使われるし、
evals_resultにも関係する。

fevalを与えない場合、early_stoppingは何を使って判断するかというと、パラメーターのmetricが使われる。
ちょっと細かく書くとこうなってるはず。


feval未指定、かつmetric未指定なら、objectiveが使われる。


feval未指定、かつmetric指定かつ、first_metric_only未指定なら、metricが使われ、metricが複数指定されていた場合、どのmetricも改善され続けないといけない。


feval未指定、かつmetric指定かつ、
first_metric_only=Trueなら、
metricの1番目のもののみでearly_stoppingする


feval指定、かつmetric指定かつ、
first_metric_only未指定の場合はどうなるか?metric、fevalの全てで改善が必要なはず。


feval指定、かつmetric指定かつ、
first_metric_only=Trueの場合はどうなるか?
evals_resultはmetric、fevalの順番で作成されているはずで、metricの1番目で評価するはず。


ひょっとすると、fevalとfirst_metric_onlyは良くない組み合わせなのかもしれない。
metricを指定しない場合、objectiveが使われるはずなので、fevalを使ったearly_stoppingにはならないのではないだろうか。