【分类问题中模型的性能度量(二)】超强整理,超详细解析,一文彻底搞懂ROC、AUC

1.背景

很多学习器是为测试样本产生一个实值或概率预测(比如比较简单的逻辑回归分类器),然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类。这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力。我们可以根据这个实值或概率预测结果,将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个 “截断点”(cut point)将样本分类两部分,前一部分判作正例,后一部分则判作反例。

在不同的应用任务中,我们可以根据任务需求来采用不同的截断点,例如:

  • 更重视“查准率”,则可选择排序中靠前的位置进行截断
  • 更重视“查全率”,则可选择排序中靠后的位置进行截断

因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏。ROC曲线就是从这个角度出发来研究学习器泛化性能的有力工具。

注:混淆矩阵、查准率、查全率等概念参见上一篇文章:分类问题中模型的性能度量(一)

2.ROC曲线

2.1 ROC名称溯源(选看)

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

具体来说,据说在二战期间,军队中雷达兵的任务是通过观察显示屏的雷达信号来判断是不是有敌人来了,在以下两种情况下显示屏上会有雷达信号:

  • 有敌机来袭(真实情况下的正例)
  • 有飞鸟(真实情况下的负例)

这个时候不同的雷达兵就可能会报出不同的结果:

  • 假如这个雷达兵比较谨慎,只要有信号就报告有敌情(可以看作更重视“查全率”),就会增加误报的风险;
  • 假如这个雷达兵比较大胆,只要有信号就认为是鸟(可以看作更重视“查准率”),就会增加漏报的风险。

这样就有了我们针对这个问题的“混淆矩阵”
在这里插入图片描述
理想情况下,希望每个雷达兵能够好好研究飞机和飞鸟信号的区别,进行准确的判断。但是现实问题是,每个雷达兵的判断标准不一,谨慎的容易出现误报,胆大的容易出现漏报。

针对以上问题,雷达兵的上级管理者汇总了每个雷达兵的汇报特点,尤其是他们的漏报和误报的概率,并将这些概率基于二维坐标系绘制成一个图形:

  • 纵坐标为敏感性(真阳性率):表示在所有敌人来袭(即真实情况为正例,TP+FN)的事件中,每个雷达兵准确预报(即TP)的概率;
  • 横坐标为1-特异性(假阳性率):表示在所有飞鸟信号(即真实情况为反例,TN+FP)中,每个雷达兵预报错误(即FP)的概率;

每个雷达兵的预报标准不同,所以得到的敏感性和特异性的组合也不同。一个雷达兵的敏感性和特异性的组合正好在一条曲线上,这条曲线就是ROC曲线。

到这里就不难理解ROC曲线为什么叫做“受试者工作特征”曲线了,在这里受试者就是指雷达兵,绘制这个曲线的目的就是观察雷达兵的工作特征,所以叫做受试者工作特征曲线。

在机器学习中,受试者就是我们的学习器了,绘制曲线的目的就是观察学习器的工作性能。

2.2 ROC曲线的绘制

分类问题中模型的性能度量(一)中介绍的P-R曲线类似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值:

  • 真正例率(True Positive Rate,TPR),也称为灵敏度(Sensitivity),
    T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
  • 假正例率(False Positive Rate,FPR),也称为1-特异度(Specificity),
    F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP
    注:特异度= T N F P + T N \frac{TN}{FP+TN} FP+TNTN

结合二分类问题的混淆矩阵我们知道,TP+FN其实就是所有真实情况为正的样本数,FP+TN其实就是所有真实情况为反的样本数,那么我们令P=TP+FN,N=FP+TN,就可以得到简化版的公式(便于理解):

  • T P R = T P P TPR=\frac{TP}{P} TPR=PTP,这时很容易看出,真正例率其实就是在所有真实情况下为正的样例中,预测为正的样本所占比例;
  • F P R = F P N FPR=\frac{FP}{N} FPR=NFP,假正例率其实就是在所有真实情况下为反的样例中,预测为正的样本所占比例;

