1. 从一个翻车现场说起:为什么正负样本值得单独拎出来讲
前阵子帮一个朋友看他的推荐系统项目,模型离线指标 AUC 跑到 0.92,团队欢天喜地准备上线,结果灰度第一天 CTR 直接掉了三成。排查了两天,问题不在模型结构,也不在特征工程,而是出在最不起眼的地方——负样本的采样方式。他们为了省事,把用户没点击的全部当成负样本,结果把"用户根本没曝光过的物品"也塞进了负样本池,模型学到的不是"用户不喜欢",而是"用户没见过",上线后自然一塌糊涂。
这个坑我见过太多次了。正样本(Positive Sample)和负样本(Negative Sample)这两个词,听起来像是机器学习入门第一课就该懂的东西,但真正在工业级项目里把它们定义清楚、采样合理、标注准确,难度远超大多数人的想象。不管你做的是搜索排序、推荐系统、风控反欺诈、图像分类,还是最近火得一塌糊涂的大模型偏好对齐,正负样本的定义方式直接决定了模型的上限。
这篇文章不打算给你背教科书定义,而是从一线实操的角度,把正负样本这件事掰开揉碎讲清楚:它们到底是什么、在不同场景下怎么定义、采样时有哪些坑、标注环节怎么保证质量、以及当样本出问题时怎么快速定位。适合已经上手做过模型、但对样本处理还停留在"调个库函数"阶段的同学,也适合想系统梳理一遍样本方法论的老手。
2. 正负样本到底是什么:别被教科书定义骗了
2.1 一句话讲清楚:它们不是"好"和"坏",而是"符合目标"和"不符合目标"
很多人第一次接触这两个词,会下意识理解成正样本就是"好的数据",负样本就是"坏的数据"。这个理解在情感分类里勉强说得通,但放到其他场景立刻就崩了。
举个反例:在信用卡反欺诈模型里,欺诈交易才是正样本,正常交易是负样本。你看,正样本反而是"坏"的那一类。再比如医疗影像筛查,有病灶的片子是正样本,健康的片子是负样本。所以正负的本质不是好坏,而是你希望模型去识别的那个目标类别,就是正样本;其余的就是负样本。
用一句更工程化的话说:正样本是"我们关心的、希望模型给出高置信度的事件",负样本是"我们希望模型压低置信度的事件"。这个定义在所有领域都成立,也是你后面做任何采样、标注、评估时判断对错的唯一标尺。
2.2 二分类、多分类、排序任务里的正负样本形态完全不同
在二分类任务里,正负样本是泾渭分明的两个集合,标签就是 0 和 1。但到了多分类,比如图像识别里识别猫、狗、鸟,正负样本的概念就变成了"相对于某个类别而言"——对"猫"这个类别来说,猫的图片是正样本,狗和鸟的图片都是负样本。这就是为什么多分类常用 one-vs-rest 的思路来理解。
到了排序和推荐场景,正负样本的形态又变了。这里没有绝对的"类别",只有"用户行为":点击、购买、收藏、停留超过 N 秒,这些通常算正样本;曝光未点击、划走、快速返回,这些算负样本。但注意,曝光未点击和从未曝光是两回事,前者是明确的负反馈,后者是未知,把它当负样本就是前面那个朋友踩的坑。
我整理了一张表,把常见场景下的正负样本定义列出来,你可以对照自己的项目看看有没有定义错:
| 场景 | 正样本定义 | 负样本定义 | 常见误区 |
|---|---|---|---|
| 推荐系统 | 点击/购买/收藏 | 曝光未点击 | 把未曝光当负样本 |
| 搜索排序 | 点击且停留达标 | 曝光未点击 | 把误点当正样本 |
| 风控反欺诈 | 欺诈交易 | 正常交易 | 正负比例极度失衡 |
| 图像分类 | 目标类别图像 | 其他类别图像 | 忽略难负样本 |
| 大模型偏好对齐 | 被选中的回答 | 被拒绝的回答 | 忽略平局样本 |
| 广告CTR | 点击 | 曝光未点击 | 忽略展示位置偏差 |
这张表建议你收藏,每次开新项目定义样本时拿出来对一遍,能省掉大量返工。
2.3 为什么这个定义如此重要:它决定了模型的学习目标
模型本质上是在拟合一个函数,输入特征,输出概率。正负样本的定义,就是在告诉模型"你要把哪些东西的概率往 1 推,哪些往 0 压"。定义一旦偏了,模型学到的就是错误的目标。
我见过一个特别典型的案例:某内容平台做"优质内容识别",把编辑人工推荐过的内容当正样本,其余当负样本。结果模型学出来的是"编辑的偏好",而不是"内容的优质程度",因为编辑推荐带有强烈的时效性和个人口味。上线后模型只会推编辑喜欢的那类内容,多样性极差。后来他们改成用"完播率+互动率+负反馈率"综合定义正样本,效果才正常。
所以定义正负样本,本质上是在回答一个业务问题:你到底想让模型帮你优化什么指标。这个问题想不清楚,后面所有工作都是白费。
3. 采样策略:正负样本比例失衡才是常态
3.1 为什么真实场景里负样本总是多到离谱
在绝大多数业务场景里,正样本都是稀缺的。广告点击率通常在百分之几甚至千分之几,欺诈交易占比可能只有万分之几,推荐场景里用户真正感兴趣的内容也是少数。这就导致原始数据里正负比例可能是 1:100、1:1000 甚至更极端。
直接把这种数据丢给模型会出问题。模型会学到一个"偷懒"的策略:把所有样本都预测成负样本,准确率依然能到 99% 以上,但这样的模型毫无价值。这就是所谓的类别不平衡问题。
解决思路主要有两条:一是从数据层面做采样,让正负比例更均衡;二是从算法层面做调整,比如给不同类别加权、用 focal loss 等。这里重点讲采样,因为它是实操中最常用、也最容易出错的环节。
3.2 负采样、正采样、分层采样怎么选
负采样(Negative Sampling)是最常用的手段,核心思路是从海量负样本中抽取一部分参与训练。但怎么抽很有讲究:
- 随机负采样:最简单,从负样本池里随机抽。适合负样本同质性高的场景,比如纯随机曝光。
- 难负样本挖掘(Hard Negative Mining):专门挑那些模型容易判错的负样本,比如曝光了但用户犹豫很久才划走的。这类样本信息量大,能显著提升模型判别力,但用多了容易过拟合,需要控制比例。
- 按热度采样:在推荐里,热门物品的曝光多,负样本也多,按热度采样能缓解热门物品被过度惩罚的问题。
正采样(Positive Sampling)相对少用,因为正样本本来就少,再采样会更少。但在某些场景下,比如正样本内部差异很大(有强正反馈和弱正反馈),可以对强正样本做上采样,让模型更关注高价值行为。
分层采样(Stratified Sampling)是我个人最推荐的做法:按照某个关键维度(比如用户活跃度、物品类别、时间分段)分层,然后在每层内部按比例采样。这样能保证训练集和真实分布的偏差可控,避免某一类用户或物品被过度代表。
3.3 采样比例不是拍脑袋:一个可落地的计算方法
很多人问采样比例到底设多少合适。我的经验是,不要追求 1:1,那反而会让模型对真实分布的估计产生严重偏差。比较稳妥的做法是:
- 先统计原始正负比例,记为 1:N。
- 根据业务对召回率和准确率的偏好,设定目标比例。一般推荐场景控制在 1:3 到 1:10 之间,风控场景可以到 1:20。
- 采样后要做概率校准,因为采样改变了先验分布,模型输出的概率不再等于真实概率。
概率校准的公式很简单,假设负样本采样率为 r(即保留了 r 比例的负样本),那么校准后的真实概率为:
p_true = p_pred / (p_pred + (1 - p_pred) / r)这个公式我在多个项目里验证过,采样率在 0.01 到 0.5 之间时校准效果都很稳。如果你不做校准,模型输出的概率直接拿去算期望收益,会系统性偏高,这是很多团队上线后才发现的问题。
注意:采样比例一旦确定,训练集、验证集、测试集必须用同一套采样逻辑,否则评估指标会失真。我见过有人训练用采样数据、测试用全量数据,结果离线指标和线上表现完全对不上。
4. 标注环节:正负样本质量的生死线
4.1 人工标注的三种模式与适用场景
不是所有项目都有现成的行为日志可以当标签。很多场景需要人工标注,这时候标注模式的选择就至关重要。
第一种是单标注,一个人标一条数据。成本最低,但一致性差,适合任务简单、容错率高的场景。
第二种是交叉标注,多人标同一条数据,取多数投票。成本翻倍,但能显著降低噪声,适合医疗、金融这类对准确性要求极高的场景。
第三种是专家标注+众包预标,先用众包做初筛,再由专家复核争议样本。这是成本和质量的平衡点,也是我在实际项目里用得最多的模式。
4.2 标注一致性怎么量化:Kappa 系数实操
标注一致性不能靠感觉,要用数据说话。最常用的指标是Cohen's Kappa 系数,它衡量的是"扣除随机一致后的真实一致性"。
Kappa 的计算逻辑是:先算观察一致率 Po,再算随机一致率 Pe,然后 Kappa = (Po - Pe) / (1 - Pe)。一般来说:
- Kappa > 0.8:一致性极好,标注质量可靠
- 0.6 < Kappa < 0.8:一致性可接受,但需要关注争议样本
- Kappa < 0.6:一致性差,标注规范需要重新制定
我在一个文本审核项目里遇到过 Kappa 只有 0.45 的情况,排查后发现是标注规范里"违规"的定义太模糊,不同标注员理解差异巨大。后来把规范拆成 12 条具体规则,每条都配了正反例,Kappa 直接升到 0.82。
4.3 标注规范怎么写才不扯皮
写标注规范是门手艺。我的经验是遵循三个原则:
- 可判定:每条规则都要能明确判断"是"或"否",避免"视情况而定"这种表述。
- 有边界:明确写出容易混淆的边界情况怎么处理,比如"部分违规算不算违规"。
- 带示例:每条规则至少配 2 个正例和 2 个反例,最好是从真实数据里挑的争议样本。
规范写完后,一定要先做一轮小规模试标,让标注员标 100 条,然后开会讨论分歧。这一步能提前暴露 80% 的理解偏差,比标完几万条再返工划算得多。
提示:标注规范不是写完就锁死的,随着项目推进要持续迭代。建议每两周复盘一次争议样本,把新出现的边界情况补充进规范。
5. 不同领域的正负样本实战差异
5.1 推荐与搜索:曝光未点击才是真负样本
推荐和搜索场景里,正负样本的定义直接决定了模型能不能学到用户的真实偏好。核心原则是:只有曝光过的物品,才有资格谈正负。
用户点击了,是正样本;曝光了但没点击,是负样本;从未曝光过的,既不是正也不是负,是未知样本,不能参与训练。这个原则听起来简单,但实操中经常被违反,原因通常是数据埋点不完整,拿不到完整的曝光日志。
另一个坑是位置偏差。排在第一位的物品天然点击率高,排在第十位的天然点击率低。如果直接把点击当正样本,模型会学到"位置靠前就是好",而不是"内容好"。解决办法是在训练时引入位置特征,或者用反事实推理的方法做纠偏。
5.2 风控与反欺诈:极端不平衡下的采样艺术
风控场景的正负比例可能是 1:10000 甚至更极端。这时候负采样几乎是必须的,但采样策略要特别小心。
我的做法是:保留全部正样本,对负样本做分层采样。分层维度包括交易金额、时间、用户等级等。采样后正负比例控制在 1:10 到 1:50 之间。同时,因为欺诈手法会不断演变,还要定期用新数据做难负样本挖掘,把那些"看起来像欺诈但实际正常"的样本加进训练集,提升模型的边界判别能力。
评估指标上,风控场景不能只看准确率,要看召回率、精确率和 KS 值。尤其是召回率,漏掉一个欺诈交易的代价远大于误判一个正常交易。
5.3 大模型偏好对齐:正负样本的新战场
大模型时代,正负样本有了新形态。在 RLHF 或 DPO 这类偏好对齐方法里,正样本是"被人类选中的回答",负样本是"被拒绝的回答"。这里最大的坑是平局样本——两个回答质量差不多,人类标注员随便选了一个。这种样本如果当正负对用,会引入大量噪声。
处理办法是:标注时明确设置"平局"选项,训练时把平局样本单独处理,或者直接丢弃。另外,偏好数据的质量比数量重要得多,几千条高质量偏好数据的效果,往往好过几万条噪声数据。
6. 常见问题与排查技巧实录
6.1 模型离线指标好但线上拉胯,怎么查
这是最经典的问题,排查顺序我总结成一张表:
| 排查项 | 检查方法 | 常见原因 |
|---|---|---|
| 样本定义 | 对比线上线下样本口径 | 线上把未曝光当负样本 |
| 采样偏差 | 检查采样是否分层 | 采样后分布偏移 |
| 特征穿越 | 检查特征时间戳 | 用了未来信息 |
| 概率校准 | 对比预测概率与实际 | 采样后未校准 |
| 数据延迟 | 检查特征更新时效 | 线上特征滞后 |
按这个顺序查,90% 的问题能在半天内定位。
6.2 正负样本比例突然变化怎么办
如果监控发现正负比例突然变化,先别急着调模型,先查数据。常见原因有三个:一是埋点出问题,某些行为没上报;二是业务策略调整,比如改了曝光逻辑;三是数据管道故障,部分数据丢失。这三种情况的处理方式完全不同,盲目调模型只会越调越乱。
6.3 几个我踩过的坑
第一个坑是用测试集的采样比例去评估模型。测试集应该尽量接近真实分布,如果测试集也做了负采样,评估出来的指标会虚高。正确做法是测试集用全量数据,或者用固定的采样比例并做校准。
第二个坑是忽略时间因素。用户兴趣会随时间变化,如果用一个月前的数据训练、预测今天的用户行为,效果会打折。建议训练数据用滑动窗口,并且做时间上的负采样,让模型学到时间衰减。
第三个坑是难负样本用过头。难负样本能提升模型判别力,但用太多会让模型过拟合到那些边界样本上,对普通样本的判别反而下降。我的经验是难负样本占比控制在 20% 到 30% 之间。
7. 写在最后:一些个人体会
正负样本这件事,说到底是一个"定义问题"的问题。技术手段再花哨,定义错了全白搭。我在实际项目里最大的体会是:花在定义和验证样本上的时间,永远不亏。一个项目如果样本定义清晰、采样合理、标注规范,模型结构用最朴素的都能出效果;反过来,样本一团糟,上再复杂的模型也是徒劳。
最后分享一个小技巧:每次开新项目,先别急着写代码,拿一张纸把"什么是正样本、什么是负样本、怎么采样、怎么验证"这四个问题写清楚,然后找业务方和数据方各对一遍。这个动作花不了半小时,但能帮你避开后面几周的返工。这个习惯我坚持了好几年,屡试不爽。