Uplift 建模与策略优化实践:从因果推断到增量估计与线上资源分配
最近在做 uplift modeling 的调研和落地工作,写篇文章浅浅记录一下。
很多业务问题表面上看是在做预测,真正要解决的却是干预决策。
比如发优惠券、投广告、调整流量分发,真正的问题通常不是 “谁最可能转化”,而是:
对谁做干预,才能带来最大的净增量?
这两类问题的差异,决定了建模方式也完全不同。
传统预测模型擅长回答 “这个用户会不会买”、“这个用户会不会留存”;但它很难回答 “如果我发券,他会不会因此多买”“如果我减少直播曝光,他的长期价值会不会提升”。前者是相关性问题,后者是因果性问题。
Uplift Modeling 的价值,就在于把优化目标从结果预测,转向对干预增量的估计。相比 “找高概率用户”,它更关注 “找高增量用户”
本文尝试介绍 uplift 的原理和一个实际落地的应用场景,内容如下
- 为什么传统预测模型不适合直接指导干预策略
- Uplift Modeling 背后的因果推断直觉与常见建模方法
- AUUC、Qini 等离线评估指标应该怎么理解
- 在通用业务策略优化场景里,如何从实验设计一路走到线上策略落地
- 多 Treatment 与连续 Treatment 等扩展场景的建模思路
问题定义:预测与增量
相关性不等于因果
“相关性不等于因果” 在数据分析里几乎是一句常识,但落到具体业务里,往往最容易被忽略。
看几个经典例子。
例子一:冰淇淋与溺水事故
数据上看,冰淇淋销量和溺水事故数量往往高度正相关。但显然,禁止卖冰淇淋并不能减少溺水。真正的共同原因是气温:天气热时,人们更愿意吃冰淇淋,也更愿意去游泳。
例子二:教育年限与收入水平
教育年限更长的人通常收入也更高,但这并不自动意味着 “多读几年书” 一定会让整体收入同比例上升。因为 “能力”“家庭背景” 等因素,可能同时影响教育选择和收入结果。
例子三:收到优惠券的用户消费更高
这类结论在营销场景中极常见。但问题是,优惠券可能本来就是定向发给高价值用户的。于是 “收到券” 和 “高消费” 之间的关系,未必是优惠券造成的,而可能只是投放策略筛出来的相关性。
这几个例子背后,其实是同一个问题:
业务需要的是 “干预带来了什么变化”,而不是 “干预和结果看起来一起出现了”。
传统预测为何不够
传统机器学习模型通常以预测结果 \(Y\) 为目标:
\[ \hat{Y} = f(X) \]
它擅长做的是:给定用户特征 \(X\),预测用户最终会不会发生某个行为。
这在很多任务上是有效的,但一旦问题变成 “要不要对用户施加干预”,就会暴露出三个根本局限。
高概率用户不等于高增量用户
假设我们要优化 “发券后购买” 的结果。传统模型通常会找出购买概率最高的人群,但这些人未必值得发券。
| 用户类型 | 不发券 | 发券后 | 是否值得干预 |
|---|---|---|---|
| 铁粉用户 | 会买 | 会买 | 不值得 |
| 可说服用户 | 不买 | 会买 | 值得 |
| 无望用户 | 不买 | 不买 | 不值得 |
| 反感用户 | 会买 | 不买 | 应避免 |
传统模型只能识别 “谁更可能买”,却无法区分这些人究竟是铁粉、可说服用户,还是反感用户。
而真正值得投放资源的,往往只有第二类:因为干预才发生正向变化的人。
无法分辨因果方向
在广告场景中,如果观察到 “看过广告的用户转化率更高”,这并不能说明广告提升了转化。也可能是本来就更容易转化的人,更容易被投到广告,或者更容易被系统分配到广告曝光机会。
看不到反事实
做决策时,我们真正关心的是:
- 干预后会怎样
- 不干预会怎样
- 两者差多少
但传统预测模型通常只能看到一个已经发生的世界,而看不到 “如果当时不做这件事,会发生什么”。
而因果估计最关键的,恰恰就是这个反事实。
Uplift 在回答什么
Uplift Modeling 关注的不是结果本身,而是干预带来的净变化。
对单个用户 \(i\) 来说,我们希望估计:
\[ \tau_i = Y_i(1) - Y_i(0) \]
其中:
- \(Y_i(1)\) 表示该用户接受干预时的结果
- \(Y_i(0)\) 表示该用户不接受干预时的结果
- \(\tau_i\) 表示干预对该用户造成的增量
于是,传统预测和 Uplift Modeling 的差别就很清晰了:
| 维度 | 传统预测模型 | Uplift Modeling |
|---|---|---|
| 核心问题 | 用户会不会转化? | 干预能不能让用户多转化? |
| 学习对象 | 结果概率 | 因果增量 |
| 识别目标 | 高概率用户 | 高增量用户 |
| 策略结果 | 可能浪费资源 | 更适合精细化投放 |
在营销、广告、召回、风控、医疗等场景里,这种差别往往会直接决定 ROI。
理论基础:因果视角
潜在结果
从理论上看,Uplift 建模最常用的基础是因果推断里的潜在结果框架(Potential Outcomes Framework)。
对任意用户 \(i\),理论上都存在两个潜在结果:
- \(Y_i(1)\):接受干预后的结果
- \(Y_i(0)\):不接受干预时的结果
个体处理效应(ITE)定义为:
\[ \tau_i = Y_i(1) - Y_i(0) \]
但这里有一个经典困难:
对同一个用户,我们永远不可能同时观察到 “既干预又不干预” 两种状态。
这就是因果推断里的 Fundamental Problem of Causal Inference。
因此在实际中,我们通常不直接估计单个用户的真实 ITE,而是估计条件平均处理效应(CATE):
\[ \tau(x) = E[Y(1) - Y(0) \mid X = x] \]
也就是:在特征相似的人群里,干预平均会带来多大变化。
这正是大多数 Uplift 模型真正想学到的东西。
四类用户
从业务视角看,Uplift 最大的价值之一,是帮助我们把用户从 “按结果分层” 切换成 “按干预响应分层”。
常见的四象限划分如下:
| 用户类型 | 干预后行为 | 不干预行为 | 干预效果 | 策略建议 |
|---|---|---|---|---|
| Persuadables | 正向 | 负向 | 正向 | 值得干预 |
| Sure Things | 正向 | 正向 | 接近 0 | 无需干预 |
| Lost Causes | 负向 | 负向 | 接近 0 | 无需干预 |
| Sleeping Dogs | 负向 | 正向 | 负向 | 避免干预 |
这里最值得关注的,是 Persuadables;最需要规避的,是 Sleeping Dogs。
很多业务策略表面上 “模型分高、投放更积极”,但如果高分用户里大量是 Sure Things,资源就会被浪费;如果误伤了 Sleeping Dogs,策略甚至会出现负收益。
三个假设
要让 uplift 估计具备可信度,通常至少依赖以下三个假设。
无混淆性
\[ (Y(1), Y(0)) \perp T \mid X \]
也就是说,在给定特征 \(X\) 的前提下,干预分配 \(T\) 与潜在结果独立。
直观理解就是:影响 “是否被干预” 和 “最终结果” 的关键变量,最好都已经被观测到。
在真实业务里,这个条件往往很强,因此很多项目会优先依赖随机实验来提升可识别性。
重叠性
\[ 0 < P(T=1 \mid X=x) < 1 \]
即对任意一类用户,都应该有机会进入实验组或对照组。否则某些区域没有足够对照信息,模型就无法可靠学习。
SUTVA
一个用户的潜在结果,只受自己的干预状态影响,而不受其他用户干预状态影响。
这意味着不存在明显的外溢效应。实际业务中,如果用户之间有强社交传播、资源竞争或系统级联动,这个假设可能会被破坏。
这三个假设里,最难满足的通常是无混淆性。所以如果业务允许,优先做随机对照实验(RCT),几乎总是更稳妥的起点。
方法综述:Uplift 建模
Uplift Modeling 并没有唯一标准答案。工程上更常见的是两类方法:
- Meta-Learners:把因果效应估计拆成几个监督学习子问题
- Direct Uplift Models:直接围绕 treatment effect 设计模型或分裂准则
本文重点介绍更常见的几类方法。
S-Learner
S-Learner 的思路最直接:把干预变量 \(T\) 当成一个普通特征,和其他用户特征一起喂给模型。
\[ \mu(x, t) = E[Y \mid X=x, T=t] \]
训练完成后,对同一个用户分别输入 \(t=1\) 和 \(t=0\),两次预测的差值就是 uplift 估计:
\[ \hat{\tau}(x) = \hat{\mu}(x, 1) - \hat{\mu}(x, 0) \]
优点:
- 实现简单
- 所有样本都用于训练一个模型
- 适合作为 baseline 快速验证
缺点:
- 如果 treatment 信号弱,模型容易忽略 \(T\)
- 在强正则下容易出现 regularization bias
如果只是想快速判断 uplift 方法在业务里有没有潜力,S-Learner 往往是很实用的起点;但如果真要追求更高质量的 CATE 估计,它通常不是终点。
T-Learner
T-Learner 的想法是把实验组和对照组彻底分开,分别训练两个模型:
\[ \mu_1(x) = E[Y \mid X=x, T=1] \]
\[ \mu_0(x) = E[Y \mid X=x, T=0] \]
两者差值就是 uplift:
\[ \hat{\tau}(x) = \hat{\mu}_1(x) - \hat{\mu}_0(x) \]
优点:
- 可以独立拟合干预组和对照组的不同模式
- 不容易像 S-Learner 一样把 treatment 信号 “抹平”
缺点:
- 每个模型只用到部分样本,样本利用率较低
- 样本不平衡时效果容易变差
- 两个模型误差会相互叠加
X-Learner
X-Learner 可以理解为在 T-Learner 的基础上,进一步提高样本利用效率,尤其适合 treatment / control 样本不平衡的场景。
它的核心步骤可以概括为三阶段:
训练两个响应模型
\[ \hat{\mu}_1(x) = E[Y \mid X=x, T=1] \]
\[ \hat{\mu}_0(x) = E[Y \mid X=x, T=0] \]
构造伪因果效应
对实验组样本:
\[ D_i^1 = Y_i^1 - \hat{\mu}_0(X_i) \]
对对照组样本:
\[ D_i^0 = \hat{\mu}_1(X_i) - Y_i^0 \]
再分别训练两个 effect model:
\[ \hat{\tau}_1(x) = E[D^1 \mid X=x] \]
\[ \hat{\tau}_0(x) = E[D^0 \mid X=x] \]
按倾向性得分加权组合
\[ \hat{\tau}(x) = g(x) \cdot \hat{\tau}_0(x) + (1-g(x)) \cdot \hat{\tau}_1(x) \]
其中 \(g(x)\) 通常取倾向性得分 \(P(T=1 \mid X=x)\)。
优点:
- 对样本不平衡更鲁棒
- 往往比 S-Learner、T-Learner 有更好的 CATE 精度
- 对业务中的非对称实验设计更友好
缺点:
- 实现与调参复杂度更高
- 训练链路更长,诊断难度更大
Uplift Tree
Uplift Tree 是决策树在 uplift 场景下的改造版。它不再围绕 “分类纯度” 或 “回归误差” 来分裂节点,而是围绕 “实验组与对照组之间的差异” 来做分裂。
常见分裂准则包括:
KL 散度:
\[ D_{KL}(P^T || P^C) = \sum_y P^T(y) \log \frac{P^T(y)}{P^C(y)} \]
欧式距离:
\[ D_E = \sum_y (P^T(y) - P^C(y))^2 \]
卡方距离:
\[ D_{\chi^2} = \sum_y \frac{(P^T(y) - P^C(y))^2}{P^C(y)} \]
它的好处在于解释性往往比较强,适合用来做规则洞察和人群切分;但稳定性、泛化能力通常仍需结合 ensemble 方法增强。
Causal Forest
Causal Forest 可以理解为 Causal Tree 的集成版本,也是很多真实业务里比较常用的一类方法。
它的核心思想不是简单地 “给用户打分”,而是:
对于目标用户 \(x\),自动找到一批和他在 treatment effect 上更相似的邻域样本,再在这个局部邻域里估计 CATE。
每棵树的分裂目标,是尽量让左右子节点在因果效应上更不一样:
\[ \max_{j,s} \left( \hat{\tau}^{left}(j,s) - \hat{\tau}^{right}(j,s) \right)^2 \]
Honest 估计
Causal Forest 的一个重要特点,是常采用 honest estimation:
- 一部分样本用于决定如何分裂树
- 另一部分样本用于估计叶子节点里的因果效应
这么做的好处是统计性质更好,也更容易给出置信区间。
在适当条件下,Causal Forest 还可以具备渐近正态性,从而支持统计推断:
\[ \frac{\hat{\tau}(x) - \tau(x)}{\sqrt{\hat{V}(x)}} \xrightarrow{d} N(0, 1) \]
它适合什么场景
Causal Forest 通常在以下场景比较有吸引力:
- 预期存在明显异质性 treatment effect
- 特征很多、非线性和交互关系强
- 希望不仅 “能打分”,还希望对估计结果有一定统计解释
当然,它的代价也很明确:训练更重、推理更复杂、调参与诊断成本也更高。
方法选择
如果把几类方法放在一起对比,大致可以这样理解:

| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| S-Learner | 快速验证、小数据 | 实现简单、样本利用率高 | 弱 treatment 时容易失效 |
| T-Learner | 样本均衡、效应较明显 | 结构直观 | 样本效率低、误差叠加 |
| X-Learner | 样本不平衡、追求精度 | 更鲁棒、效果通常更好 | 链路复杂 |
| Uplift Tree | 需要规则解释、人群切分 | 可解释性好 | 稳定性一般 |
| Causal Forest | 非线性强、希望估计更稳 | 理论支撑更强、能捕捉复杂效应 | 计算成本高 |
工程里没有银弹。很多时候,最好的方式不是一开始就追求最复杂模型,而是:
- 用简单 baseline 快速验证 uplift 是否真的存在
- 再逐步切到更强的 effect learner
- 最后把重心放在策略使用方式,而不是只盯着离线分数
评估方法:离线到在线
Uplift 的评估方式和普通分类 / 回归明显不同。
原因很简单:真实的个体因果效应不可观测。我们看不到同一个用户在 “干预” 和 “未干预” 两个世界里分别会发生什么。
所以,uplift 模型的评估重点通常不是 “单点预测准不准”,而是 “排序是否有效”。
AUUC
AUUC(Area Under the Uplift Curve)是最常见的 uplift 离线评估指标之一。
基本做法是:
- 按模型预测的 uplift 分数从高到低排序
- 从前往后逐步取人群
- 观察随着覆盖人群增加,累计 uplift 的变化曲线
对前 \(k\) 个用户,累计增量可写成:
\[ \hat{\tau}_k = \frac{\sum_{i=1}^{k} Y_i^T}{N_k^T} - \frac{\sum_{i=1}^{k} Y_i^C}{N_k^C} \]
其中:
- \(N_k^T\) 是前 \(k\) 个样本中的实验组样本数
- \(N_k^C\) 是前 \(k\) 个样本中的对照组样本数
AUUC 就是整条 uplift curve 下的面积:
\[ AUUC = \frac{1}{N} \sum_{k=1}^{N} \hat{\tau}_k \]
直观上,AUUC 越大,说明模型越能把 “真正高 uplift 的人” 排在前面。
Qini
Qini 可以看作 AUUC 的一个改进版本,尤其在实验组和对照组样本量不平衡时更常用。
Qini Curve 的一种写法为:
\[ Q_k = N_k^T \cdot \bar{Y}_k^T - N_k^C \cdot \bar{Y}_k^C \cdot \frac{N_k^T}{N_k^C} \]
Qini 系数就是对应曲线下的面积。
简单理解:
- AUUC 更直观
- Qini 对样本不均衡更稳健
- 真实业务里,Qini 往往更适合作为主指标之一
离线与线上
离线评估解决的是 “模型是否学到了可用的排序能力”,但最终仍要回到线上策略效果。
因此,一个完整的评估闭环通常是:
- 离线:看 AUUC、Qini、分桶 uplift、一致性和稳定性
- 在线:看干预后主指标提升、成本消耗、ROI、负向副作用
离线分数高,只能说明模型可能值得上线;真正决定策略是否成立的,还是线上 A / B Test。
工程落地:从实验到策略
前面的内容主要讨论理论与方法。接下来把视角从模型本身拉回到更通用的策略优化框架。
无论是电商发券、广告激励、直播调控,还是推荐系统里的流量分发,本质上都在回答同一个问题:
对这个用户施加某种干预,到底值不值得?
这类问题都可以抽象成一个统一的 gain-cost 权衡框架:
- Gain:干预后希望提升的核心业务价值
- Cost:干预带来的资源消耗、副作用或局部业务损失
方法本身并不依赖某个垂直场景,真正变化的只是不同业务下 gain 指标和 cost 指标的定义。
| 场景 | Treatment | Gain 指标 | Cost 指标 |
|---|---|---|---|
| 电商营销 | 发券、加补贴、提高触达频次 | 下单率、GMV、7 日 LT | 券成本、补贴消耗、毛利损失 |
| 广告投放 | 提高出价、增加曝光、发放激励 | 点击、转化、广告收入 | 流量占用、补贴成本、体验损耗 |
| 内容 / 直播分发 | 增减某类内容曝光、调整流量占比 | 留存、会话、时长、长期价值 | 子业务收入下滑、生态指标波动 |
如果只盯着单一 gain,很容易把策略做偏;只有把 gain 和 cost 同时纳入建模与决策,策略才真正有上线意义。
整体链路
一个完整的 uplift 策略链路,通常可以抽象为:
- 通过随机实验构造 treatment / control 数据
- 训练 uplift 模型,估计用户的增量收益与增量成本
- 在预算或约束条件下,把模型分转换成可执行决策
- 在线持续监控并动态更新策略
也就是说,模型只是中间一环;实验设计、策略求解、线上反馈,同样重要。