以FPR作为横轴、TPR作为纵轴作图,就得到了“ROC曲线”,显示ROC曲线的图叫做“ROC图”,如下所示:
在这里插入图片描述
对ROC图的几点解释:

  • 图(a)中的对角线(图中虚线),对应于“随机猜测”模型;
  • ROC曲线越靠近左上角,性能越好;
  • 点(0,1)(左上角),对应于将所有正例排在所有反例之前的“理想模型”(左上角对应的点为(0,1),也就是FPR=0,TPR=1,结合上面的公式,可以得到这时FP=0,FN=0,模型对所有的样本分类都正确,也就是将真实为正的预测为正,真实为反的预测为反,没有假正、假反。)
  • ROC曲线与P-R曲线不一样的地方在于,当正反样例分布发生剧烈变化的时候:ROC曲线的形状基本能够保持不变;P-R曲线的形状一般会发生剧烈变化。

现实任务中,通常是利用有限个测试样例来绘制ROC图,此时仅能获得有限个(FPR,TPR)坐标对,无法产生图(a)中光滑的ROC曲线,只能绘制出图(b)所示的近似ROC曲线。绘制过程如下:

  • 1.给定 m + m^+ m+个正例和 m − m^- m个反例,根据学习器预测结果对样例进行排序
  • 2.设置不同的分类阈值:
    2.1 把分类阈值设为最大,即把所有样例均预测为反例,此时TPR=FPR=0。在坐标(0,0)处标记一个点。
    2.2 将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为 ( x , y ) (x,y) (x,y)
    当前若为真正例(TP),则对应标记点的坐标为 ( x , y + 1 m + ) (x,y+\frac{1}{m^+}) (x,y+m+1)
    当前若为假正例(FP),则对应标记点的坐标为 ( x + 1 m − , y ) (x+\frac{1}{m^-},y) (x+m1,y)
  • 3.最后用线段连接相邻点即得ROC曲线

3.AUC(Area Under ROC Curve)

3.1 AUC来历

进行学习器比较时,与P-R图类似:

  • 若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者;
  • 若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者哪个更优。此时如果一定要进行比较,则较为合理的判据是:比较ROC曲线下的面积,即AUC(Area Under ROC Curve)。

3.2 AUC几何意义

从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。

假定ROC曲线是由坐标 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} {(x1,y1),(x2,y2),...,(xm,ym)}的点按序连接而成 ( x 1 = 0 , x m = 1 ) (x_1=0,x_m=1) (x1=0,xm=1),参见上面图(b),则AUC可估算为:
A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ∗ ( y i + y i + 1 ) AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)*(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1)

3.3 AUC计算

形式化地看,AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。给定 m + m^+ m+个正例和 m − m^- m个反例,令 D + D^+ D+ D − D^- D分别表示正、反例集合,则排序“损失”(loss)定义为:
l r a n k = 1 m + ∗ m − ∑ x + ∈ D + ∑ x − ∈ D − ( Ⅱ ( f ( x + ) &lt; f ( x − ) ) + 1 2 Ⅱ ( f ( x + ) = f ( x − ) ) ) l_{rank}=\frac{1}{m^+*m^-}\sum_{x^+\in D^+}\sum_{x^- \in D^-}\left(Ⅱ(f(x^+)&lt;f(x^-))+\frac{1}{2}Ⅱ(f(x^+)=f(x^-))\right) lrank=m+m1x+D+xD((f(x+)<f(x))+21(f(x+)=f(x))),其中Ⅱ()为指示函数,在为正和假时分别取值为1,0。

即考虑每一对正、反例,

  • 若正例的预测值小于反例(即真实情况为正例的样本,被预测为正例的概率,小于,真实情况为负例的样本,被预测为正例的概率),则记1个“罚分”;
  • 若正例的预测值与反例相等,则记0.5个“罚分”。

容易看出, l r a n k l_{rank} lrank对应的是ROC曲线之上的面积:若一个正例在ROC曲线上对应标记点的坐标为(x,y),则x恰是排序在其之前的反例所占的比例,即假正例率。因此有AUC计算公式
A U C = 1 − l r a n k AUC=1-l_{rank} AUC=1lrank

3.4 理解AUC的意义

通过AUC的定义我们知道了AUC是什么,怎么算,但是它的意义是什么呢。

3.4.1 从Mann-Whitney U test角度理解

