micro-F1和macro-F1详解
2022.04.06 修改了二分类F1的表述错误,增加了macro和micro的权重倾向
2021.12.21 修改了图像,并将部分公式由图片转换为公式,修改了部分表述方式
摘要
F1-score:是统计学中用来衡量二分类模型精确度的一种指标,用于测量不均衡数据的精度。它同时兼顾了分类模型的精确率和召回率。F1-score可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。
一般来说,对于二分类问题我们通常只计算正类的样本的F1-score,即将正类的F1当成整体F1,而不会去分别计算正类和负类。当然如果实验要求也可以分别计算两类的F1之后再使用micro或macro的方式得到整体的F1。我们多在多分类问题中才考虑计算不同类别的样本F1。
这里先简要介绍一下二分类的F1计算方法:
假设有如下的二分类结果:
根据上述结果我们可以得到一下结果:
P
r
e
c
i
s
i
o
n
=
a
a
+
c
R
e
c
a
l
l
=
a
a
+
b
\ \ \ Precision= \frac{a}{a+c} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Recall= \frac{a}{a+b}
Precision=a+ca Recall=a+ba
二
分
类
F
1
−
s
c
o
r
e
:
F
1
=
2
1
R
e
c
a
l
l
+
1
P
r
e
c
i
s
i
o
n
=
2
R
e
c
a
l
l
×
P
r
e
c
i
s
i
o
n
R
e
c
a
l
l
+
P
r
e
c
i
s
i
o
n
二分类F1-score:F1= \frac{2}{\frac{1}{Recall}+\frac{1}{Precision}}= 2\frac{Recall×Precision}{Recall+Precision}
二分类F1−score:F1=Recall1+Precision12=2Recall+PrecisionRecall×Precision
在多分类问题中,如果要计算模型的F1-score,则有两种计算方式,分别为micro-F1
和macro-F1
。下面分别介绍两种计算方式的不同。
micro-F1:
取值范围:(0, 1);
权重倾向:每一个样本的权重都相同;
适用环境:多分类不平衡,若数据极度不平衡会影响结果;
计算方式:
计
算
总
的
R
e
c
a
l
l
m
=
T
P
1
+
T
P
2
+
T
P
3
T
P
1
+
T
P
2
+
T
P
3
+
F
N
1
+
F
N
2
+
F
N
3
计算总的Recall_m= \frac{TP_1+TP_2+TP_3}{TP_1+TP_2+TP_3+FN_1+FN_2+FN_3}
计算总的Recallm=TP1+TP2+TP3+FN1+FN2+FN3TP1+TP2+TP3
计
算
总
的
P
r
e
c
i
s
i
o
n
m
=
T
P
1
+
T
P
2
+
T
P
3
T
P
1
+
T
P
2
+
T
P
3
+
F
P
1
+
F
P
2
+
F
P
3
计算总的Precision_m= \frac{TP_1+TP_2+TP_3}{TP_1+TP_2+TP_3+FP_1+FP_2+FP_3}
计算总的Precisionm=TP1+TP2+TP3+FP1+FP2+FP3TP1+TP2+TP3
计
算
总
的
m
i
c
r
o
−
F
1
=
2
R
e
c
a
l
l
m
×
P
r
e
c
i
s
i
o
n
m
R
e
c
a
l
l
m
+
P
r
e
c
i
s
i
o
n
m
计算总的micro-F1= 2\frac{Recall_m×Precision_m}{Recall_m+Precision_m}
计算总的micro−F1=2Recallm+PrecisionmRecallm×Precisionm
TPi 是指第 i 类的 True Positive 正类判定为正类;
FPi 是指第 i 类的 False Positive 负类判定为正类;
FNi 是指第 i 类的 FalseNegative 正类判定为负类;
TNi 是指第 i 类的 True Negative 负类判定为负类。
假设现在有一下的三分类结果:
由此表我们可以得出:
对
第
1
类
:
F
P
1
=
d
+
g
;
T
P
1
=
a
;
F
N
1
=
b
+
c
;
T
N
1
=
e
+
f
+
h
+
i
;
对第1类:FP_1=d+g;TP_1=a;FN_1=b+c;TN_1=e+f+h+i;
对第1类:FP1=d+g;TP1=a;FN1=b+c;TN1=e+f+h+i;
对
第
2
类
:
F
P
2
=
b
+
h
;
T
P
2
=
e
;
F
N
2
=
d
+
f
;
T
N
2
=
a
+
c
+
g
+
i
;
对第2类:FP_2=b+h;TP_2=e;FN_2=d+f; TN_2=a+c+g+i;
对第2类:FP2=b+h;TP2=e;FN2=d+f;TN2=a+c+g+i;
对
第
3
类
:
F
P
3
=
c
+
f
;
T
P
3
=
i
;
F
N
3
=
g
+
h
;
T
N
3
=
a
+
b
+
d
+
e
;
对第3类:FP_3=c+f; TP_3=i; FN_3=g+h;TN_3=a+b+d+e;
对第3类:FP3=c+f;TP3=i;FN3=g+h;TN3=a+b+d+e;
对micro-F1来说,mirco的计算方式使将recall和precision合起来算,所以:
对于micro-Recall:
m
i
c
r
o
−
R
e
c
a
l
l
=
T
P
1
+
T
P
2
+
T
P
3
T
P
1
+
T
P
2
+
T
P
3
+
F
N
1
+
F
N
2
+
F
N
3
micro-Recall=\frac{TP_1+TP_2+TP_3}{TP_1+TP_2+TP_3+FN_1+FN_2+FN_3}
micro−Recall=TP1+TP2+TP3+FN1+FN2+FN3TP1+TP2+TP3 即三个类别的TP和FN相加为分母,TP为分子。由上式分析可知,
T
P
1
+
T
P
2
+
T
P
3
=
a
+
e
+
i
TP_1+TP_2+TP_3 =a+e+i
TP1+TP2+TP3=a+e+i
F
N
1
+
F
N
2
+
F
N
3
=
b
+
c
+
d
+
f
+
g
+
h
FN_1+FN_2+FN_3 =b+c+d+f+g+h
FN1+FN2+FN3=b+c+d+f+g+h (即除了TP之外的所有格),所以得到
R
e
c
a
l
l
m
=
a
+
e
+
i
a
+
e
+
i
+
b
+
c
+
d
+
f
+
g
+
h
Recall_m=\frac{a+e+i}{a+e+i+b+c+d+f+g+h}
Recallm=a+e+i+b+c+d+f+g+ha+e+i
对于micro-Precision:
m
i
c
r
o
−
P
r
e
c
i
s
i
o
n
=
T
P
1
+
T
P
2
+
T
P
3
T
P
1
+
T
P
2
+
T
P
3
+
F
P
1
+
F
P
2
+
F
P
3
micro-Precision=\frac{TP_1+TP_2+TP_3}{TP_1+TP_2+TP_3+FP_1+FP_2+FP_3}
micro−Precision=TP1+TP2+TP3+FP1+FP2+FP3TP1+TP2+TP3 同理可得,
T
P
1
+
T
P
2
+
T
P
3
=
a
+
e
+
i
TP_1+TP_2+TP_3 =a+e+i
TP1+TP2+TP3=a+e+i
F
P
1
+
F
P
2
+
F
P
3
=
d
+
g
+
b
+
h
+
c
+
f
FP_1+FP_2+FP_3 =d+g+b+h+c+f
FP1+FP2+FP3=d+g+b+h+c+f (即除了TP之外的所有格),得到
P
r
e
c
i
s
i
o
n
m
=
a
+
e
+
i
a
+
e
+
i
+
d
+
g
+
b
+
h
+
c
+
f
=
R
e
c
a
l
l
m
Precision_m=\frac{a+e+i}{a+e+i+d+g+b+h+c+f}=Recall_m
Precisionm=a+e+i+d+g+b+h+c+fa+e+i=Recallm
然后,根据micro F1-score的计算方式可得:
m
i
c
r
o
−
F
1
=
2
R
e
c
a
l
l
m
×
P
r
e
c
i
s
i
o
n
m
R
e
c
a
l
l
m
+
P
r
e
c
i
s
i
o
n
m
=
R
e
c
a
l
l
m
=
P
r
e
c
i
s
i
o
n
m
micro-F1= 2\frac{Recall_m×Precision_m}{Recall_m+Precision_m}=Recall_m=Precision_m
micro−F1=2Recallm+PrecisionmRecallm×Precisionm=Recallm=Precisionm
而且,对于模型准确性Accuracy,定义为正确分类的样本在所有样本中的比例。所以准确性的公式
A
c
c
=
a
+
e
+
i
a
+
b
+
c
+
d
+
e
+
f
+
g
+
h
+
i
=
m
i
c
r
o
−
F
1
=
R
e
c
a
l
l
m
=
P
r
e
c
i
s
i
o
n
m
Acc= \frac{a+e+i}{a+b+c+d+e+f+g+h+i}=micro-F1=Recall_m=Precision_m
Acc=a+b+c+d+e+f+g+h+ia+e+i=micro−F1=Recallm=Precisionm
据此我们可以得出结论:若micro-F1=0.5,则模型准确率Acc=0.5,Precision和Recall均为0.5,但是!我们不能得出模型基本是靠猜的结论,因为若是三分类结果如下:
A
c
c
=
a
+
e
+
i
a
+
b
+
c
+
d
+
e
+
f
+
g
+
h
+
i
=
m
i
c
r
o
−
F
1
=
R
e
c
a
l
l
m
=
P
r
e
c
i
s
i
o
n
m
=
0.5
Acc= \frac{a+e+i}{a+b+c+d+e+f+g+h+i}=micro-F1=Recall_m=Precision_m=0.5
Acc=a+b+c+d+e+f+g+h+ia+e+i=micro−F1=Recallm=Precisionm=0.5
macro-F1:
取值范围:(0, 1);
取值范围:每一类别的权重都相同;
适用环境:多分类问题,不受数据不平衡影响,容易受到识别性高(高recall、高precision)的类别影响;
计算方法:(以三分类来计算)
(
1
)
.
计
算
每
个
类
别
的
F
1
−
s
c
o
r
e
i
=
2
R
e
c
a
l
l
i
×
P
r
e
c
i
s
i
o
n
i
R
e
c
a
l
l
i
+
P
r
e
c
i
s
i
o
n
i
(1).\ 计算每个类别的F1-score_i=2\frac{Recall_i×Precision_i}{Recall_i+Precision_i}
(1). 计算每个类别的F1−scorei=2Recalli+PrecisioniRecalli×Precisioni
(
2
)
.
计
算
m
a
c
r
o
−
F
1
=
F
1
−
s
c
o
r
e
1
+
F
1
−
s
c
o
r
e
2
+
F
1
−
s
c
o
r
e
3
3
(2).\ 计算macro-F1=\frac{F1-score_1+F1-score_2+F1-score_3}{3}
(2). 计算macro−F1=3F1−score1+F1−score2+F1−score3
其实macro-F1有两种计算方式,
1、先求macro-Recall和macro-Pecision,之后由这两个和求macro-F1;
2、对三个类别的F1-score直接求平均(即上述计算方法)。
在sklearn的包中,使用的是第二种方式。两种方式的使用争议一直存在,不过在“Training algorithms for linear text classifiers( Lewis, David D., et al. “Training algorithms for linear text classifiers.” SIGIR. Vol. 96. 1996.)”中,作者指出,macro-F1是所有类中F1-score的平均值,即第二种方式才是macro-F1的计算方式,因此我们使用第二种计算方式进行说明。
我们对两种macro的方法进行简单分析,第一种方式对错误的分布不太敏感“详见论文(Opitz, Juri, and Sebastian Burst. “Macro F1 and Macro F1.” arXiv preprint arXiv:1911.03347 (2019))”,这一点有点像micro-F1;而第二种方法则被上述论文作者推荐。
同样,我们对每一类的指标都进行分析:
对
第
1
类
:
F
P
1
=
d
+
g
;
T
P
1
=
a
;
F
N
1
=
b
+
c
;
T
N
1
=
e
+
f
+
h
+
i
;
对第1类:FP_1=d+g;TP_1=a;FN_1=b+c;TN_1=e+f+h+i;
对第1类:FP1=d+g;TP1=a;FN1=b+c;TN1=e+f+h+i;
对
第
2
类
:
F
P
2
=
b
+
h
;
T
P
2
=
e
;
F
N
2
=
d
+
f
;
T
N
2
=
a
+
c
+
g
+
i
;
对第2类:FP_2=b+h;TP_2=e;FN_2=d+f; TN_2=a+c+g+i;
对第2类:FP2=b+h;TP2=e;FN2=d+f;TN2=a+c+g+i;
对
第
3
类
:
F
P
3
=
c
+
f
;
T
P
3
=
i
;
F
N
3
=
g
+
h
;
T
N
3
=
a
+
b
+
d
+
e
;
对第3类:FP_3=c+f; TP_3=i; FN_3=g+h;TN_3=a+b+d+e;
对第3类:FP3=c+f;TP3=i;FN3=g+h;TN3=a+b+d+e;
对
第
1
类
:
R
e
c
a
l
l
1
=
T
P
1
T
P
1
+
F
N
1
,
P
r
e
c
i
s
i
o
n
1
=
T
P
1
T
P
1
+
F
P
1
,
F
1
−
s
c
o
r
e
1
=
2
T
P
1
2
T
P
1
+
F
P
1
+
F
N
1
对第1类:Recall_1=\frac{TP_1}{TP_1+FN_1},Precision_1=\frac{TP_1}{TP_1+FP_1},F1-score_1=\frac{2TP_1}{2TP_1+FP_1+FN_1}
对第1类:Recall1=TP1+FN1TP1,Precision1=TP1+FP1TP1,F1−score1=2TP1+FP1+FN12TP1
对
第
2
类
:
R
e
c
a
l
l
2
=
T
P
2
T
P
2
+
F
N
2
,
P
r
e
c
i
s
i
o
n
2
=
T
P
2
T
P
2
+
F
P
2
,
F
1
−
s
c
o
r
e
2
=
2
T
P
2
2
T
P
2
+
F
P
2
+
F
N
2
对第2类:Recall_2=\frac{TP_2}{TP_2+FN_2},Precision_2=\frac{TP_2}{TP_2+FP_2},F1-score_2=\frac{2TP_2}{2TP_2+FP_2+FN_2}
对第2类:Recall2=TP2+FN2TP2,Precision2=TP2+FP2TP2,F1−score2=2TP2+FP2+FN22TP2
对
第
3
类
:
R
e
c
a
l
l
3
1
=
T
P
3
T
P
3
+
F
N
3
,
P
r
e
c
i
s
i
o
n
3
=
T
P
3
T
P
3
+
F
P
3
,
F
1
−
s
c
o
r
e
3
=
2
T
P
3
2
T
P
3
+
F
P
3
+
F
N
3
对第3类:Recall_31=\frac{TP_3}{TP_3+FN_3},Precision_3=\frac{TP_3}{TP_3+FP_3},F1-score_3=\frac{2TP_3}{2TP_3+FP_3+FN_3}
对第3类:Recall31=TP3+FN3TP3,Precision3=TP3+FP3TP3,F1−score3=2TP3+FP3+FN32TP3
将上述的值带入macro-F1中,得到:
m
a
c
r
o
−
F
1
=
F
1
−
s
c
o
r
e
1
+
F
1
−
s
c
o
r
e
2
+
F
1
−
s
c
o
r
e
3
3
macro-F1=\frac{F1-score_1+F1-score_2+F1-score_3}{3}
macro−F1=3F1−score1+F1−score2+F1−score3
=
2
T
P
1
2
T
P
1
+
F
P
1
+
F
N
1
+
2
T
P
2
2
T
P
2
+
F
P
2
+
F
N
2
+
2
T
P
3
2
T
P
3
+
F
P
3
+
F
N
3
3
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\frac{\frac{2TP_1}{2TP_1+FP_1+FN_1}+\frac{2TP_2}{2TP_2+FP_2+FN_2}+\frac{2TP_3}{2TP_3+FP_3+FN_3}}{3}
=32TP1+FP1+FN12TP1+2TP2+FP2+FN22TP2+2TP3+FP3+FN32TP3
=
2
a
2
a
+
b
+
c
+
d
+
g
+
2
e
2
e
+
b
+
d
+
f
+
h
+
2
i
2
i
+
c
+
f
+
g
+
h
3
\ \ \ \ \ \ \ \ \ \ \ \ =\frac{\frac{2a}{2a+b+c+d+g}+\frac{2e}{2e+b+d+f+h}+\frac{2i}{2i+c+f+g+h}}{3}
=32a+b+c+d+g2a+2e+b+d+f+h2e+2i+c+f+g+h2i
上式即为macro-F1的公式(算到这里我就没有继续化简了感觉没东西)
若使该值=0.5,也得不到有用的结论。
weighted-F1
除了micro-F1和macro-F1,还有weighted-F1,是一个将F1-score乘以该类的比例之后相加的结果,也可以看做是macro-F1的变体吧。例如:
对上述表格,我们可得出每一类的precision、recall和F1-score:
所以,计算weighted-F1:
w
e
i
g
h
t
e
d
−
F
1
=
6
×
42.10
%
+
10
×
30.80
%
+
9
×
66.70
%
4
+
6
+
3
+
1
+
2
+
0
+
1
+
2
+
6
=
46.40
%
weighted-F1=\frac{6×42.10\%+10×30.80\%+9×66.70\%}{4+6+3+1+2+0+1+2+6}=46.40\%
weighted−F1=4+6+3+1+2+0+1+2+66×42.10%+10×30.80%+9×66.70%=46.40%
同样,我们也可以算weighted-Precision和weighted-Recall:
w
e
i
g
h
t
e
d
−
P
r
e
c
i
s
i
o
n
=
6
×
30.80
%
+
10
×
66.70
%
+
9
×
66.70
%
25
=
58.10
%
weighted-Precision=\frac{6×30.80\%+10×66.70\%+9×66.70\%}{25}=58.10\%
weighted−Precision=256×30.80%+10×66.70%+9×66.70%=58.10%
w
e
i
g
h
t
e
d
−
R
e
c
a
l
l
=
6
×
66.70
%
+
10
×
20.00
%
+
9
×
66.70
%
25
=
48.00
%
weighted-Recall=\frac{6×66.70\%+10×20.00\%+9×66.70\%}{25}=48.00\%
weighted−Recall=256×66.70%+10×20.00%+9×66.70%=48.00%
其实从上面我们也可以看出来,
w
e
i
g
h
t
e
d
−
F
1
≠
2
w
e
i
g
h
t
e
d
−
P
r
e
c
i
s
i
o
n
×
w
e
i
g
h
t
e
d
−
R
e
c
a
l
l
w
e
i
g
h
t
e
d
−
P
r
e
c
i
s
i
o
n
+
w
e
i
g
h
t
e
d
−
R
e
c
a
l
l
≈
52.57
%
weighted-F1≠2\frac{weighted-Precision×weighted-Recall}{weighted-Precision+weighted-Recall}≈52.57\%
weighted−F1=2weighted−Precision+weighted−Recallweighted−Precision×weighted−Recall≈52.57%
同理,参考macro的两种计算方式,一般以macro的计算方法为结果。
weighted-F1和macro-F1的区别在于:macro-F1对每一类都赋予了相同的权重,而weighted-F1则根据每一类的比例分别赋予不同的权重。
调参
关于scoring的使用:
进行网格调参时,构建GridSearchCV,一般二分类的评分标准为roc_auc,而多分类并不提供roc曲线面积的评分方式,所以在多分类时,我们可以用
grid_search = GridSearchCV(lg, n_jobs=-1, scoring='f1_weighted', param_grid=param_dist, cv=10, verbose=5)
等评分方式来进行调参,不同的评分方式对结果都会有影响。
还有更多的评分方式可以运行这两行代码获得:
import sklearn.metrics as sm
print(sorted(sm.SCORERS.keys()))
如果错误请及时联系我,以免产生误会。
参考:
https://towardsdatascience.com/multi-class-metrics-made-simple-part-i-precision-and-recall-9250280bddc2
https://towardsdatascience.com/multi-class-metrics-made-simple-part-ii-the-f1-score-ebe8b2c2ca1