模型评估指标 AUC 和 ROC,这是我看到的最透彻的讲解


本文地址:http://www.6aiq.com/article/1568827658600
知乎专栏 点击关注
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出

AUC 在机器学习领域中是一种模型评估指标。根据维基百科的定义,AUC(area under the curve) 是 ROC 曲线下的面积。所以,在理解 AUC 之前,要先了解 ROC 是什么。而 ROC 的计算又需要借助混淆矩阵,因此,我们先从混淆矩阵开始谈起。

混淆矩阵

假设,我们有一个任务:给定一些患者的样本,构建一个模型来预测肿瘤是不是恶性的。在这里,肿瘤要么良性,要么恶性,所以这是一个典型的二分类问题。

假设我们用 y=1 表示肿瘤是良性,y=0 表示肿瘤是恶性。则我们可以制作如下图的表格:
488e77d983594aa884640c29359fbe24-image.png

如上图,TP 表示预测为良性,而实际也是良性的样例数;

FN 表示预测为恶性,而实际是良性的样例数;

FP 表示预测为良性,而实际是恶性的样例数;

TN 表示预测为恶性,而实际也是恶性的样例数;

所以,上面这四个数就形成了一个矩阵,称为混淆矩阵。

那么接下来,我们如何利用混淆矩阵来计算 ROC 呢?

首先我们需要定义下面两个变量:

86ad9b4d0036480195f788f2ecb35391-image.png

cec96e170a8344718106df9c616ceaa1-image.png

TPR 表示,在所有良性肿瘤中,被预测为良性的比例。称为真阳性率。真阳性率告诉我们,随机拿一个良性的肿瘤样本时,有多大的概率会将其预测为良性肿瘤。显然我们会希望 TPR 越大越好。

如果以 FPR 为横坐标,TPR 为纵坐标,就可以得到下面的坐标系:

c64707f1525e4362a295ccf7e2b9851c-image.png

可能看到这里,你会觉得有点奇怪,用 FPR 和 TPR 分别作横纵坐标有什么用呢?我们先来考察几个特殊的点。

点 (0,1),即 FPR=0,TPR=1。FPR=0 说明 FP=0,也就是说,没有假正例。TPR=1 说明,FN=0,也就是说没有假反例。这不就是最完美的情况吗?所有的预测都正确了。良性的肿瘤都预测为良性,恶性肿瘤都预测为恶性,分类百分之百正确。这也体现了 FPR 与 TPR 的意义。就像前面说的我们本来就希望 FPR 越小越好,TPR 越大越好。

点 (1,0),即 FPR=1,TPR=0。这个点与上面那个点形成对比,刚好相反。所以这是最糟糕的情况。所有的预测都预测错了。

点 (0,0),即 FPR=0,TPR=0。也就是 FP=0,TP=0。所以这个点的意义是所有的样本都预测为恶性肿瘤。也就是说,无论给什么样本给我,我都无脑预测成恶性肿瘤就是了。

点 (1,1),即 FPR=1,TPR=1。显然,这个点跟点(0,0) 是相反的,这个点的意义是将所有的样本都预测为良性肿瘤。

考察完这四个点,我们可以知道,如果一个点越接近左上角,那么说明模型的预测效果越好。如果能达到左上角 (点 (0,1)),那就是最完美的结果了。

ROC 曲线

介绍了混淆矩阵之后,我们就可以了解一下 ROC(receiver operating characteristic curve)曲线是怎么定义的。

我们知道,在二分类(0,1)的模型中,一般我们最后的输出是一个概率值,表示结果是 1 的概率。那么我们最后怎么决定输入的 x 是属于 0 或 1 呢?我们需要一个阈值,超过这个阈值则归类为 1,低于这个阈值就归类为 0。所以,不同的阈值会导致分类的结果不同,也就是混淆矩阵不一样了,FPR 和 TPR 也就不一样了。所以当阈值从 0 开始慢慢移动到 1 的过程,就会形成很多对 (FPR, TPR) 的值,将它们画在坐标系上,就是所谓的 ROC 曲线了。

我们来举一个例子。比如我们有 5 个样本:

真实的类别 (label) 为 y = c(1,1,0,0,1).

一个分类器预测样本为 1 的概率为 p=c(0.5, 0.6, 0.55, 0.4, 0.7).

正如上面说的,我们需要有阈值,才能将概率转换为类别,才能得到 FPR 和 TPR。而选定不同的阈值会得到不同的 FPR 和 TPR。假设我们现在选定的阈值为 0.1, 那么 5 个样本都被归类为 1。如果选定 0.3,结果仍然一样。如果选了 0.45 作为阈值,那么只有样本 4 被分进 0,其余都进入 1 类。当我们不断改变阈值,就会得到不同的 FPR 和 TPR。然后我们将得到的 (FPR , TPR) 连接起来,就得到了 ROC 曲线了。
2357ceaa3f624306afd6896e43c01f08-image.png

