多分类下的ROC曲线和AUC

本文探讨了多分类任务下ROC曲线的绘制和AUC计算,通过鸢尾花数据实例,介绍了两种方法:一种是计算每类别的ROC曲线然后取平均,另一种是直接转化为二分类问题。Python代码验证了这两种方法的AUC结果,并展示了绘图结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:http://blog.csdn.net/ye1215172385/article/details/79448575

        由于ROC曲线是针对二分类的情况,对于多分类问题,ROC曲线的获取主要有两种方法:

        假设测试样本个数为m,类别个数为n(假设类别标签分别为:0,1,...,n-1)。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。

         比如n等于3,标签应转换为:

        方法1:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每

### 绘制多分类问题ROC曲线并计算AUC值 对于多分类问题中的接收者操作特征(ROC)曲线及其下的面积(AUC),通常采用两种主要策略之一来处理:一对其余(OvR, One-vs-Rest)或多对多(MvM, Many-vs-Many)[^1]。 #### 使用One-vs-Rest方法绘制多类别ROC曲线 在这种情况下,针对每个类别构建二元分类器,并将其余所有类别视为负样本。这会为每一个可能的结果创建一个独立的ROC相应的AUC度量。具体实现如下: ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt from itertools import cycle from sklearn.preprocessing import label_binarize from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import SVC # 假设y_test是测试集的真实标签,y_score是由模型预测的概率得分 n_classes = len(set(y_test)) # 类别数量 y_test_bin = label_binarize(y_test, classes=[0, 1, 2]) # 将真实标签转换成one-hot编码形式 classifier = OneVsRestClassifier(SVC(kernel='linear', probability=True)) y_score = classifier.fit(X_train, y_train).decision_function(X_test) fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) colors = cycle(['aqua', 'darkorange', 'cornflowerblue']) for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label=f'Class {i} (area = {roc_auc[i]:.2f})') plt.plot([0, 1], [0, 1], 'k--', lw=2) plt.xlim([-0.05, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic for multi-class data') plt.legend(loc="lower right") plt.show() ``` 上述代码片段展示了如何利用`sklearn`库中的工具函数来完成这一过程。 #### 计算微平均(micro-average)与宏平均(macro-average) AUC 除了单独评估每种类别外,还可以通过聚合不同类别的真阳性假阳性率来进行整体性能评价。其中一种方式称为“宏平均”,它简单地取各个类别下AUC值得均值;另一种更为常用的方式叫做“微平均”,其先汇总所有的真正例(TP)、假正例(FP)再求得总体TPR/FPR从而得到单个综合性的AUC指标。 ```python 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 += 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"]) # Micro-average ROC curve and ROC area fpr["micro"], tpr["micro"], _ = roc_curve(y_test_bin.ravel(), y_score.ravel()) roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) ``` 这段脚本实现了宏平均微平均AUC的计算,并且可以很容易地扩展到更多类别的情况中去。
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值