scikit-learn で F1値 計算のエラーを回避する / How to resolve UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples

scikit-learn で F1値 計算のエラーを回避する / How to resolve UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples

Python の機械学習であまりにもおなじみの scikit-learn ですが、モデルの評価のために F1値を計算しようとして次のようなエラーが出ることがあります。

UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.

文字どおり、F1値( F-score )を計算しようとしたけど、ポジティブな予測をされたデータがないから F1値がちゃんと計算できないよ、ということらしいですが、わたしの場合ちょっと違う原因もあったみたいなので、解決方法のメモを残します。

そもそも scikit-learn の F1値( F-score )って何?

こんなブログ読む人にとっては今更かもしれませんが・・・わたしもおさらいしたので念のため。 F1値というのは、

 {\displaystyle F-score = \frac{2 \times (precision \times recall)}{(precision + recall)}}

という数式で計算されるもので、precision が適合率(=予測したデータの中で正解の数?かな??)、recall が再現率(=テストデータの全 ポジティブ データの中で、何件をポジティブとして当てたか、みたいな?どんだけ網羅してるかという感じでしょうか)という数字で計算してます。
ところで、問題は何らかの理由で予測結果がぜーんぶネガティブになった場合。
precision も recall も両方とも0になり、結果として F-score の計算式は 0 ÷ 0 になるよ・・・というのが、冒頭の「 UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 」というエラーらしいです。

stackoverflow.com

データが極端に少なかったり、モデルの精度が低かったりするとこういうこともあるのかな?と思ってたのですが、どうやら別の落とし穴もあって、わたしはそっちだったみたいです。

UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples 解決方法

別の落とし穴、というのは、こちら。

github.com

なんと、scikit-learn 自体にバグがあって、バージョンによっては 0 ÷ 0 じゃないのにこのエラーが出ることがあるみたいです。
わたしも古いバージョンを使っててこのパターンだったみたいです。 pip install scikit-learn --upgrade
で解決しました。

このエラーに遭遇した方で、データ見ると 0 ÷ 0 にならないはずだぞ!という方は一度 scikit-learn の upgrade を試していただくと happy になれるかも!しれません。

機械学習 の他のブログポストもぜひどうぞ♪

datalove.hatenadiary.jp
datalove.hatenadiary.jp
datalove.hatenadiary.jp