python如何将多个模型的ROC曲线绘制在一张图(含图例)

目录
  • 多条ROC曲线绘制函数
  • 绘制效果
  • 调用格式与方法
  • 详细解释和说明
    • 1.关键函数
    • 2.参数解释
  • 需要注意的小小坑
  • 补充
  • 总结

多条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):

            method.fit(X_train, y_train)
            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完全不起作用……

这个时候就需要将这个函数整合如下图~(其实本来就是应该这么写的,我也不知道为啥我脑子一抽写了两个,可能是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: 随机数种子,不同随机数种子划分的训练集和测试集会有不同。

总结

到此这篇关于python如何将多个模型的ROC曲线绘制在一张图的文章就介绍到这了,更多相关python多模型的ROC曲线绘制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Python画ROC曲线和AUC值计算

    前言 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣.这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC. AUC介绍 AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,目前常见的机器学习库中(比如scikit-learn)一般也都是集成该指标的计算,但

  • python实现二分类和多分类的ROC曲线教程

    基本概念 precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态) recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态) F-measure:F度量是对准确率和召回率做一个权衡(越大越好,1为理想状态,此时precision为1,recall为1) accuracy:预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态) fp rate:原本是错的预测为对的比例(越小越好,0为理想状态) tp rate:原本是对的

  • Python中ROC曲线绘制

    首先以支持向量机模型为例 先导入需要使用的包,我们将使用roc_curve这个函数绘制ROC曲线! from sklearn.svm import SVC from sklearn.metrics import roc_curve from sklearn.datasets import make_blobs from sklearn. model_selection import train_test_split import matplotlib.pyplot as plt %matplot

  • 基于python实现ROC曲线绘制广场解析

    ROC 结果 源数据:鸢尾花数据集(仅采用其中的两种类别的花进行训练和检测) Summary features:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 实例:[5.1, 3.5, 1.4, 0.2] target:'setosa' 'versicolor' (0 , 1) 采用回归方法进行拟合得到参数和bias model.fit(data_train, data_tra

  • python如何将多个模型的ROC曲线绘制在一张图(含图例)

    目录 多条ROC曲线绘制函数 绘制效果 调用格式与方法 详细解释和说明 1.关键函数 2.参数解释 需要注意的小小坑 补充 总结 多条ROC曲线绘制函数 def multi_models_roc(names, sampling_methods, colors, X_test, y_test, save=True, dpin=100): """ 将多个机器模型的roc图输出到一张图上 Args: names: list, 多个模型的名称 sampling_methods: li

  • 解析ROC曲线绘制(python+sklearn+多分类)

    目录 ROC曲线绘制要点(仅记录) 提取数据(标签值和模型预测值) 多分类的ROC曲线画出来并不难 ROC曲线绘制要点(仅记录) 1.ROC用于度量模型性能 2.用于二分类问题,如若遇到多分类也以二分类的思想进行操作. 3.二分类问题代码实现(至于实现,文档说的很清楚了:官方文档) 原理看懂就好,实现直接调用API即可 提取数据(标签值和模型预测值) from sklearn.metrics import roc_curve, auc fpr, tpr, thresholds = roc_cur

  • R语言利用caret包比较ROC曲线的操作

    说明 我们之前探讨了多种算法,每种算法都有优缺点,因而当我们针对具体问题去判断选择那种算法时,必须对不同的预测模型进行重做评估. 为了简化这个过程,我们使用caret包来生成并比较不同的模型与性能. 操作 加载对应的包与将训练控制算法设置为10折交叉验证,重复次数为3: library(ROCR) library(e1071) library("pROC") library(caret) library("pROC") control = trainControl(

  • 浅谈Python基础之I/O模型

    一.I/O模型 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blockin

  • Python中函数参数匹配模型详解

    当我们的函数接收参数为任意个,或者不能确定参数个数时,我们,可以利用 * 来定义任意数目的参数,这个函数调用时,其所有不匹配的位置参数会被赋值为元组,我们可以在函数利用循环或索引进行使用 def f(*args): # 直接打印元组参数 print(args) print('-'*20) # 循环打印元组参数 [print(i) for i in args] ... # 传递一个参数 f(1) print('='*20) # 传递5个参数 f(1, 2, 3, 4, 5) 示例结果: (1,)

  • 用python生成与调用cntk模型代码演示方法

    由于一些原因,视频录制要告一段落了.再写一篇关于cntk的文章分享出来吧.我也很想将这个事情进行下去.以后如果条件允许还会接着做. cntk2.0框架生成的模型才可以支持python.1.0不支持. python可以导入cntk.exe生成的框架,也可以导入python调用cntk生成的框架.举两个例子: 1 .导入cntk.exe生成的框架. from cntk.ops.functions import load_model from PIL import Image import numpy

  • 解决python 无法加载downsample模型的问题

    downsample 在最新版本里面修改了位置 from theano.tensor.single import downsample (旧版本) 上面以上的的import会有error raise: from theano.tensor.signal import downsample ImportError: cannot import name 'downsample' 找到from theano.tensor.single import downsample所在文件,如: ...\lib

随机推荐