ROC 曲线介绍以及 python 画法

文章目录

前言

看了一些怎么画ROC曲线的内容,感觉没有找到自己想要的知识,都是零散的或者直接的模板,里面的参数和术语都没有介绍。这篇文章介绍 ROC 基础知识,使用python 绘制。本篇文章参考数据挖掘第八章分类,和哔站,CSDN知识。

一、ROC 曲线是什么?

要搞清楚 ROC 曲线不难,就是 比较分类模型可视化的工具。要使用至少了解一下术语:以二元分类为例,正确类 1,错误类 0。一个数据集就由这两个类组成,我们来预测,结果四种。 真正例、真负例、假正例、假负例:预测正确的 1 类、预测正确的 0 类,预测错误 1 类(实际上是 0 类),预测错误 0 类(实际上是 1 类)。通过字面意思也可以理解,假取反。
设想这两个例子,第一个是对于玉米的分类,玉米用于喂养鸡鸭。我们只需要绝大多数的玉米都是好的就行,偶尔两颗怀粒不影响。另一个就是癌症诊断,特别重视患者病人。这两个例子的结果:玉米对真正例要侧重一些,坏粒一两颗或者再多一些不影响结果,而癌症你想想看,没病的人说成有病,和患癌症的说成没病给放了会怎么样?我们当然更倾向于有病的重要啊(侧重负例),你误判有病我们可以继续检查,但把一个患者放了,最后恶化嗝屁了更加严重,毕竟这是生命。但是到目前为止,为计算分类器的准确率,我们都是假定正例和负例五五开,用正例和负例之和除以校验总数。
ROC曲线(接收者操作特征曲线 Receiver Operating Charateristic ) 是一种比较分类模型可视化的工具,源于二战信号检测理论分析开发的。

  • 曲线显示了给定模型的真正例(TPR)和假正例(FPR)之间的权衡。
  • 给定一个验证集和模型,TPR 是该模型标记正确的正元组的比例。(预测为1,真实为 1 类)
  • FPR 是该模型错误的标记为正的假负例元组的比例。
  • TP、FP、P 和 T 代表:真正例、假正例、正和负元组数,那么可以得出:T P R = T P P , F P R = F P F TPR\space =\space \frac{TP}{P},\space \space \space FPR\space =\space \frac{FP}{F}TPR =P TP ​,FPR =F FP ​

对于二元分类问题,ROC 让我们可以对验证集的不同部分,观察模型准确的识别正实例的比例与模型错误地把负实例识别成为成正实例地比例之间地权衡。TPR 的增加以 FPR 的增加为代价。ROC 下方的面积是模型准确率的度量。
为了绘制模型的 ROC 曲线,模型必须能够返回每个检验元组的类预测概率。使用这些信息对检验元组进行定秩和排序,使得最可能属于正类的元组出现在表的顶部,而最不可能属于正类的元组放在该表的最底部。朴素贝叶斯和向后传播(BP神经网络算法)分类器都返回每个预测概率分布,因而是合适的。对于其他分类器,决策树,可以很容易修改,返回分类概率预测。
对于给定的元组 X , 设概率分类器返回的值为 f(X) -> [0,1].对于二类问题,通常设定阈值 t ,使得 f ( X ) ⩾ t f(X)\geqslant t f (X )⩾t 的元组 X 是正的,而其他元组视为负。 注意:真正例数和假正例数都是 t 的函数,因此可以把他们表示成 TP(t) 和 FP(t),二者都是单调递减函数。

二、绘制 ROC 曲线

1. 图介绍

ROC 曲线的垂直轴表示 TPR,水平轴表示 FPR.为了绘制 M 的ROC 曲线,从左下角开始(坐标原点),检查列表顶部元素的实际类标号。如果正例,TP 增加,从而 TPR 增加,图像上移。负例元组分类为正,FP 增加,FPR增加,图像右移。

ROC 曲线介绍以及 python 画法

图片将就看一下,有一丢丢模糊。上图显示了一个概率分类器对 10 个元组返回的概率值,按概率的递减排序。图中正例和负例都是 5 个,P = F = 5,我们可以确定 TP、FP、TN、FN、TPR、FPR的值。 1 号概率最高,我们假设把这个概率设为阈值,t = 0.9 。那么,分类器就会分类, 1 号为正例,其他的元组都是负例。从而获得 TP = 1,FP = 0.在其余 9 个负例中,5 个实际为负 TN = 5,4 个实际为正,FN = 4.但是我们只需要计算 TPR 和 FPR,TN 和 FN都没用。T P R = T P P = 1 5 = 0.2 F P R = F P N = 0 5 = 0 TPR\space =\space \frac{TP}{P}\space=\space \frac{1}{5}=0.2 \ \space\ FPR\space =\space \frac{FP}{N}\space=\space \frac{0}{5}=0 TPR =P TP ​=5 1 ​=0.2 FPR =N FP ​=5 0 ​=0

