Uplift 建模与策略优化实践:从因果推断到增量估计与线上资源分配

最近在做 uplift modeling 的调研和落地工作,写篇文章浅浅记录一下。

很多业务问题表面上看是在做预测,真正要解决的却是干预决策。

比如发优惠券、投广告、调整流量分发,真正的问题通常不是 “谁最可能转化”,而是:

对谁做干预,才能带来最大的净增量?

这两类问题的差异,决定了建模方式也完全不同。

传统预测模型擅长回答 “这个用户会不会买”、“这个用户会不会留存”;但它很难回答 “如果我发券,他会不会因此多买”“如果我减少直播曝光,他的长期价值会不会提升”。前者是相关性问题,后者是因果性问题。

Uplift Modeling 的价值,就在于把优化目标从结果预测,转向对干预增量的估计。相比 “找高概率用户”,它更关注 “找高增量用户”

本文尝试介绍 uplift 的原理和一个实际落地的应用场景,内容如下

  1. 为什么传统预测模型不适合直接指导干预策略
  2. Uplift Modeling 背后的因果推断直觉与常见建模方法
  3. AUUC、Qini 等离线评估指标应该怎么理解
  4. 在通用业务策略优化场景里,如何从实验设计一路走到线上策略落地
  5. 多 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\),理论上都存在两个潜在结果:

  1. \(Y_i(1)\):接受干预后的结果
  2. \(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非线性强、希望估计更稳理论支撑更强、能捕捉复杂效应计算成本高

工程里没有银弹。很多时候,最好的方式不是一开始就追求最复杂模型,而是:

  1. 用简单 baseline 快速验证 uplift 是否真的存在
  2. 再逐步切到更强的 effect learner
  3. 最后把重心放在策略使用方式,而不是只盯着离线分数

评估方法:离线到在线

Uplift 的评估方式和普通分类 / 回归明显不同。

原因很简单:真实的个体因果效应不可观测。我们看不到同一个用户在 “干预” 和 “未干预” 两个世界里分别会发生什么。

所以,uplift 模型的评估重点通常不是 “单点预测准不准”,而是 “排序是否有效”。

AUUC

AUUC(Area Under the Uplift Curve)是最常见的 uplift 离线评估指标之一。

基本做法是:

  1. 按模型预测的 uplift 分数从高到低排序
  2. 从前往后逐步取人群
  3. 观察随着覆盖人群增加,累计 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 指标的定义。

场景TreatmentGain 指标Cost 指标
电商营销发券、加补贴、提高触达频次下单率、GMV、7 日 LT券成本、补贴消耗、毛利损失
广告投放提高出价、增加曝光、发放激励点击、转化、广告收入流量占用、补贴成本、体验损耗
内容 / 直播分发增减某类内容曝光、调整流量占比留存、会话、时长、长期价值子业务收入下滑、生态指标波动

如果只盯着单一 gain,很容易把策略做偏;只有把 gain 和 cost 同时纳入建模与决策,策略才真正有上线意义。

整体链路

一个完整的 uplift 策略链路,通常可以抽象为:

  1. 通过随机实验构造 treatment / control 数据
  2. 训练 uplift 模型,估计用户的增量收益与增量成本
  3. 在预算或约束条件下,把模型分转换成可执行决策
  4. 在线持续监控并动态更新策略

也就是说,模型只是中间一环;实验设计、策略求解、线上反馈,同样重要。

数据构造

RCT / Switchback 实验设计

实验形式并不唯一,常见的设计包括:

  • 用户级随机实验:适合电商发券、广告激励等用户独立干预场景
  • Switchback Experiment:适合供给、流量、时段级干预场景
  • 分桶灰度实验:适合线上策略逐步放量验证

共同目标只有一个:让 treatment assignment 尽量随机,从而降低选择偏差,提升 uplift 估计的可信度。

做这类实验时,至少有三点要特别关注:

  1. 随机化是否真的均匀覆盖关键人群
  2. 实验期间是否有外部流量策略或业务活动干扰
  3. 样本量是否足够支撑异质性效应学习

很多 uplift 项目不是死在模型,而是死在实验设计不够干净。

特征工程

在一个通用的 uplift 项目里,特征通常会覆盖用户、行为和上下文等多类信息,例如:

特征类别示例特征业务含义
基础用户特征年龄、性别、注册时长用户基本属性
历史交易特征下单次数、客单价、复购间隔商业价值与购买习惯
广告交互特征曝光、点击、转化、激励领取广告敏感度
内容消费特征时长、完播率、互动次数内容偏好与注意力分布
价格敏感特征价格带偏好、折扣使用率对补贴和优惠的敏感程度
设备与环境特征机型、网络、地域、时段外部约束与场景差异
流量上下文特征入口、版位、资源位竞争情况当前供给环境
用户画像与分层兴趣标签、价值层级、风险标签用户分类
社交关系特征关注、粉丝、互关、分享关系社交传播潜力
趋势特征7d / 30d 行为差值、比值、斜率状态变化

这里有一个很重要的实践经验:

Uplift 特征工程的重点,不只是提升 response prediction,而是尽量暴露 “谁对干预更敏感” 的异质性。

因此,能体现趋势、状态切换、消费结构差异的特征,往往比静态画像更重要。

Label 设计

在这个通用框架下,通常仍建议把 label 拆成两类。

Gain Label

表示 “施加干预后,业务核心目标获得的增量收益”。

例如:

  • 电商:7 日下单率、GMV、复购、长期价值
  • 广告:点击率、转化率、广告收入、广告主 ROI
  • 内容 / 直播:留存、有效会话、消费时长、长期活跃价值

Cost Label

表示 “施加干预后,需要付出的资源消耗或副作用”。

例如:

  • 电商:优惠券成本、补贴消耗、毛利损失
  • 广告:流量占用、补贴成本、用户体验下降
  • 内容 / 直播:某子业务收入下降、供给生态波动、时长迁移损失

这一点很关键:

很多策略只预测 gain,不预测 cost,最后上线时容易出现 “主指标提升了,但业务副作用太大” 的问题。把 gain 和 cost 拆开建模,本质上是在为后续约束优化做准备。

模型选择

如果要在多类业务场景里选择一个相对稳妥的异质性效应学习器,Causal Forest 往往是一个不错的起点,主要基于三点考虑:

  1. 可以较好地捕捉非线性与交互效应
  2. 对异质性 treatment effect 的表达能力更强
  3. 在类似业务场景中已有验证,工程上更有把握

如果从 “方法论最先进” 角度看,未必只有这一种选择;但从 “业务可落地、可解释、可复用” 看,Causal Forest 是一个相对稳妥的折中方案。

Label 归一化

最初尝试中,常见做法是直接使用原始 label,并通过人工权重去对齐不同指标的量纲:

\[ score_{raw} = w_1 y_1 + w_2 y_2 + w_3 y_3 \]

但这种方式有几个明显问题:

  • 超参数很难调
  • 极端值影响大
  • 一旦分布漂移,稳定性差

后来改成了更实用的百分位归一化方案:

\[ y_{norm} = \text{percentile\_rank}(y) \]

也就是用样本在训练集中的相对位置,替代原始值本身。

这么做的优点很明显:

  1. 范围固定在 [0, 1],便于模型学习
  2. 对极端值更鲁棒
  3. 更贴近后续排序型决策的使用方式

这也是一个很典型的工程取舍:

真实业务中,很多时候不需要模型把绝对收益估得极准,而是更需要它把相对优先级排对。

特征处理

为了让模型更好地捕捉状态变化,通常会构造一批趋势类特征,例如:

  • 差值特征:\(\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)排序,本身是有优化基础的。

贪心策略

虽然拉格朗日形式很优雅,但实际线上实现时,通常会落到更简单的贪心策略:

  1. 计算每个用户的 \(ROI_i = \frac{\text{gain}_i}{\text{cost}_i}\)
  2. 按 ROI 从高到低排序
  3. 从前往后累计,直到达到预算或成本上限

这么做的原因并不只是 “实现方便”,更重要的是它对工程噪声更稳。

因为在很多业务里:

  • gain 与 cost 的绝对值未必准
  • 但排序往往比绝对值更稳定

尤其当前面已经做了百分位归一化后,贪心排序往往比强行求一个精确阈值更靠谱。

平滑 Treatment

如果直接采用硬截断策略,比如 “ROI 大于阈值就全部干预,否则全部不干预”,会有两个常见问题:

  1. 探索空间不足,容易形成反馈闭环
  2. 预算利用可能不充分

举个简单例子。假设预算 \(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 最有价值的地方,并不只是它” 更高级”,而是它更贴近真实业务决策。

很多策略问题,本质上都不是在预测用户会发生什么,而是在判断:

对这个用户做动作,是否值得。

围绕这个问题,本文大致串起了以下链路:

  1. 从相关性问题切到因果问题
  2. 用潜在结果框架理解 uplift 的估计目标
  3. 对比 S/T/X-Learner、Uplift Tree、Causal Forest 等方法
  4. 用 AUUC、Qini 评估排序效果
  5. 在通用业务策略优化场景中,把模型分变成 gain-cost 约束下的可执行策略

如果只从建模角度看,Uplift 是 “预测 treatment effect”; 如果从业务角度看,它其实是在做一件更重要的事:

把有限资源,投给最可能因为干预而发生变化的人。

这也是它在营销、广告、推荐、召回、风控、医疗等场景里持续有价值的原因。

后续方向

最后也列几个我觉得很值得继续展开的话题:

  1. 网络效应:当用户之间存在明显相互影响时,SUTVA 假设如何被修正
  2. 在线学习:如何把 uplift 与 contextual bandit、reinforcement learning 结合起来

如果后面有机会,也可以再单独展开写几篇更偏工程细节的文章,比如:

  • AUUC / Qini 的实现细节与坑点
  • Causal Forest 在工业场景中的特征与样本设计
  • 平滑 treatment 的线上策略实现方式

参考文献

  1. Rubin, D. B. (1974). Estimating causal effects of treatments in randomized and nonrandomized studies. Journal of Educational Psychology.
  2. Athey, S., & Wager, S. (2019). Estimating treatment effects with causal forests: An application. Observational Studies.
  3. Kunzel, S. R., et al. (2019). Metalearners for estimating heterogeneous treatment effects using machine learning. PNAS.
  4. Radcliffe, N. J., & Surry, P. D. (2011). Real-world uplift modelling with significance-based uplift trees. White Paper.
  5. Gutierrez, P., & Gerardy, J. Y. (2017). Causal inference and uplift modelling: A review of the literature. International Conference on Predictive Applications and APIs.