python绘制多分类的AUC曲线
时间: 2023-10-04 10:04:41 浏览: 172
要绘制多分类的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曲线的示例图像。
阅读全文