机器学习-ROC曲线 和 AUC指标
1. 什么是ROC曲线?
ROC(Receiver Operating Characteristic,受试者工作特征曲线)是用来评估分类模型性能的一种方法,特别是针对二分类问题(比如“患病”或“健康”)。
核心思想
- ROC曲线通过改变分类阈值(即模型预测为“正类”的概率界限),观察模型的真正例率(TPR)和假正例率(FPR)的变化。
- TPR(True Positive Rate) = 真正例 / 所有实际正例
(正确识别出病人的比例) - FPR(False Positive Rate) = 假正例 / 所有实际负例
(把健康人误诊为病人的比例)
例子:医生诊断病人
假设我们有10个病人,其中4个真的患病(正类),6个健康(负类)。医生(模型)对每个病人给出一个患病概率(0~1之间的值)。
病人 | 实际状态 | 模型预测概率 |
---|---|---|
1 | 患病 | 0.9 |
2 | 患病 | 0.8 |
3 | 患病 | 0.7 |
4 | 患病 | 0.6 |
5 | 健康 | 0.55 |
6 | 健康 | 0.54 |
7 | 健康 | 0.53 |
8 | 健康 | 0.52 |
9 | 健康 | 0.51 |
10 | 健康 | 0.5 |
问题:医生应该设置一个阈值(比如0.6),把概率≥0.6的病人判定为“患病”,否则“健康”。但这个阈值选多少最好呢?ROC曲线就帮我们分析不同阈值下的表现。
2. 如何画ROC曲线?
我们调整阈值,计算不同阈值下的TPR和FPR,然后画出曲线:
阈值 | 预测结果(≥阈值=患病) | TPR(真正例率) | FPR(假正例率) |
---|---|---|---|
0.9 | [1] | 1/4 = 0.25 | 0/6 = 0 |
0.8 | [1,2] | 2/4 = 0.5 | 0/6 = 0 |
0.7 | [1,2,3] | 3/4 = 0.75 | 0/6 = 0 |
0.6 | [1,2,3,4] | 4/4 = 1.0 | 0/6 = 0 |
0.55 | [1,2,3,4,5] | 4/4 = 1.0 | 1/6 ≈ 0.167 |
0.54 | [1,2,3,4,5,6] | 4/4 = 1.0 | 2/6 ≈ 0.333 |
... | ... | ... | ... |
ROC曲线就是把所有(FPR, TPR)点连起来:
- 横轴(X):FPR(假正例率)
- 纵轴(Y):TPR(真正例率)
理想情况:曲线越靠近左上角(TPR高,FPR低),模型越好。
3. 什么是AUC?
AUC(Area Under Curve,曲线下面积)是ROC曲线下的面积,范围在0~1:
- AUC=1:完美模型(所有病人都被正确识别,没有误诊)
- AUC=0.5:随机猜测(和抛硬币一样,没有区分能力)
- AUC=0:完全反了(把病人当成健康,健康当成病人)
例子:
- 如果AUC=0.9,说明模型很好。
- 如果AUC=0.6,说明模型一般。
- 如果AUC=0.5,说明模型和随机猜测差不多。
4. Python代码实现
我们用sklearn
计算ROC曲线和AUC:
import numpy as np from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt # 实际标签(1=患病,0=健康) y_true = np.array([1, 1, 1, 1, 0, 0, 0, 0, 0, 0]) # 模型预测概率 y_scores = np.array([0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.5]) # 计算ROC曲线 fpr, tpr, thresholds = roc_curve(y_true, y_scores) # 计算AUC roc_auc = auc(fpr, tpr) # 画图 plt.figure() plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') # 随机猜测的线 plt.xlabel('False Positive Rate (FPR)') plt.ylabel('True Positive Rate (TPR)') plt.title('Receiver Operating Characteristic (ROC) Curve') plt.legend(loc="lower right") plt.show()
输出结果:
- 你会看到一条ROC曲线,AUC值会显示在图上(比如AUC=1.0,因为这个例子数据简单)。
5. 总结
概念 | 解释 |
---|---|
ROC曲线 | 不同阈值下的TPR vs FPR曲线 |
AUC | ROC曲线下的面积,衡量模型区分能力 |
理想情况 | AUC接近1,曲线靠近左上角 |
随机猜测 | AUC=0.5,曲线是45度直线 |
适用场景:
- 医学诊断(患病/健康)
- 垃圾邮件检测(垃圾/正常)
- 金融风控(欺诈/正常)
希望这个例子能让你轻松理解ROC和AUC!如果有疑问,欢迎继续讨论 😊