多分类条件下分类指标:Macro-average和Micro-average,以及Weighted-average

在二分类条件下,我们可以很轻易的在混淆矩阵的基础上定义出各种指标(例如Accurarcy, precision, F 1 F_1 F1, recall),其定义方法如下:
在这里插入图片描述
true positive: TP,真实情况为True,预测也为正的样本数。
false positive:FP,真实情况为False,预测为正的样本数。
false negative:FN,真实情况为True,预测为负的样本数。
true negative: TN,真实情况为False,预测为负的样本数。
对于这四个指标,在英文的取名是是两个形容词【 A 1 A_1 A1, A 2 A_2 A2】,其中第二个形容词是主体,表示预测的结果(预测目标的是正样本,还是负样本),它其实对应着一个命题:预测该样本为正或负样本。第一个形容词是对这个命题的判断结果,表示这个命题的正确与否。
例如: false negative: negative表示"分类器预测该样本为负样本"这个命题。 false则表示这个命题(“分类器预测该样本为负样本”)是错误的,既然命题是错误的,说明这个样本的实际情况是正样本。
在这些指标下,acc,recall,precision的值定义如下:
A c c u r a c y = T P + T N T P + F P + F N + T N Accuracy=\frac{TP+TN}{TP+FP+FN+TN} Accuracy=TP+FP+FN+TNTP+TN
R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

那么对于多分类,如何定义混淆矩阵的TP,FP,FN,TN?
一般的做法是,对于多分类里面的每个类别,将自身类作为正类,其他所有类作为反类,然后定义出各自的 T P i , F P i , F N i , T N i TP_i,FP_i,FN_i,TN_i TPi,FPi,FNi,TNi,然后再去计算各个类别的 a c c u r a c y i accuracy_i accuracyi r e c a l l i recall_i recalli F 1 i F_{1i} F1i,其中 i i i 表示第i个类别。
如果要计算出分类器对于所有类别的acc和recall,需要把所有类别的结果都汇聚起来,而Macro-average,Micro-average和Weighted-average就是三种汇聚所有类的指标的方式。
具体来说:
Macro-average下的accuracy的计算方式是:
A c c u r a c y m a c r o _ a v g = ∑ i = 1 N 1 N × a c c u r a c y i = ∑ i = 1 N 1 N × T P i + T N i T P i + T N i + F P i + F N i Accuracy_{macro\_avg}=\sum^{N}_{i=1}\frac{1}{N} \times accuracy_i=\sum^{N}_{i=1}\frac{1}{N}\times \frac{TP_i+TN_i}{TP_i+TN_i+FP_i+FN_i} Accuracymacro_avg=i=1NN1×accuracyi=i=1NN1×TPi+TNi+FPi+FNiTPi+TNi
这相当于把所有类别的权重都是设置为一致,这种方式在测试样本的类别在数量上极端不均衡的时候极端的不合理。
因此,为了考虑到不同类别的样本不均衡,就有所谓的Weighted-average计算方式:
A c c u r a c y w e i g h t _ a v g = ∑ i = 1 N T P i + F N i ∑ j = 1 N T P i + F N i × a c c u r a c y i Accuracy_{weight\_avg}=\sum^{N}_{i=1}\frac{TP_i+FN_i}{\sum^{N}_{j=1} TP_i+FN_i}\times accuracy_i Accuracyweight_avg=i=1Nj=1NTPi+FNiTPi+FNi×accuracyi
这是把第i个类别的权重设置为了第i类样本占所有类别样本的比例了。

而Micro-average下的Precision和recall的计算方式和accuracy的计算方式还不太一样:
R e c a l l = ∑ i = 1 N T P i ∑ j = 1 N T P j + F N j Recall=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FN_j} Recall=j=1NTPj+FNji=1NTPi
P r e c i s i o n = ∑ i = 1 N T P i ∑ j = 1 N T P j + F P j Precision=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FP_j} Precision=j=1NTPj+FPji=1NTPi
而Accuracy是说,所有这些样本里面,有多少个样本是识别正确的,因此它的计算方式为:
A c c u r a c y = ∑ i = 1 N T P i 总 样 本 数 Accuracy=\frac{\sum_{i=1}^{N}TPi}{总样本数} Accuracy=i=1NTPi

举例说明

