真实面经题目 · 原创解析

推荐系统中做采样后样本分布被改变,点击率预估值应该如何校准?

采样会改变训练样本中的先验点击率,模型在采样分布上学到的概率通常不是线上真实曝光分布的 CTR。回答时要先说明校准目标是把 sampled posterior 还原到 target posterior,再给出 odds/prior correction 公式,并补充用未采样验证集做 Platt、isotonic、温度缩放或分桶校准,最后用可靠性曲线、ECE、Brier/logloss 和线上 A/B 验证。

出现于:哔哩哔哩 · 算法

60 秒回答模板

我会先区分排序分数和真实概率。负采样或正负样本重加权以后,模型输出的 p_s = P_s(y=1|x) 是采样分布下的后验概率,不能直接当线上 CTR 使用。若正样本保留率是 s1、负样本保留率是 s0,则 odds_s = p_s / (1 - p_s) = (s1 / s0) * odds_true, 所以 odds_true = (s0 / s1) * odds_s, p_true = odds_true / (1 + odds_true)。 等价地,如果知道真实先验 π 和采样后先验 π_s,可以写成: logit(p_true) = logit(p_s) + log(π / (1 - π)) - log(π_s / (1 - π_s))。 例如常见的全量保留点击样本、只保留 q 比例未点击样本,s1=1、s0=q,那么 p_true = q * p_s / (1 - p_s + q * p_s)。 q 越小,采样集 CTR 越被抬高,校准后的真实 CTR 越低。 工程上我不会只做全局公式修正,因为真实系统里还有曝光选择偏差、位置偏差、延迟反馈、不同流量桶和不同召回源的分布差异。通常会先在与线上目标一致的未采样曝光日志或带权验证集上做校准:全局 prior correction 作为 baseline,再按场景/频道/召回源/用户活跃度/位置等切片做 Platt scaling、isotonic regression、temperature/beta calibration 或分桶校准。验证看 predicted CTR bucket 与真实 CTR 是否贴近,看 ECE、MCE、Brier score、logloss、calibration slope/intercept;排序能力再看 AUC/GAUC/NDCG。最后通过线上 A/B 检查校准后用于融合、出价、阈值或多目标排序时是否真的改善业务指标。

考点 采样后验
难度 真实面经题
回答目标 让面试官看到候选人能从概率分布变化推导校准公式,也知道推荐系统里校准要落到目标分布、切片监控和线上策略收益,而不是只背一个后处理函数。

深入解析

01

先定义被校准的量

CTR 校准不是让 AUC 更高,而是让模型输出的概率数值接近目标线上曝光分布下的 P(y=1|x)。如果下游只用单模型排序,单调变换可能不改变 AUC;但如果下游要做多路融合、阈值控制、预估收益、流量分配或多目标加权,概率尺度错误会直接影响策略。

02

采样为什么会改变概率

负采样把 P_s(y) 改了,但通常不希望改变 P(x|y) 的语义。模型用交叉熵拟合采样集时,学到的是 P_s(y=1|x)。当正负样本保留率不同,采样集的 odds 会乘上 s1/s0,所以直接输出会系统性高估或低估真实 CTR。

03

核心公式

一般形式是 odds_true = (s0 / s1) * odds_sample,其中 odds_sample = p_s / (1 - p_s)。若用真实先验 π 和采样先验 π_s 表示,则 logit(p_true) = logit(p_s) + logit(π) - logit(π_s)。这类修正本质上是 class prior correction。

04

负采样特例

若点击样本全部保留,未点击样本只保留 q,p_s 会偏大。此时 p_true = q p_s / (1 - p_s + q p_s)。面试中可以用一个数值例子说明:q=0.1、p_s=0.5 时,真实校准值约为 0.1*0.5/(1-0.5+0.1*0.5)=0.05/0.55≈0.0909,而不是 0.5。

05

模型训练阶段的替代做法

可以在 loss 中按样本采样概率做 inverse propensity weighting 或 class weight,让训练目标直接逼近目标分布的 logloss。但权重会增加方差,极端负采样下训练可能不稳定;实践里常见做法是训练侧保证排序能力,预测后再用独立校准集做概率校准。

06

校准方法选择

全局 prior correction 简单、可解释、适合已知采样率的情况;Platt scaling/temperature scaling 参数少、稳定;isotonic regression 表达力强但容易过拟合,需要足够样本;分桶校准直观,适合业务验收;beta calibration 可处理概率两端偏差。推荐系统里通常会全局加切片结合。

07

验证与上线

离线看 reliability diagram、bucket CTR、ECE/MCE、Brier score、logloss、calibration slope/intercept,并按核心流量切片。线上要看校准影响的真实决策:融合权重、阈值、人群触达、收益预估、转化率和长期指标。校准改善不一定等于 AUC 改善。

易错点

  • 把采样后训练集里的点击率直接当线上 CTR。
  • 只回答过采样/欠采样,不给 posterior 或 odds 修正公式。
  • 混淆排序分数校准和概率校准,以为 AUC 高就说明 CTR 数值可信。
  • 用训练集做校准评估,忽略需要目标分布验证集。
  • 只做全局校准,不检查频道、位置、召回源、人群等切片偏差。
  • 忽略延迟反馈、曝光选择偏差、日志丢失等非采样因素。

面试官追问

如果训练时用了 class weight,还需要做采样后校准吗?怎么判断?

需要先看 class weight 是否已经按目标分布修正了训练损失。如果权重只用于让模型更关注少数类,输出概率仍可能不是线上真实 CTR;判断方法是在未采样、接近线上曝光分布的验证集上看可靠性曲线、ECE、Brier/logloss 和分桶预估/实际点击比。

为什么 AUC 可能不变,但 CTR 校准仍然很重要?

AUC 只关心正负样本排序的相对顺序,单调变换不会改变 AUC。CTR 校准关心概率数值是否可信,会影响出价、阈值、混排融合、库存预估和收益模拟,所以排序没变也可能需要校准。

线上真实 CTR 会随时间漂移,校准层应该如何监控和更新?

要按时间、频道、召回源、人群和位置监控预估 CTR 与实际 CTR 的分桶偏差,同时看 ECE、Brier 和校准曲线漂移。更新方式可以是定期用最近未采样数据重训校准层,或使用在线分桶/温度参数平滑更新,但要避免短期噪声导致校准层震荡。

位置偏差和负采样导致的先验偏移有什么区别?能否用同一个公式解决?

负采样主要改变类别先验,可以用采样率或先验 odds 修正。位置偏差改变的是曝光和点击观察机制,同样特征在不同位置的点击概率不同,需要位置特征、逆倾向加权、随机流量或 debias 模型,不能只靠一个全局先验公式解决。

如果不同召回源的采样率不同,你会做全局校准还是分源校准?

如果不同召回源采样率、用户意图和点击基线差异明显,应至少做分源或分层校准,否则全局校准会掩盖局部偏差。实践中可以先做全局校准作为基线,再按召回源/频道/位置做层级校准,并用样本量和稳定性约束避免过拟合。