この変なエラーが出ています。
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)
というエラーメッセージがあるのでしょうか?開き括弧はないのに、なぜ閉じ括弧で終わっているのでしょうか?Windows10上のconda環境でPython3.6.0を使用してsklearn0.18.1を動かしています。
コメントにあるように、y_trueのラベルの中には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
この場合、警告は表示されません。
警告が発生する理由については、受理された回答で既に十分説明されています。もし、単に警告を制御したいのであれば、precision_recall_fscore_support
を使うことができます。これは (半公式な) 引数 warn_for
を提供し、警告をミュートするために使用することができます。
(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
average='weighted',
warn_for=tuple())
すでにいくつかのコメントで述べられているように、これの使用には注意が必要です。
エラーメッセージにあるように、Fスコアを得るために使用される方法は、sklearnの"Classification"の部分であり、したがって、"labels"について話しているのです。
回帰の問題があるのでしょうか?Sklearn は、"特徴選択" グループの下で回帰のための "F score" メソッドを提供します: http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html
分類の問題がある場合は、@Shovalt'の回答が正しいように思います。