首发于学习笔记
分类评价指标

分类评价指标

此系列文章为笔者学习工作中的阶段性总结,难免有纰漏,如有不正之处,欢迎指正,大家共同成长。

分类(Classification)是机器学习中需要解决的主要问题之一,分类任务有诸多评价指标,在诸多的评估指标中, 大部分指标只能片面地反映模型的一部分性能。 如果不能合理地运用评估指标, 不仅不能发现模型本身的问题, 而且会得出错误的结论。

下面我们从基本概念入手,探讨如何根据实际场景选择合适的评价指标。便于理解,以下讨论主要基于二分类任务,多分类同样适用。

基本概念

混淆矩阵

首先了解下混淆矩阵。我们做二分类算法会输出预测值,当然预测值有对有错,对应着真实值。那么基于预测值和真实值两个属性我们可以组合四种状态,如下图所示。

其中:

预测值为正(Positive),并且真实值也为正(Positive),预测为真(True),True Positive (TP)。

预测值为负(Negative),但是真实值为正(Positive),预测失败(False),False Negative (FN)。

预测值为正(Positive),但是真实值为负(Negative),预测失败(False),False Positive (FP)。

预测值为负(Negative),并且真实值也为负(Negative),预测为真(True),True Negative (TN)。

在具体分类任务中,模型会对一批数据(测试或验证集数据)进行推理,并统计推理结果的TP、FN、FP、TN的数量。

准确率(Accuracy)

Accuracy=\frac{n_{correct}}{n_{total}}=\frac{TP+TN}{TP+FN+FP+TN}

准确率是指分类正确的样本占总样本个数的比例。准确率是针对所有样本的统计量。

准确率是分类问题中最简单也是最直观的评价指标, 但存在明显的缺陷。 比如, 当负样本占99%时, 分类器把所有样本都预测为负样本也可以获得99%的准确率。 所以, 当不同类别的样本比例非常不均衡时, 占比大的类别往往成为影响准确率的最主要因素。

精确率(Precision)

Precision=\frac{TP}{TP+FP}

精确率是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。精确率是对部分样本的统计量,侧重对分类器判定为正类的数据的统计。

召回率(Recall)

Recall=\frac{TP}{TP+FN}

召回率是指分类正确的正样本个数占真正的正样本个数的比例。召回率也是对部分样本的统计量,侧重对真实的正类样本的统计。

F1 score

通过下图再来强化下Precision和Recall的直观理解。


从上文我们可以看到,Precision值和Recall值是既矛盾又统一的两个指标, 为了提高Precision值, 分类器需要尽量在“更有把握”时才把样本预测为正样本, 但此时往往会因为过于保守而漏掉很多“没有把握”的正样本, 导致Recall值降低。

那么当不同模型的Recall和Precision各有优势时该如何选择模型?此时可以通过F1 score来比较。F1 score是精准率和召回率的调和平均值, 它定义为:

F1=\frac{2*Precision*Recall}{Precision+Recall}

在现实场景,如果你的两个模型,一个precision特别高,recall特别低,另一个recall特别高,precision特别低的时候,f1-score可能是差不多的,可能不能通过一个f1 socre做出最终判断,此时就需要根据不同场景选择其他合适的指标做出评判。

PR曲线

我们知道,分类模型的最后输出往往是一个概率值,我们一般需要把概率值转换为具体的类别,对于二分类来说,我们设置一个阈值(threshold),然后大于此阈值判定为正类,反之负类。

以上评价指标(Accuracy、Precision、Recall)都是针对某个特定阈值来说的,那么当不同模型取不同阈值时,如何全面的评价不同模型?以下介绍PR曲线,即Precision-Recall曲线。

P-R曲线的横轴是召回率, 纵轴是精确率。 对于一个模型来说, 其P-R曲线上的一个点代表着, 在某一阈值下, 模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本, 此时返回结果对应一对儿召回率和精确率,作为PR坐标系上的一个坐标。 整条P-R曲线是通过将阈值从高到低移动而生成的。

上图代表两个模型的P-R曲线,很明显,P-R曲线越靠近右上角(1,1)代表模型越好。在现实场景,需要根据不同决策要求综合判断不同模型的好坏(以下章节具体讨论)。

为什么P-R曲线没有AUC?答:AP: PR曲线下面积

ROC曲线

另一个全面评估模型的指标叫ROC曲线,ROC曲线是Receiver Operating Characteristic Curve的简称, 中文名为“受试者工作特征曲线”。 ROC曲线源于军事领域, 而后在医学领域应用甚广, “受试者工作特征曲线”这一名称也正是来自于医学领域。 ROC曲线的横坐标为假阳性率( False Positive Rate, FPR) ; 纵坐标为真阳性率( True Positive Rate, TPR) 。 FPR和TPR的计算方法分别为:

