精华内容
下载资源
问答
  • ROC

    2019-10-23 10:19:36
    机器学习基础(1)- ROC曲线理解22018.09.09 16:14:12字数 2776阅读 10017本文用于理解ROC曲线的定义,绘制过程及其应用实现。 基本目录如下: 什么是ROC曲线? 1.1 ROC曲线的历史 1.2 ROC曲线的定义 1.3 ROC...

    机器学习基础(1)- ROC曲线理解

    2字数 2776阅读 10017

    本文用于理解ROC曲线的定义,绘制过程及其应用实现。

    基本目录如下:

    1. 什么是ROC曲线?
      1.1 ROC曲线的历史
      1.2 ROC曲线的定义
      1.3 ROC曲线的应用场景

    2. 如何绘制ROC曲线?
      2.1 ROC曲线的绘制原理
      2.2 ROC曲线绘制的Python实现

    ------------------第一菇 - 什么是ROC曲线------------------

    1.1 ROC曲线的历史

    自从读了吴军老师的《数学之美》,我就想明白了一件事情,如果想要讲明白一件事情,一定要把他的历史渊源都讲明白,这样我们才能对其理解透彻,而不是单纯学到会用就好~试想,有多少人在读这篇文章之前,会想到ROC曲线在军事上的运用呢?接下来,我就当一回搬运工,把ROC曲线的诞生渊源都捋一捋~

    经过一番网上调查,ROC曲线起源于第二次世界大战时期雷达兵对雷达的信号判断【1】。当时每一个雷达兵的任务就是去解析雷达的信号,但是当时的雷达技术还没有那么先进,存在很多噪声(比如一只大鸟飞过),所以每当有信号出现在雷达屏幕上,雷达兵就需要对其进行破译。有的雷达兵比较谨慎,凡是有信号过来,他都会倾向于解析成是敌军轰炸机,有的雷达兵又比较神经大条,会倾向于解析成是飞鸟。这个时候,雷达兵的上司就很头大了,他急需一套评估指标来帮助他汇总每一个雷达兵的预测信息,以及来评估这台雷达的可靠性(如果不论哪一类雷达兵都能准确预测,那这台雷达就很NB~读者可思考其缘由)。于是,最早的ROC曲线分析方法就诞生了,用来作为评估雷达可靠性的指标~在那之后,ROC曲线就被广泛运用于医学以及机器学习领域~

    1.2 ROC曲线的定义

    ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线”,顾名思义,其主要的分析方法就是画这条特征曲线。这里在网上找了一个比较好的图样示例如下,

    ROC曲线示例

    该曲线的横坐标为假阳性率(False Positive Rate, FPR),N是真实负样本的个数,
    FP是N个负样本中被分类器预测为正样本的个数。

    纵坐标为真阳性率(True Positive Rate, TPR),
    TPR=\frac{TP}{P}P是真实正样本的个数,
    TP是P个正样本中被分类器预测为正样本的个数。

    举一个简单的例子方便大家的理解,还是刚才雷达的例子。假设现在有10个雷达信号警报,其中8个是真的轰炸机(P)来了,2个是大鸟(N)飞过,经过某分析员解析雷达的信号,判断出9个信号是轰炸机,剩下1个是大鸟,其中被判定为轰炸机的信号中,有1个其实是大鸟的信号(FP=1),而剩下8个确实是轰炸机信号(TP=8)。因此可以计算出FPR为0.5,TPR为1,而(0.5,1)就对应ROC曲线上一点。

    说到这里,想必大家已经明白这俩个指标的计算方法,再往深挖一点,可以思考一下这俩个指标背后的原理。还是雷达的例子,敏锐的雷达系统我们肯定希望它能把所有的敌方轰炸机来袭都感知到并预测出来,即TPR越高越好,但我们又不希望它把大鸟的飞过也当成轰炸机来预警,即FRP越低越好。因此,大家可以发现,这俩个坐标值其实是有相互制约的一个概念在里面。

    当绘制完成曲线后,就会对模型有一个定性的分析,如果要对模型进行量化的分析,此时需要引入一个新的概念,就是AUC(Area under roc Curve)面积,这个概念其实很简单,就是指ROC曲线下的面积大小,而计算AUC值只需要沿着ROC横轴做积分就可以了。真实场景中ROC曲线一般都会在y=x这条直线的上方,所以AUC的取值一般在0.5~1之间。AUC的值越大,说明该模型的性能越好。

    1.3 ROC曲线的应用场景

    ROC曲线的应用场景有很多,根据上述的定义,其最直观的应用就是能反映模型在选取不同阈值的时候其敏感性(sensitivity, FPR)和其精确性(specificity, TPR)的趋势走向【2】。不过,相比于其他的P-R曲线(精确度和召回率),ROC曲线有一个巨大的优势就是,当正负样本的分布发生变化时,其形状能够基本保持不变,而P-R曲线的形状一般会发生剧烈的变化,因此该评估指标能降低不同测试集带来的干扰,更加客观的衡量模型本身的性能。要解释清楚这个问题的话,大家还是先回顾一下混淆矩阵。

    混淆矩阵

    其中,精确率P的计算公式为,

    召回率R的计算公式为,

    此时,若将负样本的数量增加,扩大个10倍,可以预见FP,TN都会增加,必然会影响到P,R。但ROC曲线的俩个值,FPR只考虑第二行,N若增大10倍,则FP,TN也会成比例增加,并不影响其值,TPR更是只考虑第一行,不会受到影响。这里在网上盗个图【3】,方便大家理解哈~

    ROC曲线和P-R曲线对比图

    其中第一行ab均为原数据的图,左边为ROC曲线,右边为P-R曲线。第二行cd为负样本增大10倍后俩个曲线的图。可以看出,ROC曲线基本没有变化,但P-R曲线确剧烈震荡。因此,在面对正负样本数量不均衡的场景下,ROC曲线(AUC的值)会是一个更加稳定能反映模型好坏的指标。

    ------------------第二菇 - 如何绘制ROC曲线------------------

    2.1 ROC曲线的绘制原理

    如果大家对二值分类模型熟悉的话,都会知道其输出一般都是预测样本为正例的概率,而事实上,ROC曲线正是通过不断移动分类器的“阈值”来生成曲线上的一组关键点的。可能这样讲有点抽象,还是举刚才雷达兵的例子。每一个雷达兵用的都是同一台雷达返回的结果,但是每一个雷达兵内心对其属于敌军轰炸机的判断是不一样的,可能1号兵解析后认为结果大于0.9,就是轰炸机,2号兵解析后认为结果大于0.85,就是轰炸机,依次类推,每一个雷达兵内心都有自己的一个判断标准(也即对应分类器的不同“阈值”),这样针对每一个雷达兵,都能计算出一个ROC曲线上的关键点(一组FPR,TPR值),把大家的点连起来,也就是最早的ROC曲线了。

    为方便大家进一步理解,本菇也在网上找到了一个示例跟大家一起分享【4】。下图是一个二分模型真实的输出结果,一共有20个样本,输出的概率就是模型判定其为正例的概率,第二列是样本的真实标签。


    二值分类模型输出结果示例

    现在我们指定一个阈值为0.9,那么只有第一个样本(0.9)会被归类为正例,而其他所有样本都会被归为负例,因此,对于0.9这个阈值,我们可以计算出FPR为0,TPR为0.1(因为总共10个正样本,预测正确的个数为1),那么我们就知道曲线上必有一个点为(0, 0.1)。依次选择不同的阈值(或称为“截断点”),画出全部的关键点以后,再连接关键点即可最终得到ROC曲线如下图所示。

    ROC曲线示例图

    其实还有一种更直观的绘制ROC曲线的方法,这边简单提一下。就是把横轴的刻度间隔设为\frac{1}{N},纵轴的刻度间隔设为\frac{1}{P},N,P分别为负样本与正样本数量。然后再根据模型的输出结果降序排列,依次遍历样本,从0开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,遍历完所有样本点以后,曲线也就绘制完成了。究其根本,其最大的好处便是不需要再去指定阈值寻求关键点了,每一个样本的输出概率都算是一个阈值了。当然,无论是工业界还是学术界的实现,都不可能手动去绘制,下面就来讲一下如何用Python高效绘制ROC曲线。

    2.2 ROC曲线绘制的Python实现

    熟悉sklearn的读者肯定都知道,几乎所有评估模型的指标都来自sklearn库下面的metrics,包括计算召回率,精确率等。ROC曲线的绘制也不例外,都得先计算出评估的指标,也就是从metrics里面去调用roc_curve, auc,然后再去绘制。

    from sklearn.metrics import roc_curve, auc
    

    roc_curve和auc的官方说明教程示例如下【5】。

    # 数据准备
    >>> import numpy as np
    >>> from sklearn import metrics
    >>> y = np.array([1, 1, 2, 2])
    >>> scores = np.array([0.1, 0.4, 0.35, 0.8])
    

    # roc_curve的输入为
    # y: 样本标签
    # scores: 模型对样本属于正例的概率输出
    # pos_label: 标记为正例的标签,本例中标记为2的即为正例
    >>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
    # 假阳性率
    >>> fpr
    array([ 0. , 0.5, 0.5, 1. ])
    # 真阳性率
    >>> tpr
    array([ 0.5, 0.5, 1. , 1. ])
    # 阈值
    >>> thresholds
    array([ 0.8 , 0.4 , 0.35, 0.1 ])

    # auc的输入为很简单,就是fpr, tpr值
    >>> auc = metrics.auc(fpr, tpr)
    >>> auc
    0.75

    因此调用完roc_curve以后,我们就齐全了绘制ROC曲线的数据。接下来的事情就很简单了,调用plt即可,还是用官方的代码示例一步到底。

    import matplotlib.pyplot as plt
    plt.figure()
    lw = 2
    plt.plot(fpr, tpr, color='darkorange',
             lw=lw, label='ROC curve (area = %0.2f)' % auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.show()
    

    最终生成的ROC曲线结果如下图。


    ROC曲线结果

    至此,整一套ROC曲线的绘制就说明白了。

    简单总结一下本文,先是讲述了ROC曲线的历史渊源,引导读者理解ROC曲线的各个基本概念,又与P-R曲线做了详细的对比,让读者理解其应用场景,最后接地气的轻微解读了一番其绘制过程,并附上了代码实现。希望大家读完本文后对ROC曲线会有一个全新的认识。有说的不对的地方也请大家指出,多多交流,大家一起进步~?

    参考文献:
    【1】https://www.ncbi.nlm.nih.gov/books/NBK22319/
    【2】https://stats.stackexchange.com/questions/28745/advantages-of-roc-curves
    【3】https://blog.csdn.net/songyunli1111/article/details/82285266
    【4】https://www.zhihu.com/question/22844912/answer/246037337
    【5】http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve

    拥有21钻 (约2.25元)
    关注
    "小礼物走一走,来简书关注我"
          共4人赞赏
    赞赏
    广告

    全部评论9只看作者
    按时间倒序
    按时间正序

    被以下专题收入,发现更多相似内容

    推荐阅读更多精彩内容

    展开全文
  • roc

    2011-01-11 18:28:00
    (receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定...

    接受者操作特性曲线概述

      接受者操作特性曲线 (receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。接受者操 作特性曲线就是以虚报概率为横轴,击中概率为纵轴所组成的坐标图,和被试在特定刺激条件下由于采用不同的判断标准得出的不同结果画出的曲线。

    编辑本段 ROC曲线的绘制

      ROC曲线的具体绘制实例:杨治良 (1983) 曾做过这样一个实验:选图画页500页,分成五个组,每组100张。五组画页的先定概率分别是0.1、0.3、0.5、0.7和0.9。对于每一组画页, 主试者使用一种信号的先定概率,然后按此先定概率呈现给被试者一定数量的画页,要求被试者把它们当做“信号”记住。例如,先定概率为0.1时,则当作“信 号”的画页为10张;当做“噪音”的画页为90张。作为信号的画页呈现完毕之后,与此组作为噪音的画页混合,然后随机地逐张呈现给被试。这时,每呈现一张 画页,即要求被试判断此画页是“信号”还是“噪音”,并要求被试把结果记录在实验纸上。   根据五种先定概率得到的实验结果,就可计算击中概率和虚惊概率。最后,根据不同先定概率下的击中概率和虚惊概率,就可在图上确定各点的位置,把五点联接起来就绘成一条 ROC曲线。

    编辑本段 ROC曲线的属性

       (1)β值的改变独立于d’的变化,考察β值变化对P(y/SN)和P(y/N)的影响时发现:当β接近无穷大时,击中概率几乎为0,即信号全当成噪音 接受;当β接近0时,虚报概率几乎为0,即噪音全当成信号接受;而当β从接近0向无穷大渐变的过程中,将形成一条完整地ROC曲线,曲线在某一处达到最佳 的标准βOPT。(2)ROC曲线的曲率反应敏感性指标d’:对角线,代表P(y/SN)=P(y/N),即被试者的辨别力d’为0,ROC曲线离这条线 愈远,表示被试者辨别力愈强,d’的值当然就愈大。由上可知,d’的变化使ROC曲线形成一个曲线簇,而β的变化体现在这一曲线簇中的某一条曲线上不同点 的变化。此外,如果将ROC曲线的坐标轴变为Z分数坐标,我们将看到ROC曲线从曲线形态变为直线形态。这种坐标变换可以用来验证信号检测论 一个重要假设,即方差齐性假设

    展开全文
  • ROC曲线学习总结

    万次阅读 多人点赞 2019-08-19 15:22:38
    文章目录ROC曲线学习总结1. ROC曲线(Receiver Operating Characteristic)的概念和绘制2. 利用ROC曲线评价模型性能——AUC(Area Under Curve)3. 利用ROC曲线选择最佳模型3.1 不同模型之间选择最优模型3.2 同一模型中...

    ROC曲线学习总结

    最近在学习机器学习基础知识部分的时候,看到了用于评估模型性能的ROC曲线,想起来之前上课的时候听老师提起过,当时没有认真去看,所以这次大体上了解了一下,来谈谈自己的看法,并做些总结。

    1. ROC曲线(Receiver Operating Characteristic)的概念和绘制

    ​ ROC的全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,首先是由二战中的电子工程师和雷达工程师发明的,用来侦测战场上的敌军载具(飞机、船舰),也就是信号检测理论。之后很快就被引入了心理学来进行信号的知觉检测。此后被引入机器学习领域,用来评判分类、检测结果的好坏。因此,ROC曲线是非常重要和常见的统计分析方法。

    首先介绍一下在模型评估上的一些基本概念:

    真实情况 预测结果 含义 统计量
    正例 反例
    正例 TP(将正例正确预测为正例) FN(将正例错误预测为负例) TP + FN 表示实际数据集中正样本的数量 召回率Recall / 灵敏度Sensitivity / TPR = TP/(TP+FN), 漏诊率 = 1 - 灵敏度
    反例 FP(将负例错误的预测为正例) TN(将负例正确的预测为负例) FP + TN 表示实际数据集中负样本的数量 FPR = FP/(FP+TN), 特异度(Specificity) = 1 - FPR = TN/(FP+TN)
    加和含义 TP + FP 表示预测的正类样本数 FN + TN 表示预测的负类样本数 TP + FN + FP + TN 表示样本总数
    统计量 精确率Precision = TP/(TP+FP) 正确率Accuracy = (TP+TN)/(TP+TN+FP+FN), 错误率 = (FP+FN)/(TP+TN+FP+FN), F-measure = 2*(Precision*Recall)/(Precision+Recall)

    其中最重要的两个公式如下:

    TPR=TPTP+FN,FPR=FPFP+TN TPR = \frac{TP}{TP+FN} ,FPR = \frac{FP}{FP+TN}

    在ROC曲线图中,每个点以对应的FPRFPR值为横坐标,以TPRTPR值为纵坐标

    ROC曲线的绘制步骤如下:

    1. 假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
    2. 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
    3. 每次选取一个不同的threshold,得到一组FPR和TPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点。
    4. 根据3中的每个坐标点,画图。

    ROC曲线绘制实例

    1、分析数据
    y_true = [0, 0, 1, 1];scores = [0.1, 0.4, 0.35, 0.8];
    2、列表

    样本 预测属于P的概率(score) 真实类别
    y[0] 0.1 N
    y[1] 0.4 N
    y[2] 0.35 P
    y[3] 0.8 P

    3、将截断点依次取为score值,计算TPR和FPR。
    当截断点为0.1时:
    说明只要score>=0.1,它的预测类别就是正例。 因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [1, 1, 1, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=2 FN=0
    反例 FP=2 TN=0

    由此可得:
    TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 1;

    当截断点为0.35时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 1, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=2 FN=0
    反例 FP=1 TN=1

    由此可得:
    TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 0.5;

    当截断点为0.4时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 0, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=1 FN=1
    反例 FP=1 TN=1

    由此可得:
    TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0.5;

    当截断点为0.8时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 0, 0, 1];

    正例与反例信息如下:

    正例 反例
    正例 TP=1 FN=1
    反例 FP=0 TN=2

    由此可得:
    TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0;

    4、根据TPR、FPR值,以FPR为横轴,TPR为纵轴画图。

    2. 利用ROC曲线评价模型性能——AUC(Area Under Curve)

    ​ AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏。AUC是衡量二分类模型优劣的一种评价指标,表示正例排在负例前面的概率。一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。

    之所以采用AUC来评价,主要还是考虑到ROC曲线本身并不能直观的说明一个分类器性能的好坏,而AUC值作为一个数量值,具有可比较性,可以进行定量的比较。

    AUC值的计算方法

    • 将坐标点按照横坐标FPR排序 。
    • 计算第ii个坐标点和第i+1i+1个坐标点的间距dxdx
    • 获取第ii或者i+1i+1个坐标点的纵坐标y。
    • 计算面积微元ds=ydxds=ydx
    • 对面积微元进行累加,得到AUC。

    AUC值对模型性能的判断标准

    1. AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
    2. 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
    3. AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
    4. AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

    3. 利用ROC曲线选择最佳模型

    首先了解一下ROC曲线图上很重要的四个点:

    1. 第一个点(0,1)(0,1),即FPR=0, TPR=1,这意味着FN(False Negative)=0,并且FP(False Positive)=0。意味着这是一个完美的分类器,它将所有的样本都正确分类。
    2. 第二个点(1,0)(1,0),即FPR=1,TPR=0,意味着这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
    3. 第三个点(0,0)(0,0),即FPR=TPR=0,即FP(False Positive)=TP(True Positive)=0,可以发现该分类器预测所有的样本都为负样本(Negative)。
    4. 第四个点(1,1)(1,1),即FPR=TPR=1,分类器实际上预测所有的样本都为正样本。

    从上面给出的四个点可以发现,==ROC曲线图中,越靠近(0,1)的点对应的模型分类性能越好。==而且可以明确的一点是,ROC曲线图中的点对应的模型,它们的不同之处仅仅是在分类时选用的阈值(Threshold)不同,每个点所选用的阈值都对应某个样本被预测为正类的概率值。

    那么我们如何根据ROC曲线图定量的找到当前最优的分类模型呢?

    3.1 不同模型之间选择最优模型

    ​ 当然最直观的比较方式就是基于AUC值,不同的模型对应的ROC曲线中,AUC值大的模型性能自然相对较好。而当AUC值近似相等时,有两种情况:第一种是ROC曲线之间没有交点;第二种是ROC曲线之间存在交点。在两个模型AUC值相等时,并不代表两个模型的分类性能也相等。

    ROC曲线之间没有交点

    ​ 如下图所示,A,B,C三个模型对应的ROC曲线之间交点,且AUC值是不相等的,此时明显更靠近(0,1)(0,1)点的A模型的分类性能会更好。

    ROC曲线之间存在交点

    ​ 如下图所示,模型A、B对应的ROC曲线相交却AUC值相等,此时就需要具体问题具体分析:当需要高Sensitivity值时,A模型好过B;当需要高Specificity值时,B模型好过A。

    在这里插入图片描述

    3.2 同一模型中选择最优点对应的最优模型

    ​ 根据前面的内容,我们可以知道,在同一条ROC曲线上,越靠近(0,1)(0,1)的坐标点对应的模型性能越好,因为此时模型具有较高的真正率和较低的假正率。那么我们如何定量的从一条ROC曲线上找到这个最优的点呢?通常需要借助ISO精度线来找到这个最优的点

    ISO精度线(ISO Accuracy Lines)

    ​ ISO精度线实际上一类斜率确定而截距不确定的直线,设ISO精度线的方程为y=ax+by=ax+b,其中aa为直线的斜率,bb为直线的截距。

    a=NEGPOSa = \frac{NEG}{POS}

    ​ 其中,NEGNEG为数据集中负样本的数目,POSPOS为数据集中正样本的数目

    ​ 如下图所示,当a=0.5a=0.5时,图中的红线都可以作为ISO精度线

    在这里插入图片描述

    根据ISO精度线确定最优点

    ​ 因为ROC曲线上的点都是在同一模型下改变分类阈值得到的,所以在同一条ROC曲线上确定最优点的过程,其实就是确定最佳分类阈值的过程,这个阈值能够让模型在高真正率和低假正率之间取得最好的平衡,即模型的分类性能最好。

    根据ISO精度线确定最优点的步骤:

    1. 首先得到ISO精度线的斜率 a=NEGPOSa = \frac{NEG}{POS}

    2. 初始化截距b=0b=0,即此时的直线方程为y=axy=ax

    3. 逐渐增大截距,即把直线向左上角移动,直到直线与ROC曲线只有一个交点,则这个交点即为我们要找的最优点,这个最优点对应的分类阈值即为使得当前模型性能最优的分类阈值(本来刚开始考虑这个点应该是切点,不过后来想想应该不是,因为ROC图本身是不连续的,相邻节点间都是通过直线连接的)

    3.3 当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变

    ​ 之所以把ROC曲线的这个特性特意提出来讲,是因为我觉得这是ROC曲线和AUC这个评价标准最大的优势所在。其他的如正确率、精确率、召回率和F值都会受到样本分布的影响,即对于同一模型,采用这些指标进行性能评估的话,如果输入的样本中正负样本分布发生变化,则最终的正确率等参数也会变化,这种最终结果会被输入样本分布影响的特性,显然使得这些指标在评估某个样本性能时会对输入样本产生依赖,不能很客观的反应模型的性能(所以这也是为什么一个可信数据集非常重要的原因,因为数据集不仅影响对模型的训练,也会直接影响对模型性能的评估。基于这两点,我们就可以断言,对于同一个模型,更可信的数据集肯定能够取得更好的效果。)

    ​ 而对应于同一个模型,当其中的正负样本分布发生变化时,ROC曲线能够基本保持不变,这就保证至少在模型评估阶段,样本分布不会对这一过程产生太大的影响。

    ​ 那么如何理解这种不变性呢?网上找了很多博客都没有人解释过,我也只能简要的谈谈我的想法,日后如果看到了比较权威的解释再来补充吧。

    ​ 首先,ROC曲线每个点都是以某个阈值对应的TPR为纵坐标,以对应FPR为横坐标,所以不变性肯定是反映在样本分布改变时,ROC曲线图中的点随着阈值变化横纵坐标的变化保持一致。

    ​ 举个例子,当一个数据集中有PP个正样本和NN个负样本时,对应于某个阈值ThresholdThreshold,其TPRTPRFPRFPR计算公式如下:

    TPR=TPTP+FN,FPR=FPFP+TN TPR = \frac{TP}{TP+FN} ,FPR = \frac{FP}{FP+TN}

    ​ 当我们将负样本的数目增加十倍,即此时数据集中有PP个正样本和10N10*N个负样本,根据上面的计算公式可知,在负样本数量增加十倍之后,

    1. TPRTPR值的取值范围是不变,因为TP+FNTP+FN不变,同时TPTP的取值为[0,P][0,P]之间的整数,所以TPRTPR的离散取值区间在负样本增加的情况下是不变的。
    2. TPRTPR值不变的条件下,此时对应的ThresholdThreshold阈值基本不变(如果变化,则TPRTPR值不可能不变),其对应的FPRFPR值的取值范围也是不变的。根据样本独立同分布的假设,负样本数目改变,但负样本的预测概率分布是不变的,即当ThresholdThreshold不变时,FPFP值和FP+TNFP+TN值应该是等比例变化的,此时FPRFPR值不变。

    综上,我们可以从感性认识上证明当样本的分布发生变化时,ROC曲线能够基本保持不变。

    接下来给出一个实例,对比ROC曲线和PR(Precision-Recall)曲线在样本分布变化时的不同。下图中,(a)和(b)分别为从初始测试集中得到的ROC曲线和PR曲线,©和(d)分别为负样本增加十倍之后得到的ROC曲线和PR曲线。由图中可知,当样本分布变化时,ROC曲线基本没有变化,而PR曲线则变化很大,这充分说明了ROC曲线在模型性能评估上的优势。

    在这里插入图片描述

    ROC曲线在多分类问题上的推广

    ​ 经典的ROC曲线适用于对二分类问题进行模型评估,通常将它推广到多分类问题的方式有两种:

    1. 对于每种类别,分别计算其将所有样本点的预测概率作为阈值所得到的TPRTPRFPRFPR值(是这种类别为正,其他类别为负),最后将每个取定的阈值下,对应所有类别的TPRTPR值和FPRFPR值分别求平均,得到最终对应这个阈值的TPRTPRFPRFPR
    2. 首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。

    ​ 上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为’macro’和’micro’的情况。

    展开全文
  • ROC学习笔记

    2017-03-16 19:07:07
    roc
  • 多分类下的ROC曲线和AUC

    万次阅读 多人点赞 2018-03-05 17:37:20
    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:...

            本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:http://blog.csdn.net/ye1215172385/article/details/79448575

            由于ROC曲线是针对二分类的情况,对于多分类问题,ROC曲线的获取主要有两种方法:

            假设测试样本个数为m,类别个数为n(假设类别标签分别为:0,1,...,n-1)。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。

             比如n等于3,标签应转换为:

            方法1:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。

            方法2:首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。

           上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为'macro'和'micro'的情况。

          下面以方法2为例,直接上代码,概率矩阵P和标签矩阵L分别对应代码中的y_score和y_one_hot:

     

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import numpy as np
    import pandas as pd
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegressionCV
    from sklearn import metrics
    from sklearn.preprocessing import label_binarize
    
    if __name__ == '__main__':
        np.random.seed(0)
        data = pd.read_csv('iris.data', header = None)  #读取数据
        iris_types = data[4].unique()
        n_class = iris_types.size
        x = data.iloc[:, :2]  #只取前面两个特征
        y = pd.Categorical(data[4]).codes  #将标签转换0,1,...
        x_train, x_test, y_train, y_test = train_test_split(x, y, train_size = 0.6, random_state = 0)
        y_one_hot = label_binarize(y_test, np.arange(n_class))  #装换成类似二进制的编码
        alpha = np.logspace(-2, 2, 20)  #设置超参数范围
        model = LogisticRegressionCV(Cs = alpha, cv = 3, penalty = 'l2')  #使用L2正则化
        model.fit(x_train, y_train)
        print '超参数:', model.C_
        # 计算属于各个类别的概率,返回值的shape = [n_samples, n_classes]
        y_score = model.predict_proba(x_test)
        # 1、调用函数计算micro类型的AUC
        print '调用函数auc:', metrics.roc_auc_score(y_one_hot, y_score, average='micro')
        # 2、手动计算micro类型的AUC
        #首先将矩阵y_one_hot和y_score展开,然后计算假正例率FPR和真正例率TPR
        fpr, tpr, thresholds = metrics.roc_curve(y_one_hot.ravel(),y_score.ravel())
        auc = metrics.auc(fpr, tpr)
        print '手动计算auc:', auc
        #绘图
        mpl.rcParams['font.sans-serif'] = u'SimHei'
        mpl.rcParams['axes.unicode_minus'] = False
        #FPR就是横坐标,TPR就是纵坐标
        plt.plot(fpr, tpr, c = 'r', lw = 2, alpha = 0.7, label = u'AUC=%.3f' % auc)
        plt.plot((0, 1), (0, 1), c = '#808080', lw = 1, ls = '--', alpha = 0.7)
        plt.xlim((-0.01, 1.02))
        plt.ylim((-0.01, 1.02))
        plt.xticks(np.arange(0, 1.1, 0.1))
        plt.yticks(np.arange(0, 1.1, 0.1))
        plt.xlabel('False Positive Rate', fontsize=13)
        plt.ylabel('True Positive Rate', fontsize=13)
        plt.grid(b=True, ls=':')
        plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)
        plt.title(u'鸢尾花数据Logistic分类后的ROC和AUC', fontsize=17)
        plt.show()

          实验输出结果:

     

           可以从上图看出,两者计算结果一致!      

            实验绘图结果:

    展开全文
  • sklearn.metrics.roc_curve解析

    万次阅读 多人点赞 2018-05-28 21:52:20
    官方网址:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics首先认识单词:metrics:['mɛtrɪks] : 度量‘指标 curve :[kɝv] : 曲线这个方法主要用来计算...sklearn.metrics.roc_cur...
  • ROC曲线作用,ROC曲线的概念,ROC曲线优点,SPSS实现等
  • roc matlab曲线

    2020-12-21 17:11:17
    ROC曲线 matlab版本 只需输入两个向量即可
  • ROC question

    2020-12-27 09:39:32
    I notice that you train the mtcnn and release model, can you tell me your roc? Compared with the original model, how about performance of your model? <p>Thanks</p><p>该提问来源于开源项目:...
  • roc曲线

    2019-10-14 14:01:56
    登录注册写文章首页下载APP机器学习基础(1)- ROC曲线理解蘑菇轰炸机关注赞赏支持机器学习基础(1)- ROC曲线理解22018.09.09 16:14:12字数 2776阅读 8325本文用于理解ROC曲线的定义,绘制过程及其应用实现。...
  • roc曲线的意义_ROC曲线分析

    千次阅读 2020-12-19 09:48:42
    作者:柏安之 封面:自己想吧01ROC曲线的主要作用(1)ROC曲线可以很容易地查出一个分类器在某个阈值时对样本的识别能力。(2)可以借助ROC曲线选择出某一诊断方法最佳的诊断界限值。ROC曲线越是靠近左上角,试验的FPR越...
  • ROC曲线

    2019-12-24 23:44:17
    ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线” ROC曲线纵坐标真阳性率:TPR = TP/(TP+FN) ROC曲线横坐标假阳性率:FPR = FP/(FP+TN) auc就是ROC曲线下的面积。 ....
  • 对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score1,以及即将要讨论的ROC和AUC。本文通过对这些指标的原理做一个简单的介绍,然后用python分别实现二分类和多分类的ROC曲线。 1 基本概念...
  • 下面来看一下ROC和PR曲线(以下内容为自己总结): 1、ROC曲线: ROC(Receiver Operating Characteristic)曲线是以假正率(FP_rate)和真正率(TP_rate)为轴的曲线,ROC曲线下面的面积我们叫做AUC,如下图所示:...
  • ROC PRC

    2020-08-11 21:45:06
    1. ROCROC AUC ROC曲线是一种评定二分类模型对正类预测效果的曲线图。x 轴是假阳率(FPR),y 轴是真阳率(TPR) FPR=FPFP+TNFPR = \frac{FP}{FP+TN}FPR=FP+TNFP​ 反例说错了多少 TPR=TPTP+FNTPR = \frac{TP}{TP+...
  • 分类模型评估之ROC-AUC曲线和PRC曲线

    万次阅读 多人点赞 2016-06-30 11:27:09
    ROC曲线和AUC ROC(Receiver Operating Characteristic,接受者工作特征曲线)曲线和AUC常被用来评价一个二值分类器(binary classifier...博文介绍ROC和AUC的特点,讨论如何作出ROC曲线图以及计算AUC。 AUC是现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,504
精华内容 3,001
关键字:

roc