sklearnのlog_lossでValueError: y_true contains only one label (0).

2値分類タスクでKfold分割してloglossを計算した時にエラー。

from sklearn.metrics import log_loss
loss = log_loss(y_valdation, oof_prediction)


ValueError: y_true contains only one label (0). 
Please provide the true labels explicitly through the labels argument.

バリデーションのデータがたまたま全て同じラベルを含んでいたようで怒られた。

計算式を見てみる。

For a single sample with true label yt in {0,1} and estimated probability yp that yt = 1, the log loss is

-log P(yt|yp) = -(yt log(yp) + (1 – yt) log(1 – yp))

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html

ytが全部同じ値でも問題なく計算できそうなので、数式を満たしていないわけではない。

log_lossの引数を見てみる。

labels : array-like, optional (default=None)
If not provided, labels will be inferred from y_true. If labels is None and y_pred has shape (n_samples,) the labels are assumed to be binary and are inferred from y_true.

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html

labelsに何も書かないと、y_trueから自動的に推論してくれるみたい。

今回はy_trueが全部同じラベルでエラーが発生してしまったので、明示的にラベルが2つあることを示してみる。

loss = log_loss(y_valdation, oof_prediction, labels=[0, 1])

これで問題なくloglossを計算することが出来た。

参考

How to use `log_loss` in `GridSearchCV` with multi-class labels in Scikit-Learn (sklearn)? - Stack Overflow
https://pcbbc.site.mobi/templates/mobile/facade_transcoder_iframe.php?u=%2Fscikit-learn%2Fscikit-learn%2Fcommit%2F104e09a085e2f891e3d0be92e20d5f2b793b2a84%3Fimz_s%3Duom2q4d8kbnnpei81su1ie25n0&lang=en

コメント

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