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. 工作五年的.neter的一些经历感想和对未来的一些疑惑

    本次疫情在家办公快一个月了,节省了上下班的时间,外出活动时间,感觉有好多时间可以利用.人一闲下来就容易想事情,很多事情想不通心里堵的厉害,做事都提不起兴趣.至于想些什么呢,我给大家摆一下. 我的经历 ...

  2. 学习jQuery基础语法,并通过一个案例引出jQuery的核心

    jquery是一个快速.小巧,功能强大的javascript函数库. jquery主要用来替代原生的javascript,简化代码. 前端最头疼的就是兼容:IE6/7/8兼容的最高版本是jQuery1 ...

  3. MySQL索引底层数据结构

    一.何为索引? 1.索引是帮助数据库高效获取数据的排好序的数据结构. 2.索引存储在文件中. 3.索引建多了会影响增删改效率. (下面这张图为计算机组成原理内容,每查询一次索引节点,都会进行一次磁盘I ...

  4. MySQL安全管理

    数据库服务器通常包含关键的数据,确保这些数据的安全和完整需要利用访问控制. 一.访问控制 MySQL服务器的安全基础:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少. 访问控制:你需要给用 ...

  5. JS DOM中getElement系列和querySelector系列获取节点

    节点查找方法 document.getElementById() 前面必须是document document.getElementsByName()  前面必须是document ele.getEl ...

  6. fatal: HttpRequestException encountered

    报错:fatal: HttpRequestException encountered 解决方法 Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,才行. ...

  7. nCompass-解决方案介绍

    nCompass-解决方案介绍 1.  IT运维的现状及痛点 业务部门投诉系统不可用,各个部门盘查: 网络是通的:系统资源正常:应用进程状态都是正常的:数据库日志中也没有报错 运维被动: 80%的故障 ...

  8. MySQL 8 用户定义函数

    MySQL Server可以通过创建或者加载UDFs(User-Defined Functions)来扩展服务器功能. 通过CREATE FUNCTION语句加载 UDF,比如: CREATE FUN ...

  9. 纪中17日T2 2322. capacitor

    2322. capacitor (File IO): input:capacitor.in output:capacitor.out 题目描述 输入 输出 样例输入 样例输出 数据范围限制 Solut ...

  10. PHP0002:PHP基础1

    PHP基础 一个表单同时提交get 和 post php保存数据到文件