快速理解分类模型评估指标

一、从混淆矩阵说起

我们以二分类模型来举例,假设我们要预测用户在借款之后是否会逾期。

对于我们的预测来说,有逾期/不逾期两种结果。

对于真实情况,同样有逾期/不逾期两种结果。

我们以逾期为正例,以不逾期为反例,将预测结果与真实结果进行列联交叉,就生成了混淆矩阵:

预测正例 预测反例
实际正例 TP: True Positive FN: False Negative
实际反例 FP: False Positive TN: True Negative
  • TP: 真正例,预测为正例,实际也是正例
  • FP: 假正例,预测为正例,实际为反例
  • FN: 假反例,预测为反例,实际为正例
  • TN: 真反例,预测为反例,实际也是反例

需要指出的是,上述这些都是计数,即真正例的个数、假正例的个数等。那么相对应的,用这些计数除以实际每个分类的总数,就得到了四个比率:

  • TPR: True Positive Rate,真正率,被预测为正的正样本数/实际正样本数。
  • FPR: False Positive Rate,假正率,被预测为正的负样本数/实际正样本数。
  • FNR: False Negative Rate,假负率,被预测为负的正样本数/实际负样本数。
  • TNR: True Negative Rate,真负率,被预测为负的负样本数/实际负样本数。

对应混淆矩阵的公式如下:

TPR=TPTP+FNTPR=\frac{TP}{TP+FN}

TPR=TPTP+FNTPR=\frac{TP}{TP+FN}

FNR=FNFP+TNFNR=\frac{FN}{FP+TN}

TNR=TNFP+TNTNR=\frac{TN}{FP+TN}

可以发现,这些简写均为单词首字母的组合,这一点可以帮助我们免于死记硬背每个公式,只要从根本上理解了这些指标的含义,就可以自己组装出来具体的公式。

简单来说,我们在设计一个分类模型时,希望它能尽可能分类正确,即实际为正例的,我们希望能将它归类到正例中;实际为反例的,我们希望能将它归类到反例中。也就是提高上述TP和TN部分的比例。

混淆矩阵是评估一个分类模型效果的基础,有许多评估指标都是基于分类指标,比如接下来我们提到的准确率、精确率、召回率等。

二、最简单的准确率

准确率(accuracy)最为简单,也最容易理解,它就是我们预测正确的比例,也就是上述TP和TN部分占总体的比例:

ACC=TP+TNTP+FP+FN+TNACC=\frac{TP+TN}{TP+FP+FN+TN}

与准确率相对的是错误率(Error),我们可以简单地使用Error=1ACCError=1-ACC来计算,也可以使用混淆矩阵类计算:

Error=FN+FPTP+FP+FN+TNError=\frac{FN+FP}{TP+FP+FN+TN}

准确率存在的一个问题是在不同分类的数量不均衡时的表现不太好。举个例子来说明这种情况:

A分类有90个,B分类有10个

模型一:在A分类中预测正确81个,在B分类中预测正确0个。
模型二:在A分类中预测正确72个,在B分类中预测正确8个。

我们来计算一下,模型一的准确率为ACC1=81+181+9+1+9=81%ACC_1=\frac{81+1}{81+9+1+9}=81\%,而模型二的准确率的准确率为ACC2=72+872+18+8+2=80%ACC_2=\frac{72+8}{72+18+8+2}=80\%,可以看到,模型一的整体准确率为81%,高于模型二的80%,那么模型一就真的比模型二好吗?

通过仔细观察我们可以看到,事实上模型一只是简单粗暴地将所有个例都分类到A分类中,就得到了更高的准确率,模型二在分类A和分类B上有着同样不错的预测效果,却在准确率上输给了模型一。假如说我们决策的目的是判断用户是否会产生逾期,而B分类就是会产生逾期的用户,那么模型一会给我们带来难以接受的损失,相对来说,模型二虽然整体准确率低于模型一,但是明显会帮助我们避开那些劣质用户,从而保障资本安全。

面对这种准确率失真的情况,我们可以通过计算真正率和真负率的均值来得到平均准确率(Average Per-Class Accuracy):

Ave_Acc=TPR+TNR2=TPTP+FN+TNFP+TN2Ave\_Acc=\frac{TPR+TNR}{2}=\frac{\frac{TP}{TP+FN}+\frac{TN}{FP+TN}}{2}

我们再来看一看上述的例子,计算得到ACC1=45%,ACC2=80%ACC_1=45\%,ACC_2=80\%,模型二远远优于模型一,在这一案例中,显然平均准确率更符合我们的设想。

