为什么scikitlearn说FN大于0时F1分数是不确定的?
machine-learning
python
scikit-learn
4
0

我运行一个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的定义是什么?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

精度,召回率,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

维基百科参考

收藏
评论

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。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号