FPR=\frac{FP}{FP+TN}\\ TPR=\frac{TP}{TP+FN}

可以看到,FPR代表错误判断的正类占所有负类的比例,医学上等价于误诊率。TPR等价于Reacll。

同样的,ROC曲线也是通过不同阈值下的FPR和TPR坐标所得到的。具体来说,通过动态地调整模型概率值(概率值的意思是模型多大概率判定为正类), 从最高的值开始( 比如1, 对应着ROC曲线的零点) , 逐渐调整到最低概率值, 每一个概率值都会对应一个FPR和TPR, 在ROC图上绘制出每个概率值对应的位置, 再连接所有点就得到最终的ROC曲线。

AUC

AUC (Area Under Curve 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

AUC的计算有两种方式,梯形法和ROC AUCH法,都是以逼近法求近似值,具体见wikipedia

从AUC判断分类器(预测模型)优劣的标准:

  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

三种AUC值示例:

简单说:AUC值越大的分类器,正确率越高

注:TPR、FPR、Precision、Recall的定义来对比,TPR、Recall的分母为样本中正类的个数,FPR的分母为样本中负类的个数,样本一旦确定分母即为定值,因此三个指标的变化随分子增加单调递增。但是Precision的分母为预测为正类的个数,会随着阈值的变化而变化,因此Precision的变化受TP和FP的综合影响,不单调,变化情况不可预测。

实际使用

对于ROC,一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting(比如图中0.2到0.4可能就有问题,但是样本太少了),这个时候调模型可以只看AUC,面积越大一般认为模型越好。

对于PRC, precision recall curve。和ROC一样,先看平滑不平滑(蓝线明显好些),再看谁上谁下(同一测试集上),一般来说,上面的比下面的好(绿线比红线好)。F1(计算公式略)当P和R接近就也越大,一般会画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好象AUC对于ROC一样。一个数字比一条线更方便调模型。


sklearn库实现

通过sklearn库可以轻松的实现各个分类性能度量。

  • accuracy_score函数用于计算分类结果的准确率,其原型为:
sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
  • precision_score函数用于计算分类结果的查准率,其原型为:
sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1, 
average='binary', sample_weight=None)
  • recall_score函数用于计算分类结果的查全率,其原型为:
sklearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1, 
average='binary', sample_weight=None)
  • f1_score函数用于计算分类结果的值,其原型为:
sklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, 
average='binary', sample_weight=None)
  • confusion_matrix函数给出了分类结果的混淆矩阵。其原型为:
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None)
  • precision_recall_curve函数用于计算分类结果的P-R曲线。其原型为:
sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_label=None,
sample_weight=None)
  • roc_curve函数用于计算分类结果的ROC曲线。其原型为:
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None,
drop_intermediate=True)
  • roc_auc_score函数用于计算分类结果的ROC曲线的面积AUC。其原型为:
sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None)


总结

  • 对于分类模型,AUC、ROC曲线(FPR和TPR的点连成的线)、PR曲线(准确率和召回率的点连成的线)是综合评价模型区分能力和排序能力的指标,而精确率、召回率和F1值是在确定阈值之后计算得到的指标。
  • 对于同一模型,PRC和ROC曲线都可以说明一定的问题,而且二者有一定的相关性,如果想评测模型效果,也可以把两条曲线都画出来综合评价。
  • 对于有监督的二分类问题,在正负样本都足够的情况下,可以直接用ROC曲线、AUC评价模型效果;而在样本极不均衡的情况下,PR曲线更能反应模型效果。
  • 在确定阈值过程中,可以根据Precision、Recall或者F1来评价模型的分类效果。对于多分类问题,可以对每一类分别计算Precision、Recall和F1,综合作为模型评价指标。
  • 当然,评价模型的指标不止以上几种,同时对于不同的应用场景及业务要求会有不同的侧重,根本上需要根据建模目的进行具体分析。
本文参考了较多hulu书[1]和知乎相关问题[4]内容,与其说行文不如说整理,如果侵权请联系。

参考

[1] 百面机器学习(hulu书)

[2] 模型评估 huaxiaozhuan.com/%E5%B7

[3] 为什么ROC曲线不受样本不均衡问题的影响 blog.csdn.net/taoqick/a

[4] 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率 jianshu.com/p/c61ae11cc

[5] 精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么? zhihu.com/question/3064

[6] 深入介紹及比較ROC曲線及PR曲線 medium.com/nlp-tsupei/r

编辑于 2021-05-17 11:30