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

11-24 38阅读 0评论

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+多分类)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持云初冀北。

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:Goliszhou@gmail.com
$

发表评论

表情:
评论列表 (暂无评论,38人围观)

还没有评论,来说两句吧...