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にはならないのではないだろうか。