赞
踩
我给一个多分类任务做分类的评估,反正指标说来说去就那几个嘛
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’
这种方法是对于不同的类分别计算评估指标,然后加起来求平均
觉得蛮有意思的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。