[解決済み] UndefinedMetricWarning。Fスコアが定義されておらず、予測されたサンプルのないラベルでは0.0に設定されている
質問
この奇妙なエラーが表示されます。
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
警告が消えます。
関連
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] virtualenvsはどこに作成するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複