多分类-- ROC曲线和AUC值
本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解
由于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'的情况。
下面以方法2为例,直接上代码,概率矩阵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.size
x = 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类型的AUC
print '调用函数auc:', metrics.roc_auc_score(y_one_hot, y_score, average='micro')
# 2、手动计算micro类型的AUC
#首先将矩阵y_one_hot和y_score展开,然后计算假正例率FPR和真正例率TPR
fpr, 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()
实验输出结果:
可以从上图看出,两者计算结果一致!
实验绘图结果:
多分类-- ROC曲线和AUC值相关推荐
- 分类模型的ROC曲线、AUC值、GINI系数、Lift、Gain、KS指标分别是什么?计算公式是什么?有什么意义?
分类模型的ROC曲线.AUC值.GINI系数.Lift.Gain.KS指标分别是什么?计算公式是什么?有什么意义? 目录
- 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率
北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指的是在所有测试样例中错分 ...
- 分类模型-评估指标(2):ROC曲线、 AUC值(ROC曲线下的面积)【只能用于二分类模型的评价】【不受类别数量不平衡的影响;不受阈值取值的影响】【AUC的计算方式:统计所有正负样本对中的正序对】
评价二值分类器的指标很多,比如precision.recall.F1 score.P-R曲线等.但这些指标或多或少只能反映模型在某一方面的性能.相比而言,ROC曲线则有很多优点,经常作为评估二值分类器 ...
- 分类性能度量指标:ROC曲线、AUC值、正确率、召回率、敏感度、特异度
在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指的是在所有测试样例中错分的样例比例.实际上,这样的度量错误掩盖了样例如何被分错的事实.在机器学习中,有一个普遍适用的称为混淆矩阵 ...
- 一文详尽混淆矩阵、准确率、精确率、召回率、F1值、P-R 曲线、ROC 曲线、AUC 值、Micro-F1 和 Macro-F1
文章目录 二分类的评价指标 一.混淆矩阵与 TP.TN.FP.FN 二.准确率.精确率.召回率.F1值 三.P-R 曲线 四.ROC 曲线.AUC 值 五.P-R曲线和ROC曲线有什么区别,如何选择? ...
- 机器学习中的度量指标:ROC曲线,AUC值,K-S曲线
机器学习中的度量指标:ROC曲线,AUC值,K-S曲线 首先,回顾一下二分类问题的一些定义: 预测 1 0 实 1 TP FN 际 0 FP TN 上表中,四个项分别为:TP真阳性:FN假阴性:FP ...
- 机器学习之分类器性能指标之ROC曲线、AUC值
机器学习之分类器性能指标之ROC曲线.AUC值 http://www.cnblogs.com/dlml/p/4403482.html 分类器性能指标之ROC曲线.AUC值 一 roc曲线 1.roc曲 ...
- 机器学习之性能度量指标——决定系数R^2、PR曲线、ROC曲线、AUC值、以及准确率、查全率、召回率、f1_score
一.线性回归的决定系数(也称为判定系数,拟合优度) 相关系数是R哈~~~就是决定系数的开方! 正如题所说决定系数是来衡量回归的好坏,换句话说就是回归拟合的曲线它的拟合优度!也就是得分啦~~ 决定系数它 ...
- ROC曲线,AUC值,PR曲线,AP值
Receiver Operating Characteristic (ROC) with cross validation - scikit-learn 1.0.2 documentation Pre ...
最新文章
- Java怎么做三端_Java三端分离开发在线教育平台
- 深入浅出grep与正则表达式
- php 常用设计模式demo
- 听说java又过气了?看我运用大数据分析2019年java发展趋势!
- 这样查看告警邮件要慢一点……
- 学习 | egg.js 中间件和插件
- java单一登录_java实现单一登录 踢人效果
- 团战开黑必备“良药”了解一下!
- c语言天数转换成周数,如何将周数转换为日期?
- PLC不用编程,以太网方式与多台智能仪表、变频器等串口设备通讯(基于智能网关)
- 三分钟带你领路Java-JFrame窗体美化
- 如果APP推广月预算只有10万 该如何展开推广?
- c/c++ 求解数独
- 注意 怎么选择车险附加险?避免“这也不赔那也不赔”
- 五种常见的聚类算法总结
- BUUCTF NewStarCTF 公开赛赛道Week3 Writeup
- 【转】canvas save restore详解(包你懂,绝对不是百度里千篇一律的教程)
- 表格的编辑插件 editable.js
- 阅读《首先,打破一切常规》有感
- linux下for命令详解,linux 命令详解 十一
热门文章
- Java JDK是什么?
- 智能化LED照明技术的最新发展
- ltspice语言中文_ltspice-一简介(中文教程).pdf
- 对话雪球创始人方三文:「打工人」如何选行业、找工作、挑老板?|创新大会 2021...
- 传感器自学笔记第十三章——7彩自动闪烁LED模块+干簧管传感器模块+水银开关模块+SW-18015P震动开关模块+KY-020倾斜开关模块
- Qt使用导出类报错:error C2491: “LmcThreadPaddle::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义
- Vue3响应式API ref和reactive
- 《程序员修炼之道-从小工到专家》读书笔记
- 专访宜信AI中台团队负责人王东:智慧金融时代,大数据和AI如何为业务赋能
- 电子信息工程考研专业c语言,2018电子信息工程考研方向有哪些