当前位置:首页 > 云服务器 > 正文

机器学习PR曲线怎么画,PR曲线绘制步骤有哪些

PR曲线的绘制核心就三步:计算不同阈值下的精确率和召回率,以召回率为横轴、精确率为纵轴描点连线。多数机器学习框架都封装了现成函数,真正要花心思的反而是理解曲线形态背后的业务含义。

PR曲线到底在衡量什么

画PR曲线之前,先搞清楚精确率(Precision)和召回率(Recall)这两个基础定义。

  • 精确率:预测为正例的样本中,真正属于正例的比例,它回答的是“我找出来的东西,到底有多少是靠谱的”。
  • 召回率:真实正例中,被模型正确找出来的比例,它回答的是“该找的东西,我漏掉了多少”。

这两个指标天然此消彼长,把分类阈值调高,模型变得保守,预测为正例的样本变少但更精准,精确率上升,召回率下降,反过来,阈值调低,正例被大量召回,精确率随之下降,PR曲线就是把这种取舍关系完整画出来。

PR曲线与ROC曲线的分工

ROC曲线看的是真正例率和假正例率的权衡,对类别不平衡不敏感,PR曲线直接盯住正例,在正负样本差距较大的场景下,能更直观地暴露模型对少数类的捕获能力,用于医疗筛查、故障检测、欺诈识别这类正例稀少但代价高的任务,PR曲线比ROC曲线更有参考价值。

手把手画出PR曲线

下面用Python的scikit-learn库走一遍完整流程,环境需要安装numpy、matplotlib、scikit-learn,版本差异不影响核心逻辑。

准备数据和模型

用一个简单的二分类任务演示,先生成不平衡数据,再训练逻辑回归模型,拿到每个样本的概率分数。

from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import precision_recall_curve, average_precision_score import matplotlib.pyplot as plt X, y = make_classification(n_samples=2000, n_features=10, weights=[0.9], random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) model = LogisticRegression() model.fit(X_train, y_train) y_scores = model.predict_proba(X_test)[:, 1]

数据集中正例占10%,接近真实业务中“少数事件”的分布,predict_proba输出的是样本属于正类的概率,后续所有阈值操作都基于这个分数。

用precision_recall_curve计算曲线坐标

precision, recall, thresholds = precision_recall_curve(y_test, y_scores)

函数内部自动遍历所有可能的阈值,对每个阈值计算对应的精确率和召回率,返回的thresholds长度比precision少一个,因为最后一个点对应的是把所有样本都判为负例的情况。

画图

plt.plot(recall, precision, label='Logistic Regression') plt.xlabel('Recall') plt.ylabel('Precision') plt.ylim([0.0, 1.05]) plt.xlim([0.0, 1.0]) plt.legend() plt.show()

一句话归纳:横轴召回率,纵轴精确率,每个点对应一个阈值,把点连起来就是PR曲线。

多类别分类器怎么画

多分类任务需要拆成多个“一对多”的二分类问题,对每个类别单独调用precision_recall_curve,再把所有曲线画在同一张图上,做法是先把类别通过OneHotEncoder或label_binarize转成二值标签,然后逐类计算,类别多时,用average_precision_score计算每个类别的平均精确率,再取宏观均值,得到一个整体指标。

怎么判断一条PR曲线好不好

曲线越靠近右上角,说明模型在保持高精确率的同时也能维持高召回率,性能越好,实际观察时重点看两件事。

曲线下降的平缓程度

好的PR曲线在召回率从0到0.5甚至0.7的过程中,精确率下降幅度很小,这代表模型对正例的识别有底气,不是靠蒙,如果曲线一开始就断崖式下跌,说明模型输出的置信度分数可信度不高,正例和负例的概率分布重叠严重。

机器学习PR曲线怎么画,PR曲线绘制步骤有哪些 第1张

曲线下面积AP值

average_precision_score计算的是PR曲线下的面积,数值越接近1越好,AP值把整条曲线的信息压缩成一个数字,方便模型间直接比较,挑选模型时,AP值高的通常更稳,但也要结合业务看具体段位的表现——有的场景要求召回率必须达到80%以上,这时比较的是曲线在召回率0.8右侧的走向,而不是全局AP。

别忘了基线