三、最常用的精确率和召回率

精确率(Precision)和准确率一字之差,含义却完全不同。通俗来说,精确率就是预测的正例中实际为正的比例。

假设有100个人,我们的任务是识别出他们中间的好人。那么精确率就是在我们预测的好人中,真正的好人所占的比例。假如我们判断其中90个是好人,但事实上这90人中只有81人是好人,那么我们的精确率就是P=81/90=90%P=81/90=90\%。精确率对应到混淆矩阵就是:
P=TPTP+FPP=\frac{TP}{TP+FP}

召回率(Recall)则是实际为正的个例中被我们预测为正的比例。仍以上例来说明,假设一共有93个好人,但是我们只预测对了其中81个,那么我们的召回率就是R=81/93=87%R=81/93=87\%。召回率对应到混淆矩阵的公式为:

P=TPTP+FNP=\frac{TP}{TP+FN}

可以看到,召回率是一个与精确率相互补的指标。它们都来自于信息检索领域,后来广泛应用于推荐系统、机器学习模型等效果的评估。

以推荐系统为例来加深理解:我们给用户推荐了100篇文章,用户看了其中的50篇,那我们的精确率§就是50%;用户一共看了200篇文章,其中50篇来自我们的推荐,另外50篇是他自己通过其他途径阅读到的,那么我们的召回率®就是25%。

精确率和召回率哪个更重要呢?这个要视我们分类的目的来决定。比如我们要识别出信贷欺诈用户或者识别出网上逃犯,那么显然召回率更重要,因为这种情况下我们宁肯错杀三千,绝不放过一个,当然针对这类情况,肯定需要更多后续的手段来保障好人的利益;而当我们要预测股票的涨跌或者要给用户推荐他喜爱的商品时,显然精确率更重要。

显然,几乎不存在我们只需要关注其中一个指标的情况。精确率和召回率总是相辅相成,在不同的目的下我们为它们赋予不同的权重,从而让它们更好地为模型评估、对比提供支持。

在这样的考量下,F1-Score应运而生。

四、综合性能强大的F1-Score

首先,F1-Score是精确率和召回率的调和平均值。我们知道常用的有算术平均值、几何平均值、加权平均值,那么,什么是调和平均值呢?

调和平均值(Harmonic Mean)就是各个统计量的倒数的算数平均值的倒数。

调和平均值的一个特点是更重视较小值,举个例子来说明:

假设A=10,B=40A=10,B=40,则2H=110+140\frac{2}{H}=\frac{1}{10}+\frac{1}{40},或H=1(110+140)×12=16H=\frac{1}{(\frac{1}{10}+\frac{1}{40})\times\frac{1}{2}}=16

调和平均值也有简单调和平均值与加权调和平均值之分。具体到F1-Score来说,如果我们赋予精确率和召回率相同权重,那我们的F1-Score就是精确率和召回率的简单调和平均值:

F1=1(1P+1R)×12=2×P×RP+RF_1=\frac{1}{(\frac{1}{P}+\frac{1}{R})\times\frac{1}{2}}=\frac{2\times{P}\times{R}}{P+R}

对我们来说,精确率和召回率的重要性并不总是等同。假如我们需要为它们赋予不同的权重,我们就需要使用到加权调和平均值。

我们用HwH_w来表示加权调和平均值,使用wa,wbw_a, w_b分别表示我们赋予a和b的不同的权重,那么a和b的加权调和平均值为:

Hw=11wa+wb×(waa+wbb)=wa+wbwaa+wbb=(wa+wb)×a×bwa×b+wb×aH_w=\frac{1}{\frac{1}{w_a + w_b}\times{(\frac{w_a}{a}+\frac{w_b}{b}})}=\frac{w_a+w_b}{\frac{w_a}{a}+\frac{w_b}{b}}=\frac{(w_a+w_b)\times{a}\times{b}}{w_a\times{b}+w_b\times{a}}

现在我们为精确率赋以β2\beta^2的权重,为召回率赋以1的权重,那么我们的F1F_1就是:

F1=11wP+wR×(wPP+wRR)=wP+wRwPP+wRR=(wP+wR)×P×RwP×R+wR×P=(β2+1)×P×Rβ2×R+PF_1=\frac{1}{\frac{1}{w_P+w_R}\times{(\frac{w_P}{P}+\frac{w_R}{R}})}=\frac{w_P+w_R}{\frac{w_P}{P}+\frac{w_R}{R}}=\frac{(w_P+w_R)\times{P}\times{R}}{w_P\times{R}+w_R\times{P}}=\frac{(\beta^2+1)\times{P}\times{R}}{\beta^2\times{R}+P}

