python 多分类画auc曲线和macro-average ROC curve

最近帮一个人做了一个多分类画auc曲线的东西,不过最后那个人不要了,还被说了一顿,心里很是不爽,anyway,我写代码的还是要继续写代码的,所以我准备把我修改的代码分享开来,供大家研究学习。处理的数据大概是这种xlsx文件:

IMAGE	 y_real	 y_predict	 0其他	 1豹纹	 2弥漫	 3斑片	 4黄斑
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM005111 (Copy).jpg	0	0	1	8.31E-19	7.59E-13	4.47E-15	2.46E-14
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM005201 (Copy).jpg	0	0	1	5.35E-17	4.38E-11	8.80E-13	3.85E-11
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM004938 (4) (Copy).jpg	0	0	1	1.20E-16	3.17E-11	6.26E-12	1.02E-11
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM004349 (3) (Copy).jpg	0	0	1	5.66E-14	1.87E-09	6.50E-09	3.29E-09
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM004673 (5) (Copy).jpg	0	0	1	5.51E-17	9.30E-12	1.33E-13	2.54E-12
/mnt/AI/HM/izy20200531c5/299/train/0其他/IM004450 (5) (Copy).jpg	0	0	1	4.81E-17	3.75E-12	3.96E-13	6.17E-13

  • 导入基础的pandas和keras处理函数
import pandas as pd
from keras.utils import to_categorical
  • 导入数据
data=pd.read_excel('5分类新.xlsx')
data.head()
  • 导入机器学习库
from sklearn.metrics import precision_recall_curve
import numpy as np
from matplotlib import pyplot
from sklearn.metrics import f1_score
from sklearn.metrics import roc_curve, auc
  • 把ground truth提取出来
true_y=data[' y_real'].to_numpy()
true_y=to_categorical(true_y)
  • 把每个类别的数据提取出来
PM_y=data[[' 0其他',' 1豹纹',' 2弥漫',' 3斑片',' 4黄斑']].to_numpy()
PM_y.shape
  • 计算每个类别的fpr和tpr
n_classes=PM_y.shape[1]
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(true_y[:, i], PM_y[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
  • 计算macro auc
from scipy import interp
# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))

# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += interp(all_fpr, fpr[i], tpr[i])

# Finally average it and compute AUC
mean_tpr /= n_classes

fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
  • 画图
import matplotlib.pyplot as plt
from itertools import cycle
from matplotlib.ticker import FuncFormatter
lw = 2
# Plot all ROC curves
plt.figure()
labels=['Category 0','Category 1','Category 2','Category 3','Category 4']
plt.plot(fpr["macro"], tpr["macro"],
         label='macro-average ROC curve (area = {0:0.4f})'
               ''.format(roc_auc["macro"]),
         color='navy', linestyle=':', linewidth=4)

colors = cycle(['aqua', 'darkorange', 'cornflowerblue','blue','yellow'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label=labels[i]+'(area = {0:0.4f})'.format(roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('1-Specificity (%)')
plt.ylabel('Sensitivity (%)')
plt.title('Some extension of Receiver operating characteristic to multi-class')
def to_percent(temp, position):
    return '%1.0f'%(100*temp)
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
plt.gca().xaxis.set_major_formatter(FuncFormatter(to_percent))
plt.legend(loc="lower right")
plt.show()
  • 展示

  • 上述的代码是在jupyter中运行的,所以是分开的

参考文献

[1].ROC原理介绍及利用python实现二分类和多分类的ROC曲线. ROC原理介绍及利用python实现二分类和多分类的ROC曲线_山不过来,我就过去-CSDN博客_roc曲线python实现

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要绘制多分类AUC曲线,需要先将多分类问题转化为多个二分类问题。一种常见的方法是将每个类别与其他类别进行二分类,得到多个二分类结果后分别计算AUC,最终绘制多分类AUC曲线。 下面是一个示例代码,假设有3个类别,即0、1、2: ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt import numpy as np # 假设有3个类别,即0、1、2 n_classes = 3 # 随机生成样本标签和预测概率 y_test = np.random.randint(0, n_classes, size=100) y_score = np.random.rand(100, n_classes) # 计算每个类别与其他类别的AUC,并绘制多分类AUC曲线 fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): # 将当前类别设为正例,其他类别设为负例 y_test_binary = np.zeros_like(y_test) y_test_binary[y_test == i] = 1 y_test_binary[y_test != i] = 0 # 计算ROC曲线AUC fpr[i], tpr[i], _ = roc_curve(y_test_binary, y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 计算微观平均和宏观平均的AUC fpr["micro"], tpr["micro"], _ = roc_curve(y_test_binary.ravel(), y_score.ravel()) roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)])) mean_tpr = np.zeros_like(all_fpr) for i in range(n_classes): mean_tpr += np.interp(all_fpr, fpr[i], tpr[i]) mean_tpr /= n_classes fpr["macro"] = all_fpr tpr["macro"] = mean_tpr roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) # 绘制多分类AUC曲线 plt.figure() plt.plot(fpr["micro"], tpr["micro"], label='micro-average ROC curve (area = {0:0.2f})' ''.format(roc_auc["micro"]), color='deeppink', linestyle=':', linewidth=4) plt.plot(fpr["macro"], tpr["macro"], label='macro-average ROC curve (area = {0:0.2f})' ''.format(roc_auc["macro"]), color='navy', linestyle=':', linewidth=4) colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label='ROC curve of class {0} (area = {1:0.2f})' ''.format(i, roc_auc[i])) plt.plot([0, 1], [0, 1], 'k--', lw=2) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Multi-class ROC Curve') plt.legend(loc="lower right") plt.show() ``` 运行以上代码可以得到一个多分类AUC曲线的示例图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值