实际上AUC和Mann-Whitney U test有密切的联系。从Mann-Whitney U test的角度来理解AUC:

  • 1.从所有正例(即 m + m^+ m+)中随机选取一个样本,从所有反例(即 m − m^- m)中随机选取一个样本;
  • 2.然后根据我们的学习器对两个随机样本进行预测,把正例预测为正的概率为p1,把反例预测为正的概率为p2;
  • 3.p1>p2的概率就等于AUC

3.4.2 从AUC计算公式角度理解

A U C = 1 − l r a n k AUC=1-l_{rank} AUC=1lrank

l r a n k l_{rank} lrank表示:任取一对正反例(真实情况),把(真实情况下的)正例预测为正的概率 ≤ \leq 把(真实情况下的)反例预测为正的概率,的概率。

那么AUC,即 1 − l r a n k 1-l_{rank} 1lrank就相应地表示:任取一对正反例(真实情况),把(真实情况下的)正例预测为正的概率 &gt; &gt; >把(真实情况下的)反例预测为真的概率,的概率。

3.4.3 一句话介绍AUC

从上面两个角度总结来看,对AUC比较全面的总结:

  • AUC就是,从测试集中随机(即任取)选定一个正例、一个反例,分类器输出该正例为正的那个概率值,比,分类器输出该反例为正的那个概率值,要大,的可能性。

还有一句更加简洁的总结:

  • 从测试集中任取一个正例、一个反例,经分类器输出,正例得分大于负例得分的概率。(对于得分的理解,见逻辑回归模型中1.1.2 对假设函数输出的解释)

3.5 为什么用AUC

AUC的优势:AUC的计算方法同时考虑了分类器对于正例和反例的分类能力,在样本不均衡的情况下,依然能够对分类器作出合理的评价。(即AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。)

例如:在反欺诈场景,设非欺诈类样本为正例,反例占比很少(假设为0.1%):

  • 如果使用准确率评估,把所有样本预测为正,便可以获得99.9%的准确率;
  • 但是如果使用AUC,把所有样本预测为正例,TPR=FPR=1,AUC仅为0.5,成功规避了样本不均衡带来的问题。

3.6 AUC的一般判断标准

  • = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
  • 0.5 - 0.7:效果较低,但用于预测股票已经很不错了
  • 0.7 - 0.85:效果一般
  • 0.85 - 0.95:效果很好,需要选定合适阈值
  • 0.95 - 1:效果非常好,但一般不太可能

参考:
1.《机器学习》2.3,周志华
2.BAT面试官最喜欢问的问题之一:ROC曲线
3.如何理解机器学习和统计中的AUC(重点前5个回答)
4.对AUC计算公式和几何意义的理解

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用 `multiclass_roc_auc_score()` 函数计算多类分类问题ROC AUC 分数,您需要进行以下步骤: 1. 导入 `multiclass_roc_auc_score()` 函数: ```python from sklearn.metrics import multiclass_roc_auc_score ``` 2. 将真实标签 `y_test` 和预测得分 `y_score` 作为参数传递给 `multiclass_roc_auc_score()` 函数,并指定 `average` 参数。`average` 参数指定了多类分类问题ROC AUC 分数如何计算。可以设置为以下值之一: - `'macro'`:对所有类别的 ROC 曲线分数进行平均,每个类别的权重相等。 - `'weighted'`:对所有类别的 ROC 曲线分数进行加权平均,每个类别的权重由其样本数占比决定。 - `None`:返回每个类别的 ROC 曲线分数。 例如,计算用于多类分类问题的加权平均 ROC AUC 分数的代码如下: ```python roc_auc = multiclass_roc_auc_score(y_test, y_score, average='weighted') ``` 3. `multiclass_roc_auc_score()` 函数会返回多类分类问题ROC AUC 分数。您可以将其打印到控制台或将其用于后续分析。 完整的代码示例如下: ```python from sklearn.metrics import multiclass_roc_auc_score # 计算多类分类问题ROC AUC 分数 roc_auc = multiclass_roc_auc_score(y_test, y_score, average='weighted') # 打印 ROC AUC 分数 print('ROC AUC score:', roc_auc) ``` 请注意,`multiclass_roc_auc_score()` 函数仅适用于多类分类问题。如果您的问题分类问题,请使用 `roc_auc_score()` 函数来计算 ROC AUC 分数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值