一. 多条ROC曲线绘制函数

 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

二.绘制效果

三.调用格式与方法

调用方法时,需要把模型本身(如clf_xx)、模型名字(如GBDT)和对应颜色(如crimson)按照顺序、以列表形式传入函数作为参数。

names = ['Logistic Regression','Random Forest','XGBoost','AdaBoost','GBDT','LGBM']sampling_methods = [clf_lr,clf_rf,clf_xgb,clf_adb,clf_gbdt,clf_lgbm]colors = ['crimson','orange','gold','mediumseagreen','steelblue', 'mediumpurple'  ]#ROC curves
train_roc_graph = multi_models_roc(names, sampling_methods, colors, X_train, y_train, save = True)
train_roc_graph.savefig('ROC_Train_all.png')

四. 详细解释和说明

1.关键函数

(1)plt.figure(figsize=(20, 20), dpi=dpin)

在for循环外绘制图片的大体框架。figsize控制图片大小,dpin控制图片的信息量(其实可以理解为清晰度?documentation的说明是The resolution of the figure in dots-per-inch)

(2)zip()

函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

(3)roc_curve()

fpr, tpr, thresholds = roc_curve(y_test, y_test_predprob, pos_label=1)

该函数的传入参数为目标特征的真实值y_test和模型的预测值y_test_predprob。需要为pos_label赋值,指明正样本的值。
该函数的返回值 fpr、tpr和thresholds 均为ndarray, 为对应每一个不同的阈值下计算出的不同的真阳性率和假阳性率。这些值,就对应着ROC图中的各个点。

(4)auc()

 plt.plot(fpr, tpr, lw=5, label='{} (AUC={:.3f})'.format(name, auc(fpr, tpr)),color = colorname)

函数auc(),传入参数为fpr和tpr,返回结果为模型auc值,即曲线下面积值。
以上代码在使用fpr和tpr绘制ROC曲线的同时,也确定了标签(图例)的内容和格式。

2. 参数解释

(1)sampling_methods

是包含多个模型名字的list。所有模型不需要fit过再传入函数,只需要定义好即可。

clf = RandomForestClassifier(n_estimators = 100, max_depth=3, min_samples_split=0.2, random_state=0)

(2)X_test, y_test

X_test 和 y_test 两个参数用于传入函数后计算各个模型的预测值。

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

如果需要绘制的是训练集的ROC曲线,则可以在对应参数位置分别传入X_trian和y_train即可。

(3)names 和 colors

这两个参数均为字符串列表形式。注意,这两个列表的值要和模型参数中的模型顺序一一对应。

如有需要绘制更多的模型,只需要对应增加列表中的值即可。

五.需要注意的小小坑

1.同一张图片的同一种方法只能调用一次!!!

plt.legend(loc='lower right')
plt.legend(fontsize=10)

如果像上图中的我一样,把同一张图片plt的方法legend()调用两次,那么下一个的方法中的参数就会将上一个的参数覆盖!这种情况下,我就发现第一个方法赋值的location完全不起作用……

这个时候就需要将这个函数整合如下图~(其实本来就是应该这么写的,我也不知道为啥我脑子一抽写了两个,可能是R的ggplot给我的美好印象挥之不去吧)

plt.legend(loc='lower right',fontsize=10)

六.答疑和补充

根据小伙伴的评论提问,在这里进行一下解释说明:

1.函数的适用问题

这个函数是适用于所有数据集的,只需要导入数据集后进行训练集和测试集的划分即可。(我在“调用格式与方法”部分调用函数使用的是X_train 和y_train,绘制出的则是不同模型在训练集表现的ROC曲线)

划分训练集和测试集的代码如下(以使用8:2划分训练集测试集为例)

# 8:2划分训练集测试集
X, y = df.drop(target,axis=1), df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=0)

df:导入的数据集
target:目标特征(y)
train_size:训练集占比80%
random_state: 随机数种子,不同随机数种子划分的训练集和测试集会有不同。

2.完整数据和代码

有很多小伙伴问我要完整的数据集和代码,我在这里做下说明。这个函数是完整的、可以直接使用的,如涉及到具体的数据集,完整的流程是这样的:

(1)导入包

可能涉及到的包的调用代码:

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

(2)导入数据集

df = pd.read_csv(r'你的数据集所在地址')

(3)划分训练集和测试集

# 以下是我常用的8:2划分训练集测试集,数据量大的话也可以9:1
X, y = df.drop(target,axis=1), df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=0)

(4)建立模型

接下来就需要建立模型啦~ 需要建多少都没有问题,只需要对应调整调用函数时的names和sampling_methods就可以了。下面以随机森林模型为例

#调用模型包
from sklearn.ensemble import RandomForestClassifier
#建立模型
#可以根据需要调整模型内参数来达到更优的效果
clf_rf = RandomForestClassifier(n_estimators = 100, max_depth=3, min_samples_split=0.2, random_state=0)
clf_rf.fit(X_train, y_train)

在这一步也可以用以下代码来先简要看看模型效果:

yprob_train_rf = clf_rf.predict_proba(X_train)[:,1]
print("RF训练集AUC",roc_auc_score(y_true=y_train, y_score=yprob_train_rf))
yprob_test_rf = clf_rf.predict_proba(X_test)[:,1]
print("RF测试集AUC",roc_auc_score(y_true=y_test, y_score=yprob_test_rf))
test_roc_rf = roc_auc_score(y_true=y_test, y_score=yprob_test_rf)

(5)把第一部分的函数复制粘贴~
(6)根据建立的模型修改第二部分的调用格式
(7)保存ROC图片即可

3.ROC图片的修改和调整