数据构造
RCT / Switchback 实验设计
实验形式并不唯一,常见的设计包括:
- 用户级随机实验:适合电商发券、广告激励等用户独立干预场景
- Switchback Experiment:适合供给、流量、时段级干预场景
- 分桶灰度实验:适合线上策略逐步放量验证
共同目标只有一个:让 treatment assignment 尽量随机,从而降低选择偏差,提升 uplift 估计的可信度。
做这类实验时,至少有三点要特别关注:
- 随机化是否真的均匀覆盖关键人群
- 实验期间是否有外部流量策略或业务活动干扰
- 样本量是否足够支撑异质性效应学习
很多 uplift 项目不是死在模型,而是死在实验设计不够干净。
特征工程
在一个通用的 uplift 项目里,特征通常会覆盖用户、行为和上下文等多类信息,例如:
| 特征类别 | 示例特征 | 业务含义 |
|---|---|---|
| 基础用户特征 | 年龄、性别、注册时长 | 用户基本属性 |
| 历史交易特征 | 下单次数、客单价、复购间隔 | 商业价值与购买习惯 |
| 广告交互特征 | 曝光、点击、转化、激励领取 | 广告敏感度 |
| 内容消费特征 | 时长、完播率、互动次数 | 内容偏好与注意力分布 |
| 价格敏感特征 | 价格带偏好、折扣使用率 | 对补贴和优惠的敏感程度 |
| 设备与环境特征 | 机型、网络、地域、时段 | 外部约束与场景差异 |
| 流量上下文特征 | 入口、版位、资源位竞争情况 | 当前供给环境 |
| 用户画像与分层 | 兴趣标签、价值层级、风险标签 | 用户分类 |
| 社交关系特征 | 关注、粉丝、互关、分享关系 | 社交传播潜力 |
| 趋势特征 | 7d / 30d 行为差值、比值、斜率 | 状态变化 |
这里有一个很重要的实践经验:
Uplift 特征工程的重点,不只是提升 response prediction,而是尽量暴露 “谁对干预更敏感” 的异质性。
因此,能体现趋势、状态切换、消费结构差异的特征,往往比静态画像更重要。
Label 设计
在这个通用框架下,通常仍建议把 label 拆成两类。
Gain Label
表示 “施加干预后,业务核心目标获得的增量收益”。
例如:
- 电商:7 日下单率、GMV、复购、长期价值
- 广告:点击率、转化率、广告收入、广告主 ROI
- 内容 / 直播:留存、有效会话、消费时长、长期活跃价值
Cost Label
表示 “施加干预后,需要付出的资源消耗或副作用”。
例如:
- 电商:优惠券成本、补贴消耗、毛利损失
- 广告:流量占用、补贴成本、用户体验下降
- 内容 / 直播:某子业务收入下降、供给生态波动、时长迁移损失
这一点很关键:
很多策略只预测 gain,不预测 cost,最后上线时容易出现 “主指标提升了,但业务副作用太大” 的问题。把 gain 和 cost 拆开建模,本质上是在为后续约束优化做准备。
模型选择
如果要在多类业务场景里选择一个相对稳妥的异质性效应学习器,Causal Forest 往往是一个不错的起点,主要基于三点考虑:
- 可以较好地捕捉非线性与交互效应
- 对异质性 treatment effect 的表达能力更强
- 在类似业务场景中已有验证,工程上更有把握
如果从 “方法论最先进” 角度看,未必只有这一种选择;但从 “业务可落地、可解释、可复用” 看,Causal Forest 是一个相对稳妥的折中方案。
Label 归一化
最初尝试中,常见做法是直接使用原始 label,并通过人工权重去对齐不同指标的量纲:
\[ score_{raw} = w_1 y_1 + w_2 y_2 + w_3 y_3 \]
但这种方式有几个明显问题:
- 超参数很难调
- 极端值影响大
- 一旦分布漂移,稳定性差
后来改成了更实用的百分位归一化方案:
\[ y_{norm} = \text{percentile\_rank}(y) \]
也就是用样本在训练集中的相对位置,替代原始值本身。
这么做的优点很明显:
- 范围固定在
[0, 1],便于模型学习 - 对极端值更鲁棒
- 更贴近后续排序型决策的使用方式
这也是一个很典型的工程取舍:
真实业务中,很多时候不需要模型把绝对收益估得极准,而是更需要它把相对优先级排对。
特征处理
为了让模型更好地捕捉状态变化,通常会构造一批趋势类特征,例如:
- 差值特征:\(\Delta = \bar{x}_{30d} - \bar{x}_{7d}\)
- 比值特征:\(R = \bar{x}_{7d} / \bar{x}_{30d}\)
- 变化率:\(r = (\bar{x}_{7d} - \bar{x}_{30d}) / \bar{x}_{30d}\)
对于重尾分布或异常值,也会做一系列稳健化处理:
- P99 截断:\(x' = \min(x, P_{99}(x))\)
- 分桶离散化
- Log 平滑:\(x' = \log(1 + x)\)
这些步骤看起来普通,但对 uplift 任务尤其重要。因为 uplift 模型本来就在学习一个更弱、更稀疏的信号,输入特征如果噪声太大,模型很容易学不稳。
模型评估
离线评估时,更值得关注的是训练集与测试集上的 AUUC、Qini 是否一致,以及不同分桶上的 uplift 排序是否稳定。
这里有两个经常出现、但容易被误读的现象:
稀疏 cost label 的 AUUC 绝对值可能很小
如果某个 cost 指标本身零值很多、分布非常稀疏,那么即使模型把排序做对了,AUUC 的绝对值也未必会特别大。这并不一定意味着模型无效,更可能只是标签本身的信息密度较低。
某些 cost 相关指标的 AUUC 可能为负
这通常出现在 “抑制型干预” 里,比如减少某类曝光、压缩某类补贴、降低某类流量占比。此时 treatment 的目标,本来就是牺牲局部指标去换取整体收益,所以 cost 维度出现负向 uplift,往往反而说明方向符合预期。
因此,评估 uplift 模型时,不应该孤立地看某一个 gain 或 cost 指标,而应该结合策略目标去理解其方向性和 trade-off。
策略优化:从评分到决策
很多团队在拿到 uplift score 之后就停下来了,但真正的业务价值往往出现在 “如何使用这个分”。
真正有业务价值的,不是简单给用户打一列 uplift 分,而是要在 Gain 与 Cost 之间做最优选择。
约束优化
设有 \(n\) 个用户,对用户 \(i\) 干预后:
- 业务收益预估值为 \(\text{gain}_i\)
- 业务损失预估值为 \(\text{cost}_i\)
定义决策变量:
\[ x_i \in \{0, 1\} \]
其中 \(x_i = 1\) 表示对用户施加干预。
如果预算或业务损失约束为 \(C\),优化目标可写成:
\[ \begin{aligned} \max_{x_i} \quad & \sum_{i=1}^{n} x_i \cdot \text{gain}_i \\ \text{s.t.} \quad & \sum_{i=1}^{n} x_i \cdot \text{cost}_i \le C \\ & x_i \in \{0, 1\} \end{aligned} \]
这其实就是 “在有限成本下,选出最值得干预的人”。
ROI 视角
构造拉格朗日函数:
\[ L(x, \lambda) = \sum_{i=1}^n x_i (\text{gain}_i - \lambda \cdot \text{cost}_i) + \lambda C \]
由最优性条件可知:
- 当 \(\frac{\text{gain}_i}{\text{cost}_i} > \lambda\) 时,倾向于干预
- 当 \(\frac{\text{gain}_i}{\text{cost}_i} < \lambda\) 时,倾向于不干预
这里的 \(\lambda\) 可以理解为成本的影子价格。
这个结论很重要,因为它说明:
在给定成本约束下,按单位成本收益(ROI)排序,本身是有优化基础的。
贪心策略
虽然拉格朗日形式很优雅,但实际线上实现时,通常会落到更简单的贪心策略:
- 计算每个用户的 \(ROI_i = \frac{\text{gain}_i}{\text{cost}_i}\)
- 按 ROI 从高到低排序
- 从前往后累计,直到达到预算或成本上限
这么做的原因并不只是 “实现方便”,更重要的是它对工程噪声更稳。
因为在很多业务里:
- gain 与 cost 的绝对值未必准
- 但排序往往比绝对值更稳定
尤其当前面已经做了百分位归一化后,贪心排序往往比强行求一个精确阈值更靠谱。
平滑 Treatment
如果直接采用硬截断策略,比如 “ROI 大于阈值就全部干预,否则全部不干预”,会有两个常见问题:
- 探索空间不足,容易形成反馈闭环
- 预算利用可能不充分
举个简单例子。假设预算 \(C = 2.5\),有两个用户:
- 用户 A:\(gain=10, cost=2, ROI=5\)
- 用户 B:\(gain=8, cost=2, ROI=4\)
如果硬截断,只选 A,总 gain 是 10。
如果采用平滑干预强度,例如:
- A 干预 75%
- B 干预 50%
则总 gain 变成:
\[ 10 \times 0.75 + 8 \times 0.5 = 11.5 \]
也就是说,在资源可以按概率或强度分配的场景里,“部分干预” 可能优于 “非黑即白”。
文中的一个平滑映射形式为:
\[ p(x) = \frac{2}{1+e^{\alpha x}} - 1 \]
其中 \(x\) 表示预估 ROI,\(\alpha\) 是控制曲线陡峭程度的超参数。
从优化视角看,这本质上是在用一个连续函数,去近似 “边际收益递减” 下的最优分配过程。
它的业务价值主要有三点:
- 保留探索,减轻反馈闭环
- 预算利用更充分
- 不同用户可以分配不同干预强度,运营动作更精细
动态更新
策略上线后,数据分布很可能发生变化。
常见问题包括:
Uplift ROI 分布漂移
解决思路是对分数再做归一化,把它映射到稳定区间 [a, b],从而让阈值与分位更可控。
业务指标长期右移或左移
比如客单价、转化价值、时长、广告出价等指标随着业务阶段变化持续右移或左移,这时模型分可能没问题,但决策阈值和预算映射会逐渐失真。
所以,uplift 策略上线之后,不能只看模型是否更新,还要持续看:
- 分数分布是否漂移
- 人群覆盖率是否异常
- gain / cost 比例是否变化
- 策略副作用是否扩大
扩展场景:多 Treatment 与连续 Treatment
前面讨论的内容主要围绕单一、二值的 treatment 展开。但实际业务中,经常会遇到更复杂的场景:
- 多 Treatment:存在多种干预方式可选(如不同面额的优惠券、不同的广告创意)
- 连续 Treatment:干预存在强度或剂量差异(如折扣力度、补贴金额、曝光频次)
这两类场景在建模思路和工程实现上都有明显差异,值得单独展开。
多 Treatment 场景
当存在多种干预选择时,问题从” 要不要干预” 变成了” 用哪种方式干预”。
问题定义
假设存在 \(K\) 种 treatment,对用户 \(i\),每种 treatment 对应一个潜在结果 \(Y_i(t)\),其中 \(t \in \{0, 1, ..., K\}\),\(t=0\) 表示不干预。
目标是找到最优 treatment:
\[t^*(i) = \arg\max_{t \in \{0,1,...,K\}} \tau_i(t) = \arg\max_{t} \left( Y_i(t) - Y_i(0) \right)\]
常见方法
One-vs-All (OVA)
把多 treatment 问题拆成 \(K\) 个二分类 uplift 问题,每个问题估计” 使用 treatment \(k\) vs 不干预” 的增量:
\[\tau_k(x) = E[Y(k) - Y(0) \mid X=x]\]
然后选择增量最大的 treatment:
\[t^*(x) = \arg\max_k \hat{\tau}_k(x)\]
优点是可以直接复用已有的二分类 uplift 模型;缺点是忽略了 treatment 之间的关系,且需要训练 \(K\) 个模型。
Multivalued Treatment Model
把 treatment 当成多值变量,训练一个统一模型:
\[\mu(x, t) = E[Y \mid X=x, T=t]\]
预测时,对每个用户枚举所有 \(t\),选择预测增益最大的:
\[t^*(x) = \arg\max_t \left( \hat{\mu}(x, t) - \hat{\mu}(x, 0) \right)\]
这种方式的好处是模型可以学习 treatment 间的共享模式,但需要足够多的样本覆盖每种 treatment。
Pairwise Comparison
对每对 treatment \((j, k)\),估计相对优势:
\[\tau_{jk}(x) = E[Y(j) - Y(k) \mid X=x]\]
然后综合所有 pairwise 结果做排序或选择。这种方法在 treatment 数量较少、对精度要求高时比较适用。
预算约束下的选择
更接近实际业务的问题是:在预算约束下,同时决定” 给谁干预” 和” 用哪种 treatment”。
优化问题变成:
\[ \begin{aligned} \max \quad & \sum_{i=1}^n \sum_{t=1}^K x_{it} \cdot \text{gain}_i(t) \\ \text{s.t.} \quad & \sum_{i=1}^n \sum_{t=1}^K x_{it} \cdot \text{cost}_i(t) \le C \\ & \sum_{t=0}^K x_{it} = 1, \quad \forall i \\ & x_{it} \in \{0, 1\} \end{aligned} \]
其中 \(x_{it}=1\) 表示对用户 \(i\) 施加 treatment \(t\)。
这是一个整数规划问题,实际中常用贪心策略: 1. 对每个用户计算每个 treatment 的 ROI 2. 选择该用户 ROI 最高的 treatment 3. 按全局 ROI 排序,在预算约束下依次分配
连续 Treatment 场景
当 treatment 不是” 做不做”,而是” 做多少” 时(如折扣力度、广告出价、补贴金额),需要估计剂量 - 响应曲线(Dose-Response Curve)。
问题定义
Treatment \(t\) 是连续变量,目标是估计:
\[\mu(t, x) = E[Y(t) \mid X=x]\]
以及在不同剂量下的边际效应:
\[\tau(t, x) = \frac{\partial}{\partial t} E[Y(t) \mid X=x]\]
边际效应反映了” 剂量每增加一个单位,收益变化多少”。
常见方法
Dose-Response Network (DRNet)
把 treatment 离散化成多个区间,每个区间训练一个响应模型,然后拼接成连续曲线:
\[\mu(t, x) = \sum_{m=1}^M I(t \in [t_m, t_{m+1}]) \cdot \mu_m(x, t)\]
每个子网络 \(\mu_m\) 学习局部剂量区间的响应。这种方式可以捕捉非线性的剂量 - 响应关系,但离散化粒度需要权衡,区间边界处可能出现跳跃。
Modified Meta-Learners
把 Meta-Learner 扩展到连续场景,直接建模 \((X, t) \to Y\) 的映射:
\[\mu(t, x) = f(X, t)\]
预测时,对连续 \(t\) 做数值积分或梯度搜索找最优剂量。实现上通常用神经网络或树模型作为基础学习器。
Propensity Weighting
在观察数据中,treatment 的分配往往有偏。可以用倾向性得分 \(P(T=t \mid X=x)\) 做加权估计:
\[\hat{\mu}(t, x) = \frac{\sum_i K(t, t_i) \cdot w_i \cdot Y_i}{\sum_i K(t, t_i) \cdot w_i}\]
其中 \(K\) 是核函数,\(w_i\) 是基于倾向性得分的逆概率权重。这种方式在观察数据场景下比较实用。
最优剂量选择
给定用户特征 \(x\),选择最优剂量:
\[t^*(x) = \arg\max_t \left( \text{gain}(t, x) - \lambda \cdot \text{cost}(t, x) \right)\]
实际中常用网格搜索或梯度方法: 1. 在剂量范围内均匀采样 2. 预测每个剂量下的 gain 和 cost 3. 选择 ROI 最高的剂量
工程挑战
这两类场景在实际落地时都会遇到一些共同挑战:
| 挑战 | 多 Treatment | 连续 Treatment |
|---|---|---|
| 样本需求 | 每种 treatment 需要足够样本 | 剂量分布需要足够覆盖 |
| 实验设计 | 需要设计多臂随机实验 | 需要设计剂量随机化 |
| 模型复杂度 | 模型数量随 treatment 数量增长 | 需要学习连续函数 |
| 选择偏差 | 某些 treatment 可能天然偏向某些用户 | 剂量分配往往与用户特征相关 |
从工程角度看,这两类场景的落地难度明显高于二值 treatment,通常需要更强的实验设计能力和更多的数据积累。
总结与展望
回过头看,Uplift Modeling 最有价值的地方,并不只是它” 更高级”,而是它更贴近真实业务决策。
很多策略问题,本质上都不是在预测用户会发生什么,而是在判断:
对这个用户做动作,是否值得。
围绕这个问题,本文大致串起了以下链路:
- 从相关性问题切到因果问题
- 用潜在结果框架理解 uplift 的估计目标
- 对比 S/T/X-Learner、Uplift Tree、Causal Forest 等方法
- 用 AUUC、Qini 评估排序效果
- 在通用业务策略优化场景中,把模型分变成 gain-cost 约束下的可执行策略
如果只从建模角度看,Uplift 是 “预测 treatment effect”; 如果从业务角度看,它其实是在做一件更重要的事:
把有限资源,投给最可能因为干预而发生变化的人。
这也是它在营销、广告、推荐、召回、风控、医疗等场景里持续有价值的原因。
后续方向
最后也列几个我觉得很值得继续展开的话题:
- 网络效应:当用户之间存在明显相互影响时,SUTVA 假设如何被修正
- 在线学习:如何把 uplift 与 contextual bandit、reinforcement learning 结合起来
如果后面有机会,也可以再单独展开写几篇更偏工程细节的文章,比如:
- AUUC / Qini 的实现细节与坑点
- Causal Forest 在工业场景中的特征与样本设计
- 平滑 treatment 的线上策略实现方式
参考文献
- Rubin, D. B. (1974). Estimating causal effects of treatments in randomized and nonrandomized studies. Journal of Educational Psychology.
- Athey, S., & Wager, S. (2019). Estimating treatment effects with causal forests: An application. Observational Studies.
- Kunzel, S. R., et al. (2019). Metalearners for estimating heterogeneous treatment effects using machine learning. PNAS.
- Radcliffe, N. J., & Surry, P. D. (2011). Real-world uplift modelling with significance-based uplift trees. White Paper.
- Gutierrez, P., & Gerardy, J. Y. (2017). Causal inference and uplift modelling: A review of the literature. International Conference on Predictive Applications and APIs.