skmetrics输出acc、precision、recall、f1值相同的问题

一个很神奇的现象

我给一个多分类任务做分类的评估,反正指标说来说去就那几个嘛

acc = skmetrics.accuracy_score(y_true, y_pred)
b_acc = skmetrics.balanced_accuracy_score(y_true, y_pred)
k = skmetrics.cohen_kappa_score(y_true, y_pred)
   
precision = skmetrics.precision_score(y_true, y_pred, average='micro')
recall = skmetrics.recall_score(y_true, y_pred ,average='micro')
f1 = skmetrics.f1_score(np.array(y_true), np.array(y_pred), average='micro')

神奇的是,输出的值居然长这样:
acc 0.7777777777777778
b_acc 0.8571428571428572
k 0.5714285714285714
recall 0.7777777777777778
precision 0.7777777777777778
f1 0.7777777777777778

原因是我average用了micro,这个方法的原理是:
把每个类别的TP、FP、FN先相加,再把这个问题当成二分类来进行计算。

比方说 :
二分类的precision计算公式为:
precision = TP/(TP+FP)
二分类的recall的计算公式为:
recall = TP/(TP+FN)

在猫狗猪动物的三分类里,用micro-average来计算precision和recall的话,公式就变成了这样子:›请添加图片描述
那为什么最后得到的值是一样的呢?
因为在某一类中被判断成FP的样本,在其他类中一定是FN的样本。
比如说系统错把「狗」预测成「猫」,那么对于狗而言,其错误类型就是False Negative,对于猫而言,其错误类型就是False Positive。于此同时,Micro-precision和Micro-recall的数值都等于Accuracy,因为它们计算了对角线样本数和总样本数的比值,总结就是:

请添加图片描述
参考来源

解决方法的话就是换一种平均的方法average = ‘macro’
这种方法是对于不同的类分别计算评估指标,然后加起来求平均请添加图片描述
觉得蛮有意思的

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值