“天才的定义——能将复杂变成简单的人”-爱因斯坦
ROC和AUC曲线是用于计算任何分类模型性能的重要评估指标。 这些定义和术语在机器学习社区中非常常见,当我们开始学习分类模型时,我们每个人都会遇到这些定义和术语。 然而,大多数时候,他们并没有被完全理解或被误解,不了解它们的本质,使得我们无法真正的利用它们。 好了,让我们一点点揭开ROC和AUC的神秘面纱,它们将不再神秘,需要的只是您阅读本文的一点点耐心。
ROC和AUC的概念建立在混淆矩阵,特异性和灵敏度的基础之上。 我将在本文中使用一个基于Logisitic回归算法的例子,但是,请务必记住,ROC和AUC的概念不仅适用于Logistic回归。
在我们的例子中有这么两类人:沿着Y轴方向,红色小人表示患有心脏病,绿色小人表示没患心脏病。 x轴表示人体胆固醇胆固醇含量。
请注意:
底部圆圈中的绿色小人,胆固醇含量高,但没有心脏病。 这可能是由于现在这个人有较好的生活条件并且定期锻炼的原因。
顶部圆圈中的红色小人,胆固醇含量低,仍患有心脏病。 这可能是由于他有其他与心脏有关的疾病所引起的。
这仅仅只是一个假设的例子,所以有或没有心脏病的原因也是假设的?
逻辑回归(Logistic Regression)
现在,如果我们用Logistic回归曲线拟合我们的数据,那么Y轴将转换为患有心脏病的概率。
下图中白色的点表示患心脏病的概率要低于黑色的点。
但是,如果我们想要对这两类人进行分类,我们需要一种方法将概率转化为分类。 一种方法是将阈值设置为0.5。 接下来,将概率> 0.5的人归类为“患有心脏病”,并将概率<0.5的人归类为“没有心脏病”。
现在让我们评估这种逻辑回归的有效性,我们将分类阈值设置为0.5,此时来了一些新的人,如果它们患心脏病的概率高于0.5,则我们就可以认定他们患有心脏病,反之则认定他们没有患心脏病。
除了1号圈和2号圈内的小人,我们逻辑回归模型其他所有人都做出了正确的分类。
- 1号圈的小人患有心脏病,但我们的模型却将其识别为没有心脏病。(因为他的概率低于0.5)
- 2号圈的小人没有心脏病,但我们的模型却将其识别为患有心脏病。(因为他的概率高于0.5)
混淆矩阵
我们创建一个混淆矩阵,对上述的分类结果进行一下总结.
填写完上述混淆矩阵后,我们可以计算灵敏度(Sensitivity)和特异性(Specificity),以便在0.5阈值下评估我们的逻辑回归模型。
灵敏度(Sensitivity)和特异性(Specificity)
在上面的混淆矩阵中,让我们用这些数字的实际含义来替换这些数字。
- 真阳性(TP):实际患有心脏病并且识别也患有心脏病的人。
- 真阴性(TN):实际没有患心脏病并且识别也没有患心脏病的人。
- 假阴性(FN):实际患有心脏病但是识别为没有心脏病的人。
- 假阳性(FP):实际没有患心脏病但是识别患有心脏病的人。
我们现在可以根据混淆矩阵计算两个有用的指标:
灵敏度
敏感性指我们实际上正确识别出患有心脏病的人的百分比。
这告诉我们有75%的心脏病患者被我们的模型正确识别出来。
特异性
特异性指实际上正确识别出没有心脏病的人的百分比。
这告诉我们,我们的模型正确地识别出75%没有患心脏病的人。
如果正确识别阳性对我们比较重要,那么我们应该选择具有更高灵敏度的模型。反之,如果正确识别阴性更重要,那么我们应该选择特异性作为衡量指标。
识别正确的阈值(Thresholds)
现在,让我们讨论一下当我们使用不同的阈值来判断一个人是否患有心脏病时会发生什么。
- 设置阈值为0.1
这将会使所有患心脏病的人都被识别出来。下面1号圈内的小人也被正确识别为患有心脏病。
然而,这也会增加假阳性的数量,因为现在2号圈和3号圈内的小人将被错误地识别为患有心脏病。
所以较低的阈值会导致:
- 增加假阳性的数量
- 减少假阴性的数量
我们重新计算一下混淆矩阵:
在这种情况下,正确识别患有心脏病的人变得很重要,以便可以采取治疗措施,否则心脏病会导致严重的并发症。 这意味着降低阈值是一个好主意,即使它导致更多的假阳性案例。
- 设置阈值为0.9
现在,这将正确识别所有没有心脏病的人。 然而,1号圈内的小人将被错误地识别为没有心脏病。
所以较高的阈值会导致:
- 减少假阳性的数量
- 增加假阴性的数量
我们重新计算一下混淆矩阵:
阈值可以设置为0到1之间的任何值。那么我们如何确定哪个阈值最好? 我们需要试验所有阈值吗? 每个阈值都会产生不同的混淆矩阵,并且许多阈值将导致大量混淆矩阵,这不是最好的工作方式。
ROC图
ROC(受试者工作特征曲线)可以帮助确定最佳阈值。 它是通过将真阳性率(y轴)与假阳性率(x轴)作图来生成的。
真阳性率表示正确识别“心脏病患者”的比例。
假阳性率表示错误识别为“心脏病患者(其实没有患心脏病)”的比例,即假阳性。
为了更好地了解ROC,让我们重新画一个图。
- 将阈值设置为0,所有人将被识别为“患有心脏病”
混淆矩阵将为:
这意味着当阈值非常低以至于所有人都被识别为患有心脏病时的真实阳性率为1.这意味着每个患有心脏病的人都被正确识别。
此外,当阈值太低以至于每个人被识别为患有心脏病时,假阳性率也是1.这意味着所有没有心脏病的人都被错误的识别为有心脏病。
在ROC图上绘制这一点:
蓝色对角线上的任何点表示正确分类的样本的比例等于错误分类的样本的比例。
我们稍微增加一点阈值,以便只有胆固醇值最低的两个人低于阈值。
我们的混淆矩阵将为:
让我们把点(0.5,1)画到ROC图上:
这意味着此阈值优于前一个阈值。
- 现在,如果继续增加阈值,并使阈值达到下面混淆矩阵所要求的点:
接下来我们把点(0,0.75)画到我们的ROC图上:
到目前为止,这是我们获得的最佳阈值,因为它预测没有误报(假阳性)。
- 最后,我们选择一个阈值,我们将所有人归类为没有心脏病,即阈值为1。
在这种情况下,该点位于(0,0)处:
然后我们可以连接所有的点,这就形成了一个ROC图。 ROC图总结了为每个阈值生成的混淆矩阵,而无需实际计算它们。
通过浏览该ROC图,我们可以得出结论,阈值C优于阈值B,并且根据我们愿意接受多少误报(假阳性率),来选择符合我们自己要求的最佳阈值。
AUC
AUC表示曲线下面积。 AUC通过逻辑模型给出成功分类的表现。 AUC可以轻松地比较一种模型与另一种模型的ROC曲线。
红色ROC曲线的AUC(面积)大于蓝色ROC曲线的AUC(面积)。 这意味着红色曲线更好。 如果红色ROC曲线是由随机森林模型生成的,而蓝色的ROC由Logistic回归生成的,我们可以得出结论,随机森林分类器在分类心脏病患者方面做得更好。 (因为随机森林的AUC面积大于逻辑回归的AUC面积)
总结
AUC和ROC是用于计算任何分类模型性能的重要评估指标。 因此,了解它们的计算方法与使用它们一样重要。 希望下次遇到这些术语时,您将能够在实际问题的背景下轻松解释它们。
个人感悟:画ROC的方法其实就是将所有的阈值(0至1之间)都遍历一下,每一个阈值都会生成一个混淆矩阵,每一个混淆矩阵都可以生成ROC图上的一个点,再将这些点都连起来就是最终的ROC图。不同的分类模型会有不同的ROC图,要比较不同的模型的好坏,那就需要计算AUC,虽然我们能用肉眼识别出不同模型ROC曲线的优劣,但是对于计算机来说,要识别模型的好坏,必须要有一个量化的指标,那就是AUC(曲线下方的面积),AUC越大即面积越接近1(ROC曲线的拐点越靠近左上角1的位置),则模型表现越好。计算AUC的值可以借助于一些现成的工具如skLearn中的sklearn.metrics.roc_auc_score 等。