周五给学生讲课的时候,学生听得有点蒙,故写下这篇抢救一下。为了节省敲键盘的次数,下面部分内容来自维基百科。
什么时候ROC曲线?这个好像并没有一个很好的定义,维基百科上是这么说明的:
ROC曲线首先是由二战中的电子工程师和雷达工程师发明的,用来侦测战场上的敌军载具(飞机、船舰),也就是信号检测理论。之后很快就被引入了心理学来进行信号的知觉检测。数十年来,ROC分析被用于医学、无线电、生物学、犯罪心理学领域中,而且最近在机器学习(machine learning)和数据挖掘(data mining)领域也得到了很好的发展。
(这只是一段类似于背景介绍的内容)
这篇文章希望达到的目标是:
- 理解ROC曲线
- 根据数据能画出ROC曲线
其实,如果不会画出ROC曲线,那对ROC曲线就不算理解了。
基本概念
ROC曲线是用于分析二分类模型的,也就是输出结果只有两种类别的模型,例如:(阳性/阴性)(有病/没病)(垃圾邮件/非垃圾邮件)(目标客户/非目标客户)。用于分类模型的机器学习的算法很多,例如逻辑回归,决策树等,不过这并不是本文的目标。
当分类模型的预测结果是一个连续值(例如逻辑回归的预测结果)时,类与类的边界必须用一个阈值(英语:threshold)来界定。举例来说,用血压值来检测一个人是否有高血压,测出的血压值是连续的实数(从0~200都有可能),以收缩压140/舒张压90为阈值,阈值以上便诊断为有高血压,阈值未满者诊断为无高血压。二元分类模型的个案预测有四种结局:
- 真阳性(TP):诊断为有,实际上也有高血压。
- 伪阳性(FP):诊断为有,实际却没有高血压。
- 真阴性(TN):诊断为没有,实际上也没有高血压。
- 伪阴性(FN):诊断为没有,实际却有高血压。
在机器学习中,通常这会用一个2*2的混淆矩阵来表达:
这个表格能非常清晰地描述二分类模型的性能,基于这个混淆矩阵就能计算模型的精确率,召回率,F1值等,不过这也不是本文的目标。通常情况下,我们关注的往往是预测值为阳性的数据,例如如果我们预测某个人为我们的目标客户,那就需要我们投入资源去对这个客户做营销活动,这就会产生成本,而真阳性和伪阳性的区别在于:如果是真阳性,那我们的投入就会有产出;如果是伪阳性,那我们的投入就变成了沉没成本。
注意:这里的阳性阴性在有些书也会定义成正例负例,名称虽然不同,意思完全是一样的。
ROC曲线
ROC曲线,其实就是一条二维平面上的曲线,其中X轴为伪阳性率(FPR),Y轴为真阳性率(TPR)。
用直观的话,来理解这两个值,其实就是覆盖率(其实召回率并没有覆盖率好理解)和误报率,我们模型期待的当然就是覆盖率越高越好,而误报率越低越好。但是覆盖率和误报率这对冤家却没那么听话,结果往往是一个增加,而另一个就会减少。例如在营销活动中,如果我们要覆盖所有的目标客户,那我们就得对所有人去做营销,这时误报率也是最高的100%,因为所有本来不是目标客户的人都被误判为潜在客户了,营销成本也很大。
把FPR值作为X轴,把TPR值作为Y周,ROC曲线大概长下面的德行:
从 (0, 0) 到 (1,1) 的对角线(就是上图的虚线)将ROC空间划分为左上/右下两个区域,在这条线的以上的点代表了一个好的分类结果(胜过随机分类),而在这条线以下的点代表了差的分类结果(劣于随机分类)。
完美的预测是一个在左上角的点,在ROC空间座标 (0,1)点,X=0 代表着没有伪阳性,Y=1 代表着没有伪阴性(所有的阳性都是真阳性);也就是说,不管分类器输出结果是阳性或阴性,都是100%正确。一个随机的预测会得到位于从 (0, 0) 到 (1, 1) 对角线(也叫无识别率线)上的一个点;最直观的随机预测的例子就是抛硬币。
如果在ROC曲线上寻找最优的零界点,那我们可以找曲线上里点(0,1)最近的点。不过在实际应用的时候,往往还没有这么简单,实际在实施的时候,可能会受到现实条件的制约,例如成本等。例如,如果警察要对人群中的犯罪嫌疑人排除,最优的方案可能是对其中的30%的人进行排查,但受现实警力的条件限制,可能只能对其中的20%的人做排查。
怎么画ROC曲线
上面我们说的ROC曲线,但是并没有说是怎么画出来的,网上也有很多介绍ROC曲线的文章,但是很多都没有讲清楚ROC曲线是怎么画出来的。
例如,如果我们使用二分类模型(例如逻辑回归)来判断一个人是否是我们的目标客户,这时模型会得到这个人是目标客户的得分(或者叫概率)。例如有一个20人的样本集,这20人我们已经知道其分类特征,其中10人是我们的目标客户,另外10人不是,而我们的模型也给每个人打了分数(score),分数越高则是目标客户的概率越大。我们按照得分倒序排序如下:
其中p表示目标客户,n表示非目标客户。
我们把上面表格,按顺序排在一个轴上,如下:
其中绿球为目标客户,红球为非目标客户,排序在左边的得分比较高。这样排列,主要是方便我们观察。
- 我们先以第一个人的得分作为阀值,即threshold=0.9,得分大于等于该值的都判断为目标客户,这时我们有一个目标客户,且他本身也是目标客户,而我们总共有10个目标客户,所以这时的覆盖率TPR=1/10;没有误报,故FPR=0。
- 我们接着以第二个人的得分作为阀值,即threshold=0.8。这时我们得到2个目标客户,却这2人本身也是我们的目标客户,所以这时的覆盖率TPR=2/10;依然还没有误报,故FPR=0。
- 当我们以第11个人的得分作为阀值时,即threshold=0.4。从上图我们可以看到,满足条件的共有11个人(得分大于等于阀值的),其中绿球7个,红球4个,即7个目标客户,4个非目标客户。这时我们的目标客户覆盖率TPR=7/10;而误报率FPR=4/10,这里的分母10的意思是我们总共有10个非目标客户,和计算覆盖率的分母的含义是不一样的。
- 。。。。。。
我们把每一个人的得分作为阀值,都计算出相应的TPR和FPR,就能画成一个图,如下:
所以,画ROC曲线的关键是:将样本数据按模型预测的得分进行倒序排序,然后把每个得分作为阀值,进而计算相应的覆盖率和误报率,这就是XY平面上的点,然后连成线即可。
ROC曲线与X轴之间的面积,其实二分类模型一个非常重要的评估指标AUC,不过这不是本文要介绍的内容,以后有机会写到分类模型应该会涉及AUC。
ROC曲线的兄弟姐妹
除了ROC曲线,其实我们还有一些其他的曲线:
PR曲线
PR曲线是精确率和召回率的曲线,横轴是召回率(覆盖率),纵轴是精确率。计算方式和ROC曲线类似。
响应曲线
我们将ROC曲线,除了用来计算AUC,如果说到直接应用的话,其实我觉得不如响应曲线,至少没有响应曲线直观好理解。响应曲线的纵轴依然是覆盖率,但是横轴变成为预测为阳性的数量占比。
例如我们要做营销活动,但是活动经费只允许我们对其中10%的人做营销活动,这时模型就是要找出最有可能是我们目标客户的10%的人,也就是得分的TOP10%,这时的覆盖率(召回率)是多少,我们都可能算出来,这样这次活动的投入产出我们就可以预先计算出来。
Lift提升曲线
如果说响应曲线对模型效果还不够直观,我们还有Lift曲线可以选择,它可以非常直观的反映出模型的效果。如下图:
其中红色线就是没有模型的效果,即随机选择的效果,也是我们对比的基准。而蓝色线就是我们模型相对于随机选择的提升值。
例如通过模型来选择10%的样本,模型效果能提升到4.5倍!换一句话来表述就是,如果我们服务10%的潜在客户需要营销成本100万,而原来的100万只能带来100个目标客户(假设10%对应的就是100个目标客户),现在有了模型之后,同样的100万预算,却能带来450个目标客户。
这就是提升曲线直观传达的意思。
2019-06-02