从而我们获得一个点(0,0.2).

然后,设置 t 为元组 2 的概率值是 0.8 ,因而该元组现在也被视为正,而元组 3~10都被看做负。元组 2 的实际标号是正,TP = 2,像上述一样可以计算出点 (0,0.4).接下来考察元组 3 的类标号并令 t = 0.7,把他看作正的,就会出事儿了,本身是负例,这里出现了假正例,FP = 1所以产生点(0.2,0.4)以此推下去。就会得到下面的左图。

ROC 曲线介绍以及 python 画法

有许多方法可以从这些点得到一条曲线,最常用的就是凸包,图中还有一条对角线,对模型的每个真正例元组,好像都遇到一个假正例元组。这条直线代表随机猜测,目的是方便比较。
右图显示了两个分类模型的 ROC 曲线,一条对角线。 模型的ROC曲线离对角线越近,模型的准确率越低。如果模型真的很好,随着有序列表(第一张由元组标号的图)向下移动,开始就可能遇到真正例元组,图开始就陡峭地从 0 开始上升,后来遇到的真正例越来越少,假正例越来越多,曲线平缓变得更加水平。
为了评估模型的准确率,可以测量曲线下方的面积(AUC)。有一些软件包可以用来进行这些计算。面积越接近 0.5 ,模型的准确率越低。完全正确的模型面积为 1.0

; 2.代码实现

这个我是在别人博客学习的,大家可以先使用我的代码,里面的解释可以参考这个大佬点击了解
我这里使用 diabetes.csv 数据集来实现我们的 ROC 曲线。

第一步:导库

import pandas as pd
import numpy as np
from sklearn.metrics import roc_auc_score,roc_curve,auc
from sklearn import metrics
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

第二步:导入数据集 分割数据集

df = pd.read_csv(r'diabetes.csv')

X, y = df.drop('Outcome',axis=1), df['Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=0)

第三步:调用模型 我使用了三个模型,决策树,朴素贝叶斯,knn.

决策树:


from sklearn.metrics import accuracy_score,classification_report
from sklearn.metrics import confusion_matrix
from sklearn import tree
clf_d = tree.DecisionTreeClassifier(criterion = 'entropy')
clf_d.fit(X_train,y_train)

贝叶斯:


from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)

Knn:

from sklearn.neighbors import (NeighborhoodComponentsAnalysis,
KNeighborsClassifier)
knn = KNeighborsClassifier(n_neighbors=3)
knn = knn.fit(X_train,y_train)

第四步:绘图

定义函数(这个不用改变):

 def multi_models_roc(names, sampling_methods, colors, X_test, y_test, save=True, dpin=100):
"""
        将多个机器模型的roc图输出到一张图上

        Args:
            names: list, 多个模型的名称
            sampling_methods: list, 多个模型的实例化对象
            save: 选择是否将结果保存(默认为png格式)

        Returns:
            返回图片对象plt
"""
        plt.figure(figsize=(20, 20), dpi=dpin)

        for (name, method, colorname) in zip(names, sampling_methods, colors):

            y_test_preds = method.predict(X_test)
            y_test_predprob = method.predict_proba(X_test)[:,1]
            fpr, tpr, thresholds = roc_curve(y_test, y_test_predprob, pos_label=1)

            plt.plot(fpr, tpr, lw=5, label='{} (AUC={:.3f})'.format(name, auc(fpr, tpr)),color = colorname)
            plt.plot([0, 1], [0, 1], '--', lw=5, color = 'grey')
            plt.axis('square')
            plt.xlim([0, 1])
            plt.ylim([0, 1])
            plt.xlabel('False Positive Rate',fontsize=20)
            plt.ylabel('True Positive Rate',fontsize=20)
            plt.title('ROC Curve',fontsize=25)
            plt.legend(loc='lower right',fontsize=20)

        if save:
            plt.savefig('multi_models_roc.png')

        return plt

调用函数画图(这里可以改变):标签名字不能出现中文,出现中文显示不出来会有警告,有处理的方法,大家自己查。

names = ['Decision Tree',
         'Naive Bayes',
         'knn']

sampling_methods = [clf_d,
                    gnb,
                    knn
                   ]

colors = ['crimson',
          'orange',
          'lawngreen'
         ]

test_roc_graph = multi_models_roc(names, sampling_methods, colors, X_test, y_test, save = True)
test_roc_graph.savefig('ROC_Train_all.png')

成果图:

ROC 曲线介绍以及 python 画法

总结

文章到这里就结束了,我学习书本,了解理论,可惜书上没有实现它的代码。我通过 SCDN 获取了如何实现多算法的 ROC 曲线比较,毕竟这个更加实用。感谢教科书,感谢拟禾博主。注意运行不成功,查看报错提示,库是否安装,变量的名字,数目搞清楚。我成功了,你们也可以。

