AIQ -【干货】模型验证的常用“武器”—ROC 和 AUC



转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com

AIQ 机器学习大数据 知乎专栏 点击关注

每次做完二值分类模型(eg: Logistic Regression, Decision Tree, Neural Network etc.),我们经常会面对一连串的模型验证指标,最常用的有 ROC&AUC、Gini、PS、K-S 等等。那我们不禁会问:

1. 这个指标怎么定义?

2. 怎么实现指标计算?

3. 为什么用这个指标?

4. 怎么用它评价模型?

       事实上,如果不明白这些评估指标的背后的直觉,就很可能陷入一种机械的解释中,不敢多说一句,就怕哪里说错。在这里就通过这篇文章,针对上述 4 个问题,介绍一下 ROC&AUC。

问题 1: ROC&AUC 的定义分别是什么?

      ROC 曲线全称为受试者工作特征曲线 (receiver operating characteristic curve),它是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(敏感性)为纵坐标,假阳性率(1- 特异性)为横坐标绘制的曲线

AUC (Area Under Curve)被定义为 ROC 曲线下的面积。我们往往使用 AUC 值作为模型的评价标准是因为很多时候 ROC 曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应 AUC 更大的分类器效果更好。

** 注意:ROC 是一条曲线是一条曲线啊,并不是一个值啊!真正通过计量手段比较模型功效的是 AUC!!**


问题 2: AUC 是如何计算得到的?

      既然我们已经了解到 AUC 其实就是 ROC 曲线下的面积,那我们首先要理解 ROC 曲线从何而来,这其中必定蕴含了 ROC&AUC 蕴含的价值。

       作为理解 ROC 曲线的铺垫,我们还要先了解一下混淆矩阵(Confusion Matrix)。显然,一个完美的二分类模型就是,如果一个客户实际上属于类别 good,也预测成 good(True Positive 类),处于类别 bad,也就预测成 bad(True Negative 类),也就是完全预测准确。但从实际模型情况来看,往往会有一些实际上是 good 的客户,经过我们的模型,被预测为 bad(False Negative 类),对一些 bad 的客户,却预测他为 good(False Positive 类)。事实上,我们需要知道所建的模型到底预测对了多少,预测错了多少,然而混淆矩阵就把所有这些信息,都归到这样一个表里。

_
_


        实际数据中,客户只有 good/bad 两种可能,模型预测结果同样也只有这两种可能,可能匹配可能不匹配。匹配的好说,Negative 预测为 Negative,或者 Positive 预测为 Positive,这就是 True Negative(其中 Negative 是指预测成 Negative)和 True Positive(其中 Positive 是指预测成 Positive)的情况。

       同样,犯错也只有两种情况。实际是 Positive,预测成 Negative ,这就是 False Negative;实际是 Negative,预测成 Positive,这就是 False Positive;

明白这些概念后,不难理解以下几组常用的评估指标:

(事实上 ROC 曲线只用到其中的 3 和 4)

1. 准确率 accuracy: 针对整个预测情况。预测正确的 / 总实例数 = (TP+TN)/(P+N)

2. 误分类率 error rate: 针对整个情况。预测错误的 / 总实例数 = (FP+FN)/(P+N)

3. 召回率 recall/ 敏感性 sensitivity: 针对 good 的正确覆盖了。预测对的 good 实例 / 实际 good 的实例 = TP/P

4. 特异性 specificity: 针对 bad 的预测正确率。预测对的 bad 实例 / 实际的 bad 实例数 = FP/N

5. 命中率 precision: 针对 good 的预测正确率。预测对的 good 实例 / 预测的 good 实例数 = TP/(TP+FP)

6. Type I error: False Discovery Rate(FDR, false alarm) = 1- precision

7. Type II error: miss rate = 1- sensitivity

      理解了混淆矩阵后,ROC 曲线就不难理解了。事实上,ROC 曲线就是不同的阈值下,敏感性(Sensitivity)和 1- 特异性(Specificity)的关系曲线。其中 ROC 曲线的横轴为(1- 特异性),即 1- 预测对的 bad 实例 / 实际的 bad 实例数;纵轴为敏感性,即预测对的 good 实例 / 实际 good 的实例,易知 ROC 曲线的横轴纵轴的值域均为 [0,1]。

     

