Precision-Recall 曲线中的“无技能模型”基准线原理与绘制方法

云杰小哥_7054

云杰小哥_7054

2026-03-25

217人浏览

原创

Precision-Recall 曲线中的“无技能模型”基准线原理与绘制方法

本文深入解析分类任务中 precision-recall(pr)曲线上“无技能模型”(no-skill classifier)为何呈现为水平线,阐明其数学本质,并提供基于 scikit-learn 的完整实现代码与关键注意事项。

本文深入解析分类任务中 precision-recall(pr)曲线上“无技能模型”(no-skill classifier)为何呈现为水平线,阐明其数学本质,并提供基于 scikit-learn 的完整实现代码与关键注意事项。

在二分类评估中,Precision-Recall 曲线(PR 曲线)是衡量模型在不同分类阈值下查准率(Precision)与查全率(Recall)权衡关系的重要工具。与 ROC 曲线不同,PR 曲线对类别不平衡高度敏感,因此其基准线(即“无技能模型”的表现)并非对角线,而是一条水平直线——这一特性常令初学者困惑。其根本原因在于:无技能模型不依赖任何特征,仅以固定概率(如 0.5)随机预测正类;当该概率被用作预测置信度并配合阈值扫描时,其 Recall 可取 [0, 1] 全区间值,而 Precision 却恒等于数据集中正样本的真实比例(即 pos_ratio = n_pos / (n_pos + n_neg))。

为什么 Precision 恒定?
根据定义:
[ \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} = \frac{\text{True Positives}}{\text{All Predicted Positives}} ]
对无技能模型而言,所有样本被预测为正类的概率相同(设为 (p))。若设定阈值为 (t),则预测为正类的样本比例恒为:

  • 若 (t \leq p):全部样本被判为正 → 预测正例数 = 总样本数 (N)
  • 若 (t > p):全部样本被判为负 → 预测正例数 = 0(此时 Recall = 0,通常不参与 PR 曲线绘制)

在有效阈值区间((t \leq p))内,预测正例集合是随机均匀采样的,故其中正样本的期望比例严格等于数据集的正样本比例 pos_ratio。因此:
[ \mathbb{E}[\text{Precision}] = \frac{\mathbb{E}[\text{TP}]}{\mathbb{E}[\text{TP}+\text{FP}]} = \frac{p \cdot n{\text{pos}}}{p \cdot N} = \frac{n{\text{pos}}}{N} = \text{pos_ratio} ]
而 Recall = TP / n_pos = (p · n_pos) / n_pos = p —— 通过调节阈值 (t),可使等效的 (p) 从 0 连续变化至 1,从而驱动 Recall 从 0 到 1,但 Precision 始终锚定在 pos_ratio。这正是 PR 曲线上无技能模型表现为 y = pos_ratio 的水平线 的严格数学依据。

以下是在 Python 中计算并绘制该基准线的完整示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成高度不平衡数据集(正样本占比 ~10%)
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,
                           n_informative=2, n_clusters_per_class=1,
                           weights=[0.9, 0.1], random_state=42)
y_train, y_test = train_test_split(y, test_size=0.3, stratify=y, random_state=42)

# 计算正样本比例(即无技能模型的 Precision 基准值)
pos_ratio = np.mean(y_test)
print(f"正样本真实比例(无技能模型 Precision): {pos_ratio:.3f}")

# 模拟一个简单模型(如逻辑回归)用于对比
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X[y==0][:500], y[y==0][:500])  # 仅用部分数据训练示意
# 实际应用中请使用完整训练流程

# 获取预测概率(此处用随机概率模拟,真实场景替换为 model.predict_proba()[:, 1])
y_score = np.random.rand(len(y_test))  # 替换为实际模型输出

# 计算 PR 曲线点
precision, recall, _ = precision_recall_curve(y_test, y_score)
ap_score = average_precision_score(y_test, y_score)

# 绘图
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, label=f'Classifier (AP = {ap_score:.3f})', linewidth=2)
plt.axhline(y=pos_ratio, color='r', linestyle='--', 
             label=f'No-Skill Model (Precision = {pos_ratio:.3f})')

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve with No-Skill Baseline')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim([0, 1])
plt.ylim([0, 1.05])
plt.show()

关键注意事项:

  • ✅ 基准线位置由数据决定:y = pos_ratio 是唯一正确的无技能基准,不可设为 0.5 或其他固定值;
  • ⚠️ 避免混淆 ROC 与 PR 基准:ROC 曲线的无技能线是主对角线(y = x),因其纵轴为 TPR、横轴为 FPR,二者在随机预测下呈线性关系;PR 曲线因纵轴(Precision)含分母 TP+FP,导致其基准退化为水平线;
  • ? 评估意义:若模型 PR 曲线整体低于该水平线,说明其性能不如随机猜测正样本比例——这是一个强警示信号,需检查数据泄露、标签错误或模型失效;
  • ? AP 分数解读:Average Precision(AP)是对 PR 曲线下面积的近似,其值高于 pos_ratio 才表明模型具备实际判别能力。

综上,理解无技能模型在 PR 空间中的水平基准,不仅是正确绘制和解读曲线的前提,更是诊断模型在不平衡场景下真实价值的核心标尺。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4224

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24517

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2987

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3027

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2343

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习