看到这里,也许我们还有一点难理解。这里要注意:

1 阈值的范围是 [0,1],当阈值从 1 到 0 慢慢移动时,FPR 会越来越大。因为 FP(假正例) 会越来越多。

2 如果在给定的样本中,我都随机预测,也就是 0.5 概率预测为良性肿瘤,0.5 概率预测为恶性肿瘤。那么这条曲线会是怎样的呢?可以想象,如果数据是均匀,那么这条曲线就是 y=x。

3 注意曲线一定是从 (0,0) 开始最终到达 (1,1) 的。理解了上面四个点的意义就知道了。

4 事实上,ROC 曲线不是光滑的,而是阶梯型的。为什么呢?因为样本的数量是有限的,而 FPR 和 TPR 的变化需要至少有一个样本变化了,在没有变化的间隙里,就不会有变化。也就是说,步进是 1/ 样本数。



得到了 ROC 曲线,我们就可以计算曲线下方的面积了。计算出来的面积就是 AUC 值了。

AUC 值的意义

知道了如何计算 AUC 值,我们当然是要来问一下 AUC 值的意义了。为什么我们要这么大费周章地搞出这个 AUC 值?

假设我们有一个分类器,输出是样本输入正例的概率,所有的样本都会有一个相应的概率,这样我们可以得到下面这个图:

其中,横轴表示预测为正例的概率,纵轴表示样本数。

所以,蓝色区域表示所有负例样本的概率分布,红色样本表示所有正例样本的概率分布。显然,如果我们希望分类效果最好的话,那么红色区域越接近 1 越好,蓝色区域越接近 0 越好。

为了验证你的分类器的效果。你需要选择一个阈值,比这个阈值大的预测为正例,比这个阈值小的预测为负例。如下图:

在这个图中,阈值选择了 0.5 于是左边的样本都被认为是负例,右边的样本都被认为是正例。可以看到,红色区域与蓝色区域是有重叠的,所以当阈值为 0.5 的时候,我们可以计算出准确率为 90%.

好,现在我们来引入 ROC 曲线。

图中左上角就是 ROC 曲线,其中横轴就是前面说的 FPR(False Positive Rate),纵轴就是 TPR(True Positive Rate)。

然后我们选择不同的阈值时,就可以对应坐标系中一个点。

当阈值为 0.8 时,对应上图箭头所指的点。

当阈值为 0.5 时,对应上图箭头所指的点。

这样,不同的阈值对应不同的点。最后所有的点就可以连在一起形成一条曲线,就是 ROC 曲线。

现在我们来看看,如果蓝色区域与红色的区域发生变化,那么 ROC 曲线会怎么变呢?

上图中,蓝色区域与红色区域的重叠部分不多,所以可以看到 ROC 曲线距离左上角很近。

但是,当蓝色区域与红色区域基本重叠时,ROC 曲线就和接近 y=x 这条线了。

综上两个图,如果我们想要用 ROC 来评估分类器的分类质量,我们就可以通过计算 AUC(ROC 曲线下的面积)来评估了,这就是 AUC 的目的。

其实,AUC 表示的是正例排在负例前面的概率。

比如上图,第一个坐标系的 AUC 值表示,所有的正例都排在负例的前面。第二个 AUC 值,表示有百分之八十的正例排在负例的前面。

我们知道阈值可以取不同,也就是说,分类的结果会受到阈值的影响。如果使用 AUC 的话,因为阈值变动考虑到了,所以评估的效果更好。

另一个好处是,ROC 曲线有一个很好的特性:当测试集中的正负样本分布发生变化了,ROC 曲线可以保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

在上图中,(a)和 (c) 为 ROC 曲线,(b)和 (d) 为 Precision-Recall 曲线。(a)和 (b) 展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和 (d) 是将测试集中负样本的数量增加到原来的 10 倍后,分类器的结果。可以明显的看出,ROC 曲线基本保持原貌,而 Precision-Recall 曲线则变化较大。

参考:

https://www.zybuluo.com/frank-shaw/note/152851
https://www.zhihu.com/question/39840928?from=profile_question_card
http://blog.csdn.net/cherrylvlei/article/details/52958720
http://www.dataschool.io/roc-curves-and-auc-explained/


本文地址:http://www.6aiq.com/article/1568827658600
知乎专栏 点击关注
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出