为啥 scikit learn 说 F1 分数不明确,FN 大于 0?

Posted

技术标签:

【中文标题】为啥 scikit learn 说 F1 分数不明确,FN 大于 0?【英文标题】:why does scikitlearn says F1 score is ill-defined with FN bigger than 0?为什么 scikit learn 说 F1 分数不明确,FN 大于 0? 【发布时间】:2016-04-17 21:27:18 【问题描述】:

我运行一个调用sklearn.metrics 的方法来计算精度和F1 分数的python 程序。这是没有预测样本时的输出:

/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 的定义是什么?

【问题讨论】:

请将答案标记为已接受。 【参考方案1】:

Precision、Recall、F1-scoreAccuracy计算

- 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

***reference

【讨论】:

【参考方案2】:

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

F1 = 2 * (精度 * 召回率) / (精度 + 召回率)

precision = TP/(TP+FP) 正如你刚才所说,如果预测器根本不预测正类 - 精度为 0。

recall = TP/(TP+FN),如果预测器不能预测正类 - TP 为 0 - 召回率为 0。

所以现在你正在划分 0/0。

【讨论】:

以上是关于为啥 scikit learn 说 F1 分数不明确,FN 大于 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥scikit learn的平均精度分数返回nan?

为啥 scikit-learn SVM 分类器交叉验证这么慢?

精度、召回率、F1 分数等于 sklearn

在 scikit-learn 中获得二元概率分类器的最大准确度

scikit加权f1分数计算及使用

scikit-learn 在多标签分类中计算 F1