机器学习-AUC/ROC

1.ROC

接收者操作特征曲线(receiver operating characteristic curve,或者叫ROC曲线)

ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。

  • TPR:在所有实际为阳性的样本中,被正确地判断为阳性之比率。

{\displaystyle TPR=TP/(TP+FN)}

  • FPR:在所有实际为阴性的样本中,被错误地判断为阳性之比率。

{\displaystyle FPR=FP/(FP+TN)}

给定一个二元分类模型和它的阈值,就能从所有样本的(阳性/阴性)真实值和预测值计算出一个 (X=FPR, Y=TPR) 座标点。

从 (0, 0) 到 (1,1) 的对角线将ROC空间划分为左上/右下两个区域,在这条线的以上的点代表了一个好的分类结果(胜过随机分类),而在这条线以下的点代表了差的分类结果(劣于随机分类)。

完美的预测是一个在左上角的点,在ROC空间座标 (0,1)点,X=0 代表着没有伪阳性,Y=1 代表着没有伪阴性(所有的阳性都是真阳性);也就是说,不管分类器输出结果是阳性或阴性,都是100%正确。一个随机的预测会得到位于从 (0, 0) 到 (1, 1) 对角线(也叫无识别率线)上的一个点。

 

2. ROC曲线

上述ROC空间里的单点,是给定分类模型且给定阈值后得出的。但同一个二元分类模型阈值可能设定为高或低,每种阈值的设定会得出不同的FPR和TPR。

  • 同一模型每个阈值 的 (FPR, TPR) 座标都画在ROC空间里,就成为特定模型的ROC曲线

3. AUC

在比较不同的分类模型时,可以将每个模型的ROC曲线都画出来,比较曲线下面积做为模型优劣的指标。

ROC曲线下方的面积(英语:Area under the Curve of ROC (AUC ROC)),其意义是:

  • 因为是在1x1的方格里求面积,AUC必在0~1之间。
  • 假设阈值以上是阳性,以下是阴性;
  • 若随机抽取一个阳性样本和一个阴性样本,分类器正确判断阳性样本的值高于阴性样本之机率{\displaystyle =AUC}[1]
  • 简单说:AUC值越大的分类器,正确率越高。

从AUC判断分类器(预测模型)优劣的标准:

  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
### 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 对于每一个类别分别获取对应的 FPR、TPR 并求得各自的 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值