本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是机器学习专题的第18篇文章,我们来看看机器学习领域当中,非常重要的其他几个指标。

混淆矩阵

在上一篇文章当中,我们在介绍召回率、准确率这些概念之前,先讲了TP、FP、FN、和FP这几个值。我们再来简单地回顾一下,我们不能死记硬背这几个指标,否则很容易搞错,并且还容易搞混。我们需要从英文入手来理解,其中的T表示真,可以理解成预测正确,F表示假,也就是预测错误。而P和N表示positive和negative,也就是阴和阳,或者是0和1,也就是两个不同的类别。

既然是两个类别,那么显然说明了我们的这些指标针对的是二分类的场景,也是机器学习当中最常见的场景。

混淆矩阵其实本质上就是将这四个值展示在一个表格当中,这样方便我们观察结果做出分析。

我们举个例子:

假设某一个模型的预测结果的混淆矩阵是这样,我们从上面展示的数据当中很容易就分析出,我们预测的错误主要发生在49这一格,也就是假阴性这一格。也就是说模型将大量的阳性样本预测成了阴性,说明模型的阈值设置得过高,我们可以尝试降低阈值来提升扩大召回。

反之,如果假阳性的样本太多,则说明模型的阈值过低,将大量阴性的样本预测成了阳性。我们想要提升模型的效果,可以考虑提升一下模型分类的阈值。

如果假阳和假阴都很多该怎么办?

这种情况也很多,一般情况下是由于模型没有完全收敛,或者是模型不够强大。比如特征过多,特征当中很多隐藏的信息没有能够学习到。这个时候可以考虑使用更加复杂的模型,比如神经网络或者是XGboost这种较为强力的模型。如果模型本身已经足够复杂,那么可能是训练的时候的样本数量不够多,导致模型的能力无法完全发挥,这个时候可以考虑增加一些样本。

理解了混淆矩阵的概念和用途之后,我们就可以进一步来看ROC了。

ROC

ROC的英文是receiver operating characteristic curve,翻译过来是接受者操作特征曲线,这是一个从信号系统学科当中迁移过来的一个概念。老实讲我不太了解信号系统,不太清楚它原本的含义,但是在机器学习当中,它是反应TPR和FPR的曲线。

标一下关键点,TPR和FPR以及曲线。这里的TRP就是True Positive Rate,也就是真阳率,这里的FPR是假阳率。

所谓的真阳率也就是召回率,也就是所有阳性样本当中被我们预测成阳性的比例

FPR自然就是False Positive Rate,也就是假阳率,是所有阴性样本当中被预测成阳性的比例。分母显然是FP,分子是FP + TN。

建议大家不要把TPR理解成recall,虽然它的确就是recall但是如果你记成recall的话,会增加记忆成本。横轴和纵轴记成FPR和TPR比较好记。

所以ROC曲线就是横轴是FPR纵轴是TPR的曲线,大概是下面这个样子。

AUC

理解了ROC之后,AUC就容易了。因为AUC完全源于ROC,它的英文是Area under curve,也就是ROC曲线当中曲形的面积。

那么,这个ROC是怎么算出来的呢?

我们来举一个例子,假设我们现在有一系列预测结果:

我们列一下这个模型的混淆矩阵:

我们代入算一下FPR和TPR,可以得到TPR是3 / (3 + 2) = 0.6,对应的FPR是1 / (1 + 4) = 0.2。

我们把这个点代入ROC曲线,可以得到:

看起来像是那么回事了,但还是有些怪怪的,这看起来也不像是一个曲线呀。这是因为我们模型预测的结果直接拿的是01值,对于一些硬分类器,比如SVM和贝叶斯,0就是0,1就是1,我们得到的就是这样一个折线图。但如果是一些根据阈值划分结果的软分类器,比如LR、GBDT等,我们得到的就是一个浮点值,我们调整阈值就会得到不同的结果,就会更加像是曲线。

我们还用刚才的样本举例:

这次的结果是一个浮点值,结果就不一样了。由于预测结果是一个浮点值,我们设置不同的阈值就会得到不同的混淆矩阵

比如,如果我们设置阈值为0.5,得到的混淆矩阵如下:

这样算出来的TPR和FPR分别是0.8,0.4。如果我们进一步放宽阈值,可以提升召回,也就是提升TPR,但与此同时FPR也会提升。比如如果我们把阈值放宽到0.2,我们可以识别出所有的正例,但是同样的,FPR也会上升:

