模型评测指标

什么是微平均和宏平均?

很多时候,我们在计算指标时会发现有多种可能的方法。比如最简单的计算多类分类的准确率。

一种计算方法所有类别的一次性都考虑进来,计算类别预测的准确率。(微平均

另外还有一种是对每个类别分开考虑,计算单独每个类别的准确率,最后再进行算术平均得到该测试集的准确率。(宏平均

后面会有例子介绍微平均、宏平均怎么计算。


相关指标。

  • 准确率
  • 精确率
  • 召回率
  • F1-score
  • P-R曲线
  • ROC、AUC


二分类的混淆矩阵:

P:正类,N:负类

TP:P表示预测为正类;同时实际也是正类,这是正确的,所以是True,组合为TP

FN:N表示预测为负类;同时实际是正类,这是错误的,所以是False,组合为FN

FP:P表示预测为正类,同时实际是负类,这是错误的,所以False,组合为FP

TN:N表示预测为负类,同时实际是负类,这是正确的,所以True,组合为TN


下面的4个各种率比较难记,分子是原封不动照抄,比如TPR,分子就是TP。主要的是分母怎么确定,我的方式是先确定当前分类属于实际标签的哪一类,比如TPR,实际是正类,所以分母是正类的所有数据TP+FN(标注的P)。 比如TNR,实际是负类,所以分母是负类的所有数据TN + FP(标注的N)。

TPR(True Positive Rate)可以理解为所有正类中,有多少被预测成正类(正类预测正确),即召回率,给出定义如下:

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


FPR(False Positive Rate)可以理解为所有反类中,有多少被预测成正类(正类预测错误),给出定义如下:

FPR = \frac{FP}{FP+TN}


TNR(True Negative Rate)可以理解为所有反类中,有多少被预测成反类(反类预测正确),给出定义如下:

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


FNR(False Negative Rate)可以理解为所有正类中,有多少被预测成反类(反类预测错误),给出定义如下:

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




准确率:分类正确的样本占总样本个数的比例

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

n_{correct} 为被正确分类的样本个数, n_{total} 为总样本的个数

准确率的缺陷:若正负样本比例不均衡,倘若负样本占99%,分类器把所有样本预测为负样本,acc为99%,占比大的类别往往成为影响准确率的最主要因素。


精确率(查准率)

衡量正样本的分类准确率,在模型预测为正样本(分母)中,有多少是真的正样本(分子)

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


召回率(查全率):

在实际所有真的样本中(分母),有多少被模型预测出来了(分子)

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


精确率和召回率往往都是矛盾的,因此出现了F1

F1 score是精准率和召回率的调和平均值

F1 = \frac{2 * precision * recall }{precision+ recall}


sklearn里有个宏平均和微平均的概念,呼应开头的宏平均和微平均:

宏平均(Macro-averaging),是先对每一个类统计指标值,然后在对所有类求算术平均值。
微平均(Micro-averaging),是对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标。

举个例子:

假设有5分类的10个样本,5分类的label为0、1、2、3、4。y_pred为预测值,y_true为实际值,矩阵为每个类别的P、R、F1

举个栗子

微平均计算:

P=\frac{\sum_{i=1}^{10}{TP_{i}}}{\sum_{i=1}^{10}{TP_{i}} + \sum_{i=1}^{10}{FP_{i}}}

针对精确率,遍历每个例子,比如index=0 ,即(y_pred=0,y_true=0 ),下面仅仅写index了,预测是0,实际也是0,TP 加 1;index=1, 预测是1,实际也是1,TP加1;index=2,预测是3,实际是2,FP加1;遍历完后,TP=4,FP=6,P = 4/(4+6) = 0.4

直观理解是:预测的10个样本中,精准预测的有4个,精确率就是4/10=0.4


R=\frac{\sum_{i=1}^{10}{TP_{i}}}{\sum_{i=1}^{10}{TP_{i}} + \sum_{i=1}^{10}{FN_{i}}}

针对召回率,遍历每个例子,比如index=0 ,即(y_pred=0,y_true=0 ),下面仅仅写index了,预测是0,实际也是0,TP 加 1;index=1, 预测是1,实际也是1,TP加1;index=2,预测是3,实际是2,FN加1;遍历完后,TP=4,FN=6,R = 4/(4+6) = 0.4

直观理解是:原本要召回的10个样本中,实际召回了4个,召回率就是4/10=0.4


介绍下宏平均下相关P、R、F1怎么算。

label=0的P,模型预测为0的样本有index=0,4这2对,即(y_pred=0,y_true=0 和 y_pred=0,y_true=3)。 在这2对中,仅index=0属于TP,因此P=TP / (TP + FP) = 1/2=0.5

label=2的P,模型预测为2的样本有index=3,5,6,9。 在这4对中,仅index=3属于TP,P=TP / (TP + FP) = 1/4 = 0.25

分别计算label=0、1、2、3、4的P,求其平均值即为整个模型的P。

P = \frac{0.5 + 0.5 + 0.25 + 0.5 + 0 }{5}= 0.35

复制上图,貌似看不到

label=3的R,实际标注为3的有index=4,7,8。在这3对中,仅仅8被模型预测召回 。

R = \frac{TP}{TP+FN} = \frac{1}{3}

分别计算label=0、1、2、3、4的R、F1,求其平均值即为整个模型的R、F1。


P-R曲线

横轴是召回率, 纵轴是精确率。对于一个排序模型来说, 其P-R曲线上的一个点代表着, 在某一阈值下, 模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本, 此时返回结果对应的召回率和精确率。

下图实线代表模型A的P-R曲线, 虚线代表模型B的P-R曲线。 原点附近代表当阈值最大时模型的精确率和召回率。

P-R曲线

由图可见, 当召回率接近于0时, 模型A的精确率为0.9, 模型B的精确率是1,这说明模型B得分前几位的样本全部是真正的正样本, 而模型A即使得分最高的几个样本也存在预测错误的情况。 并且, 随着召回率的增加, 精确率整体呈下降趋势。 但是, 当召回率为1时, 模型A的精确率反而超过了模型B。 这充分说明, 只用某个点对应的精确率和召回率是不能全面地衡量模型的性能, 只有通过P-R曲线的整体表现, 才能够对模型进行更为全面的评估。


ROC(Receiver Operating Characteristic Curve, 受试者工作特征曲线)

横坐标为假阳性率(False Positive Rate, FPR) ; 纵坐标为真阳性率(True Positive Rate, TPR)

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

P是真实的正样本的数量, N是真实的负样本的数量。


举个医院诊断病人的栗子:

  • 有10位疑似癌症患者,有3位很不幸确实患了癌症(P=3),另外7位不是癌症患者(N=7)
  • 对这10位疑似患者做了诊断, 诊断出3位癌症患者,
    • 其中有2位确实是真正的患者(TP=2),真阳性率 TPR=\frac{TP}{P} = \frac{2}{3}
    • 有一位很不幸被误诊为癌症患者(FP=1) , 那么假阳性率 FPR=\frac{FP}{N}=\frac{1}{7}
  • 对于“该医院”这个分类器来说, 这组分类结果就对应ROC曲线上的一个点 (\frac{1}{7}, \frac{2}{3})


如何绘制ROC曲线?

事实上, ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的, 通过下面的例子进一步来解释“截断点”的概念。


在二分类中,假设测试集有20个样本,下表是模型的输出结果。样本按照预测概率从高到低排序。在输出最终的正例负例之前,我们需要指定一个阈值,比如一个样本的预测概率为0.8,如果阈值设为0.7(大于等于0.7的是正例,小于0.7的是负例),则该样本是正例,若阈值设为0.9(大于等于0.9的都是正例,小于0.9的是负例),则该样本是负例。上面所说的“截断点”指的就是区分正负预测结果的阈值。

通过动态调整这个截断点,从最高的得分开始,逐渐调整到最低得分,每一个截断点都会对应一个FPR和TPR, 在ROC图上绘制出每个截断点对应的位置, 再连接所有点就得到最终的ROC曲线。

样本数据
  • 就本例来说, 当截断点选择为正无穷时, 模型把全部样本预测为负例, 那么FP和TP必然都为0, FPR和TPR也都为0, 因此曲线的第一个点的坐标就是 (0,0)
  • 当把截断点调整为0.9时, 模型预测1号样本为正样本, 并且该样本确实是正样本, 因此, TP=1, 20个样本中, 所有正例数量为P=10,故TPR=TP/P=1/10; 这里没有预测错的正样本, 即FP=0, 负样本总数N=10,故FPR=FP/N=0/10=0, 对应ROC曲线上的点 (0,0.1)
  • 依次调整截断点, 直到画出全部的关键点, 再连接关键点即得到最终的ROC曲线,如图所示。
ROC

其实, 还有一种更直观地绘制ROC曲线的方法。 首先, 根据样本标签统计出正负样本的数量, 假设正样本数量为P, 负样本数量为N; 接下来, 把横轴的刻度间隔设置为1/N, 纵轴的刻度间隔设置为1/P; 再根据模型输出的预测概率对样本进行排序(从高到低) ; 依次遍历样本, 同时从零点开始绘制ROC曲线, 每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线, 每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线, 直到遍历完所有样本, 曲线最终停在(1,1) 这个点, 整个ROC曲线绘制完成。


如何计算AUC:

AUC指的是ROC曲线下的面积大小, 该值能够量化地反映基于ROC曲线衡量出的模型性能。 计算AUC值只需要沿着ROC横轴做积分就可以了。AUC的取值一般在0.5~1之间。 AUC越大, 说明分类器越可能把真正的正样本排在前面, 分类性能越好。


ROC曲线相比P-R曲线有什么特点?

相比P-R曲线, ROC曲线有一个特点, 当正负样本的分布发生变化时, ROC曲线的形状能够基本保持不变, 而P-R曲线的形状一般会发生较剧烈的变化。

举例来说, 图2.3是ROC曲线和P-R曲线的对比图, 其中图 2.3(a) 和图2.3(c) 是ROC曲线, 图2.3(b) 和图2.3(d) 是P-R曲线, 图2.3(c) 和图 2.3(d) 则是将测试集中的负样本数量增加10倍后的曲线图。

ROC曲线和P-R曲线的对比

可以看出, P-R曲线发生了明显的变化, 而ROC曲线形状基本不变。 这个特点让ROC曲线能够尽量降低不同测试集带来的干扰, 更加客观地衡量模型本身的性能。

这有什么实际意义呢? 在很多实际问题中, 正负样本数量往往很不均衡。 比如, 计算广告领域经常涉及转化率模型, 正样本的数量往往是负样本数量的1/1000甚至1/10000。 若选择不同的测试集, P-R曲线的变化就会非常大, 而ROC曲线则能够更加稳定地反映模型本身的好坏。 所以, ROC曲线的适用场景更多, 被广泛用于排序、 推荐、 广告等领域。


补充:

当我们要预测某个任务时,可能会有很多种方法,比如A、B这2个模型,如何评估这2个模型呢?

针对A模型,假设0.5的阈值下,哪些是正类,哪些是负类都可以计算其结果,因此就能算该模型在0.5阈值下的准确率、精确率、召回率、TPR、FPR、TNR、FNR,进而能计算P-R、ROC上的某个点。调整A模型的阈值,就会产生上述很多值,将各个阈值的(精确率-召回率)点绘制到图上就是A模型的P-R曲线,将各个阈值下的(TPR,FPR)点绘制到图上就是A模型的ROC曲线。将A模型和B模型整体比较,最后我们线上运行服务的模型只是较好的模型曲线上的一个点,即某个模型下 某个阈值的指标满足我们的业务。

编辑于 2019-08-19 20:28