PR曲线是评估分类模型性能的重要工具,特别适用于类别不平衡或需要重点关注正类识别能力的任务(如疾病诊断、欺诈检测)。以下从定义、绘制方法、应用场景及实际案例展开解析:
一、PR曲线的定义
1. 核心指标
-
精确率(Precision):
衡量预测为正类的样本中真实正类的比例。
-
召回率(Recall,即敏感度):
衡量真实正类样本中被正确预测的比例。
2. PR曲线的构成
- 横轴:召回率(Recall),范围[0, 1]。
- 纵轴:精确率(Precision),范围[0, 1]。
- 曲线形状:通过调整分类阈值,计算不同阈值下的(Recall, Precision)点并连接成曲线。
二、PR曲线的绘制步骤
- 排序预测概率:将测试集样本按模型输出的正类概率从高到低排序。
- 调整分类阈值:从高到低遍历概率阈值(如0.9, 0.8, ..., 0.1),逐个判定样本为正类。
- 计算Precision与Recall:在每个阈值下统计TP、FP、FN,计算对应的P和R。
- 连接所有点:将不同阈值下的(Recall, Precision)点按顺序连接,形成PR曲线。
示例数据:
样本 | 真实标签 | 预测概率 | 阈值=0.8时预测结果 |
---|---|---|---|
A | 正 | 0.95 | 正(TP) |
B | 负 | 0.90 | 正(FP) |
C | 正 | 0.85 | 正(TP) |
D | 负 | 0.75 | 负(TN) |
- 当阈值为0.8时:
- TP=2(A、C),FP=1(B),FN=0(未漏检)。
- Precision=2/(2+1)=0.67,Recall=2/(2+0)=1.0(假设总正类为2个)。
- 重复计算不同阈值下的点,绘制曲线。
三、PR曲线 vs ROC曲线
指标 | 横轴 | 纵轴 | 适用场景 |
---|---|---|---|
PR曲线 | 召回率(Recall) | 精确率(Precision) | 类别高度不平衡(正类<10%) |
ROC曲线 | 假正率(FPR) | 召回率(TPR) | 类别相对均衡 |
关键区别:
- 类别不平衡时:
- ROC曲线可能因大量负类样本而虚高(FPR易降低)。
- PR曲线直接反映正类的识别能力,更敏感于模型改进。
- 实例对比:
- 若正类仅占1%,模型A的ROC-AUC=0.9,但PR曲线可能显示AP=0.3,说明模型对正类识别能力不足。
四、PR曲线的应用场景
1. 类别不平衡任务
- 示例:
- 欺诈交易检测(正类占比0.1%)。
- 疾病筛查(患病样本极少)。
- 优势:避免准确率(Accuracy)的误导,直接反映少数类的识别效果。
2. 需权衡精确率与召回率的场景
- 高Recall需求:医疗诊断中需减少漏诊(FN),允许一定FP。
- 高Precision需求:法律判决中需减少误判(FP),允许一定FN。
- PR曲线的作用:帮助选择最优阈值(如通过曲线拐点确定平衡点)。
3. 模型性能对比
- 曲线位置:
- 曲线越靠近右上角(Precision和Recall均高),模型性能越好。
- 曲线接近水平线(Precision低),说明模型无法有效识别正类。
五、PR曲线的局限性
- 阈值敏感:曲线形状依赖分类阈值的调整策略。
- 样本量影响:正类样本极少时,曲线可能不稳定。
- 多分类扩展:需通过“一对多”策略为每个类别单独绘制PR曲线。
六、关键指标:平均精度(Average Precision, AP)
1. 定义
- AP是PR曲线下面积的近似值,综合反映模型在所有阈值下的平均性能。
- 计算方式:
- 11点插值法(PASCAL VOC):在11个召回率点(0.0, 0.1, ..., 1.0)取最大精确率,计算均值。
- 全点插值法(COCO):对每个召回率点插值精确率,积分计算面积。
2. 示例计算
假设PR曲线上有以下点:
(Recall=0.2, Precision=1.0), (Recall=0.4, Precision=0.8), (Recall=0.6, Precision=0.6)
- AP(11点插值):在召回率0.0、0.1、…、1.0处取最大精确率,例如:
- 召回率≥0.4时,最大精确率为0.8。
- AP = (1.0 + 1.0 + 0.8 + ...) / 11 ≈ 0.72
七、实际案例:癌症诊断模型
数据分布:
- 正类(患病):100例
- 负类(健康):9900例
- 模型A:Recall=0.90,Precision=0.30
- 模型B:Recall=0.70,Precision=0.50
PR曲线分析:
- 模型A:高Recall但低Precision,适合减少漏诊(如初步筛查)。
- 模型B:平衡性能,适合确诊阶段(需减少误诊)。
- 选择依据:根据医疗场景需求,通过PR曲线确定阈值或模型。
八、代码实现(Python)
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score
# 示例数据
y_true = [1, 0, 1, 0, 1, 1, 0, 1]
y_scores = [0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.4]
# 计算PR曲线和AP
precision, recall, _ = precision_recall_curve(y_true, y_scores)
ap = average_precision_score(y_true, y_scores)
# 绘制PR曲线
plt.plot(recall, precision, marker='.', label=f'AP={ap:.2f}')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve')
plt.legend()
plt.show()
九、总结
- PR曲线的核心价值:在类别不平衡时准确评估模型对正类的识别能力。
- 使用建议:
- 优先选择PR曲线而非ROC曲线处理高度不平衡数据。
- 结合AP指标量化模型性能。
- 根据业务需求选择阈值(如高Recall或高Precision)。
- 注意事项:理解不同插值方法对AP计算的影响,并在多分类任务中分开展示各类别PR曲线。