根据上面这个混淆矩阵计算得出的结果TPR是1.0,FPR是0.6。也就是说我们选择不同的阈值会得到不同的TPR,和FPR。如果样本较少的话,画出来的ROC可能是锯齿形

当样本的数量足够多之后,锯齿会变得越来越光滑,我们可以再用上一些平滑的方法,可以得到一个相对光滑的曲线,就变成了上面那张图:

深度理解

现在我们搞清楚了AUC的概念,AUC就是ROC曲线围成的图形面积。而ROC曲线上每一个点都是通过不同的阈值计算得到的点。

我们结合一下AUC的图像以及上面的例子来深度理解一下这个概念,对于AUC曲线而言,我们发现它是单调递增的。也就是说FPR越大,对应的TPR也就越大。这个是比较直观的,因为FPR越大,说明我们把更多的样本预测成了正例,那么显然TPR也就越大。也就是说我们召回的正样本变多了,比例也就变多了。

当FPR=1的时候TPR也等于1,这个点表明我们把所有的样本都预测成了正例。显然在这种情况下,所有的正例都被预测对了,TPR自然就是1。我们再来看另外一个极值点,也就是FPR等于0的点。

FPR等于0表明了假阴率为0,也就是说没有一个负样本被预测错,也就对应着模型预测为正例的样本数非常少。所以FPR这个点对应的TPR越高,往往说明模型的效果越好。

我们理解了AUC的概念之后,免不了问一个问题,AUC这个值究竟代表了什么呢,能够反映什么结果呢?

我们来看下面这张图:

下面这张图中的绿线围成的面积明显大于粉线,也就是AUC1 > AUC2。从这张图我们可以看出,AUC越大,说明曲线围成的面积越大,如果我们选择0-1当中去一个点做垂线,可以得到相同FPR下,通常AUC越大的,对应的TPR也越大(有反例,见下图)。

TPR越大说明模型可以在分错同样数量负样本的情况下预测正确更多的正样本,这代表了模型区分正负样本的能力

为什么要比较AUC而不是设定一个阈值比较TPR呢?

因为有些时候模型的情况比较复杂,比如下面这张图:

在p点以前紫色模型的效果明显更好,但是p点之后就是粉红色的模型更好了。如果只凭单个点的情况,我们很难反应模型整体的能力。所以用AUC可以衡量模型整体上区分正负样本的能力。

最后我们来思考一个问题,AUC最坏的情况是多少?会是0吗?

错了,AUC最坏的情况是0.5。因为如果是随机猜测正负例,那么我们猜测正确的正例数量应该永远占当前猜测数量的0.5,在这种情况下TPR和FPR一直相等,也就是我们画出来的是一条直线,比如下图:

如果算出来的AUC小于0.5怎么办?说明模型可能学习到了样本和特征之间负相关的关系,我们可以试着调换一下0和1两个类别,算出来的AUC应该能变成0.5以上。

总结

在前面的文章当中我们曾经说过,在机器学习的使用场景当中,我们往往更加看重正例。比如广告的点击率预测、搜索排序、推荐等等这些场景下,我们更加关注用户点击行为的发生和预测准确情况,而不太关心没有点击是否预测准确。在这些场景当中,我们衡量精确度或者是召回其实不是特别重要,尤其这种涉及排序、摆放位置调整的场景,我们更加在意模型是否能够把高质量的内容给出一个高的预测分,让它能够排在前面,让用户优先看到。这个时候往往AUC更加能够说明模型的能力。

也因此,相比于精确度、准确度和召回率,在实际的工业应用场景当中,我们可能使用AUC更多一些。当然这并非是说其他概念不重要,这主要还是应用场景决定的。既然应用场景决定了使用AUC的范围很广,那么当我们去应聘岗位的时候,问到AUC的可能性就很高,尤其是考察候选人基础能力的时候。如果被问到,光理解它是什么意思是不够的,我们还需要掌握它的应用场景,它的前因后果,甚至能够进行发散思考一些之前没有想过的问题。

希望大家都能有所收获,原创不易,厚颜求个赞和转发,让我们为了成为更优秀的自己而努力。

