ROC曲线

ROC曲线是二元分类器中常用的工具,它的全称是 Receiver Operating Characteristic,接收者操作特征曲线。它与precision/recall 曲线特别相似,但是它画出的是true positive rate(recall的另一种叫法)对应false positive rate (FPR)的图。FPR是“负实例”(negative instances) 被错误地分类成“正实例”(positive)的比率。它等同于 1 减去true negative rate(TNR,“负实例”被正确地分类成“负实例”的比率)。TNR也被称为特异性(specificity)。所以ROC曲线画出的也是 sensitivity(也就是recall)vs (1 – specificity)。

为了画出ROC 曲线,我们首先需要计算在不同阈值下的TPR与FPR值,使用roc_curve() 方法:

from sklearn.metrics import roc_curve

fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

然后使用matplotlib 画出FPR对应TPR的图:

def plot_roc_curve(fpr, tpr, label=None):
plt.plot(fpr, tpr, linewidth=2, label=label)
plt.plot([0, 1], [0, 1], 'k--') #加上虚线对角线 plot_roc_curve(fpr, tpr)
plt.show()

同样,这里也有一个折中,更高的recall(TPR)也就意味着分类器会产生更多的false positives(FPR)。虚线代表的是一个完全随机的分类器的ROC曲线,一个好的分类器的ROC曲线要尽可能地远离这条虚线,并要尽可能地接近左上角。

一种比较分类器的办法是评估AUC(area under the curve,曲线下方面积),一个完美的分类器的ROC AUC应等于1,而一个完全随机的分类器的ROC AUC则为0.5。sk-learn提供了一个方法用于计算ROC AUC:

from sklearn.metrics import roc_auc_score

roc_auc_score(y_train_5, y_scores)
>0.9604938554008616

由于ROC曲线与precision/recall(或者PR)曲线非常相似,所以大家可能会好奇到底使用哪个。根据经验,任何时候当positive 类别很少、或是在关注false positive甚于false negative时,使用PR曲线。反之则使用ROC曲线。例如,我们看一下上一个ROC曲线(以及ROC AUC分数),我们可能认为分类器非常好。但是这主要是因为数据集中positive instances(也就是数字5)较少,相对于“非5”少很多。相反,从PR曲线来看,我们可以看到其实这个分类器还有提升的空间(PR曲线应该尽可能地靠近右上角)。

我们接下来训练一个RandomForestClassifier,并对比它的ROC 曲线以及ROC AUC分数。首先,我们需要得到训练集中每条数据的分数。但是RandomForestClassifier类并没有提供decision_function() 的方法,它提供的是一个predict_proba() 方法。一般sk-learn中的分类器中,基本都是提供的这两个方法中的其一。predict_proba() 方法返回一个数组,里面每行是一条数据,每列是一个类别,里面的数值就是这条数据属于这个类别的概率(例如,某条数据有70%的概率代表数字5)。

from sklearn.ensemble import RandomForestClassifier

forest_clf = RandomForestClassifier(random_state=42)
y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3, method='predict_proba')
y_probas_forest
>array([[0.1, 0.9], [1. , 0. ], [0.9, 0.1], ..., [0. , 1. ], [1. , 0. ], [1. , 0. ]])

但是为了画出ROC曲线,我们需要的是分数(scores),并不是概率。一个简单的办法是使用positive类的概率作为分数:

y_scores_forest = y_probas_forest[:, 1]
fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5, y_scores_forest)

现在我们已经有了分数,可以画出ROC曲线(最好是也画出第一个分类器的ROC曲线作为对比):

plt.plot(fpr, tpr, 'b:', label='SGD')
plot_roc_curve(fpr_forest, tpr_forest, 'Random Forest')
plt.legend(loc='lower right')
plt.show()

如上图所示,RandomForestClassifier的ROC曲线看起来比SGDClassifier的更好:它更接近于左上角。显而易见,它的ROC AUC分数也会更高:

roc_auc_score(y_train_5, y_scores_forest)
>0.9920527492698306

如果进一步计算它的precision与recall的话,可以分别得到98% 的precision,以及82%的recall:

