本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:机器学习之分类器性能指标之ROC曲线、AUC值_MinerYCC-CSDN博客

由于ROC曲线是针对二分类的情况,对于多分类问题,ROC曲线的获取主要有两种方法:

假设测试样本个数为m,类别个数为n(假设类别标签分别为:0,2,...,n-1)。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。

比如n等于3,标签应转换为:

方法1:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。

方法2:首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。

上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为'macro'和'micro'的情况。

下面以方法1为例,直接上代码,概率矩阵P和标签矩阵L分别对应代码中的y_score和y_one_hot:

正在上传…重新上传取消​

#!/usr/bin/python
# -*- coding:utf-8 -*-import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.preprocessing import label_binarizeif __name__ == '__main__':np.random.seed(0)data = pd.read_csv('iris.data', header = None)  #读取数据iris_types = data[4].unique()n_class = iris_types.sizex = data.iloc[:, :2]  #只取前面两个特征y = pd.Categorical(data[4]).codes  #将标签转换0,1,...x_train, x_test, y_train, y_test = train_test_split(x, y, train_size = 0.6, random_state = 0)y_one_hot = label_binarize(y_test, np.arange(n_class))  #装换成类似二进制的编码alpha = np.logspace(-2, 2, 20)  #设置超参数范围model = LogisticRegressionCV(Cs = alpha, cv = 3, penalty = 'l2')  #使用L2正则化model.fit(x_train, y_train)print '超参数:', model.C_# 计算属于各个类别的概率,返回值的shape = [n_samples, n_classes]y_score = model.predict_proba(x_test)# 1、调用函数计算micro类型的AUCprint '调用函数auc:', metrics.roc_auc_score(y_one_hot, y_score, average='micro')# 2、手动计算micro类型的AUC#首先将矩阵y_one_hot和y_score展开,然后计算假正例率FPR和真正例率TPRfpr, tpr, thresholds = metrics.roc_curve(y_one_hot.ravel(),y_score.ravel())auc = metrics.auc(fpr, tpr)print '手动计算auc:', auc#绘图mpl.rcParams['font.sans-serif'] = u'SimHei'mpl.rcParams['axes.unicode_minus'] = False#FPR就是横坐标,TPR就是纵坐标plt.plot(fpr, tpr, c = 'r', lw = 2, alpha = 0.7, label = u'AUC=%.3f' % auc)plt.plot((0, 1), (0, 1), c = '#808080', lw = 1, ls = '--', alpha = 0.7)plt.xlim((-0.01, 1.02))plt.ylim((-0.01, 1.02))plt.xticks(np.arange(0, 1.1, 0.1))plt.yticks(np.arange(0, 1.1, 0.1))plt.xlabel('False Positive Rate', fontsize=13)plt.ylabel('True Positive Rate', fontsize=13)plt.grid(b=True, ls=':')plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)plt.title(u'鸢尾花数据Logistic分类后的ROC和AUC', fontsize=17)plt.show()

我的实战

Bnew_one1=[]for lis in Bnew4:bol=np.zeros(51)bol=bol.tolist()bol[lis[0]]=1Bnew_one1.append(bol)Blast_one=[]for lis in Blast:bol=np.zeros(51)bol=bol.tolist()bol[lis[0]]=1Blast_one.append(bol)Bnew_one1=np.array(Bnew_one1)Blast_one=np.array(Blast_one)Bnew_one=np.array(Bnew_one)print('调用函数auc:', metrics.roc_auc_score(Blast_one, Bnew_one1, average='micro'))fpr, tpr, thresholds = metrics.roc_curve(Blast_one.ravel(),Bnew_one1.ravel())auc = metrics.auc(fpr, tpr)print('手动计算auc:', auc)#绘图mpl.rcParams['font.sans-serif'] = u'SimHei'mpl.rcParams['axes.unicode_minus'] = False#FPR就是横坐标,TPR就是纵坐标plt.plot(fpr, tpr, c = 'r', lw = 2, alpha = 0.7, label = u'AUC=%.3f' % auc)plt.plot((0, 1), (0, 1), c = '#808080', lw = 1, ls = '--', alpha = 0.7)plt.xlim((-0.01, 1.02))plt.ylim((-0.01, 1.02))plt.xticks(np.arange(0, 1.1, 0.1))plt.yticks(np.arange(0, 1.1, 0.1))plt.xlabel('False Positive Rate', fontsize=13)plt.ylabel('True Positive Rate', fontsize=13)plt.grid(b=True, ls=':')plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)plt.title(u'大类问题一分类后的ROC和AUC', fontsize=17)plt.show()

