分类指标之p值,r值,F1值,微平均和宏平均

假设有12个样本可被分为A,B, C 三个类别,某个分类器的结果如下:

真实预测
AB
AA
AA
AC
BB
BB
BA
BC
CC
CC
CA
CC

对于多分类来说,P值,R值,F1值都是针对某个类别来说的。对于A类来说,A类就是正类,其他类别都是负类。

A类的混淆矩阵:

预测为正类预测为负类
实际为正类2 (TP)2 (FN)
实际为负类2 (FP)6 (TN)

B类的混淆矩阵:

预测为正类预测为负类
实际为正类2 (TP)2 (FN)
实际为负类1 (FP)5 (TN)

C类的混淆矩阵:

预测为正类预测为负类
实际为正类3 (TP)1 (FN)
实际为负类2 (FP)6 (TN)

P值

precision 精确率

预测为A类的样本中,实际是A类的样本占比:
P A = T P T P + F P = 1 2 P_{A}=\frac {TP} {TP+FP}=\frac 1 2 PA=TP+FPTP=21

预测为B类的样本中,实际是B类的样本占比:
P B = 2 3 P_{B}=\frac 2 3 PB=32

预测为C类的样本中,实际是C类的样本占比:
P C = 3 5 P_{C}=\frac 3 5 PC=53

R值

recall 召回率

实际为A类的样本中,被预测为A类的占比:
R A = T P T P + F N = 1 2 R_{A}=\frac {TP} {TP+FN}=\frac 1 2 RA=TP+FNTP=21

实际为B类的样本中,被预测为B类的占比:
R B = 1 2 R_{B}=\frac 1 2 RB=21

实际为C类的样本中,被预测为C类的占比:
R C = 3 4 R_{C}=\frac 3 4 RC=43

F1值

F1值是P值和R值得调和平均数:
2 F 1 = 1 P + 1 R \frac 2 F_{1}=\frac 1 P + \frac 1 R F21=P1+R1

F 1 = 2 ∗ P ∗ R P + R F_{1}=\frac{2*P*R} {P+R} F1=P+R2PR

F A = 2 ∗ 1 2 ∗ 1 2 1 2 + 1 2 = 0.5 F_{A}=2*\frac {\frac 1 2*\frac 1 2} {\frac 1 2+\frac 1 2}=0.5 FA=221+212121=0.5
F B = 2 ∗ 2 3 ∗ 1 2 2 3 + 1 2 = 0.571 F_{B}=2*\frac {\frac 2 3 *\frac 1 2} {\frac 2 3 +\frac 1 2}=0.571 FB=232+213221=0.571
F C = 2 ∗ 3 5 ∗ 3 4 3 5 + 3 4 = 0.667 F_{C}=2*\frac {\frac 3 5 *\frac 3 4} {\frac 3 5 +\frac 3 4}=0.667 FC=253+435343=0.667

这里做一下延伸,F1值计算将P值和R值看得同等重要。若当更关注某一个指标时,公式需要稍作修改:

F β = ( 1 + β 2 ) ∗ P ∗ R β 2 ∗ P + R F_\beta=\frac{(1+\beta^2)*P*R} {\beta^2*P+R} Fβ=β2P+R(1+β2)PR

β = 1 \beta=1 β=1时,即是计算 F 1 F_{1} F1的值。 β < 1 \beta<1 β<1时, 更关注P值, β > 1 \beta>1 β>1时, 更关注R值.

在语法纠错中,一般更关注P值,用F0.5。被分类为错误的类别里面,实际错误的比率要足够高,误判会让人感觉很不好。

F β = ( 1 + 0. 5 2 ) ∗ P ∗ R 0. 5 2 ∗ P + R F_\beta=\frac{(1+0.5^2)*P*R} {0.5^2*P+R} Fβ=0.52P+R(1+0.52)PR

Micro-F1

不区分类别。使用总体的P值和R值计算出Micro-F1

P: 预测为ABC类里面真正正确的占比
R: 实际为ABC类里面真正正确的占比

P = R = F 1 = 7 12 = 0.583 P=R=F1=\frac 7 {12}=0.583 P=R=F1=127=0.583

这里的P,R,F1在任何情况下都是相等的,相当于多分类的accuracy

Macro-F1

宏平均有两种计算方式:

  1. 直接对每个类别的F1值求平均
    Macro-F1(type1) = 1 C ∑ i = 1 C F i \text{Macro-F1(type1)}=\frac 1 C \sum_{i=1}^{C}F_{i} Macro-F1(type1)=C1i=1CFi
  2. 对每一个类别的P值,R值求平均,再计算F1值
    Macro-P = 1 C ∑ i = 1 C P i \text{Macro-P}=\frac 1 C \sum_{i=1}^{C}P_{i} Macro-P=C1i=1CPi
    Macro-R = 1 C ∑ i = 1 C R i \text{Macro-R}=\frac 1 C \sum_{i=1}^{C}R_{i} Macro-R=C1i=1CRi
    Macro-F1(type2) = 2 ∗ Macro-P ∗ Macro-R Macro-P + Macro-R \text{Macro-F1(type2)}=\frac {2*\text{Macro-P}*\text{Macro-R}} {\text{Macro-P}+\text{Macro-R}} Macro-F1(type2)=Macro-P+Macro-R2Macro-PMacro-R

sklearn计算的是第一种。

代码验证:

from sklearn.metrics import classification_report
from sklearn.metrics import f1_score

print(classification_report(y_true=["A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"],
                            y_pred=["B", "A", "A", "C", "B", "B", "A", "C", "C", "C", "A", "C"],
                            labels=["A", "B", "C"]))

print(f1_score(y_true=["A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"],
               y_pred=["B", "A", "A", "C", "B", "B", "A", "C", "C", "C", "A", "C"],
               labels=["A", "B", "C"], average="micro"))

print(f1_score(y_true=["A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"],
               y_pred=["B", "A", "A", "C", "B", "B", "A", "C", "C", "C", "A", "C"],
               labels=["A", "B", "C"], average="macro"))

结果:

             precision    recall  f1-score   support

          A       0.50      0.50      0.50         4
          B       0.67      0.50      0.57         4
          C       0.60      0.75      0.67         4

avg / total       0.59      0.58      0.58        12

0.5833333333333334
0.5793650793650794

参考

Macro-F1 Score与Micro-F1 Score

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺棒棒冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值