y_train_forest_pred = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)
precision_score(y_train_5, y_train_forest_pred)
>0.986046511627907 recall_score(y_train_5, y_train_forest_pred)
>0.8212506917542889

相较上一个分类器,有了很大的提升。

至此,希望大家已经了解了:

  • 如何训练一个二元分类器
  • 为任务选择合适的指标
  • 使用交叉验证评估分类器
  • 使用precision/recall tradeoff 满足你的需求
  • 通过ROC曲线以及ROC AUC分数比较不同的模型

在二元分类器完成之后,我们之后接下来继续看一下多类别分类,让分类器不仅仅是只区分数字5。

分类问题(四)ROC曲线的更多相关文章

  1. 多分类下的ROC曲线和AUC

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

  2. 机器学习:评价分类结果(ROC 曲线)

    一.基础理解 1)定义 ROC(Receiver Operation Characteristic Curve) 定义:描述 TPR 和 FPR 之间的关系: 功能:应用于比较两个模型的优劣: 模型不 ...

  3. 多分类-- ROC曲线

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

  4. ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况

    ROC和AUC介绍以及如何计算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operat ...

  5. 【分类模型评判指标 二】ROC曲线与AUC面积

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80499031 略有改动,仅供个人学习使用 简介 ROC曲线与AUC面积均是用来 ...

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

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

  7. 机器学习:分类算法性能指标之ROC曲线

    在介绍ROC曲线之前,先说说混淆矩阵及两个公式,因为这是ROC曲线计算的基础. 1.混淆矩阵的例子(是否点击广告): 说明: TP:预测的结果跟实际结果一致,都点击了广告. FP:预测结果点击了,但是 ...

  8. 【sklearn】性能度量指标之ROC曲线(二分类)

    原创博文,转载请注明出处! 1.ROC曲线介绍 ROC曲线适用场景 二分类任务中,positive和negtive同样重要时,适合用ROC曲线评价 ROC曲线的意义 TPR的增长是以FPR的增长为代价 ...

  9. scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

    数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 im ...

随机推荐

  1. RaspberryPi 3b+ 安装OpenWrt教程

    layout: post title: "RaspberryPi 3b+ 安装OpenWrt教程" date: 2019-09-28 22:00:00 +0800 categori ...

  2. 将jsp页面转化为图片或pdf(一)(qq:1324981084)

    java高级架构师全套vip教学视频,需要的加我qq1324981084 在项目中遇见了将jsp页面转化为pdf的问题,试过itext,但是itext需要标准的html代码,我的页面中的一些属性是it ...

  3. 消息队列MQ(一)

    消息队列 为什么要用消息队列,都有什么优缺点? 要问的是消息队列都有哪些场景,然后项目里具体实现的什么场景,你在这个场景里用的什么消息队列? 期望的回答是,你们公司有个什么业务,这个业务场景有什么技术 ...

  4. Jetty配置虚拟目录,实现把web项目发布到自定义目录,指定指定上下文访问;jetty编码修改

    2019-12-31     17:28:38 一般只需要把Java站点文件夹或*.war文件拷贝到Web Server的webapps文件夹下,即可启动运行该站点,但更多时候,我们并不想拷贝站点,而 ...

  5. Vue中在template标签中进行判断时注意比较元素

    (一)比较的元素,一个是data元素,另外一个是常量,如下图所示: 编译正常,运行正常,效果在期望中,会显示Hello World,结果如下: (二)比较的元素,一个是data元素,另外一个是cons ...

  6. 服务器CentOS7上安装MySql

    1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成Replaced:grub2.x86_64 1:2.02-0.64.e ...

  7. Vue项目中实现tab栏和步骤条的数据联动

    也就是tab栏切换步骤条随之变化 <template>   <div>     <!-- 面包屑导航  -->     <el-breadcrumb sepa ...

  8. MySQL8服务无法正常启动的解决方法(1053错误)

    个人博客 地址:https://www.wenhaofan.com/article/20190530120545 错误描述 在MySQL安装的最后一步启动失败,如下图所示 在服务和应用程序->服 ...

  9. JN_0018:运行窗口不显示

    1,新建vbs文件 CreateObject("WScript.Shell").Run "cmd /c E:/OneDrive/NodeJS/WebServer/star ...

  10. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...