解析ROC曲线绘制(python+sklearn+多分类)
作者:sinysama 发布时间:2021-04-06 12:16:16
标签:ROC,曲线绘制,python,sklearn,多分类
ROC曲线绘制要点(仅记录)
1、ROC用于度量模型性能
2、用于二分类问题,如若遇到多分类也以二分类的思想进行操作。
3、二分类问题代码实现(至于实现,文档说的很清楚了:官方文档)
原理看懂就好,实现直接调用API即可
提取数据(标签值和模型预测值)
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_true,y_sore)
roc_auc = auc(fpr, tpr)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, '#9400D3',label=u'AUC = %0.3f'% roc_auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.1,1.1])
plt.ylim([-0.1,1.1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.grid(linestyle='-.')
plt.grid(True)
plt.show()
print(roc_auc)
4、多分类问题代码实现
对于两个以上类的分类问题,
这里就有ROC的宏观平均(macro-average)和微观平均(micro-average)的做法了(具体查阅机器学习)
在这之前,我想肯定会有人想把每个类别的ROC的都绘制出来,实现起来,无非就是获得每个单类的标签值和模型预测值数据
不过你怎么解释呢?有什么意义呢?其实这个问题我也想了很久,查阅了很多文献,也没有个所以然。
PS:(如果有人知道,麻烦告知下~)
多分类的ROC曲线画出来并不难
具体如下
import numpy as np
import matplotlib.pyplot as plt
from scipy import interp
from sklearn.preprocessing import label_binarize
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import cohen_kappa_score, accuracy_score
fpr0, tpr0, thresholds0 = roc_curve(y_true0,y_sore0)
fpr1, tpr1, thresholds1 = roc_curve(y_true1,y_sore1)
fpr2, tpr2, thresholds2 = roc_curve(y_true2,y_sore2)
fpr3, tpr3, thresholds3 = roc_curve(y_true3,y_sore3)
fpr4, tpr4, thresholds4 = roc_curve(y_true4,y_sore4)
roc_auc0 = auc(fpr0, tpr0)
roc_auc1 = auc(fpr1, tpr1)
roc_auc2 = auc(fpr2, tpr2)
roc_auc3 = auc(fpr3, tpr3)
roc_auc4 = auc(fpr4, tpr4)
plt.title('Receiver Operating Characteristic')
plt.rcParams['figure.figsize'] = (10.0, 10.0)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 设置标题大小
plt.rcParams['font.size'] = '16'
plt.plot(fpr0, tpr0, 'k-',color='k',linestyle='-.',linewidth=3,markerfacecolor='none',label=u'AA_AUC = %0.5f'% roc_auc0)
plt.plot(fpr1, tpr1, 'k-',color='grey',linestyle='-.',linewidth=3,label=u'A_AUC = %0.5f'% roc_auc1)
plt.plot(fpr2, tpr2, 'k-',color='r',linestyle='-.',linewidth=3,markerfacecolor='none',label=u'B_AUC = %0.5f'% roc_auc2)
plt.plot(fpr3, tpr3, 'k-',color='red',linestyle='-.',linewidth=3,markerfacecolor='none',label=u'C_AUC = %0.5f'% roc_auc3)
plt.plot(fpr4, tpr4, 'k-',color='y',linestyle='-.',linewidth=3,markerfacecolor='none',label=u'D_AUC = %0.5f'% roc_auc4)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.1,1.1])
plt.ylim([-0.1,1.1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.grid(linestyle='-.')
plt.grid(True)
plt.show()
在上面的基础上,我们将标签二值化
(如果你不使用二分类思想去画ROC曲线,大概率会出现报错:ValueError: multilabel-indicator format is not supported)
y_test_all = label_binarize(true_labels_i, classes=[0,1,2,3,4])
y_score_all=test_Y_i_hat
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(len(classes)):
fpr[i], tpr[i], thresholds = roc_curve(y_test_all[:, i],y_score_all[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
注意看,宏观平均(macro-average)和微观平均(micro-average)的处理方式
(y_test_all(真实标签值)和y_score_all(与真实标签值维度匹配,如果十个类就对应十个值,↓行代表数据序号,列代表每个类别的预测值)
# micro-average ROC curve(方法一)
fpr["micro"], tpr["micro"], thresholds = roc_curve(y_test_all.ravel(),y_score_all.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
# macro-average ROC curve 方法二)
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(len(classes))]))
mean_tpr = np.zeros_like(all_fpr)
for i in range(len(classes)):
mean_tpr += interp(all_fpr, fpr[i], tpr[i])
# 求平均计算ROC包围的面积AUC
mean_tpr /= len(classes)
fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
#画图部分
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],'k-',color='y',
label='XXXX ROC curve micro-average(AUC = {0:0.4f})'
''.format(roc_auc["micro"]),
linestyle='-.', linewidth=3)
plt.plot(fpr["macro"], tpr["macro"],'k-',color='k',
label='XXXX ROC curve macro-average(AUC = {0:0.4f})'
''.format(roc_auc["macro"]),
linestyle='-.', linewidth=3)
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.1,1.1])
plt.ylim([-0.1,1.1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.legend(loc="lower right")
plt.grid(linestyle='-.')
plt.grid(True)
plt.show()
来源:https://blog.csdn.net/QAQIknow/article/details/107661417


猜你喜欢
- tkinter库:Python的标准Tk GUI工具包的接口示例:from tkinter import *root = Tk()#你的ui
- 在项目过程中,需要设置各种IP和端口号信息等,如果每次都在源程序中更改会很麻烦(因为每次都要重启项目重新加载配置信息),因此将需要修改的参数
- 前言Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"
- 背景测试工具箱写到一半,今天遇到了一个前后端数据交互的问题,就一起做一下整理。环境-----------------------------
- 前言Laravel 队列为不同的后台队列服务提供统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系
- Python是一个非常实用、流行的解释型编程语言,其优势之一就是可以借助其交互的shell进行探索式地编程。你可以试着输入一些代码,然后马上
- 前言d3.js 是一款上手容易的js类库,专门用于绘制svg图形图表,其关键理念为data-join 意即数据绑定.搞清这个概念非常重要,它
- DROP FUNCTION IF EXISTS `getPY`; DELIMITER ;; CREATE FUNCTION `getPY`(
- 在一般的MIS应用中,会有大量的报表,此时我们可以在后台数据库编写相应的视图或存储过程,用ASP通过ADO调用以完成报表工作。下面用一个例子
- 成品效果 <body> <div id="game" style="p
- 下面通过实例代码给大家分享Python切片操作去除字符串首尾的空格的方法,具体内容如下所示:#利用切片操作,实现一个trim()函数,去除字
- torch.arange函数详解官方文档:torch.arange函数原型arange(start=0, end, step=1, *, o
- 目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js)2、store/permission.js(在
- 1、pyqtgraph库数据可视化效果还不错,特别是窗体程序中图像交互性较好;安装也很方便,用 pip 安装。2、在Python中新建一个
- 废话不多说了,直接给大家贴代码了,具体代码如下所述: var aLi = document.querySelectorAll('.a
- FBV:function based view 基于函数的视图.CBV:class based view 基于类的视图.在视图函数创建类,需
- asp之家补充两点,以让大家看的更明白:一.什么是GUID?由于水平有限在看到这篇文章时,我并不了解什么是GUID,为了看懂文章当然先请教一
- Django Form 实时从数据库中获取数据 ,具体内容如下所示:修改 models.py 添加class UserType(models
- 在嵌入式、尤其是机器人的python编程中,经常需要实时检测用户的键盘输入来随时控制机器人,这段代码可以帮助我们提取用户输入的字符,并在按下
- /* *使用方法: * var d = new Drag({id:'dragPannel',maxLeft:500,maxT