简述

  机器学习很多是为测试样本产生一个预测值,然后将这个预测值与阈值进行对比,若大于阈值则分为正类,否则分为反类。这个预测值的好坏,直接决定了学习器泛化能力。根据这个预测值,我们可以对测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个截断点将样本分为两部分,前面一部分作为正例,后面一部分作为反例。
  如果我们更加重视“查准率”,则可以选择排序中靠前的位置进行阶段(尽可能的准确预测正例);若更加重视“查全率”,则可以选择排序中靠后的位置进行截断(尽可能多的包含正例)。因此排序的好坏,直接体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏。ROC曲线就是从这个角度出发来研究学习器泛化性能的。

真正例率和假正例率

  • 真正例率:前半部分预测为正的样例占实际为正的样例的比例
TPR=TPTP+FNTPR=TPTP+FN

TPR = \frac{TP}{TP+FN}

  • 假正例率:后半部分预测为正的样例占实际为反的样例的比例

    FPR=FPTN+FPFPR=FPTN+FP

    FPR = \frac{FP}{TN+FP}

数据集:
x1  0.9894352   1
x2  0.9794352   1
x3  0.977945262 1
x4  0.960783037 1
x5  0.944241384 1
x6  0.93664411  1
x7  0.924929575 1
x8  0.920406882 0
x9  0.888570298 1
x10 0.882629706 1
x11 0.882401646 1
x12 0.853832401 1
x13 0.839347591 1
x14 0.836771262 1
x15 0.833144033 1
x16 0.828867488 1
x17 0.815303556 0
x18 0.805622582 1
x19 0.802897991 1
x20 0.789226942 0
x21 0.758042059 1
x22 0.716307689 1
x23 0.69443123  1
x24 0.693818886 1
x25 0.684523938 1
x26 0.672463705 1
x27 0.629302653 0
x28 0.58780351  1
x29 0.548529475 1
x30 0.488394372 0
x31 0.483994649 0
x32 0.43695701  1
x33 0.408835528 1
x34 0.393323919 0
x35 0.374834691 1
x36 0.349519471 0
x37 0.29704696  0
x38 0.273542305 0
x39 0.205748558 0
x40 0.187974058 1
x41 0.179264057 0
x42 0.164596829 0
x43 0.142258075 0
x44 0.138514809 0
x45 0.128892511 0
x46 0.126119067 0
x47 0.113361272 0
x48 0.083327915 0
x49 0.071568497 0
x50 0.031525573 0

测试样本包含三列,第一列样本序号,第二列为预测值,第三列为真实标记值。

#-*- coding: utf-8 -*-
import matplotlib.pyplot as pltdef get_data(path):f = open(path)data_list  = f.readlines()return data_listdef get_truth_value():threshold_list = []truth_value = []data_list  = get_data('test.txt')for item in data_list:truth_value.append(item.strip().split('\t')[2])return truth_valuedef plot_curve(x,y):plt.scatter(x,y)plt.xlabel(u"假正例率",fontproperties='SimHei')plt.ylabel(u"真正例率",fontproperties='SimHei')plt.show()def get_tpr_fpr():truth_value = get_truth_value()tpr = []fpr = []for i  in range(1,len(truth_value)):forecast = []forecast.extend([1]*(i))forecast.extend([0]*(len(truth_value) - i))tmp_list = [forecast[j]*int(truth_value[j]) for j in range(len(forecast))]tp = sum(tmp_list[0:i])fp = i - tpfn = sum([int(x) for x in truth_value[i:len(truth_value)]])tn = len(truth_value)-i - fnprint(tp,fp,fn,tn)tpr.append(tp*1.0/(tp+fn))fpr.append(fp*1.0/(tn+fp))return tpr,fpr  if __name__ == "__main__":x,y = get_tpr_fpr()plot_curve(y,x)
绘图

这里绘图方法是将测试样本的每一个值作为阈值,然后分别计算出真正例率和假正例率,如图所示:

对于同一个测试样本,不同的学习器产生的预测值不同,绘制的ROC曲线也不同,当一个曲线将另一个曲线完全包住时,包住的曲线对应的学习器的泛化能力是强于另外一个的,当两条曲线有交点时,需要计算ROC曲线围住的面积:

AUC=12∑i=1m−1(xi+1−xi)∗(yi+yi+1)AUC=12∑i=1m−1(xi+1−xi)∗(yi+yi+1)

AUC = \frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)*(y_i+y_{i+1})

提示:这里讲面积划分为许多梯形的面积,然后求和,梯形面积公式:

