一、ROC曲线简介
1.1 ROC曲线的构成
1.横轴(假正率,FPR):
表示负样本被错误分类为正的比例(越小越好)
2.纵轴(真正率,TPR,即召回率):
表示正样本被正确识别的比例(越大越好)
3.曲线绘制:通过调整分类阈值(如逻辑回归的概率阈值),计算不同阈值下的(FPR, TPR)点,连接这些点形成曲线
1.2 关键指标:AUC
1.AUC:ROC曲线下的面积,范围在0.5(随机猜测)到1(完美模型)之间
- AUC = 0.9:模型有90%的概率将随机正样本排在负样本之前
- AUC对类别分布不敏感,适合不平衡数据评估
1.3 ROC曲线的核心作用
1.模型性能比较:AUC越高,模型整体区分能力越强
2.阈值选择:通过曲线形状选择最佳分类阈值(如平衡误诊与漏诊的医疗场景)
3.可视化权衡:曲线越靠近左上角,模型在TPR和FPR间的权衡越好
1.4 ROC vs. 精确率-召回率曲线(PR Curve)
1.ROC:关注整体排序能力,适合类别相对均衡的场景
2.PR Curve:聚焦正类的识别质量(精确率 vs. 召回率),更适合极端类别不平衡(如欺诈检测)
1.5 实例应用
1.医学诊断:调整阈值以降低漏诊(提高TPR)或减少误诊(降低FPR)
2.信用评分:通过AUC评估模型区分高风险/低风险客户的能力
二、PR曲线简介
2.1 PR曲线的构成
1.横轴(召回率,即TPR):
表示正样本被正确识别的比例(关注"漏检"问题)
2.纵轴(精确率):
表示预测为正的样本中实际为正的比例(关注"误检"问题)
3.曲线绘制:通过调整分类阈值(如概率阈值),计算不同阈值下的(Recall, Precision)点,连接这些点形成曲线
2.2 关键指标:AUC-PR
1.AUC-PR:PR曲线下的面积,范围在0(最差)到1(完美模型)之间
- 类别越不平衡,AUC-PR的评估越敏感。例如,在欺诈检测中,正样本占比仅1%时,AUC-PR比AUC-ROC更有参考价值
2.3 PR曲线的核心作用
1.聚焦正类性能:直接反映模型对正类的识别能力,避免负类数量主导评估结果
2.高不平衡场景:当正样本极少时(如罕见病诊断、欺诈检测),PR曲线比ROC曲线更可靠
3.阈值选择:通过曲线形状选择平衡精确率和召回率的最佳阈值(例如,医疗场景需高召回率,推荐系统需高精确率)
2.4 PR曲线 vs ROC曲线
|---------------|-------------------------------|---------------------|
| 对比维度 | PR曲线 | ROC曲线 |
| 核心关注点 | 正类的识别质量(Precision vs. Recall) | 整体排序能力(TPR vs. FPR) |
| 使用场景 | 正样本极少(极端不平衡) | 类别相对均衡或关注整体性能 |
| 对类别不平衡敏感度 | 高度敏感 | 不敏感(因FPR受负类数量影响较小) |
| AUC解释 | AUC-PR越低,模型漏检或误检越严重 | AUC-ROC反映整体排序能力 |
2.5 实例应用
1.罕见病筛查:需高召回率(减少漏诊),允许一定误诊(低精确率)
2.垃圾邮件检测:需高精确率(避免正常邮件被误判为垃圾),可容忍少量漏检(低召回率)
3.推荐系统:平衡精确率(推荐内容相关性)和召回率(覆盖用户兴趣范围)
2.6 注意事项
1.负样本主导时慎用:若负样本占比过高(如99%),PR曲线可能波动较大,需结合其他指标(如F1分数)
2.随机基线的差异:ROC曲线的随机基线是AUC=0.5,而PR曲线的随机基线为:
例如正样本占1%,随机模型的AUC-PR ≈ 0.01
三、代码实现
1.导入所需要的包
python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score
2.加载数据集,进行训练
python
随机生成数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用随机森林分类器进行训练
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
# 获取预测结果
y_pred_proba = clf.predict_proba(X_test)[:, 1]
3.计算ROC曲线和PR曲线
python
# 计算ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
# 计算PR曲线
precision, recall, _ = precision_recall_curve(y_test, y_pred_proba)
average_precision = average_precision_score(y_test, y_pred_proba)
4.绘制ROC曲线和PR曲线
python
# 绘制ROC曲线
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
# 绘制PR曲线
plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='blue', lw=2, label=f'PR curve (AP = {average_precision:.2f})')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall (PR) Curve')
plt.legend(loc="best")
# 显示图像
plt.tight_layout()
plt.show()
四、曲线可视化展示
4.1 曲线截图

4.2 图像分析
1.ROC曲线分析
- ROC曲线:展示了分类模型在不同阈值下的真阳性率(TPR)与假阳性率(FPR)之间的关系。
- 曲线下的面积(AUC):图中显示AUC为0.92,表示模型具有很高的区分能力。AUC值越接近1,模型性能越好。
- 对角线:图中的虚线表示随机猜测的模型性能,曲线越远离这条线,模型性能越好。
2.PR曲线分析
- PR曲线:展示了分类模型在不同阈值下的精确率(Precision)与召回率(Recall)之间的关系。
- 平均精确率(AP):图中显示AP为0.94,表示模型在不同召回率下的精确率平均值很高,说明模型在处理不平衡数据集时表现良好。
- 曲线形状:曲线越靠近左上角,模型性能越好。图中曲线在大部分区域都保持较高的精确率,说明模型在不同召回率下都能保持较高的精确度。
3.总结
- 这两个图表明该模型在分类任务中表现优异,具有很高的区分能力和精确度。
- ROC曲线适合评估模型的整体性能,而PR曲线更适合评估模型在不平衡数据集上的表现