我们举个三分类的例子加以说明。
如下图所示的混淆矩阵:
在这里插入图片描述
对猫,鱼,鸡,我们可以分别求出各自的TP,TN,FP,FN:
T P 猫 = 4 TP_{猫}=4 TP=4, T P 鱼 = 2 TP_{鱼}=2 TP=2 T P 鸡 = 6 TP_{鸡}=6 TP=6
T N 猫 = 2 + 2 + 0 + 6 = 10 TN_{猫}=2+2+0+6=10 TN=2+2+0+6=10, T N 鱼 = 4 + 3 + 1 + 6 = 14 TN_{鱼}=4+3+1+6=14 TN=4+3+1+6=14 T N 鸡 = 4 + 6 + 1 + 2 = 13 TN_{鸡}=4+6+1+2=13 TN=4+6+1+2=13
F P 猫 = 6 + 3 = 9 , F P 鱼 = 1 + 0 = 1 , F P 鸡 = 1 + 2 = 3 FP_{猫}=6+3=9,FP_{鱼}=1+0=1,FP_{鸡}=1+2=3 FP=6+3=9,FP=1+0=1,FP=1+2=3
F N 猫 = 1 + 1 = 2 , F N 鱼 = 6 + 2 = 8 , F N 鸡 = 3 + 0 = 3 FN_{猫}=1+1=2,FN_{鱼}=6+2=8,FN_{鸡}=3+0=3 FN=1+1=2,FN=6+2=8,FN=3+0=3
于是对于猫来说:
A c c u r a c y 猫 = 4 + 10 4 + 10 + 9 + 2 = 0.56 Accuracy_{猫}=\frac{4+10}{4+10+9+2}=0.56 Accuracy=4+10+9+24+10=0.56
r e c a l l 猫 = 4 6 = 0.66 recall_{猫}=\frac{4}{6}=0.66 recall=64=0.66
p r e c i s i o n 猫 = T P 猫 T P 猫 + F P 猫 = 4 4 + 9 = 0.3076 precision_{猫}=\frac{TP_{猫}}{TP_{猫}+FP_{猫}}=\frac{4}{4+9}=0.3076 precision=TP+FPTP=4+94=0.3076

对于鱼来说:
A c c u r a c y 鱼 = 2 + 14 2 + 14 + 1 + 8 = 0.64 Accuracy_{鱼}=\frac{2+14}{2+14+1+8}=0.64 Accuracy=2+14+1+82+14=0.64
r e c a l l 鱼 = 2 2 + 8 = 0.20 recall_{鱼}=\frac{2}{2+8}=0.20 recall=2+82=0.20
p r e c i s i o n 鱼 = T P 鱼 T P 鱼 + F P 鱼 = 2 2 + 1 = 0.66 precision_{鱼}=\frac{TP_{鱼}}{TP_{鱼}+FP_{鱼}}=\frac{2}{2+1}=0.66 precision=TP+FPTP=2+12=0.66

对于鸡来说:
A c c u r a c y 鸡 = 6 + 13 6 + 13 + 3 + 3 = 0.76 Accuracy_{鸡}=\frac{6+13}{6+13+3+3}=0.76 Accuracy=6+13+3+36+13=0.76
r e c a l l 鸡 = 6 6 + 3 = 0.66 recall_{鸡}=\frac{6}{6+3}=0.66 recall=6+36=0.66
p r e c i s i o n 鸡 = T P 鸡 T P 鸡 + F P 鸡 = 6 6 + 3 = 0.66 precision_{鸡}=\frac{TP_{鸡}}{TP_{鸡}+FP_{鸡}}=\frac{6}{6+3}=0.66 precision=TP+FPTP=6+36=0.66


接下来,我们分别计算Macro-average,Micro-average和Weighted-average下的三种指标:
Macro-average 情况下 :
a c c = 0.56 + 0.64 + 0.76 3 acc=\frac{0.56+0.64+0.76}{3} acc=30.56+0.64+0.76

r e c a l l = 0.66 + 0.66 + 0.20 3 recall=\frac{0.66+0.66+0.20}{3} recall=30.66+0.66+0.20

p r e c i s i o n = 0.3076 + 0.66 + 0.66 3 precision=\frac{0.3076+0.66+0.66}{3} precision=30.3076+0.66+0.66


Micro-average 情况下:
a c c = 4 + 2 + 6 6 + 4 + 9 = 12 25 = 0.48 acc=\frac{4+2+6}{6+4+9}=\frac{12}{25}=0.48 acc=6+4+94+2+6=2512=0.48

r e c a l l = 4 + 2 + 6 4 + 2 + 6 + 2 + 8 + 3 = 12 25 = 0.48 recall=\frac{4+2+6}{4+2+6+2+8+3}=\frac{12}{25}=0.48 recall=4+2+6+2+8+34+2+6=2512=0.48

p r e c i s i o n = 4 + 2 + 6 4 + 2 + 6 + 9 + 1 + 3 = 12 25 = 0.48 precision=\frac{4+2+6}{4+2+6+9+1+3}=\frac{12}{25}=0.48 precision=4+2+6+9+1+34+2+6=2512=0.48


以及Weighted情况下:
我们首先计算出三个类别的样本比例:
样本总数目: T P 猫 + F N 猫 + T P 鱼 + F N 鱼 + T P 鸡 + F N 鸡 TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡} TP+FN+TP+FN+TP+FN=4+2+2+8+6+3=25

