多标签评价指标--Macro-F1、Micro-F1

对于多标签分类的评价指标比较复杂,一般对于n个二分类混淆矩阵要引入宏平均、微平均、权重评价即Macro-average、Micro-Average,Weighted-Average,近期正好应用,所以就总结一下。

Macro-averaging:指所有类别的每一个统计指标值的算数平均值,则对应的macro F1为多个F1值的算数平均数。

Micro-averaging:将各个混淆矩阵对应元素平均,得到TPFPTNFN,然后计算相应的平均值。

weighted-F1:在样本不平衡的时候,有时我们希望根据每个类别的样本数量,给不同的类赋予不同的权重。

下面先给出F1相关的指标公式:

         

 

 

python 中可以导入包计算

   print f1_score(test_labels, preds, average='macro')
    print f1_score(test_labels, preds, average='micro')
    print f1_score(test_labels, preds, average='weighted')

来一个例子:

y_true=[0,1,2,0,1,2]

y_pred=[0,2,1,0,0,1]

macro:

A:以label 0作为正类,label 1和label 2作为负类, 所对应的TP FN FP TN如下表:

T\Ppositivenegative
True2(TP)0(FN)
False1(FP)3(TN)

则:P=2/(2+1)=2/3

      R=2/(2+0)=1

F1=(P * R * 2) / (P + R) = 0.8

B:以label 1作为正类,label 0和label 2作为负类, 所对应的TP FN FP TN如下表:

T\Ppositivenegative
True0(TP)2(FN)
False2(FP)2(TN)

则:

P=0/(0+2)=0

      R=0/(0+2)=0

F1=(P * R * 2) / (P + R) = 0

C:以label 2作为正类,label 0和label 1作为负类, 所对应的TP FN FP TN如下表

T\Ppositivenegative
True0(TP)2(FN)
False1(FP)4(TN)

 

则:

P=0/(0+1)=0

      R=0/(0+2)=0

F1=(P * R * 2) / (P + R) = 0

Macro-F1=(0.8+0+0)/3=0.26

Micro-F1:

将三个表格中的所有TP相加,得到总TP = 2 + 0 + 0 = 2

将三个表格中的所有FN相加,得到总FN = 0 + 2 + 2 = 4

将三个表格中的所有FP相加,得到总FP = 1 + 2 + 1 = 4

总P = 总TP / (总TP + 总FP) = 2 / (2 + 4) = 1 / 3
总R = 总TP / (总TP + 总FN) = 2 / (2 + 4) = 1 / 3
Micro-F1= (总P * 总R * 2) / (总P + 总R) = 1 / 3 = 0.33

另外看到一个宏平均和微平均的对比:

  1. 如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
  2. 如果每个class的样本数量差异很大,而且你想:
    • 更注重样本量多的class:使用宏平均
    • 更注重样本量少的class:使用微平均
  3. 如果微平均大大低于宏平均,检查样本量多的class
  4. 如果宏平均大大低于微平均,检查样本量少的class

更新,看到一个代码,很全

from sklearn import metrics
 
y_test    = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]
y_predict = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3]
 
print('准确率:', metrics.accuracy_score(y_test, y_predict)) #预测准确率输出
 
print('宏平均精确率:',metrics.precision_score(y_test,y_predict,average='macro')) #预测宏平均精确率输出
print('微平均精确率:', metrics.precision_score(y_test, y_predict, average='micro')) #预测微平均精确率输出
print('加权平均精确率:', metrics.precision_score(y_test, y_predict, average='weighted')) #预测加权平均精确率输出
 
print('宏平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#预测宏平均召回率输出
print('微平均召回率:',metrics.recall_score(y_test,y_predict,average='micro'))#预测微平均召回率输出
print('加权平均召回率:',metrics.recall_score(y_test,y_predict,average='micro'))#预测加权平均召回率输出
 
print('宏平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='macro'))#预测宏平均f1-score输出
print('微平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='micro'))#预测微平均f1-score输出
print('加权平均F1-score:',metrics.f1_score(y_test,y_predict,labels=[1,2,3,4],average='weighted'))#预测加权平均f1-score输出
 
print('混淆矩阵输出:\n',metrics.confusion_matrix(y_test,y_predict,labels=[1,2,3,4]))#混淆矩阵输出
print('分类报告:\n', metrics.classification_report(y_test, y_predict,labels=[1,2,3,4]))#分类报告输出
 
 
输出:
准确率: 0.571428571429
宏平均精确率: 0.696428571429
微平均精确率: 0.571428571429
加权平均精确率: 0.775510204082
宏平均召回率: 0.566666666667
微平均召回率: 0.571428571429
加权平均召回率: 0.571428571429
宏平均F1-score: 0.579166666667
微平均F1-score: 0.571428571429
加权平均F1-score: 0.615476190476
混淆矩阵输出:
 [[3 0 2 0]
 [0 2 2 0]
 [0 0 2 1]
 [0 0 1 1]]
分类报告:
              precision    recall  f1-score   support
 
          1       1.00      0.60      0.75         5
          2       1.00      0.50      0.67         4
          3       0.29      0.67      0.40         3
          4       0.50      0.50      0.50         2
 
avg / total       0.78      0.57      0.62        14


https://blog.csdn.net/lyb3b3b/java/article/details/84819931

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值