在二分类条件下,我们可以很轻易的在混淆矩阵的基础上定义出各种指标(例如Accurarcy, precision, F1F_1F1, recall),其定义方法如下:
true positive: TP,真实情况为True,预测也为正的样本数。
false positive:FP,真实情况为False,预测为正的样本数。
false negative:FN,真实情况为True,预测为负的样本数。
true negative: TN,真实情况为False,预测为负的样本数。
对于这四个指标,在英文的取名是是两个形容词【A1A_1A1,A2A_2A2】,其中第二个形容词是主体,表示预测的结果(预测目标的是正样本,还是负样本),它其实对应着一个命题:预测该样本为正或负样本。第一个形容词是对这个命题的判断结果,表示这个命题的正确与否。
例如: false negative: negative表示"分类器预测该样本为负样本"这个命题。 false则表示这个命题(“分类器预测该样本为负样本”)是错误的,既然命题是错误的,说明这个样本的实际情况是正样本。
在这些指标下,acc,recall,precision的值定义如下:
Accuracy=TP+TNTP+FP+FN+TNAccuracy=\frac{TP+TN}{TP+FP+FN+TN}Accuracy=TP+FP+FN+TNTP+TN
Recall=TPTP+FNRecall=\frac{TP}{TP+FN}Recall=TP+FNTP
Precision=TPTP+FPPrecision=\frac{TP}{TP+FP}Precision=TP+FPTP
那么对于多分类,如何定义混淆矩阵的TP,FP,FN,TN?
一般的做法是,对于多分类里面的每个类别,将自身类作为正类,其他所有类作为反类,然后定义出各自的TPi,FPi,FNi,TNiTP_i,FP_i,FN_i,TN_iTPi,FPi,FNi,TNi,然后再去计算各个类别的accuracyiaccuracy_iaccuracyi,recallirecall_irecalli和F1iF_{1i}F1i,其中iii 表示第i个类别。
如果要计算出分类器对于所有类别的acc和recall,需要把所有类别的结果都汇聚起来,而Macro-average,Micro-average和Weighted-average就是三种汇聚所有类的指标的方式。
具体来说:
Macro-average下的accuracy的计算方式是:
Accuracymacro_avg=∑i=1N1N×accuracyi=∑i=1N1N×TPi+TNiTPi+TNi+FPi+FNiAccuracy_{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=1∑NN1×accuracyi=i=1∑NN1×TPi+TNi+FPi+FNiTPi+TNi
这相当于把所有类别的权重都是设置为一致,这种方式在测试样本的类别在数量上极端不均衡的时候极端的不合理。
因此,为了考虑到不同类别的样本不均衡,就有所谓的Weighted-average计算方式:
Accuracyweight_avg=∑i=1NTPi+FNi∑j=1NTPi+FNi×accuracyiAccuracy_{weight\_avg}=\sum^{N}_{i=1}\frac{TP_i+FN_i}{\sum^{N}_{j=1} TP_i+FN_i}\times accuracy_iAccuracyweight_avg=i=1∑N∑j=1NTPi+FNiTPi+FNi×accuracyi
这是把第i个类别的权重设置为了第i类样本占所有类别样本的比例了。
而Micro-average下的Precision和recall的计算方式和accuracy的计算方式还不太一样:
Recall=∑i=1NTPi∑j=1NTPj+FNjRecall=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FN_j}Recall=∑j=1NTPj+FNj∑i=1NTPi
Precision=∑i=1NTPi∑j=1NTPj+FPjPrecision=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FP_j}Precision=∑j=1NTPj+FPj∑i=1NTPi
而Accuracy是说,所有这些样本里面,有多少个样本是识别正确的,因此它的计算方式为:
Accuracy=∑i=1NTPi总样本数Accuracy=\frac{\sum_{i=1}^{N}TPi}{总样本数}Accuracy=总样本数∑i=1NTPi
举例说明
我们举个三分类的例子加以说明。
如下图所示的混淆矩阵:
对猫,鱼,鸡,我们可以分别求出各自的TP,TN,FP,FN:
TP猫=4TP_{猫}=4TP猫=4,TP鱼=2TP_{鱼}=2TP鱼=2,TP鸡=6TP_{鸡}=6TP鸡=6
TN猫=2+2+0+6=10TN_{猫}=2+2+0+6=10TN猫=2+2+0+6=10,TN鱼=4+3+1+6=14TN_{鱼}=4+3+1+6=14TN鱼=4+3+1+6=14,TN鸡=4+6+1+2=13TN_{鸡}=4+6+1+2=13TN鸡=4+6+1+2=13
FP猫=6+3=9,FP鱼=1+0=1,FP鸡=1+2=3FP_{猫}=6+3=9,FP_{鱼}=1+0=1,FP_{鸡}=1+2=3FP猫=6+3=9,FP鱼=1+0=1,FP鸡=1+2=3
FN猫=1+1=2,FN鱼=6+2=8,FN鸡=3+0=3FN_{猫}=1+1=2,FN_{鱼}=6+2=8,FN_{鸡}=3+0=3FN猫=1+1=2,FN鱼=6+2=8,FN鸡=3+0=3
于是对于猫来说:
Accuracy猫=4+104+10+9+2=0.56Accuracy_{猫}=\frac{4+10}{4+10+9+2}=0.56Accuracy猫=4+10+9+24+10=0.56
recall猫=46=0.66recall_{猫}=\frac{4}{6}=0.66recall猫=64=0.66
precision猫=TP猫TP猫+FP猫=44+9=0.3076precision_{猫}=\frac{TP_{猫}}{TP_{猫}+FP_{猫}}=\frac{4}{4+9}=0.3076precision猫=TP猫+FP猫TP猫=4+94=0.3076
对于鱼来说:
Accuracy鱼=2+142+14+1+8=0.64Accuracy_{鱼}=\frac{2+14}{2+14+1+8}=0.64Accuracy鱼=2+14+1+82+14=0.64
recall鱼=22+8=0.20recall_{鱼}=\frac{2}{2+8}=0.20recall鱼=2+82=0.20
precision鱼=TP鱼TP鱼+FP鱼=22+1=0.66precision_{鱼}=\frac{TP_{鱼}}{TP_{鱼}+FP_{鱼}}=\frac{2}{2+1}=0.66precision鱼=TP鱼+FP鱼TP鱼=2+12=0.66
对于鸡来说:
Accuracy鸡=6+136+13+3+3=0.76Accuracy_{鸡}=\frac{6+13}{6+13+3+3}=0.76Accuracy鸡=6+13+3+36+13=0.76
recall鸡=66+3=0.66recall_{鸡}=\frac{6}{6+3}=0.66recall鸡=6+36=0.66
precision鸡=TP鸡TP鸡+FP鸡=66+3=0.66precision_{鸡}=\frac{TP_{鸡}}{TP_{鸡}+FP_{鸡}}=\frac{6}{6+3}=0.66precision鸡=TP鸡+FP鸡TP鸡=6+36=0.66
接下来,我们分别计算Macro-average,Micro-average和Weighted-average下的三种指标:
Macro-average 情况下 :
acc=0.56+0.64+0.763acc=\frac{0.56+0.64+0.76}{3}acc=30.56+0.64+0.76
recall=0.66+0.66+0.203recall=\frac{0.66+0.66+0.20}{3}recall=30.66+0.66+0.20
precision=0.3076+0.66+0.663precision=\frac{0.3076+0.66+0.66}{3}precision=30.3076+0.66+0.66
Micro-average 情况下:
acc=4+2+66+4+9=1225=0.48acc=\frac{4+2+6}{6+4+9}=\frac{12}{25}=0.48acc=6+4+94+2+6=2512=0.48
recall=4+2+64+2+6+2+8+3=1225=0.48recall=\frac{4+2+6}{4+2+6+2+8+3}=\frac{12}{25}=0.48recall=4+2+6+2+8+34+2+6=2512=0.48
precision=4+2+64+2+6+9+1+3=1225=0.48precision=\frac{4+2+6}{4+2+6+9+1+3}=\frac{12}{25}=0.48precision=4+2+6+9+1+34+2+6=2512=0.48
以及Weighted情况下:
我们首先计算出三个类别的样本比例:
样本总数目:TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡=4+2+2+8+6+3=25
猫占比 r猫r_猫r猫:TP猫+FN猫TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡=625=0.24\frac{TP_{猫}+FN_{猫}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{6}{25}=0.24TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡TP猫+FN猫=256=0.24
鱼占比 r鱼r_鱼r鱼:TP鱼+FN鱼TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡=1025=0.4\frac{TP_{鱼}+FN_{鱼}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{10}{25}=0.4TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡TP鱼+FN鱼=2510=0.4
鸡占比 r鸡r_鸡r鸡:TP鸡+FN鸡TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡=925=0.36\frac{TP_{鸡}+FN_{鸡}}{TP_{猫}+FN_{猫}+TP_{鱼}+FN_{鱼}+TP_{鸡}+FN_{鸡}}=\frac{9}{25}=0.36TP猫+FN猫+TP鱼+FN鱼+TP鸡+FN鸡TP鸡+FN鸡=259=0.36
于是各个指标就是加权求和了:
acc=acc猫×r猫+acc鱼×r鱼+acc鸡×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
recall=recall猫×r猫+recall鱼×r鱼+recall鸡×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
precision=precision猫×r猫+precision鱼×r鱼+precision鸡×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的计算公式为:
Recall=∑i=1NTPi∑j=1NTPj+FNjRecall=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FN_j}Recall=∑j=1NTPj+FNj∑i=1NTPi
Precision=∑i=1NTPi∑j=1NTPj+FPjPrecision=\frac{\sum_{i=1}^{N}TPi}{\sum_{j=1}^N TP_j+FP_j}Precision=∑j=1NTPj+FPj∑i=1NTPi
其中∑j=1NFNj\sum^N_{j=1}FN_j∑j=1NFNj含义为所有类别里面,把【本属于自己类】的样本错误的识别为其他类别的样本数之和;∑j=1NFPj\sum^N_{j=1}FP_j∑j=1NFPj含义为所有类别里面,把【不属于自己类】的样本错误的识别为本类的样本数之和。
假设样本xxx的正确类别为yry_ryr,但是预测的类别为ypy_pyp,且yr≠ypy_r\neq y_pyr=yp。
毫无疑问,对于类别yry_ryr来说,它被错误的识别为其他类了,因此这个样本会被统计到∑j=1NFNj\sum^N_{j=1}FN_j∑j=1NFNj里面去。
同时对于类别ypy_pyp来说,这个样本也会一样统计到∑j=1NFPj\sum^N_{j=1}FP_j∑j=1NFPj,因为它是属于把本不是ypy_pyp类的样本错误的识别为ypy_pyp类了。
因此对所有类别求和以后,即有:∑j=1NFNj\sum^N_{j=1}FN_j∑j=1NFNj=∑j=1NFPj\sum^N_{j=1}FP_j∑j=1NFPj。
同时注意到,对于每个样本xxx,其预测结果与真实标签之间只存在相等于不相等的关系。如果yr≠ypy_r\neq y_pyr=yp 那么这个样本会被统计进∑j=1NFPj\sum^N_{j=1}FP_j∑j=1NFPj 或者∑j=1NFNj\sum^N_{j=1}FN_j∑j=1NFNj;如果yr=ypy_r=y_pyr=yp,那么这个样本会被统计进 ∑j=1NTPj\sum^N_{j=1}TP_j∑j=1NTPj,因此统计量∑j=1NTPj+FNj\sum^N_{j=1}TP_j+ FN_j∑j=1NTPj+FNj其实也等于样本总数;
而accuracy=∑i=1NTPi总样本数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相等的。