银河超市的王经理最近很焦虑。黄金货架层的薯片月销三千袋,底层同款却只有两百——供应商拍胸脯说自家薯片优秀,可王经理心里清楚:那个位置,就是放块石头也有人拿。你每天打开 App,看到“猜你喜欢”第一排的商品点击率 8%、第十条只有 1%,产品经理欢欣鼓舞,可算法工程师明白:这 8% 里,有多少是“货架光环”,又有多少是“真实喜欢”?这两个问题,正是推荐系统去偏研究的核心。 这篇文章教你两件武器。第一件叫 Uplift 建模,回答“推荐这个动作本身带来了多少增量”——就像王经理把同款薯片在黄金层和底层各摆一周,对比的是“被摆上去”这件事带来的因果效应。第二件叫 位置偏差校正,回答“点击高是因为位置好,还是因为真的匹配”——就像给底层商品的销量乘上补偿权重,抵消它吃亏的曝光概率。你还会学到 Uplift 树、IPS 逆倾向加权、AUUC 反事实评估,以及它们如何拼成一套完整的去偏方案。
学会 Uplift 与位置去偏,你就能从“追求点击率”升级为“衡量真实决策增量”,在推荐、广告、营销评估中成为能分清因果与关联的稀缺算法人才。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
位置偏差:观测CTR = 真实质量 + 位置效应 观测CTR (有偏) CTR分解公式 P(click|quality) P(click|pos) = V_ips = (1/n) \u03a3 推荐系统去偏可视化:展示位置偏差对CTR的污染、IPS逆倾向得分去...
认识位置偏差
银河超市的王经理发现一个怪象:黄金货架层的薯片月销三千袋,底层同款却只有两百。供应商说“薯片优秀”,可王经理清楚——黄金层连空气都卖得动。到底是质量好还是位置好?他不知道。推荐系统每天都在上演同一幕:用户打开 App,“猜你喜欢”第一条点击率 8%,第十条只有 1%。产品同学说“排第一的商品最棒”,老练的工程师却要先问:这个商品要是挪到第十条,还能有 8% 吗?
观测到的点击率,其实是两个因素相乘的结果:物品对用户的真实吸引程度,以及它被看到的机会(曝光概率)。位置越靠前,曝光概率越高,点击率天然虚高。这就是“位置偏差”:位置作为一个混入其中的干扰变量,同时影响着“谁被曝光”和“是否被点击”。于是“关联不等于因果”——头部物品点击高,是位置优势与真实质量的混合产物,不能全部算作物品的功劳。
用公式拆开看:
如果不处理位置偏差,模型会学到“靠前 = 用户喜欢”,导致头部富者愈富、尾部优质内容被永久压制。王经理的决定是:把同款薯片在黄金层和底层各放一周,记录销量差——这正是推荐系统从“观测”走向“因果”的第一步。
- 观测点击率日志里统计到的实际点击率,是被污染的混合值。
- 真实匹配度用户与物品的内在相关性,去偏后想恢复的目标。
- 位置曝光概率该展示位被用户看到的概率,位置越靠前越大。
- 等式含义观测值由真实相关和位置曝光相乘得到,位置这个“滤镜”混进了点击信号。
- 符号读音P 是概率,下标 obs 表示观测、real 表示真实、pos 表示位置。
Uplift建模原理
王经理开始做实验。他选了 200 家分店,100 家把这批薯片摆上黄金层,100 家摆底层。一个月后:黄金层平均销量 800,底层平均 200。差值 600 就是“摆黄金层”这件事本身的增量效应。注意,底层也卖出了 200——这些顾客是无论摆哪里都会买的忠实拥趸,他们不属于增量,却常常被算在功劳簿里。
推荐系统同理。每个用户像一家“试验店”,推荐策略是一个干预按钮 T:T=1 表示被推荐,T=0 表示未被推荐。Uplift(增量效应)回答的正是:同一个用户,在被推荐与未被推荐两个平行世界里,行为差异是多少。它不是简单预测“谁会点击”,而是预测“点击是因为推荐才发生的吗”。
公式定义:
不同用户对推荐的反应差异很大:有的用户不推就不买(高增量),有的推不推都买(零增量),还有的推了反而嫌烦(负增量)。Uplift 的目标,就是预测每个用户自己的 τ。王经理发现:年轻顾客的增量是 700 袋,家庭主妇接近 0。于是他把黄金层留给“最需要人推一把”的人群——同样的货架,产出完全不同。
- τ(x_i)用户 i 的增量效应,读作"tau of x i",是 Uplift 模型的预测目标。
- 条件概率 P在给定条件下发生点击的概率,条件写在竖线右侧。
- 治疗组 T=1该用户被推荐了目标物品。
- 对照组 T=0该用户没被推荐,作为平行世界的对照。
- 相减两组条件概率之差,消除“本来就喜欢”的成分,只留“推荐带来的增量”。
Uplift树算法
王经理手里有十万条顾客购买记录,特征包括年龄、会员等级、品牌偏好。他想让电脑自动找出“对推荐最敏感”的群体。信息部的李工提过决策树:按“买不买”分叉。可王经理要的不是“买不买”,而是“是不是推荐才买的”——普通决策树回答不了因果问题,于是 Uplift 树登场了。
普通决策树分裂时用信息熵或基尼系数衡量纯度,让节点内标签尽可能“同质”。Uplift 树换了个判据:不再看标签纯不纯,而是看“治疗响应差异”——分裂之后,左右两个子节点内部各自的“治疗组均值 − 对照组均值”差异越大越好。一句话:找一个特征阈值,把“推荐增量大的人”和“推荐增量小的人”干净地分开。
常用的分裂准则之一是欧氏距离:
树建好后,每个叶子节点里的“治疗 − 对照”均值,就是落入该叶子的用户的预测增量。剪枝也不看分类准确率,而看增量差异是否显著。王经理最终得到一棵让他惊喜的 Uplift 树:会员等级高、年龄在 25 到 35 的顾客,推荐增量最大。他满意地合上报告,开始调整货架策略。
- 样本占比左右子节点各占父节点的比例,作为权重。
- 组内响应均值子节点内治疗组和对照组各自的平均点击率。
- 作差相减得到该子节点内的增量效应。
- 平方把差异放大,同时避免正负增量相互抵消。
- 求最大遍历所有特征和阈值,选出使 Δ 最大的分裂方式。
逆倾向加权(IPS)
王经理想偷懒:不是每家店都做了 100/100 的对照实验,历史数据里黄金层商品多、底层商品少,两组样本严重不平衡。直接比销量,只会再次被位置欺骗。他需要一种“事后补偿”的方法,把底层商品吃亏的曝光概率补回来。
这个方法叫逆倾向加权(Inverse Propensity Scoring,IPS)。逻辑非常生活化:一个商品摆在很难被看到的位置(曝光概率 p 很小),居然还有销量,说明它的真实吸引力极强——它的销量应该乘上大权重 1/p,抵消它吃亏的处境;反之,占尽黄金位置才勉强卖出的商品,权重小一些,免得被“位置光环”抬轿子。
公式如下:
王经理对底层薯片乘以 5 倍权重、黄金层只乘 1.2 倍,重算商品排序,五个被埋没的爆款浮出水面。他感慨:IPS 就像给近视的人配眼镜,曝光概率是视力,1/p 是镜片度数。不过他还没来得及高兴,评估的老问题又来了——怎么证明这套模型真的有效?
- R 帽经过 IPS 校正后的无偏点击率估计,帽子表示估计量。
- 点击标签 y_i用户是否点击了该物品,取 1 或 0。
- 曝光指示器只统计被曝光(o=1)的样本,没曝光就无法观测点击。
- 倾向得分该物品在位置 x_i 下被曝光(被看到)的概率,通常用模型估计。
- 逆倾向权重除以 p 相当于乘以 1/p——曝光概率越低,一旦发生点击,权重越大。
反事实评估
王经理不能把 200 家店重新实验一遍来验证模型。他真正想问的是:“如果上个月没给张三推荐薯片,他还会买吗?”——现实里没有平行世界,这就是反事实问题。但“没有平行世界”不代表“无法评估”,关键是用对数据和方法。
思路是这样:拿一小部分流量做随机化试验——位置完全打散,让治疗组和对照组在统计上可比,等于制造了一个“平行世界切片”。然后,把模型预测的“增量最高用户”排在前面,看他们在随机试验数据里的真实累计增益曲线。这条曲线下的面积,就是 AUUC(Area Under Uplift Curve)。
公式:
如果模型真能识别增量人群,增益曲线会快速上升随后变平;如果模型是“瞎猜”,曲线会贴着对角线。AUUC 越高,说明把预算投向前排用户的回报越高。王经理用这个指标对比了三家建模公司的方案,选了曲线最陡的那家——因为只有它能把每一分钱都花在真正会被推荐打动的顾客身上。
- 排序集合 U_t按模型预测的增量从大到小排序,取前 t 比例的用户。
- 个体响应差治疗组与对照组各自的真实点击结果相减,得到真实增量。
- 计算平均对前 t% 用户求平均,得到累计增益。
- 曲线下面积对不同 t 的累计增益积分,AUUC 越大说明越多人被排对了队。
推荐系统实践
最终,王经理把整套方法装进了超市的“智能货架系统”:采集层记录每个位置的曝光与点击,去偏层用 IPS 校准数据,决策层用 Uplift 树输出每位顾客的推荐增量,评估层用随机分流加 AUUC 每月复盘。四个环节闭环运转。
决策层的核心原则是:不排“点击率最高”,而排“增量最大”。推荐对象不是“他本来就喜欢的东西”,而是“推荐这个动作能额外撬动行为的东西”。数学表达为:
落地时有几个实战细节:一是位置特征要加入模型,但推理时要把位置置为该物品的“平均曝光值”,否则位置会一边当特征一边当偏差;二是要把 5%~10% 的流量保持在随机位置模式,为 IPS 和 AUUC 提供干净数据;三是 IPS 权重需要截断(clip)到合理范围,防止个别极端权重引爆方差。月度看板上,离线 AUUC 提升 15%,线上 A/B 的增量点击提升 8%。
王经理的超市从“凭感觉摆货”升级为“用因果做决策”。他彻底明白了一个道理:黄金货架上的光环会骗人,真正的增长藏在“推荐这个动作本身”带来的增量里。区分因果与关联,从观测走向干预——这正是 Uplift 建模与位置偏差校正的全部意义。
- 最优策略 π\*对用户 u 给出的最优推荐决策。
- arg max从候选物品集合中,找出使目标函数取最大值的那个物品。
- 预测增量模型估计的物品 i 对用户 u 的 Uplift 值。
- 决策逻辑选增量最大者,而非点击率最高者——因为高点击率可能来自位置光环,增量才代表真实的业务拉动。
AI 应用场景
电商首页“猜你喜欢”位次调优
阶段:模型评估与决策优化
解决的问题:传统 CTR 排序被展示位置污染,顶部商品吃“位置红利”虚高,底部优质商品曝光不足。用 Uplift 模型预测每个商品对该用户的增量,用 IPS 加权校准位置偏差,让真正“推荐才买”的商品获得黄金位。
具体案例:某电商平台在首页 Feed 流上,把“增量最大”的物品排到前两位,A/B 实验显示深位转化提升 12%,底部商品曝光量提升 30%。
信息流广告人群圈选
阶段:人群定向与预算分配
解决的问题:传统投放圈选“高活跃人群”,但高活跃用户不投广告也会买,预算被白白浪费。Uplift 建模找出“看了广告才会下单”的增量人群,把预算集中投向这些人。
具体案例:某新零售客户对 500 万用户做 Uplift 树分层,圈出 80 万增量人群后 ROI 提升 2.3 倍,曝光成本下降 34%。
新品冷启动推荐去偏
阶段:在线学习与评估
解决的问题:新品没有点击历史,容易被位置偏差压制到尾部。用位置随机化加 IPS 校准,给新品公平曝光机会,并用 AUUC 离线验证模型对新品的排序质量。
具体案例:内容平台对新作者视频实施“位置随机打散 + IPS 加权曝光”,一周内新作者均播量提升 45%。
Python 演示
import numpy as np rng = np.random.default_rng(42)n = 1000active = np.arange(n) < n // 2 # 前 500 名是活跃用户t = rng.binomial(1, 0.5, n) # 是否被推荐p_click = 0.1 + 0.4 * active + 0.3 * (t == 1) * activey = rng.binomial(1, p_click, n) pos_prob = 0.95 ** np.arange(n) # 越靠前曝光概率越高obs_mask = rng.binomial(1, pos_prob, n) == 1y_obs = y.copy()y_obs[~obs_mask] = -1 # 未曝光无法观测点击 def ips_click_rate(y_obs, obs_mask, pos_prob): w = 1.0 / np.maximum(pos_prob, 0.05) seen = obs_mask & (y_obs >= 0) return (w[seen] * y_obs[seen]).sum() / w[seen].sum() naive = y_obs[y_obs >= 0].mean()ips = ips_click_rate(y_obs, obs_mask, pos_prob)true = p_click.mean() def uplift_by_group(mask): mt = (t == 1) & mask mc = (t == 0) & mask yt = y[mt].mean() if mt.sum() else 0.0 yc = y[mc].mean() if mc.sum() else 0.0 return yt - yc g_active = uplift_by_group(active)g_inactive = uplift_by_group(~active) print(f"朴素点击率={naive:.3f} IPS校正={ips:.3f} 真实点击率={true:.3f}")print(f"活跃用户增量={g_active:.3f} 非活跃用户增量={g_inactive:.3f}")print("决策:把推荐资源向增量更大的活跃用户倾斜")
active = np.arange(n) < n // 2前 500 名用户为活跃用户,模拟“活跃度”这个可能与位置相关的隐藏变量。p_click = 0.1 + 0.4 * active + 0.3 * (t == 1) * active生成点击概率:推荐只对活跃用户产生 0.3 的增量。pos_prob = 0.95 ** np.arange(n)曝光概率随位置指数衰减,越靠前越容易被看到。obs_mask = rng.binomial(1, pos_prob, n) == 1按曝光概率随机决定哪些样本被观测到,模拟真实日志的缺失机制。w = 1.0 / np.maximum(pos_prob, 0.05)IPS 权重是曝光概率的倒数,并用 0.05 下限防止除零和权重爆炸。naive = y_obs[y_obs >= 0].mean()直接平均可观测样本,得到被位置偏差污染的点击率。ips = ips_click_rate(y_obs, obs_mask, pos_prob)经过逆倾向加权,得到接近真实的点击率估计。mt = (t == 1) & mask取出治疗组(被推荐且属于该人群)的子集。return yt - yc组内增量等于治疗组平均响应减去对照组平均响应。print(...)对比三列数值,直观看到 IPS 校正了位置偏差。
常见误区
误区我看到排在第一位的商品点击率最高,说明推荐系统已经很棒了,用户就是喜欢这些商品,不需要做什么去偏处理。
正解顶部位置的点击率天然虚高,就像黄金货架放块石头也有人拿。观测点击率 = 真实相关 × 位置曝光,两者纠缠在一起。要想知道真实质量,必须拆开位置的影响,否则永远在给“位置光环”发功劳。
为何常见:因为只看了观测数据,没有对照组;位置信息被当成物品特征学进了模型,模型自然会把“靠前”误认为“被喜欢”。
误区CTR 模型已经能预测点击率,按点击率排序不就是在做推荐吗?为什么要多此一举搞 Uplift?
正解CTR 预测“用户会不会点”,是关联;Uplift 预测“推荐这个动作带来的增量”,是因果。一个高 CTR 用户可能本来就买,推不推无所谓;Uplift 专门找出“不推就不买”的人。就像王经理关心的不是薯片卖了多少,而是“摆上黄金层”这件事多卖了多少。
为何常见:把关联当因果,忽略了推荐系统本身是一个“干预”而不是“观察”。
误区IPS 的权重就是 1/点击率,点击率越高权重越大,而且权重越大越准,不用设置上限。
正解IPS 的权重是 1/曝光概率,不是 1/点击率。曝光概率低(很难被看到)却产生点击,说明物品本身有吸引力,所以权重高。但极端权重会让单个样本主导估计、方差爆炸,实际工程中必须做权重截断(clipping)。
为何常见:混淆了“曝光”与“点击”两个环节,又把统计直觉里的“权重大=更准”错误套用到了因果推断场景。
误区反事实评估需要同一个用户既被推荐又没被推荐,现实中做不到,所以离线模型没法验证好坏。
正解用小流量随机化试验数据制造“平行世界切片”:位置随机打散,治疗组和对照组天然可比。再把模型预测的增量排序拿到试验数据上画增益曲线,AUUC 就能离线比较不同模型的排序质量。王经理没把 200 家店重做实验,照样选出了最好的建模公司。
为何常见:把“反事实”想成了魔法般的平行宇宙,其实它是一套基于随机化与对照的统计设计。
误区位置偏差不过是随机噪声,训练数据足够大之后,模型自然会看清真实相关性,不用刻意处理。
正解位置偏差是系统性混杂,不是随机噪声。它方向一致地让头部虚高、尾部被压,数据越多,模型反而越巩固“靠前代表喜欢”的错误规律。必须用位置特征加随机化、IPS 加权等手段主动去偏。
为何常见:用“误差会相互抵消”的直觉去理解偏差,忽略了偏差是定向的、会随数据量放大的。
面试题
Q1. 位置偏差的本质是什么?
- A.数据标注的低级错误
- B.物品固有特征的缺失
- C.位置与质量效应混杂← 正确答案
- D.用户行为的随机波动
答案:C。位置偏差的本质是展示位置同时影响曝光和点击,导致“位置好”和“物品好”被混在一起,无法直接看出真实质量。它既不是标注错误,也不是随机噪声。
Q2. Uplift 建模估计的是哪个量?
- A.用户点击物品的概率
- B.推荐行为带来的增量← 正确答案
- C.物品之间的相似程度
- D.用户活跃时间的分布
答案:B。CTR 模型预测点击概率(关联),Uplift 预测“被推荐 vs 未被推荐”的行为差异(因果增量)。选项 A 是 CTR 的目标,C 是召回的目标。
Q3. Uplift 树选择分裂特征的依据是什么?
- A.子节点内信息熵增量
- B.子节点内基尼系数值
- C.治疗对照响应差异← 正确答案
- D.节点内样本量最大化
答案:C。Uplift 树的分裂目标是让左右子节点内部的“治疗组均值 − 对照组均值”差异尽量明显,用的是欧氏距离或 KL 散度,而不是普通决策树的信息熵和基尼系数。
Q4. 关于 IPS 逆倾向加权,哪些说法正确?
- A.权重等于曝光概率的倒数← 正确答案
- B.权重等于点击次数的倒数
- C.低曝光点击样本权重更高← 正确答案
- D.极端大权重需截断处理← 正确答案
答案:ACD。IPS 用 1/p 作为权重,p 是曝光概率。曝光概率越小,一旦发生点击说明物品真实吸引力越强,样本权重越大;但权重过大会让方差爆炸,需要 clip。权重绝不是点击次数的倒数。
Q5. 朴素点击率为何会高估头部物品?
- A.头部物品曝光量更平稳
- B.位置提高曝光与点击率← 正确答案
- C.头部物品质量必然更高
- D.用户习惯只点首屏物品
答案:B。观测点击率 ≈ 真实相关 × 位置曝光。头部位置曝光概率高、点击天然多,因此朴素点击率把位置红利算进了物品功劳里。“用户只点首屏”本身就是位置偏差的表现,不是原因。
Q6. AUUC 评估按什么顺序对用户排序?
- A.模型预测点击率降序
- B.模型预测增量效应降序← 正确答案
- C.物品曝光概率升序排列
- D.用户历史活跃度升序
答案:B。AUUC 把用户按 Uplift 模型预测的增量效应从大到小排序,再和随机试验数据里的真实累计增益对照。按点击率排会混入“本来就买”的用户,无法评估增量识别能力。
Q7. 位置偏差校正有哪些可行手段?
- A.训练时将位置作为特征← 正确答案
- B.小流量随机化位置实验← 正确答案
- C.逆倾向加权修正观测← 正确答案
- D.直接删除后排曝光样本
答案:ABC。位置特征加随机化流量加 IPS 加权是工程上常用的组合拳。删除后排样本会丢失信息,还会让训练集更加偏向头部,属于错误操作。
Q8. 治疗组与对照组在各场景中指的是?
- A.被推荐用户与未被推荐← 正确答案
- B.付费用户与免费用户
- C.活跃用户与沉默用户
- D.前排商品与尾部商品
答案:A。Uplift 建模中,治疗组是被施加干预(被推荐)的用户,对照组是未施加干预(不被推荐)的用户。付费与否、活跃度都是协变量而非干预分组。
Q9. 曝光概率趋近 0 时,IPS 估计的方差如何变化?
- A.方差会快速的减小
- B.方差维持原状不变
- C.方差急剧的增大← 正确答案
- D.方差先增大后减小
答案:C。IPS 权重是 1/p,当 p 趋近 0 时个别样本权重爆炸,主导整个估计,方差急剧增大。实际使用要用权重截断或改用双重稳健(DR)估计来缓解。
Q10. Uplift 建模适用于哪些业务场景?
- A.电商推荐位次调优← 正确答案
- B.广告投放人群圈选← 正确答案
- C.新用户冷启动策略← 正确答案
- D.图片分类标注任务
答案:ABC。只要关心“干预动作带来的增量”就适合 Uplift:推荐位次、广告投放、冷启动策略都属于干预决策。图片分类只做识别,没有干预与反事实问题。