这就是F1F_1的由来,作为一个综合了精确率与召回率两大指标的指标,F1F_1的使用颇为广泛。

五、ROC和AUC

ROC(Receiver Operating Characteristic)的全称是受试者工作特征,源于二战中用于敌机检测的雷达信号分析技术。

首先,分类模型的目标可以通俗地理解为:在尽可能少地将负例分类为正例的同时,尽可能多地将正例分类为正例。因此,我们可以观察假正率与真正率的变化趋势,来观察我们的模型是否能在较低的假正率下得到较高的真正率。这里的真正率和假正率,在混淆矩阵部分有提到,忘记的可以往上翻一下。

ROC曲线就是以假正率为横轴,以真正率为纵轴绘制的曲线,它表现了随着假正率的增长,我们是否能得到更大的真正率的增长。

绘制ROC曲线时,我们要先对预测样本做一个排序。如何排序呢?根据概率,根据我们的模型计算出来的每个样本属于正例的概率做一个逆序排列。比如说,我们的模型预测样本1属于正例的概率为99%,在所有样本里最高,那样本1就排在第一个;我们的模型预测样本2属于正例的概率为1%,在所有样本里最低,那样本2就排在最后一个。这样按照概率从大到小排序好之后,我们就得到了一个在模型预测中从“最正”到“最负”的样本列表。

接下来我们需要了解一个截断点的概念。由于我们输出了每个样本归属于正例的概率,这一概率是一个从0到1的数字,假如在概率大于0.5的时候,我们就讲样本归类到正例中去,那么0.5就是我们设置的截断点。ROC曲线就是根据在不同的截断点条件下得到的(假正率,真正率)数值对绘制而成的曲线。

我们依照概率大小,依次将每个样本预测为正例,由此来得到一系列的(假正率,真正率)数值对。

显而易见的是,当我们将所有样本都预测为反例时,这一数值对为(0,0);当我们将所有样本预测为正例时,这一数值对为(1,1):

  • 当模型的预测效率与随机预测一样——即随机为每个样本分配到正负例中,那ROC曲线就是一条从(0,0)到(1,1)的近似线段,表明每当我们将更多的1%的负例预测为正例,我们基本上也能将更多的1%的正例预测为正例;
  • 当我们的ROC曲线在对角线之上时,说明我们的模型预测效果比随机预测要好,也就是说,在我们预测为正例的概率最大的一批样本中,其正例的比例明显高于负例,因此真正率的增长明显快于假正率的增长;
  • 当我们的ROC曲线在对角线之下时,就说明跟我们的模型反着来预测可能会更好……
  • 假设我们的模型比较健康的话,ROC曲线的导数应该是逐渐降低的。假如中间某些地方真正率的增长速度反而高于开头,那可能说明我们的模型选择、特征选取或者参数配置出现了一些问题,导致某些明显正例概率更大的样本被我们的模型认为正例概率不够高。

快速理解分类模型评估指标

如上图,ROC曲线下方的面积就是AUC。一个模型的ROC曲线如果完全在另一个模型的ROC曲线上方,那说明这个模型明显好于另一个模型。但是在实际的预测过程中,我们会经常遇到不同模型的ROC曲线相交叉的情况,很难界定到底哪个模型更好,这时我们就需要通过AUC来进行判断了。

AUC的现实意义是给定一个正例A,一个负例B,在我们的模型中给出A属于正例的概率大于B属于正例的概率的概率。也就是说我们的模型认为A比B更像正例的概率。因此AUC的值越大,就说明了模型预测效果越好。

由于真正的ROC曲线是一个个阶梯状的线段组成的(因为每当新增一个样本预测为正例,要么它的确是正例,那就向上增加真正率而假正率不变;要么它是反例,那就向右增加假正率而真正率不变),因此其面积计算很简单,就是每个阶梯下方的矩形面积之和。事实上,ROC和AUC的绘制与计算我们几乎不会通过手动的方式完成(否则只需要几十个样本就足以让我们焦头烂额),我们可以使用计算机方便地完成这些任务。不过下边还是贴一下AUC的计算公式:

AUC=12i=1m1(xi+1xi)(yi+yi+1)AUC=\frac{1}{2}\sum\limits_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1})