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
。下面分别介绍两种计算方式的不同。
取值范围:(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
取值范围:(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,也得不到有用的结论。
除了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