下面我们从 ROC 曲线横轴值从 0 到 1 取三个点进行展示,以计算对应的纵轴值:

1. 1- 特异性 =0


     1- 特异性 =0 意味着 预测对的 bad 实例 / 实际的 bad 实例数 =1,也就是说所有 bad 都被预测为 bad,如上图所示。此时,对应的纵轴值敏感性 =TP/P=0.45。因此对应 ROC 曲线上的点(0,0.45)。

2. 0<1- 特异性 <1

      随着横轴值从 0 到 1 的增加,通过上图可以表达为分割线的左移,如下图。


      可以看到,随着分割线的左移,也就是特异性逐渐减小,敏感性则逐渐增加。此时 1- 特异性 =0.2,对应的敏感性 =0.85。因此对应 ROC 曲线上的点(0.2,0.85)。

3. 1- 特异性—>1

   随着分界线的继续左移,达到样本分数最小值时,所有样本都被预测为 good,此时 1- 特异性 =0.98,对应的纵轴值敏感性 =,1。对应 ROC 曲线上的点(0.98,1)。

      好了,每个点都能画了,那 ROC 曲线也就不在话下了,AUC 的计算也就顺其自然的进行了。

      实际应用中,对于最常用的 Logistic regression,SAS 的 PROC LOGISTIC 可以轻松解决 ROC 图像绘制以及 AUC 计算的问题。
代码如下



proc logistic data=dataname plots(only)=roc;

model y=x1 x2 x3... xn;

run;


      运行程序即可得到 ROC 曲线以及相应 AUC=0.8005。

问题 3: AUC 值和模型功效有何关系?

我们不妨先固定某一横轴值,也就是说固定了分割线相对 bad 样本的位置关系,根据敏感性的定义(敏感性 = 预测对的 good 实例 / 实际 good 的实例 ),不难发现在有相等横轴值的情况下,纵轴值(敏感度)越大,模型功效越好。

      下图中,对于相同的横轴值(固定坏样本分布和分割线),若模型的好样本结果的分布情况为 Distribution2,其相应的纵轴值显然大于 Distribution1 的情况,也就是 y2>y1。 同样,任意移动分割线(也就是对任意横轴值),都可以得到 Distribution2 的纵轴值大于等于 Distribution1。那也很显然情况 2 的模型比情况 1 具备更强的区分能力。这是最简单的比较情况,如果两个模型并不是对于任意横轴值都存在一致的纵轴值大小区分,我们该怎么比较呢?

    

       这里我们再来回顾一下 AUC 是什么。AUC 事实上是 ROC 曲线下的面积,事实上也是 ** 敏感性在 x 属于 [0,1] 区间内的积分!** 既然对于每个固定横轴值,都存在纵轴值越大模型功效越好这个说法,那么通过计量面积来比较模型的功效依旧成立,同时 AUC 还简化了指标的维度,将 2 维的 ROC 图转化为 1 维数值,简化的同时还提供了模型与模型之间比较的契机,这也就很容易理解我们为什么要使用 AUC 值来展示模型的区分能力了!

问题 4: 如何使用 AUC 值评价模型?

      ROC 曲线下的面积值(AUC) 正常情况下在 0.5 和 1 之间。应用中通常使用以下标准评价模型功效。

|        AUC |               评价 |
|        0.9-1 |             高准确性 |
|      0.7-0.9 |         有一定准确性 |
|      0.5-0.7 |         有较低准确性 |
|        0-0.5 |       不符合真实情况 |

       事实上,当模型的 ROC=1 时,模型将所有好坏样本完全分离,也就是说低分区全是 bad 样本,高分区全是 good 样本,两组样本在得分上没有交集,这也被成为“完美模型”。当然,在实际建模中,“完美模型”显然是不存在的。

       当模型的 ROC=0.5 时,模型实际上相当于一个随机排序模型,也就是和说生成随机数评分没啥区别,因此无法对我们的模型使用场景提供支持。


更多高质资源 尽在AIQ 机器学习大数据 知乎专栏 点击关注

转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com