Original: https://blog.csdn.net/qq_51294669/article/details/127624590
Author: 四川兔兔
Title: ROC 曲线介绍以及 python 画法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/732190/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Pandas库

    Pandas是python第三方库,提供高性能易用数据类型和分析工具。Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用。pandas库引用: impor…

    Python 2023年8月28日
    042
  • pytest 常用测试报告类型

    先前博客有介绍pytest测试框架的安装及使用,现在来聊聊pytest可以生成哪些测试报告 1.allure测试报告 关于allure报告参见先前的一篇博文: https://ww…

    Python 2023年9月12日
    032
  • 【Git进阶】基于文件(夹)拆分大PR

    背景 前段时间为了迁移一个旧服务到新项目,由此产生了一个巨大的PR,为了方便Code Review,最终基于文件夹,将其拆分成了多个较小的PR;现在这里记录下,后面可能还会需要。 …

    Python 2023年10月22日
    035
  • drf 之 群改,单改接口

    序列化基础 之二 整体单改 路由层、模型层、序列化层不需要做修改,只需要处理视图层:views.py 单与整体局部修改 视图层:views.py 视图类传递参数给序列化类 二次封装…

    Python 2023年6月12日
    079
  • 深度学习基础之numpy,轻松入门numpy

    ### 回答1: 深度学习_是一种通过算法模拟人类神经系统中神经元之间的连接,进行复杂的数据处理和分析的技术。 _深度学习_广泛应用于图像识别,自然语言处理,语音识别,推荐系统等领…

    Python 2023年8月23日
    039
  • Pytest学习-使用fixture返回数据

    Pytest学习-使用fixture返回数据 原创 我的事说来话长2022-08-05 19:43:15博主文章分类:Pytest ©著作权 文章标签 Pytest 文章分类 Py…

    Python 2023年5月24日
    072
  • FPS游戏:D3D内部游戏菜单实现

    19年发布了一篇《FPS游戏:实现GDI方框透视》这篇文章,本篇文章中使用到的技术是外部GDI绘制,该绘制模式在Win10系统中如果不关闭毛玻璃效果则绘制会失效,为了解决绘制失效的…

    Python 2023年9月20日
    040
  • Python绘制时序图,ACF和PACF图

    在时序分析众多模型中,最为基础也是最为重要的有AR§模型,MA(q)模型,以及两者的结合ARMA(p,q)模型,同时考虑ARMA模型的平稳性,若有一个或多个根落于单位圆上,则此时的…

    Python 2023年10月27日
    026
  • VTP | DTP | 端口镜像 | 端口聚合 | 端口隔离

    1、VTP(vlan 数据库同步协议):凡是同个网络中开启了VTP协议的网络设备,客户端上的vlan全部来自与服务端的vlan。就是全网vlan数据库同步,不用自己一个一个的去配置…

    Python 2023年6月15日
    058
  • 用pandas模块轻松做数据分析

    本文主要介绍pandas模块,该模块是Python用于数据导入及数据整理的模块,对于数据分析,数据挖掘等前期数据处理工作十分有用,它提供了很多方法,使得数据处理变得简单高效。 pa…

    Python 2023年8月16日
    042
  • Python+OpenCV手势识别Mediapipe(基础篇)

    Python+OpenCV手势识别Mediapipe(新手入门) 前言 * 项目效果图 认识Mediapipe 项目环境 代码 * 核心代码 – 视频帧率计算 完整代码…

    Python 2023年8月1日
    049
  • 一日一技:用Python绘画有多好玩

    前言 小编把之前发过的好玩的有趣的Python绘画结果总结起来发给大家,可以在各种节日跟心爱的那个TA来个浪漫表白哦~喜欢就收藏下来吧,多多支持哦~ https://docs.qq…

    Python 2023年8月2日
    058
  • stm32f407VET6 系统学习 day03 通用同步异步收发器

    1.同步串行通信 同步通信发送端和接收端必须用 共同的时钟源 才能保持它们之间的准确同步。同步传输时,每个字 符没有起始位和停止位,它不是用起始位来标志字符的开始,而是用一串特定的…

    Python 2023年9月30日
    048
  • Django框架总结

    一、基本了解 wsgiref模块快速搭建网络服务 jinja2模块的模板语法 三大主流框架比较 框架组成分为三部分:socket部分、路由与视图函数对应关系(路由匹配)、模板语法 …

    Python 2023年8月4日
    032
  • NumPy的实用函数整理之percentile

    NumPy函数percentile()用于计算指定维度上数组元素的第 n 个百分位数,返回值为标量或者数组。 percentile() percentile(a, q, axis=…

    Python 2023年8月24日
    045
  • mysql 即学a又学b_学习python

    python优缺点 简单易学免费,开源,高层语言,可移植型,解释性,面向对象,可扩展性,丰富的库,规范的代码 缺点 运行速度,国内市场小,中文资料匮乏,构架选择太多 (所有的库在p…

    Python 2023年9月25日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球