一、先从混淆矩阵讲起
- 下面我们将预测类别为1的称为positive(阳性),预测类别为0的negative(阴性);
- 预测正确的称为true(真),预测错误的称为false(伪)。
上面的对应关系其实就是混淆矩阵了,现在引出【真阳率】(True positive)和【伪阳率】(False positive):
- 前者TPRate(也叫Sensitivity)即将TP除以TP所在列之和,表示在所有真实类别为1的样本(正样本)中,预测为真(1)的比例:
二、ROC曲线登场
首先来看ROC曲线的定义,横轴为刚才的FPRate(伪阳率),纵坐标为TPRate(真阳率)。有一种特殊情况,横纵坐标这两个概率相等,即无论真实类别是1还是0,两者预测为1的概率相同(即对正负样本没啥区分能力),即如下直线:
显然上面这种情况不是我们想要的,对正负样本还没啥区分能力,我们希望将真实类别为1的样本,正确预测为1的概率即TPRate,大于将真实类别为0的样本,预测为1的概率即FPRate,对应的ROC曲线就是往上拱的样子(而且越拱越好):
这里注意我们将ROC曲线下的面积定义为AUC (Area Under Curve),而刚才说到这个ROC曲线越拱越好,拱到AUC面积接近为1,这时候如下图:
TPRate基本恒等于1,表示在所有真实类别为1的样本中(负样本),预测为真(1)的比例基本为1了!!
FPRate几乎恒等于0,表示在所有真实类别为0的样本中(负样本),全部都预测错为1的概率几乎为0,都基本预测为0呗(都正确了)!!
注意我们在画ROC曲线时是根据某个特定阈值下的TP率和FP率描点(坐标)的,和P-R曲线一样,ROC曲线也是通过遍历所有的阈值来绘制整条ROC曲线,如下图:
三、几个栗子分析
【栗子1】如果我们的模型分类结果如下:
混淆矩阵如下:
TPRate=3/4,FPRate=2/4,根据这个点画出对应ROC曲线如下,并且计算AUC面积为0.625。
【栗子2】而如果是利用逻辑回归预测结果如下(通过sigmoid函数输出对应的概率值):
需要设置阈值,比如阈值取为0.5,小于0.5为0,否则为1的label,这样得到的混淆矩阵和栗子1的情况是一样的,当然也可以设置阈值为其他数。然后依次使用所有预测值作为阈值,得到一系列的TPRate、FPRate,在坐标上描点、连线得到ROC曲线。
【栗子3】在反欺诈场景中,我们前提假设欺诈团伙为正样本,在正样本占全体样本很少时(如0.0001%),当如果用 a c c u r a c y accuracyaccuracy 作为我们模型的评估指标。
from sklearn import metrics from sklearn.metrics import auc import numpy as np y = np.array([1, 1, 2, 2]) scores = np.array([0.1, 0.4, 0.35, 0.8]) fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) metrics.auc(fpr, tpr) # 0.75
五、ML常用评估指标
六、ML高阶评估指标
6.1 P-R 曲线
P-R 曲线,这里的 P 就是精确率 Precision,R 就是召回率 Recall。为了综合评价一个推荐模型的好坏,不仅要看模型在一个 Top n 值下的精确率和召回率,还要看到模型在不同 N 取值下的表现,甚至最好能绘制出一条 n 从 1 到 N,准确率和召回率变化的曲线。这条曲线就是 P-R 曲线。
P-R 曲线的横轴是召回率,纵轴是精确率。
对于一个推荐模型来说,它的 P-R 曲线上的一个点代表“在某一阈值下,模型将大于该阈值的结果判定为正样本,将小于该阈值的结果判定为负样本时,整体结果对应的召回率和精确率”。整条 P-R 曲线是通过从高到低移动正样本阈值生成的。如图 1 所示,它画了两个测试模型,模型 A 和模型 B 的对比曲线。其中,实线代表模型 A 的 P-R 曲线,虚线代表模型 B 的 P-R 曲线。
从图中我们可以看到,在召回率接近 0 时,模型 A 的精确率是 0.9,模型 B 的精确率是 1。这说明模型 B 预测的得分前几位的样本全部是真正的正样本,而模型 A 即使是得分最高的几个样本也存在预测错误的情况。
曲线分析:
随着召回率的增加,两个模型的精确率整体上都有所下降。特别是当召回率在 0.6 附近时,模型 A 的精确率反而超过了模型 B。这就充分说明了,只用一个点的精确率和召回率是不能全面衡量模型性能的,只有通过 P-R 曲线的整体表现,才能对模型进行更全面的评估。
AUC (Area Under Curve):AUC用于衡量P-R曲线的优劣。指的是 P-R 曲线下的面积大小,因此计算 AUC 值只需要沿着 P-R 曲线横轴做积分。AUC 越大,就证明推荐模型的性能越好。
6.2 ROC 曲线
第二个高阶指标,ROC 曲线,它也是一个非常常用的衡量模型综合性能的指标。
ROC 曲线的全称是 the Receiver Operating Characteristic 曲线,中文名为“受试者工作特征曲线”。ROC 曲线最早诞生于军事领域,而后在医学领域应用甚广,“受试者工作特征曲线”这一名称也正是来源于医学领域。
ROC 曲线的横坐标是 False Positive Rate(FPR,假阳性率),纵坐标是 True Positive Rate (TPR,真阳性率)。
和上面介绍精确度的介绍一样,这里的P 指的是真实的正样本数量,N 是真实的负样本数量;TP 指的是 P 个正样本中被分类器预测为正样本的个数,FP 指的是 N 个负样本中被分类器预测为正样本的个数。
和 P-R 曲线一样,ROC 曲线也是通过不断移动模型正样本阈值生成的。如上面的动图,垂线其实就是我们的阈值,当垂线从右到左移动时,右边ROC曲线上的点,从下往上移动。如果来固定阈值,我们也可以看到左图中,其实和混淆矩阵中四个值是对应的:
(1)栗子1
ROC曲线的横轴是FPRate,纵轴是TPRate,当二者相等时,即y=x,如下图,这时候ROC曲线表示:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的。
分类器对于正例和负例毫无区分能力,和抛硬币没什么区别,一个抛硬币的分类器是我们能想象的最差的情况,因此一般来说我们认为AUC的最小值为0.5(当然也存在预测相反这种极端的情况,AUC小于0.5,这种情况相当于分类器总是把对的说成错的,错的认为是对的,那么只要把预测类别取反,便得到了一个AUC大于0.5的分类器)。
(2)栗子2
假设测试集中一共有 20 个样本,模型的输出如下表所示,表中第一列为样本序号,Class 为样本的真实标签,Score 为模型输出的样本为正的概率,样本按照预测概率从高到低排序。在输出最终的正例、负例之前,我们需要指定一个阈值,并且设定预测概率大于该阈值的样本会被判为正例,小于该阈值的会被判为负例。
比如,我们指定 0.9 为阈值(又称为截断点额),那么只有第一个样本会被预测为正例,其他全部都是负例。
接下来,我们要做的就是动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着 ROC 曲线的零点),逐渐调整到最低得分。每一个截断点都会对应一个 FPR 和 TPR 的值,在 ROC 图上绘制出每个截断点对应的位置,再连接每个点之后,我们就能得到最终的 ROC 曲线了。那么 ROC 曲线上的点具体应该怎么确定呢?
确定几个点:
(1)当截断点选择为正无穷的时候,模型会把全部样本预测为负例,那 FP 和 TP 必然都为 0,FPRate 和 TPRate 也都为 0,因此曲线的第一个点就是 (0,0) 。
(2)当把截断点调整为 0.9 的时候,模型预测 1 号样本为正样本,并且这个样本也确实是正样本。因此,在 20 个样本中,当 TP=1,所有正例数量 P=10 的时候,TPR=TP/P=1/10。
在表中观察,没有预测错的正样本,也就是说当 FP=0,负样本总数 N=10 的时候,FPR=FP/N=0/10=0,对应着 ROC 图上的点 (0,0.1)。
(3)更直观的绘制 ROC 曲线的方法
(1)首先,根据样本标签统计出正负样本的数量,假设正样本数量为 P,负样本数量为 N。然后,我们把横轴的刻度间隔设置为 1/N,纵轴的刻度间隔设置为 1/P。
(2)接着,再根据模型输出的预测概率对样本进行从高到低的排序。
(3)最后,依次遍历样本。
同时,从零点开始绘制 ROC 曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在 (1,1) 这个点,整个 ROC 曲线就绘制完成了。
在绘制完 ROC 曲线后,我们也可以像 P-R 曲线一样,计算出 ROC 曲线的 AUC,AUC 越高,推荐模型的效果就越好。
七、考考你
(1)工业界在用指标评估排序列表结果时,最最常用的指标是啥?cmu的搜索引擎这门课的教授说MAP和NDCG是最常用的,其中NDCG应该是效果最好的,因为NDCG考虑到了每个数的实际相关性和模型预测出的排序顺序。
【答】离线主要用AUC和gAUC。但工业界离线指标主要是参考作用,最重要的还是在线指标。
(2)Diversity在推荐系统中重要吗?如果重要的话,是不是除了以上这些指标,还需要用到诸如Precision-Intent aware@K和alpha-NDCG这些指标进一步分析模型效果呢?
【答】diversity比较重要,但一般是secondary metric,一般不作为主要优化的指标
(3)在实际工作中,一般是如何定义正样本和负样本的呢?首先,这个正样本和负样本应该是应用户而异吧?其次,以电影推荐为例,对于某个用户A,我们是把用户A之前看过的电影都定义成正样本,然后没有看过的电影都标记为负样本嘛?还是有其他什么方法?
【答】正样本比较好说,就是你定义的一些正向的行为,比如点击、播放、购买等等。负样本其实看你的选择了,有纯random的,也有曝光未点击等等。
(4)个性化推荐,不是每个人的推荐结果都不一样吗。为啥说ROC、P-R是全量数据,我认为是针对每个人的全量物品推荐,文中的全量是指全量物品吗。mAP严格意义上说是用到了全量的用户和物品。
【答】ROC曲线,P-R曲线是对全量样本在一起排序,不区分用户,所以这里说是全量数据。
(5)P-R 曲线和 ROC 曲线,它们的优缺点分别是什么呢?在正负样本分布极不均衡的情况下,你觉得哪个曲线的表现会更稳定、更权威一点?
【答】ROC曲线。
FPR=FP/N,TPR=TP/P,当我们将负样本复制10倍时,TPR显然不会变,FPR是负样本中被预测为正样本的比例,这其实也是不变的,那整个ROC曲线也就没有变。PR曲线,精确率P=TP/(TP+FP),TP不变,FP增大,而召回率R没有变,显然ROC曲线更稳定一些。