有小伙伴问关于ROC图片的坐标轴刻度的修改问题,在这里简单补充一下:

坐标轴的范围是由xlim和ylim控制的,坐标轴的刻度是由xticks和yticks控制的,需要修改坐标轴刻度大小只需要增加到“xlim”语句后面就可以啦。

plt.xlim([0, 1])
plt.ylim([0, 1])
#增加到如下语句后,注意缩进
#方法一,直接手动设置
plt.xticks([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
plt.yticks([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
#方法二,间隔相同的可以利用arange函数
plt.xticks(np.arange(0, 1, step=0.1))
plt.yticks(np.arange(0, 1, step=0.1))

python 将多个模型的ROC曲线绘制在一张图里(含图例)相关推荐

  1. 【机器学习系列】如何将多条ROC曲线画在一张图里,并解决文本遮挡问题

    有的时候我们需要将ROC曲线输出在同一张图中,这样可以更加直观地对比模型:并且我们常常会遇到在图形中有文字相互遮挡的问题,我们可以用adjustText中的adjust_text来实现文本不相互遮挡并 ...

  2. 把多个ROC曲线画在一张图上

    为了展示实验效果,ROC曲线也能更直观的展示而且美观.所以我想画出ROC曲线.下面是两个方法:1)只画一个ROC曲线,2)多个ROC曲线展示在一张图上. 注:我是已经有y-pred,所以直接用即可,不 ...

  3. 多模型的ROC曲线绘制

    ROC曲线 ROC曲线是一种评估分类器性能的图形工具,它以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制.ROC曲线特别需要注意以下几点: ROC曲线要与45度对角线比较,对角线表示随 ...

  4. julia如何将多个曲线画在一张图里

    # 本例子使用PyPlot包,使用之前要安装PyPlot,安装教程网上就有,百度即可 # 示例代码如下 using PyPlot n = 10 # 线条数 x = rand( n, n )for i ...

  5. python计算多个模型在不同数据集上的预测概率、获取每个数据集上的最优模型、多个最优模型的ROC曲线进行对比分析

    pytyon计算多个模型在不同数据集上的预测概率.获取每个数据集上的最佳模型.多个最优模型的ROC曲线进行对比分析 目录

  6. ROC曲线绘制(详细)以及模型选择

    在我们在讲解ROC曲线之前 首先要明确混淆矩阵的概念 如下图: 真正率 TPR:预测为正例且实际为正例的样本占所有正例样本(真实结果为正样本)的比例. 假正率 FPR:预测为正例但实际为负例的样本占所 ...

  7. linux使用mtcnn进行人脸检测,Linux下使用FDDB 测试MTCNN人脸检测模型生成 ROC 曲线

    FDDB是全世界最具权威的人脸检测评测平台之一,是专门针对人脸识别算法的评测方法与标准.FDDB数据集官网:http://vis-www.cs.umass.edu/fddb/ 下面介绍如何使用FDDB ...

  8. 分类模型的ROC曲线、AUC值、GINI系数、Lift、Gain、KS指标分别是什么?计算公式是什么?有什么意义?

    分类模型的ROC曲线.AUC值.GINI系数.Lift.Gain.KS指标分别是什么?计算公式是什么?有什么意义? 目录

  9. R语言使用epiDisplay包的lroc函数可视化logistic回归模型的ROC曲线并输出诊断表、输出灵敏度、1-特异度、AUC值等、设置lwd参数自定义ROC曲线线条的粗细(宽度)

    R语言使用epiDisplay包的lroc函数可视化logistic回归模型的ROC曲线并输出诊断表(diagnostic table).输出灵敏度.1-特异度.AUC值等.设置lwd参数自定义ROC ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:多隐含层神经网络公式推导(二分类)
  2. android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...
  3. ios AppStore 帐号申请
  4. tomcat ssi配置及升级导致ssi include错误问题解决
  5. 微软发布的python教程_微软发布Python 教程《Develop with Python on Windows》
  6. 神策数据 2018 校招启程了!
  7. 【离散数学】命题逻辑符号化例题
  8. as 使用类模拟枚举类
  9. Struts2→MCV、环境搭建第一个样例、工作原理、核心文件、XML中常用元素、通配符、action后缀、action接收参数、result、标签
  10. 爬虫:爬取微软必应翻译做成API
  11. 服务器系统小米随身wifi,Mac OS10.13正常使用的小米随身WIFI无线驱动 | 陳松's 博客...
  12. Linux下FTP上传下载之续传命令
  13. 在Excel中使用翻译公式 (有道API)
  14. 手zhuan手机软件app下载排行网站源码(需要自取)
  15. Eclipse IDE for Java EE Developers 下载地址
  16. unbound部署DNS服务器
  17. 判断两数互质,java实现
  18. 目前国际上存在的主要安全标准
  19. c++怎么确定一个整数有几位_德国人怎么学电机——浅谈电机模型(十六):同步电机(三)永磁电机(一)...
  20. easyswoole和mixphp_关于thinkphp5和swoole通过SMTP方式实现异步邮件群发的详解 - easyswoole...

热门文章

  1. 去留无意,望天上云卷云舒
  2. 怎么使用_许昌防裂贴使用方法,怎么使用
  3. OpenCV官方教程中文版——学习笔记(一)
  4. 使用OpenCV进行图片转码
  5. 如何通过腾讯云短信实现发送验证码并校验验证码以实现登录功能
  6. python+appium多设备情况下指定设备,具体执行设备没按指定的来
  7. 《大数据架构详解》一书再版意见征集
  8. IMU预积分及残差雅克比计算
  9. 微信 发放代金券 api
  10. 关于波斯历(奇怪的历法)