1. ホーム
  2. python

[解決済み] UndefinedMetricWarning。Fスコアが定義されておらず、予測されたサンプルのないラベルでは0.0に設定されている

2022-10-23 22:30:06

質問

この奇妙なエラーが表示されます。

classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)`

を実行すると、初回実行時にfスコアも表示されます。

metrics.f1_score(y_test, y_pred, average='weighted')

2回目に実行すると、エラーなしでスコアが提供されます。なぜでしょうか?

>>> y_pred = test.predict(X_test)
>>> y_test
array([ 1, 10, 35,  9,  7, 29, 26,  3,  8, 23, 39, 11, 20,  2,  5, 23, 28,
       30, 32, 18,  5, 34,  4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 12, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23,
       12, 19, 19,  3,  2, 31, 30, 11,  2, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 34, 33,  2, 37, 17, 30, 24,  2, 36,  9, 36, 19, 33, 35,  0,  4,
        1])
>>> y_pred
array([ 1, 10, 35,  7,  7, 29, 26,  3,  8, 23, 39, 11, 20,  4,  5, 23, 28,
       30, 32, 18,  5, 39,  4, 25,  0, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 30, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12,  4, 22, 26, 29, 14, 37, 23,
       12, 19, 19,  3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 39, 33,  9, 37, 17, 30, 24,  9, 36, 39, 36, 19, 33, 35,  0,  4,
        1])
>>> metrics.f1_score(y_test, y_pred, average='weighted')
C:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276

また、なぜ末尾に 'precision', 'predicted', average, warn_for) というエラーメッセージが表示されるのでしょうか?開き括弧はないのに、なぜ閉じ括弧で終わってしまうのでしょうか?私はWindows 10上のconda環境でPython 3.6.0を使用してsklearn 0.18.1を実行しています。

も見てみたのですが はこちら と同じバグかどうかはわかりません。この SOポスト にも解決策はありません。

どのように解決するのですか?

コメントにもあるように y_test に表示されないラベルがあります。 y_pred . 具体的には、この場合、ラベル'2'は予測されない。

>>> set(y_test) - set(y_pred)
{2}

これは、このラベルに対して計算するFスコアがないことを意味し、したがって、このケースのFスコアは0.0とみなされます。スコアの平均を要求しているので、0というスコアが計算に含まれていることを考慮しなければならず、そのためscikit-learnはその警告を表示しているのです。

このことから、2回目のエラーが表示されないことがわかります。先ほど述べたように、これは 警告 であり、python のエラーとは異なる扱いを受けます。ほとんどの環境でのデフォルトの動作は、特定の警告を一度だけ表示することです。この動作は変更することができます。

import warnings
warnings.filterwarnings('always')  # "error", "ignore", "always", "default", "module" or "once"

他のモジュールをインポートする前にこれを設定すると、コードを実行するたびに警告が表示されます。

を設定する以外には、最初にこの警告が表示されないようにする方法はありません。 warnings.filterwarnings('ignore') . あなたは できること は、予測されなかったラベルのスコアには興味がないと判断し、明示的に を明示的に指定します。

>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078

警告が消えます。