web-dev-qa-db-ja.com

scikitlearnが、FNスコアが0より大きいFNスコアで不明確だと言うのはなぜですか?

pythonプログラムを実行して、sklearn.metricsのメソッドを呼び出して、精度とF1スコアを計算します。予測サンプルがない場合の出力は次のとおりです。

/xxx/py2-scikit-learn/0.15.2-comp6/lib/python2.6/site-packages/sklearn/metr\
ics/metrics.py:1771: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples.
  'precision', 'predicted', average, warn_for)

/xxx/py2-scikit-learn/0.15.2-comp6/lib/python2.6/site-packages/sklearn/metr\
ics/metrics.py:1771: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.
  'precision', 'predicted', average, warn_for)

予測されたサンプルがない場合、TP + FPが0であることを意味するため、

  • 精度(TP /(TP + FP)として定義)は0/0であり、定義されていません。
  • FNがゼロでない場合、F1スコア(2TP /(2TP + FP + FN)として定義)は0です。

私の場合、sklearn.metricsは精度を0.8として返し、0として呼び出します。したがって、FNはゼロではありません。

しかし、scikilearnがF1が不明確だと言うのはなぜですか?

Scikilearnで使用されるF1の定義は何ですか?

46
Tim

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py

F1 = 2 *(精度*再呼び出し)/(精度+再呼び出し)

予測子が正のクラスをまったく予測しない場合、先ほど述べたように、精度= TP /(TP + FP)-精度は0です。

リコール= TP /(TP + FN)、予測子が陽性クラスを予測しない場合-TPは0-リコールは0.

これで、0/0を分割しています。

48
Ibraim Ganiev

精度、リコール、F1-スコアおよび精度計算

- In a given image of Dogs and Cats

  * Total Dogs - 12  D = 12
  * Total Cats - 8   C = 8

- Computer program predicts

  * Dogs - 8  
    5 are actually Dogs   T.P = 5
    3 are not             F.P = 3    
  * Cats - 12
    6 are actually Cats   T.N = 6 
    6 are not             F.N = 6

- Calculation

  * Precision = T.P / (T.P + F.P) => 5 / (5 + 3)
  * Recall    = T.P / D           => 5 / 12

  * F1 = 2 * (Precision * Recall) / (Precision + Recall)
  * F1 = 0.5

  * Accuracy = T.P + T.N / P + N
  * Accuracy = 0.55

ウィキペディア 参照

19
Wazy