S=12(上底+下底)∗高S=12(上底+下底)∗高

S = \frac{1}{2}(上底+下底)*高

python 绘制ROC曲线相关推荐

  1. 基于python绘制ROC曲线

    基于python绘制ROC曲线,直接附代码: from sklearn.metrics import roc_curve, auc from sklearn.model_selection impor ...

  2. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

    目录 一.ROC曲线 二.TP.FP.TN.FN 三. python绘制ROC曲线(二分类) 1.思路 2.关键代码 3.完整代码 四. python绘制ROC曲线(多分类) 五.参考文献 一.ROC ...

  3. python:Sklearn SVM使用留一法时如何绘制ROC曲线与计算AUC

    在前面的一篇文章我们给出了使用Sklearn 中的SVM进行分类时如何使用留一法来进行分类. python基于sklearn的SVM和留一法(LOOCV)进行二分类 如何在使用留一法时绘制ROC曲线和 ...

  4. 机器学习:python绘制P-R曲线与ROC曲线

    Python绘制P-R曲线与ROC曲线 查准率与查全率 P-R曲线的绘制 ROC曲线的绘制 查准率与查全率   P-R曲线,就是查准率(precision)与查全率(recall)的曲线,以查准率作为 ...

  5. python实现绘制ROC曲线寻找指标最佳诊断临界值

    实现功能: 根据患者的诊断结果以及某一个诊断指标数值,绘制ROC曲线,寻找出这个指标的最佳诊断临界值,并在曲线中标记出此时的坐标. 实现代码: import numpy as np import ma ...

  6. Python下使用sklearn绘制ROC曲线(超详细)

    什么是ROC曲线?可以参见(https://blog.csdn.net/hesongzefairy/article/details/104295431) 现在我们知道ROC曲线上的一组组(FPR,TP ...

  7. R语言构建logistic回归模型并评估模型:模型预测结果抽样、可视化模型分类预测的概率分布情况、使用WVPlots包绘制ROC曲线并计算AUC值

    R语言构建logistic回归模型并评估模型:模型预测结果抽样.可视化模型分类预测的概率分布情况.使用WVPlots包绘制ROC曲线并计算AUC值 目录

  8. R语言使用pROC包绘制ROC曲线、获取最优阈值(threshold)及最优阈值对应的置信区间

    R语言使用pROC包绘制ROC曲线并获取最佳阈值(threshold)及最佳阈值对应的置信区间 #ROC曲线 ROC(receiver operating characteristic curve)接 ...

  9. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)

    R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal.density.fitdistr.logcondens.logcondens.smooth) ...

最新文章

  1. Python培训教程分享:如何实现pygame的初始化和退出操作?
  2. 快速排序(抽象理解,最快了解)
  3. 由于昨天没发博客,在此向广大粉丝们道歉。 今天发的是一个数据库的代码
  4. Spark基础学习笔记06:搭建Spark On YARN模式的集群
  5. 图神经网络:Graph Neural Networks
  6. 能被3整除的Fibonacci的下标号
  7. c语言sqrt函数无作用,如何在不使用C语言的sqrt函数的情况下获得数字的平方根...
  8. PPT快速成长经验,我将其免费告诉你
  9. VSTO安装卸载方法
  10. 三维重建——D2HC-RMVSNet网络详解
  11. Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by se
  12. bootstrap学习心得总结
  13. 柏诚股份冲刺上交所:年营收27.4亿 拟募资4.7亿
  14. 2023年软考高项论文秘籍大讲堂|开篇
  15. C语言经典练习题(2)——“冒泡排序(Bubble Sort)“
  16. termux安装配置
  17. 【能效管理】关于学校预付费水电系统云平台应用分析介绍
  18. cf新手最多的服务器,从最初的42个服务器到现在仅剩4个,是什么让你离开了穿越火线?...
  19. 2019晋城一中开放日
  20. Linux 学习笔记(六):Linux

热门文章

  1. 云计算行业到了最危险的时刻
  2. MySQL的图形化界面开发工具DataGrip的下载安装
  3. USACO 2018 January Contest Platinum A: Lifeguards 题解
  4. 台资企业管理职的中英文称谓以及级别
  5. 再生龙制作u盘启动linux,再生龙制作U盘启动盘教程 | 楚盟博客
  6. 如何更改图片的背景色(PS、证件照之星)
  7. SpringBoot-NutzDao
  8. 阿里云搭建frp(其他云,通用)内网穿透
  9. 【经营智慧】004.做一个善于发挥自己才智的人
  10. 银行术语之“表内”“表外”