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. C#中实现文件拖放打开的方法

    C#中实现文件拖放打开的方法 设置Form属性 AllowDrop = True; 在Form事件中 private void Form1_DragDrop(object sender, DragEv ...

  2. C#设计模式学习笔记:(19)策略模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8057654.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第七个模式--策 ...

  3. 少量代码设计一个登录界面(二) – .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 同上篇文章<少量代码设计一 ...

  4. c# 异步编程总结

    异步编程前提 1.学委托 delegate 其中委托中的beginInvoke()和endInvoke()方法必须要会. 2.学习回调函数 (也可以不用,但是一般建议用回调函数中执行endinvoke ...

  5. 二维数组的生成-new的使用

    相关的思路来自于下面这个博客:https://blog.csdn.net/samuelcoulee/article/details/8674388 我们对于其中的一个方案进行了实现与测试——借助new ...

  6. 获取Servlet原生API

    1.请求 <a href="param/test1">Servlet原生API</a> 2.处理方法 @RequestMapping("/para ...

  7. jQuery---jquery.color.js和jquery.lazyload.js的使用

    jquery.color.js的使用 了解即可 <!--1. 引入jquery的js文件--> <script src="jquery-1.12.4.js"> ...

  8. exp导出含有双引号的表

    由于ORACLE默认的表名都是不区分大小写,在创建表时,在数据字典中存储的表名为大写.在有些情况下,如果创建的表在表名上加上双引号("),则创建的表其表名在数据字典中不作转换.比如 SQL& ...

  9. 剑指offer-面试题57_1-和为s的两个数字-双指针

    /* 题目: 输入一个递增数组和一个s,求和等于s的两个数组中的数字. */ /* 思路: 双指针问题. */ #include<iostream> #include<cstring ...

  10. Android ListView的批量处理(多选/反选/删除)

    在Android开发中经常遇到使用ListView的情况,有时候需要的不仅仅是列表显示,还有长按列表进行多选,并且批量删除的情况,在这里记录一下自己的所学. 先上效果图: 几个需要用到的核心方法: / ...