转载自:
根据前面几篇文章我们可以知道,当我们为模型泛化性能选择评估指标时,要根据问题本身以及数据集等因素来做选择.本篇博客主要是解释Micro Average,Macro Average,Weighted Average.这三者常用于多分类任务,他们的计算方法有细微的差别,因此在各自表示的含义和适用场景上也有细微的差别
Micro Average
Micro Average会考虑到所有类别的贡献.举个例子, 假设我们有四个类A,B,C,D. 通过模型预测得到了预测值:
真实值:A, A, A, A, B, B, B, B, B, C, C, C, C, D, D, D,
预测值:A, A, C, B, B, B, B, A, D, C, C, A, D, D, D, C
根据预测值和真实值,对每个类计算出(TPi),假正例(FPi), 假反例(FNi), i表示第i个类.不了解真正例假反例的可以看我这篇博客机器学习--如何理解Accuracy, Precision, Recall, F1 score
Class A | Class B | Class C | Class D | |
TP | 2 | 3 | 2 | 2 |
FP | 2 | 1 | 2 | 2 |
FN | 2 | 2 | 2 | 1 |
首先计算MIcro Precesion, 计算公式如下
对于我们的例子,真正例就是被预测正确的样本有2+3+2+3 = 10, 接下来计算假反例.采用one vs rest 方法,对于类i (i = A,B,C,D),属于i的样本被标记为正,不属于i的样本被标记为负.那么对于类i来说一个假正例意味着一个属于类 j (j≠i)的样本被错误的预测为i. 比如说样本属于类A但被错误的预测为类B,那么对于类B而言,这个预测就是一个假正例.所以一个假反例就意味着一个错误的预测值,总的假反例就是总的错误的预测值.在我们的例子中FP = 2+2+0+2 = 6, 所以Micro Precesion = 10/(10+6)=0.625.
下面计算Micro Recall, 真正例依旧有10例,接下来计算假正例,同样采用one vs rest 方法,对于类i (i = A,B,C,D),一个假反例意味着一个属于类i的样本被错误的预测为类j (j≠i). 比如说样本属于类A但被错误的预测为类B,那么对于类A而言,这个预测就是一个假反例.更为一般的,一个错误的预测值(A被错误的预测为B),对于B而言是一个假正例,对于A而言是一个假反例.因此总的假反例也就是总的错误的预测值,所以Micro Recall = 10/(10+6)=0.625.
由上我们知道Micro Recall = Micro Precesion , 而 Micro F1 = (2* Micro Precesion*Micro Recall)/(Micro Precesion + Micro Recall),不难得出Micro Recall = Micro Precesion = Micro F1.
而且我们也能看出,上边求得的值也表示了分类器的精确度(Accuracy), 即被正确分类的样本占总的样本的比例.因此对于Micro F1而言右边的等式恒成立,Micro F1 = Micro Recall = Micro Precesion = Accuracy
Macro Average
Macro Average会首先针对每个类计算评估指标如查准率Precesion,查全率 Recall , F1 Score,然后对他们取平均得到Macro Precesion, Macro Recall, Macro F1. 具体计算方式如下:
首先计算Macro Precesion,先计算每个类的查准率,再取平均: PrecesionA=2/(2+2) = 0.5, PrecesionB=3/(3+2) = 0.6, PrecesionC=2/(2+0) = 1, PrecesionD=3/(3+2) = 0.6, Macro Precesion = (PrecesionA+PrecesionB + PrecesionC + PrecesionD )/4 = 0.675
对于Macro Recall采用同样的计算方法,RecallA = 2/(2+2) = 0.5, RecallB = 3/(3+2) = 0.6, RecallC = 2/(2+2)=0.5 , RecallD =2/(2+0) = 1, Macro Recall = (RecallA+RecallB+RecallC+RecallD)/4 = 0.65
最后计算 Macro F1, F1A = 0.5, F1B = 0.6, F1C = 0.67, F1D = 0.75, Macro F1 = (F1A+F1B+F1C+F1D)/4 = 0.63.
Weighted Average
从计算的角度讲,先对每个类求值,再取平均得到Macro Average会比较容易.但是当数据集中存在严重类别不平衡的问题时,就不适宜单纯使用Macro Average.此时可以采取weighted average. 具体来说当我们计算Macro Average时候我们给每个类赋予相同的权重,但是当样本不平衡时,不适宜给每个类赋予同样的权重,我们可以根据每个类的样本量,给每个类赋予不同的权重,这就是weighted average的计算方法.在我们的例子中一共有16个样本,其中A类有4个,B类有5个,C类有4个,D类有3个,那么
weighted-F1 = (4*0.5+5*0.6+4*0.67+3*0.75)/16 = 0.618
weighted-Precesion = (4*0.5+5*0.6+4*1+3*0.6)/16 = 0.675
weighted-Recall = (4*0.5+5*0.6+4*0.5+3*1)/16 = 0.625
注意事项
当我们在使用F1的时候要注意,它对Precesion 和Recall赋予相同的权重.但在实际应用中我们需要从给定的问题出发,考虑Precesion 和Recall的哪一个更重要.比如把一个患病的人误诊为健康人所带来的后果远比把一个健康人误诊为患病造成的后果要严重.这个事实就应该反映在权重和代价损失函数上,进而帮助我们选出最佳分类器.二分类问题是这样,多分类问题就更为复杂.在多分类情况下,不同的预测误差可能具有不同的含义,比如说将X预测为Y比将W预测为R产生更高的代价.而标准的F1是不会考虑这些事情,因此我们需要针对特定的问题选择合适的模型性能衡量指标.
reference Multi-Class Metrics Made Simple, Part II: the F1-score--Boaz Shmueli