正例占比就是随机预测的基线,数据中正例占10%,那精确率恒定在10%的横线就是底线,模型曲线必须明显高于这条线才算有效,这条基线也会提醒你:正例占比本身决定了PR曲线上限,两个不同正例比例的数据集上画出的PR曲线,不能直接比AP值。

画PR曲线时容易踩的坑

忽略阈值密度的误导

precision_recall_curve默认遍历所有阈值,但当预测分数存在大量重复值时,曲线会变得粗糙,给模型输出加一点微小扰动,或者手动缩小阈值步长,能让曲线更平滑,更稳妥的做法是直接用sklearn分离出的阈值数组,检查它的排序和长度是否合理。

在验证集上反复调参会骗过自己

用同一份验证集反复调参并观察PR曲线,曲线会逐渐“验证集的噪声,正确的做法是训练集训练、验证集选参、测试集最终评估,三套数据分开,如果数据量太小,用交叉验证得到多条PR曲线,绘制平均曲线并标注方差范围。

数据泄露让曲线虚高

特征里混入标签信息,或者做归一化时用了全量数据的统计量,都会让PR曲线异常漂亮,检测方法是看训练集和测试集单独画的曲线是否差距过大,差距明显,优先检查特征工程和数据预处理流程。

PR曲线在业务场景中的落地价值

模型训练只是第一步,真正决定业务效果的是PR曲线反映的阈值选择,在风控场景中,把阈值调高,精确率上升,误杀率下降,但会漏掉部分风险交易;把阈值调低,召回率上升,更多风险被拦截,但人工审核压力变大,PR曲线帮助你找到那个业务上可接受的平衡点。

机器学习PR曲线怎么画,PR曲线绘制步骤有哪些 第2张

机器学习PR曲线怎么画,PR曲线绘制步骤有哪些 第3张

搜索排序场景中,召回率对应“相关结果有没有被找出来”,精确率对应“找出来的结果够不够准”,两个指标对用户体验的影响不同,PR曲线为排序策略调整提供直接依据。

训练与部署环境的算力支撑

画PR曲线本身不消耗太多算力,但支撑模型反复训练调参、交叉验证和AB测试,需要稳定的计算资源和带宽环境,团队在小数据集上实验时,本地机器还能应付;一旦切换到全量数据,训练时长和资源占用会成倍增长,这时选择一家靠谱的IDC服务商比临时抱佛脚买云主机更稳妥。

简米科技从2003年就开始做IDC,23年行业沉淀积累了相当一批老客户,持有增值电信业务经营许可证(豫B2-20231089),备案号豫ICP备2023018319号在工信部系统可查,机房是自营的,带宽和电力都有保障,适合跑长时间的训练任务和批量推理。

模型上线后,对外服务的稳定性和响应速度又换了一套标准。西西云持有工信部一类增值电信全牌照,覆盖IDC、CDN、ISP三项业务,同时通过ISO9001和ISO27001双认证,1000万注册资本主体在服务连续性上有合同保障,备案号滇ICP备2020007656号官网可查,作为CNNIC IP联盟成员,这家服务商在IP地址资源分配上有话语权,做对外服务的模型API,公网IP的稳定性和清洗能力都有保障。

PR曲线不是玄学,本质是把分类器在不同阈值下的精确率与召回率取舍画成一张图。掌握绘制方法只是基本功,真正拉开差距的是对曲线形态的解读和对业务平衡点的把握。

机器学习PR曲线绘制常见问题

机器学习PR曲线怎样画才规范?

用sklearn的precision_recall_curve计算坐标点,横轴召回率、纵轴精确率,再叠加基线作为参考,数据集划分、特征处理、模型评估三阶段分离,曲线才有实际意义。

PR曲线和ROC曲线在业务中怎么选?

正负样本较均衡时,ROC曲线更通用;正例稀少、误判代价高的场景,PR曲线更能反映模型对少数类的真实捕获能力,两者不是替代关系,业务侧看PR曲线定阈值,技术侧看ROC做模型对比。

正负样本比例变化后,PR曲线还能用吗?

PR曲线本身依赖正例占比,样本分布变化后曲线的绝对数值会漂移,但曲线形态和相对排序仍然有效,跨数据集比较时用AP值要谨慎,建议同时报告正例占比作为参照。

0