​多分类下的ROC曲线和AUC​相关推荐

  1. 多分类下的ROC曲线和AUC

    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明.如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:http://blog.c ...

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

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

  3. 多分类-- ROC曲线和AUC值

    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明.如果对ROC和AUC二分类下的概念不是很了解 由于ROC曲线是针对二分类的情况,对于多分类问题 ...

  4. 分类模型-评估指标(2):ROC曲线、 AUC值(ROC曲线下的面积)【只能用于二分类模型的评价】【不受类别数量不平衡的影响;不受阈值取值的影响】【AUC的计算方式:统计所有正负样本对中的正序对】

    评价二值分类器的指标很多,比如precision.recall.F1 score.P-R曲线等.但这些指标或多或少只能反映模型在某一方面的性能.相比而言,ROC曲线则有很多优点,经常作为评估二值分类器 ...

  5. 「机器学习速成」分类,评估指标(TP、FP、TN、FN),ROC曲线和AUC

    https://www.toutiao.com/a6706449645901464078/ 2019-06-25 20:49:47 大家好,今天我们学习[机器学习速成]之 分类,评估指标(TP.FP. ...

  6. 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率

    北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指的是在所有测试样例中错分 ...

  7. 【深度学习-机器学习】分类度量指标 : 正确率、召回率、灵敏度、特异度,ROC曲线、AUC等

    来源于博文:https://blog.csdn.net/tanzuozhev/article/details/79109311 在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指 ...

  8. 分类性能度量指标:ROC曲线、AUC值、正确率、召回率、敏感度、特异度

    在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指的是在所有测试样例中错分的样例比例.实际上,这样的度量错误掩盖了样例如何被分错的事实.在机器学习中,有一个普遍适用的称为混淆矩阵 ...

  9. 机器学习(五)之评价指标:二分类指标、多分类指标、混淆矩阵、不确定性、ROC曲线、AUC、回归指标

    文章目录 0 本文简介 1 二分类指标 1.1 二分类时的错误类型 1.2 不平衡的数据 1.3 混淆矩阵 1.4 考虑不确定性 1.5 准确率-召回率曲线 1.6 ROC与AUC 2 多分类指标 3 ...

最新文章

  1. 【AI】在win10上安装TensorFlow2,安装成功,但是import tensorflow时报错:pywrap_tensorflow.py“, line 58
  2. 他们拿走腾讯广告百万奖金,我算是知道票圈广告为啥那么多赞了
  3. python游戏编程入门-python游戏编程入门
  4. php stock 资料地址
  5. Java Annotation详解
  6. 插入移动硬盘_Win10插入移动硬盘或U盘有提示声但电脑中不显示的解决方法
  7. 激战2:逐火之路-概念艺术设计
  8. 关于find指令的一点使用小心得 II
  9. spring中IOC的简单使用
  10. 简明python教程 沈洁元_Python简明教程-沈洁元
  11. TeXLive2021+TeXStudio安装及配置,亲测有效!
  12. 如何选择和使用视频质量客观评价指标
  13. int 和 Integer
  14. c#拼图碎片形状_将碎片拼成完整的拼图
  15. 项目实战!Python分析广州房地产市场,房价还会再涨吗?
  16. 这套系统,可能真的是数据分析师未来5年的机遇!
  17. C++: double类型数值比较
  18. MATLAB surfl函数 surfc函数 效果图
  19. kaiser密码的加密与解密
  20. 凯新生物高分子FITC-PEG-NHS的简介,Fluorescein-PEG-NHS

热门文章

  1. nmap脚本(nse)原理和编写
  2. WINDOWS下的各类HOOK
  3. 进程的用户栈和内核栈
  4. Android操作系统11种传感器介绍
  5. JAVA编译显示存在不安全_java – 编译时出现“未经检查或不安全的操作”错误...
  6. 连接没反应_显示器USB接口的作用是什么?为什么会没有反应?
  7. sequelize 增加数据库字段_使用Sequelize动态创建新表
  8. 个人的关于c++运算符重载的总结
  9. android spinner 简书,【Android】Spinner:下拉列表笔记
  10. 安装bigsur卡在12分钟_Big Sur为什么安装不了?macOS Big Sur无法完成安装的解决办法!...