猫占比 r 猫 r_猫 r T P 猫 + F N 猫 T P 猫 + F N 猫 + T P 鱼 + F N 鱼 + T P 鸡 + F N 鸡 = 6 25 = 0.24 \frac{TP_{猫}+FN_{猫}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{6}{25}=0.24 TP+FN+TP+FN+TP+FNTP+FN=256=0.24

鱼占比 r 鱼 r_鱼 r T P 鱼 + F N 鱼 T P 猫 + F N 猫 + T P 鱼 + F N 鱼 + T P 鸡 + F N 鸡 = 10 25 = 0.4 \frac{TP_{鱼}+FN_{鱼}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{10}{25}=0.4 TP+FN+TP+FN+TP+FNTP+FN=2510=0.4

鸡占比 r 鸡 r_鸡 r T P 鸡 + F N 鸡 T P 猫 + F N 猫 + T P 鱼 + F N 鱼 + T P 鸡 + F N 鸡 = 9 25 = 0.36 \frac{TP_{鸡}+FN_{鸡}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{9}{25}=0.36 TP+FN+TP+FN+TP+FNTP+FN=259=0.36
于是各个指标就是加权求和了:
a c c = a c c 猫 × r 猫 + a c c 鱼 × r 鱼 + a c c 鸡 × r 鸡 acc=acc_猫\times r_猫+ acc_鱼 \times r_鱼+ acc_鸡 \times r_鸡 acc=acc×r+acc×r+acc×r=0.560.24+0.640.4+0.76*0.36=0.664

r e c a l l = r e c a l l 猫 × r 猫 + r e c a l l 鱼 × r 鱼 + r e c a l l 鸡 × r 鸡 recall=recall_猫\times r_猫+recall_鱼 \times r_鱼+ recall_鸡 \times r_鸡 recall=recall×r+recall×r+recall×r=0.660.24+0.200.4+0.66*0.36=0.476

p r e c i s i o n = p r e c i s i o n 猫 × r 猫 + p r e c i s i o n 鱼 × r 鱼 + p r e c i s i o n 鸡 × r 鸡 precision=precision_猫\times r_猫+ precision_鱼 \times r_鱼+ precision_鸡 \times r_鸡 precision=precision×r+precision×r+precision×r=0.30760.24+0.660.4+0.66*0.36=0.5754

其它

我们会看到上面这个例子里面,Micro-average下,多分类的accuracy,recall和precision会相同。这不是个例,而是多分类任务下,micro-average指标的常态。

这是因为在多分类里面,micro-average情况下,recall和precision的计算公式为:
R e c a l l = ∑ i = 1 N T P i ∑ j = 1 N T P j + F N j Recall=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FN_j} Recall=j=1NTPj+FNji=1NTPi
P r e c i s i o n = ∑ i = 1 N T P i ∑ j = 1 N T P j + F P j Precision=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FP_j} Precision=j=1NTPj+FPji=1NTPi
其中 ∑ j = 1 N F N j \sum^N_{j=1}FN_j j=1NFNj含义为所有类别里面,把【本属于自己类】的样本错误的识别为其他类别的样本数之和; ∑ j = 1 N F P j \sum^N_{j=1}FP_j j=1NFPj含义为所有类别里面,把【不属于自己类】的样本错误的识别为本类的样本数之和。

假设样本 x x x的正确类别为 y r y_r yr,但是预测的类别为 y p y_p yp,且 y r ≠ y p y_r\neq y_p yr=yp
毫无疑问,对于类别 y r y_r yr来说,它被错误的识别为其他类了,因此这个样本会被统计到 ∑ j = 1 N F N j \sum^N_{j=1}FN_j j=1NFNj里面去。
同时对于类别 y p y_p yp来说,这个样本也会一样统计到 ∑ j = 1 N F P j \sum^N_{j=1}FP_j j=1NFPj,因为它是属于把本不是 y p y_p yp类的样本错误的识别为 y p y_p yp类了。
因此对所有类别求和以后,即有: ∑ j = 1 N F N j \sum^N_{j=1}FN_j j=1NFNj= ∑ j = 1 N F P j \sum^N_{j=1}FP_j j=1NFPj

同时注意到,对于每个样本 x x x,其预测结果与真实标签之间只存在相等于不相等的关系。如果 y r ≠ y p y_r\neq y_p yr=yp 那么这个样本会被统计进 ∑ j = 1 N F P j \sum^N_{j=1}FP_j j=1NFPj 或者 ∑ j = 1 N F N j \sum^N_{j=1}FN_j j=1NFNj;如果 y r = y p y_r=y_p yr=yp,那么这个样本会被统计进 ∑ j = 1 N T P j \sum^N_{j=1}TP_j j=1NTPj,因此统计量 ∑ j = 1 N T P j + F N j \sum^N_{j=1}TP_j+ FN_j j=1NTPj+FNj其实也等于样本总数;

a c c u r a c y = ∑ i = 1 N T P i 总 样 本 数 accuracy=\frac{\sum_{i=1}^{N}TPi}{总样本数} accuracy=i=1NTPi。因此,Micro-average平均下,多分类的accuracy,recall和precision其实是一致的。而这也是为什么sklearn里面classification_report在输出的时候,没有micro-average,只有accuracy,macro-average和weighted-average的结果。其实,第一行的accuracy就把micro-average下的三个值都显示出来了,因为precision,recall都是和accuracy相等的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/114935105
今日推荐