机器学习模型评价指标ROC-AUC

混淆矩阵

首先,在试图弄懂ROC和AUC概念之前,你一定要彻底理解混淆矩阵的定义!

混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:

  • 称预测类别为1的为Positive(阳性)
  • 预测类别为0的为Negative(阴性)
  • 预测正确的为True(真)
  • 预测错误的为False(伪)。

对上述概念进行组合,就产生了如下的混淆矩阵:
在这里插入图片描述

真正率假正率

然后,由此引出True Positive Rate(真正率)、False Positive Rate(假正率)两个概念:
T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
F P R = F P F P + T N FPR = \frac{FP}{FP + TN} FPR=FP+TNFP

仔细看这两个公式,发现其实TPR就是TP除以TP所在的列,FPR就是FP除以FP所在的列,二者意义如下:

TPR的意义是所有真实类别为1的样本中,预测类别为1的比例。
FPR的意义是所有真实类别为0的样本中,预测类别为1的比例。

ROC-AUC

如果上述概念都弄懂了,那么ROC曲线和AUC含义就信手拈来了:

按照定义,AUC即ROC曲线下的面积,而ROC曲线的横轴是FPR,纵轴是TPR,当二者相等时,即 y = x,如下图:
在这里插入图片描述
表示的意义是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的。

换句话说,分类器对于正例和负例毫无区分能力,和纯瞎蒙没什么区别,因此一般来说我们认为AUC的最小值为0.5。

理想情况

而我们希望分类器达到的效果是:对于真实类别为1的样本,分类器预测为1的概率(即TPR),要大于真实类别为0而预测类别为1的概率(即FPR),即y>x,因此大部分的ROC曲线长成下面这个样子:
在这里插入图片描述
最理想的情况下,既没有真实类别为1而错分为0的样本——TPR一直为1,也没有真实类别为0而错分为1的样本——FPR一直为0,AUC为1,这便是AUC的极大值。

### Python 中机器学习 ROCAUC概念 ROC (Receiver Operating Characteristic) 曲线用于展示不同阈值下分类器的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)[^1]。TPR 表示实际为正类的情况下预测为正的概率;FPR 则表示实际为负类却错误地预测为正的比例。 AUC (Area Under the Curve),即曲线下面积,衡量的是整个二分类模型的好坏程度。理想的分类器其 AUC 值接近于 1,意味着具有完美的区分能力;而当 AUC 接近 0.5,则表明该分类器几乎不具备任何判别力[^2]。 ### 计算方法与实现方式 为了计算并绘制 ROCAUC,在 Python 中通常会借助 `scikit-learn` 库中的函数来完成这一过程: #### 导入必要的库 ```python import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import label_binarize from sklearn.multiclass import OneVsRestClassifier from sklearn.metrics import roc_curve, auc from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt ``` #### 加载数据集并预处理 这里以鸢尾花(Iris)数据为例说明多类别情况下的操作流程: ```python iris = datasets.load_iris() X = iris.data y = iris.target # 将标签转换成二进制形式 Y = label_binarize(y, classes=[0, 1, 2]) n_classes = Y.shape[1] # 数据分割 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=.5, random_state=0) ``` #### 构建分类器并训练 采用随机森林作为基础估计器构建 OvR 多标签分类器: ```python classifier = OneVsRestClassifier(RandomForestClassifier(n_estimators=100)) y_score = classifier.fit(X_train, y_train).predict_proba(X_test) ``` #### 绘制 ROC 曲线及计算 AUC 对于每一个类别分别获取对应的 FPRTPR 并求得各自的 AUC 值: ```python fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 宏平均 ROC 曲线及其 AUC 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 macro_roc_auc = auc(all_fpr, mean_tpr) plt.figure(figsize=(8, 6), dpi=100) lw = 2 colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=lw, label='ROC curve of class {0} (area = {1:0.2f})' ''.format(i, roc_auc[i])) plt.plot([0, 1], [0, 1], 'k--', lw=lw) plt.xlim([-0.05, 1.05]) plt.ylim([-0.05, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Some extension of Receiver operating characteristic to multi-class') plt.legend(loc="lower right") plt.show() ``` 上述代码展示了如何针对多分类问题通过宏平均法得到整体表现指标,并给出了具体绘图的方法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MathDance

代码点亮人生,代码改变世界……

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

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

打赏作者

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

抵扣说明:

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

余额充值