感觉自己越来越标题党了...不过我相信看了这篇文章,以及本文的参考文献,你会期待面试官问你这些问题。这篇文章适合对上述概念存在疑惑的同学,希望我讲的足够全可以解答你的疑惑。
在之前面试的时候,被问到给定一堆样本的label和模型预测的prob,怎么手动计算ROC、AUC。当时我写的那叫一个挫,把PR曲线和ROC曲线还搞混了...然后面试回来我立志一定要把这几个概念搞清楚(感觉都是吃了亏才长记性...)。
一、混淆矩阵
在进行一切计算之前,先画二分类问题的混淆矩阵。混淆矩阵有助于理清思路,也方便后续的推导。我们将样例根据真实值与模型预测的结果组合,划分成TP、TN、FP、FN四种情形,组成所有的分类结果。
这个矩阵就是“混淆矩阵”,不知道有没有人跟我一样一出手就画成了下面的样子...(虽然说也不影响写公式...但是...写成这样感觉会被怼)
四种情况包括:
- TP:预测为1,样本为1,预测正确
- FP:预测为1,样本为0,预测错误
- FN:预测为0,样本为1,预测错误
- TN:预测为0,样本为0,预测正确
言归正传,我们定义查准率(Precision)和查全率(Recall)分别为:
- 所谓查准率就是:所有预测为正的样本里,真实正样本所占比重
- 所谓查全率就是:所有真实的正样本里,预测为正的样本所占比重
这两个例子我们可以用实例来理解:医学模型判断癌症病人我们希望Recall高一点(无病诊断为有病去治疗总比漏掉癌症病人好(所有真实患病的人里,检测出患病)),而自己买西瓜的话希望甜瓜的Precision高一点(我们买到的是预测为1(甜瓜)的样本,希望有限的买瓜次数下甜瓜更多)。
二、PR曲线
上面的分析可以看到,不同情况下我们希望在查准和查全上有个权衡。为什么会有权衡呢?因为我们二分类器输出的是预测为正样本的概率,是个[0,1]范围内的数值。那我们可以选择不同的阈值(比如我们的模型预测癌症的概率是0.2, 但是我们为了保守起见,高于0.1就认为是预测的正例)。
理解了阈值的概念,就可以继续看PR曲线了。我们将纵轴设置为Precison,横轴设置成Recall,改变阈值就能获得一系列的pair并绘制出曲线。对于不同的模型在相同数据集上的预测效果,我们可以画出一系列的PR曲线。一般来说如果一个曲线完全“包围”另一个曲线,我们可以认为该模型的分类效果要好于对比模型。
但是PR曲线判断模型好坏还是有点粗糙了,我们有更常用的F1值:
可以看到F1值就是P和R值的调和平均值的2倍。
上述
在信息检索等任务中,我们可能关注最终的结果排序,而不是仅仅召回了。所以会有P@10或者P@5,代表我们考量的是排序前10位或者前5位的元素中的查准率,排在越靠前权重越高。
与P@10对应还有NDCG指标,这两个指标都是考虑排序的,这里就不作展开了。
三、ROC曲线
ROC曲线的全称是“受试者曲线”,与PR曲线类似。它相比PR曲线能够在样本不均衡的条件下给出更加合理的结果。先看一下ROC的纵轴和横轴:纵轴是TPR,横轴是FPR,对应的计算方式是:
可以看到TPR的定义是和Recall是一样的。TPR和FPR分别描述了在正负样本里(正样本=TP+FN,负样本=FP+TN),TP和FP样本所占的比例。与PR曲线一样,我们可以通过调整阈值,来改变TPR和FPR。下面举个例子(引用自 CSDN)
以下列数据举例:
y_true = [0, 1, 0, 1],真实值
y_score = [0.1, 0.35, 0.4, 0.8], 预测概率值
分别取4组判定正例用的阈值:[0.1, 0.35, 0.4, 0.8],可得相应4组FPR,TPR:
FPR: [1, 0.5, 0.5, 0]
TPR: [1, 1, 0.5, 0.5]
绘制ROC曲线图如下:
可以看到ROC曲线一般是个阶梯形,我们的样本和采样点越多,阶梯效应就越不明显。当数据量足够大采样阈值足够多的时候,这条曲线就会平滑,如下图。
模型的效果越好,整个ROC曲线越往左上角靠,与PR类似如果一个模型ROC曲线完全cover另一个,说明该模型优于另一模型。
四、AUC
4.1 概念
AUC一般指的是ROC曲线与横轴构成的面积(area-under-curve)
4.2 计算
给定数据集如何计算AUC呢,当然是在不调用sklearn的方式下,我所了解的有3种计算方式。
方法1、近似法
这个方法取自西瓜书,是最基础的做法:即我们计算ROC曲线下每个矩形的面积,如下图:
显然这是个近似的方法,因为我们会多算虚线处三角形面积的一半。并且我们需要改变阈值并绘制出所有的矩形,计算复杂,故这种方法不推荐。
方法2、
这个方法也叫“曼 - 惠特尼法”,我们构造M*N个正负样本对。然后看看正例样本的predict值大于负例样本的情况,即
如上图,我们有4个样本,2正例2负例(M=2,N=2),模型分别输出不同的predict概率。然后我们像上图右侧一样构建正负样本对。所以按照方法2,我们计算出最终的auc为3/4.
方法3、排序
这种属于上面“曼 - 惠特尼法”的优化版本,通过排序避免了
构成样本对的思路可以这样想:第1正样本,如果它排在
这样一来,通过排序我们将算法复杂度从
有关这个“曼 - 惠特尼法”更详细的信息可以参阅参考文献,或者自行搜索。