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

作者:sinysama 时间:2021-04-06 12:16:16 

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)

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

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曲线绘制(python+sklearn+多分类)

在上面的基础上,我们将标签二值化

(如果你不使用二分类思想去画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(与真实标签值维度匹配,如果十个类就对应十个值,↓行代表数据序号,列代表每个类别的预测值)

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

# 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()

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

来源:https://blog.csdn.net/QAQIknow/article/details/107661417

标签:ROC,曲线绘制,python,sklearn,多分类
0
投稿

猜你喜欢

  • 何在MySQL数据库中定义外键

    2009-12-17 12:29:00
  • 获取Dom元素的X/Y坐标

    2009-10-10 12:49:00
  • js 将json字符串转换为json对象的方法解析

    2023-07-22 21:41:49
  • python应用文件读取与登录注册功能

    2023-04-17 17:04:03
  • MySQL内建复制功能来优化可用性

    2010-10-25 20:20:00
  • Python编写百度贴吧的简单爬虫

    2023-12-06 02:17:56
  • matplotlib quiver箭图绘制案例

    2023-07-13 10:04:11
  • 动态提示的select下拉框

    2007-12-02 14:54:00
  • Python数据类型转换详解

    2021-03-04 04:11:13
  • 人工智能学习Pytorch张量数据类型示例详解

    2021-09-13 01:33:08
  • 在不能中寻找可能 QZONE个性相册设计的始末

    2009-07-13 12:27:00
  • 网页设计五原则

    2007-11-03 13:50:00
  • Oracle 语句优化分析说明第1/2页

    2009-09-18 13:23:00
  • eWebEditor在线HTML编辑助手下载及安装使用说明

    2008-10-11 13:58:00
  • SQL Server中多行多列连接成为单行单列

    2008-12-09 14:39:00
  • Python利用PaddleOCR制作个搜题小工具

    2022-07-22 16:18:18
  • 《JavaScript语言精粹》译者序及样章试读

    2009-04-03 11:38:00
  • 你是真正的用户体验设计者吗? Ⅲ

    2008-03-27 09:04:00
  • Python合并pdf文件的工具

    2021-09-09 23:28:47
  • Python 自由定制表格的实现示例

    2023-11-11 16:54:41
  • asp之家 网络编程 m.aspxhome.com