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)
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html
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.
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)?
I'm trying to use the log_loss argument in the scoring parameter of GridSearchCV to tune this multi-class (6 classes) cl...
https://pcbbc.site.mobi/templates/mobile/facade_transcoder_iframe.php?u=%2Fscikit-learn%2Fscikit-learn%2Fcommit%2F104e09a085e2f891e3d0be92e20d5f2b793b2a84%3Fimz_s%3Duom2q4d8kbnnpei81su1ie25n0&lang=en
コメント