五分钟秒懂机器学习混淆矩阵、ROC和AUC的更多相关文章

  1. 机器学习性能指标(ROC、AUC、召回率)

    混淆矩阵 构造一个高正确率或高召回率的分类器比较容易,但很难保证二者同时成立 ROC 横轴:FPR(假正样本率)=FP/(FP+TN) 即,所有负样本中被分错的比例 纵轴:TPR(真正样本率)=TP/ ...

  2. 机器学习性能指标之ROC和AUC理解与曲线绘制

    一. ROC曲线 1.roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. 横轴:负正类率(false po ...

  3. 五分钟秒懂Java日志组件

    Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来.我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章. 在Java中进行日志 ...

  4. Java面向对象笔记(五分钟秒懂)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

  5. 机器学习-Confusion Matrix混淆矩阵、ROC、AUC

    本文整理了关于机器学习分类问题的评价指标——Confusion Matrix.ROC.AUC的概念以及理解. 混淆矩阵 在机器学习领域中,混淆矩阵(confusion matrix)是一种评价分类模型 ...

  6. 【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积

    一.前述 怎么样对训练出来的模型进行评估是有一定指标的,本文就相关指标做一个总结. 二.具体 1.混淆矩阵 混淆矩阵如图:  第一个参数true,false是指预测的正确性.  第二个参数true,p ...

  7. [机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法

    分类问题 分类问题是人工智能领域中最常见的一类问题之一,掌握合适的评价指标,对模型进行恰当的评价,是至关重要的. 同样地,分割问题是像素级别的分类,除了mAcc.mIoU之外,也可以采用分类问题的一些 ...

  8. 混淆矩阵、准确率、精确率/查准率、召回率/查全率、F1值、ROC曲线的AUC值

    准确率.精确率(查准率).召回率(查全率).F1值.ROC曲线的AUC值,都可以作为评价一个机器学习模型好坏的指标(evaluation metrics),而这些评价指标直接或间接都与混淆矩阵有关,前 ...

  9. ML01 机器学习后利用混淆矩阵Confusion matrix 进行结果分析

      目标: 快速理解什么是混淆矩阵, 混淆矩阵是用来干嘛的. 首先理解什么是confusion matrix 看定义,在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是 ...

随机推荐

  1. [codeforces]Page Numbers <模拟>

    描述: «Bersoft» company is working on a new version of its most popular text editor — Bord 2010. Bord, ...

  2. SQL 实战(五)

    一. 将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01.CREATE TABLE IF NOT EXISTS titles_test ( ...

  3. 小白快速使用fetch与后端交互

    本人专心后端,但在完成页面碰到了交互,选择了fetch来完成, 总结了一下简单的使用fetch的方法. fetch是纯原生JS与后端交互的方法,请注意,Fetch规格不同于jQuery.ajax(), ...

  4. 混合app禁止切换输入法英文键盘方案

    前言 在此介绍的是h5的部分,非原生,原生可以直接属性禁止. 需求 禁止中文出现在input中.(如果你认为不显示出来中文,那么请往下看) 效果:只显示英文键盘. 遇到的问题 1.在三星低版本上会出现 ...

  5. 【php】错误日志处理

    一. 错误处理: a) 在写程序的过程当中,遇到错误时,你的反应?可能比较急躁,比较烦 b) 遇到错误后:一别哭,二别闹,三别上吊,四别尿……二. 你可能会遇到的错误: a) 语法错误 i. 语法错误 ...

  6. 虚拟机的vmnet8网卡找不到了

    不知道我设置了什么,在我于Linux中配置网络时发现怎么都不行,检查了一下发现用于NAT的网卡没有了. 我重启了电脑之后发现还是没有. 于是按照网上的办法在虚拟网络编辑器将其重置,如下图. 问题解决. ...

  7. 听说这个 IP 和子网掩码异常难算

    IP地址格式 每个Internet主机或路由器都有IP地址.所有的IP地址包括网络号和主机号(就像是手机号,前几位是区号,后几位是序列号). 说明如下 A类地址用于主机数目非常多的网络.A类地址允许有 ...

  8. python3.6 ubuntu部署nginx、 uwsgi、 django

    ubuntu部署nginx. uwsgi. django 将项目上传到服务器 python manager.py runserver 0:80 在浏览器输入服务器的域名或者ip地址,访问成功. 安装u ...

  9. SQLAlchemy查询

    SQLAlchemy查询 结果查询: from databases.wechat import User from config import session def search(): result ...

  10. html的嵌套规则

    html元素分为块状元素和内联元素,块状元素作为其他元素的容器. 块状元素可以嵌套其他块状元素 块状元素可以嵌套内联元素 内联元素不能嵌套块状元素 p内不能嵌套块状元素 有几个特殊块状元素只能包含内联 ...