python绘制多分类的ROC曲线
时间: 2023-10-04 18:04:41 浏览: 109
绘制多分类的ROC曲线可以采用微观平均和宏观平均的方式。下面给出一个示例代码:
```python
import numpy as np
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 生成随机分类结果
n_classes = 3
n_samples = 1000
y_true = np.random.randint(low=0, high=n_classes, size=n_samples)
y_score = np.random.rand(n_samples, n_classes)
# 计算ROC曲线和AUC值
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_true == i, y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# 计算宏观平均ROC曲线和AUC值
macro_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
macro_tpr = np.zeros_like(macro_fpr)
for i in range(n_classes):
macro_tpr += np.interp(macro_fpr, fpr[i], tpr[i])
macro_tpr /= n_classes
macro_auc = auc(macro_fpr, macro_tpr)
# 计算微观平均ROC曲线和AUC值
micro_fpr, micro_tpr, _ = roc_curve((y_true == np.arange(n_classes)[:, None]).ravel(), y_score.ravel())
micro_auc = auc(micro_fpr, micro_tpr)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(micro_fpr, micro_tpr, label='micro-average ROC (AUC = {0:0.2f})'.format(micro_auc), color='deeppink', linestyle=':', linewidth=4)
plt.plot(macro_fpr, macro_tpr, label='macro-average ROC (AUC = {0:0.2f})'.format(macro_auc), 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} (AUC = {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('ROC Curve for Multi-class Classification')
plt.legend(loc="lower right")
plt.show()
```
在这个示例代码中,首先生成了随机的分类结果,然后分别计算每个类别的ROC曲线和AUC值。接着计算宏观平均和微观平均的ROC曲线和AUC值,并将它们一起绘制在同一张图上。最后,加入了一条虚线作为基准,将图例添加到图表中。
需要注意的是,对于多分类问题,sklearn.metrics.roc_curve函数的第一个参数需要传入一个bool型的数组,表示当前样本是否属于当前类别。因此,在计算ROC曲线时需要对每个类别进行二元分类。
阅读全文