从响应率到增量:增益模型如何重塑智能营销的因果推断与ROI评估
2026/9/16 1:29:08 网站建设 项目流程

快到年底,运营同事把一份活动复盘报告拍在我桌上:触达20万高意向用户,优惠券核销率8.2%,ROI算出来超过4,结论是明年继续加码。财务复核后却说,这笔钱几乎没有带来增量利润,反而还倒贴了小几万。类似的场景,我猜很多做过智能营销的朋友都遇到过。问题不在执行力,而在于我们一直在用“响应率”衡量营销触达,却忘了问一句:这些人里,有多少是“不发券也会买”的?

这也是我在团队里反复讲增益模型(uplift model)的原因。智能营销里真正值钱的,不是预测“谁会买”,而是判断谁是因为这次触达才买、谁不触达也会买、谁触达了反而会流失。下面这些内容,是我那套PPT和视频的完整文字版,从业务本质到因果推断,再到代码实现和上线避坑,一次说清楚。适合运营、数据分析师、算法工程师,以及所有想系统理解智能营销增量思维的人。

1. 从一次“高响应率”活动说起

先说前面提到的那次活动。当时的投放策略并不复杂:圈选出20万高活跃用户,推送一张5元无门槛优惠券,观察7天内的核销转化。从响应模型的角度看,这个方案几乎是完美的——触达组转化率达到8.2%,远高于平台平均水平。可把对照组拉出来一比较,问题立刻暴露出来:同批次未触达用户的自然转化率也有6.9%。

也就是说,在20万人里,有13,800人本来就会下单,优惠券真正带来的增量订单只有2,600单。按每单平均毛利30元计算,增量毛利是78,000元。但为了这20万人,我们承担了触达成本和优惠券核销成本:Push渠道成本约1万元,核销16,400张券、每张5元成本约8.2万元,合计9.2万元。算下来,这笔“成功”的活动净亏约1.4万元。把设计和运营人力放进去,亏得更多。

1.1 响应率本身不是错,错在把“关联”当成了“因果”

指标数值
触达用户数200,000
触达组转化率8.2%(16,400单)
对照组自然转化率6.9%(13,800单)
增量转化率1.3%
增量订单数2,600
每单增量毛利(平均)30元
增量毛利合计78,000元
触达成本 + 券核销成本约92,000元
实际利润变化约 -14,000元

传统响应模型盯住的是“谁最可能转化”,它输出的分数是一个条件概率:P(转化 | 用户特征)。只要用户特征表示他很可能购买,就会被选进名单。可营销运营真正应该关心的是另一个条件概率:P(转化 | 用户特征, 触达) 减去 P(转化 | 用户特征, 不触达)。前者解决“哪些人值得被找到”,后者才回答“哪些人的购买行为是被这次触达改变的”。

1.2 智能营销真正要优化的对象变了

很多团队做人群圈选的时候,习惯用“购买概率高低”来排序,然后从高到低圈人。这个思路有一个隐含假设:高购买概率的人,营销动作对他也更有效。但实际数据反复证明,这两件事经常是错位的。一个每月购买三次的老客,自然转化概率极高,但他几乎不需要优惠券刺激;一个最近在竞品平台频繁加购、犹豫不决的用户,自然转化率可能不高,但一张定向券很可能促成他首次下单。

增益模型要优化的,正是后面这类人的转化概率。它不再回答“这个用户买不买”,而是回答“这个用户的购买行为,有多大比例来源于我们的干预”。这个思维转变,是整个智能营销精细化的分水岭。

2. 增益模型的因果本质:反事实与个体处理效应

要用好增益模型,就不能只把它当成一种新算法。它背后的语言是因果推断。我见过不少算法同学上来就调包跑一个Uplift Tree,结果数据是历史营销数据,特征里还有一堆运营策略变量,最后模型效果一团糟。根子上,是没有理解增益模型的因果假设。

2.1 一个用户不可能同时出现“触达”和“不触达”

从统计角度,触达对用户小明的因果效应,定义为:Y小明(触达) - Y小明(不触达)。其中Y小明(1)是小明在触达条件下的转化结果,Y小明(0)是小明在不触达条件下的转化结果。问题在于,我们只会实施其中一种动作,所以只能观察到两个潜在结果中的一个。这便是反事实问题:我们永远不知道没走的那条路会发生什么。

营销数据集里没有“同一个用户既被触达又没被触达”的记录,所以我们永远无法精确计算个体层面的因果效应。能做的是通过随机实验或方法学假设,估计整个群体或某个特征子群的平均因果效应。增益模型中的CATE(Conditional Average Treatment Effect),翻译过来就是在给定特征X的人群子集中,触达与不触达的转化率之差。用公式写就是:

uplift(x) = E[Y(1) - Y(0) | X = x]

在实践中,我们通常无法轻松得到Y(1)和Y(0)的个体差异,只能用触达组均值减去对照组均值来估计。关键是这个差必须来自可控的随机对照数据,否则就会被各种混杂因素污染。

2.2 为什么随机实验是增益模型的“出厂设置”

假设营销系统根据用户近30天活跃度决定是否发放权益。那么高活跃用户更有可能被触达,而他们本身的购买意愿也更强。此时如果我们直接拿历史数据比较触达组和未触达组的转化率,得到的结果是高活跃用户和低活跃用户的差异,而不是触达动作本身的效果。这就是选择偏差,也是历史营销数据中最常见的陷阱。

增益模型要成立,需要满足无混杂假设:在给定特征X的前提下,是否触达T与潜在结果Y(0)、Y(1)独立。随机实验天然满足这个条件,因为触达分配由硬币决定,和用户任何特征都不相关。没有随机实验的数据,即便用倾向得分匹配、双重稳健估计等方法去补救,也只能弱化偏差,无法彻底消除。所以我的第一建议永远是:先设计一个干净的A/B测试,再谈建模。

3. 用户四象限:营销人该数清楚的四类人

很多业务同学第一次接触增益模型时,会被公式劝退。我通常先用一张“用户四象限”的图把因果逻辑讲明白。增益模型本质上是在回答:如果把用户按“不触达时是否转化”和“触达后是否转化”这两个维度切分,到底哪类人真正被营销动作打动了。

3.1 四类人群的业务定义

用户类型不触达时是否转化触达后是否转化增益方向运营策略
忠实用户(Sure Things)无增量少发券或不发券,避免预算浪费
说服者(Persuadables)不会正向显著模型重点识别,优先投放
沉睡犬(Sleeping Dogs)不会负向测试是否被过度打扰,控制频次
顽固用户(Lost Causes)不会不会无增量放弃触达或替换低打扰策略

忠实用户就是前面案例里“本来就会买”的人。给他们发券,相当于把利润换成优惠券成本。说服者是增益模型最想找到的用户,他们需要被推一把。沉睡犬在现实中真实存在:某些用户本来有购买计划,但频繁的Push和短信让他们产生了反感,反而推迟或取消了订单。顽固用户则无论如何都不转化,除非有商品结构、品牌认知层面的改变,否则不应该花太多注意力。

3.2 从四象限到人群策略的转变

传统响应模型按转化概率排序,很容易把预算花在忠实用户身上。因为忠实用户历史购买次数多、活跃度高,响应模型给出的购买概率非常高。但增益模型会把预测重点放在“增量差异”上。同样是购买概率50%的用户,一个是“触达转化55%、不触达转化52%”的忠实用户,一个是“触达转化50%、不触达转化10%”的说服者,后者带来的增量明显更高。

用一个简化例子:假设一次活动覆盖1万人,其中有4,000名忠实用户(触达转化率60%,不触达转化率55%)、1,000名说服者(触达转化率50%,不触达转化率0%)、3,000名沉睡犬(触达转化率5%,不触达转化率20%)、2,000名顽固用户(触达转化率0%,不触达转化率0%)。如果只看转化概率,触达组里转化率最高的是忠实用户;如果只看增量,说服者才是唯一值得投放的人群。增益模型要做的,就是在预算约束下,把这1,000名说服者尽量识别出来。

4. 三套建模路线:从元学习器到真正的增量学习

增益模型的算法实现有好几个流派。我建议团队从最简单的基线做起,再逐步升级。不要一开始就上深度模型,因为因果推断类模型的难处往往不在网络结构,而在数据生成机制和评估方式。

4.1 S-Learner:把“是否触达”当成一个普通特征

S-Learner是最容易实现的方案。它把所有样本扔进同一个分类模型,把“是否触达”作为一个普通特征输入,然后预测时分别设置T=1和T=0,两条预测概率相减就是增益。

import pandas as pd from sklearn.ensemble import GradientBoostingClassifier # df 包含特征列、treatment 列和转化标签列 features = ["recency", "frequency", "channel", "member_level"] X = df[features].copy() X["treatment"] = df["treatment"] # 0=对照组,1=触达组 model = GradientBoostingClassifier() model.fit(X, df["conversion"]) # 推理时分别用 T=1 和 T=0 打分 X_treat = X.copy() X_treat["treatment"] = 1 X_control = X.copy() X_control["treatment"] = 0 pred_treat = model.predict_proba(X_treat)[:, 1] pred_control = model.predict_proba(X_control)[:, 1] df["uplift_s"] = pred_treat - pred_control

S-Learner的优点是样本利用率高,两组数据共同训练;缺点也很明显:模型可能把主要精力放在预测绝对转化率上,而“是否触达”这个特征很容易被其他强特征淹没。尤其在两组样本差异很小的时候,模型估计出的增益往往被压缩到零附近。

4.2 T-Learner:分别训练两个模型再相减

T-Learner是另一种天然思路:为触达组和对照组各训练一个模型,然后用两个模型的预测概率相减。

model_treat = GradientBoostingClassifier() model_treat.fit(df[features], df.loc[df["treatment"] == 1, "conversion"]) model_control = GradientBoostingClassifier() model_control.fit(df[features], df.loc[df["treatment"] == 0, "conversion"]) df["uplift_t"] = model_treat.predict_proba(df[features])[:, 1] \ - model_control.predict_proba(df[features])[:, 1]

T-Learner实现简单,而且可以复用现有分类模型管线。但它的核心问题有两个。第一,误差会叠加:两个模型各自的预测误差都带有方向性,相减之后可能互相放大。第二,两个模型的优化目标都是绝对转化概率,不是增量本身。模型可能会花大量容量拟合忠实用户和顽固用户等增益近似为零的人群,而真正应该重点拟合的说服者占比又小,很容易被忽视。

从我的经验看,T-Learner适合做快速基线,但不适合作为最终线上模型。

4.3 真正的增量学习:改造目标变量与树模型分裂准则

如果想让模型直接以“增量”为学习目标,比较常用的方案有三种:Class Transformation Method(CTM)、Uplift Tree和Causal Forest。

CTM的思路很聪明:把二分类转化目标做一个加权变换,使得新目标变量的期望恰好等于个体增量。在随机实验且触达概率P(w=1)已知的情况下,可以构造:

z = y * w / P(w=1) - y * (1 - w) / (1 - P(w=1))

其中w表示是否触达,y表示是否转化。这个z在某个用户身上只能计算出一个值,但它的期望等于uplift。之后我们用任意回归模型去拟合z,就能直接预测增量。

import numpy as np from sklearn.ensemble import RandomForestRegressor df["w"] = df["treatment"] p_treat = df["w"].mean() df["z"] = df["conversion"] * df["w"] / p_treat \ - df["conversion"] * (1 - df["w"]) / (1 - p_treat) ctm_model = RandomForestRegressor() ctm_model.fit(df[features], df["z"]) df["uplift_ctm"] = ctm_model.predict(df[features])

Uplift Tree则从另一个角度入手。普通决策树分裂时用的Gini系数最大化“节点内部类别纯度”,而Uplift Tree分裂时最大化“两个节点之间增幅分布的差异”。也就是说,它希望分裂后,其中一个子节点的触达组与对照组差异被放大,另一个子节点的差异被压缩或改变方向。这样长出来的树叶,天然对应着不同增量子群。Causal Forest则是把这种思想扩展成随机森林,并可以对每个个体给出增量的置信区间,对高波动人群判断很有用。

实际项目中,我会先用CTM或T-Learner跑一版,再用Uplift Tree/Causal Forest做迭代。模型选择不是越复杂越好,而是要看业务对可解释性的要求和数据量大小。

5. 数据与实验:没有干净的对照组,再漂亮的AUC也是数字游戏

我在内部培训时经常说一句话:增益模型的原料是实验数据,不是历史数据。如果数据源头错了,后面所有算法技巧都是在修饰错误。

5.1 随机对照实验应该怎么做

要训练增益模型,我们需要一个带随机分组的实验:把目标人群随机分成两组,一组接收营销触达,另一组保持沉默,然后观察一段时间内各自的转化率差异。这里的“随机”不是一句口号,而是一套操作规范:

  • 随机单元建议使用用户ID,而不是设备或渠道。
  • 如果营销会覆盖多个渠道,最好以用户维度做分流,避免同一个用户在不同渠道被反复分到不同组。
  • 分层随机可以显著降低分组不均衡的风险。建议按历史转化水平、新老客、城市等级、渠道来源等关键维度做分层。
  • 实验周期要覆盖从触达到转化的完整窗口。例如优惠券有效期7天,观察窗口至少要7天,最好预留出用户延迟决策的时间。

样本量方面,可以使用常规A/B测试的样本量公式,把基础转化率设为对照组的历史自然转化率,最小可检出差异设置为业务能接受的增量水平。举例:基线转化率6.9%,想检测1%的增量差异,显著性水平5%,检验功效80%,单组至少需要几万个有效样本。样本量太小,模型学到的增量更多是噪声。

5.2 历史营销数据为什么不能直接训练

历史数据里,用户是否被触达通常由运营策略决定,而不是随机决定的。活跃用户更容易收到Push,高价值用户更容易拿到大额券。这些结构性规律会混进模型,让增益模型学到的不是“触达的因果效应”,而是“哪些用户被运营偏爱”。

我曾见过一个团队用过去半年的短信触达数据训练增益模型,特征里包含“近30天登录次数”。模型输出的高增益人群全部是最近登录频繁的用户。这不是因为触达对他们有效,而是因为他们本来就会在没有短信时回来。后来换成随机实验数据重新训练,人群排序发生了明显变化,线上增量ROI反而比之前高出一大截。

5.3 对照组“被污染”是隐形杀手

还有一种情况:实验设计看起来没问题,但对照组用户通过其他渠道看到了相同内容。例如你短信只发给实验组,但同一时段App首页又给所有用户弹了同款优惠券。这时候对照组的自然转化率被抬高了,真实增益被稀释,模型学到的增量会整体偏低。

多触点营销环境里,最好把随机单元设置成用户,并且在实验期间保证不同触点对同一用户的策略一致。如果实在无法完全隔离,也要在评估时明确记录污染来源,宁可调低置信度,也不要假装结果很干净。

6. 评估指标与效果复盘:AUUC、Qini系数和业务侧的真实收益

增益模型和传统预测模型的评估方式非常不同。新手最容易犯的错误是继续用AUC评价模型好坏。AUC衡量的是“排序能力”,但增益模型真正关心的,是“按增益排序后,前N个人群能贡献多少累计增量”。

6.1 Qini曲线和AUUC到底是什么

Qini曲线的横轴是“按模型预测增益从高到低排序后的人群累计占比”,纵轴是“这部分人群累计带来的增量订单数”。它的计算逻辑可以这样理解:把样本按照模型分排序后,每往后推进一个人群分位,就把当前集合里触达组的转化人数减去对照组按比例缩放后的转化人数,得到这个集合的累计增量。如果模型是随机排序,Qini曲线接近一条直线;如果模型有区分能力,曲线会早期快速上升,然后在包含更多低增益人群后逐渐变平。

AUUC(Area Under the Uplift Curve)就是这条曲线下的面积。Qini系数则是对AUUC做归一化,让不同场景之间可以比较。理想情况下,我们希望AUUC远大于随机模型的AUUC。

评估指标传统分类模型常用增益模型常用
AUC辅助参考
准确率/召回率不直接适用
Qini曲线 / AUUC
增量ROI

6.2 增量ROI比整体ROI更接近真相

业务方最关心的不是模型的Qini,而是钱有没有多赚。这里我强烈建议把评估口径从“整体ROI”切成“增量ROI”。整体ROI会包含大量自然转化带来的GMV,虚假繁荣;增量ROI只计算“因为这次触达多产生的订单、利润和成本”。

假设一版增益模型给每个人打了分,我们按分数从高到低排,分别计算前5%、前10%、前20%人群的增量表现。一个我常用的简易复盘表:

预测增益分位预估增量转化率预估增量订单触达成本增量毛利增量ROI
0-5%4.2%420约12,00025,2002.1
5-10%2.8%280约12,00016,8001.4
10-20%1.1%220约24,00013,2000.55

从这个表能直观看到,模型分数越高的群体,增量ROI越好;但扩大到10%以后,增量ROI快速下降。业务方可以依据这个表决定投放预算边界,而不是简单地说“模型分高就投”。

6.3 线上验证是终局裁判

离线指标再漂亮,也不能替代线上真实效果验证。增量模型落地后,建议每个月或每个季度做一次小流量随机验证:从模型预测的高增益人群中随机抽出一部分,再随机分成触达组和对照组,观察实际增量。线上反馈和离线训练数据存在分布漂移是很正常的,关键是建立一套自动监控机制,及时捕捉增量衰减。

7. 踩坑实录:模型上线后ROI反而下降,问题出在哪

算法模型最大的谎言,就是离线指标好看。增益模型尤甚,因为它的上游是因果推断,任何偏差都会被层层放大。这一节总结我踩过并且修复的三个典型坑。

7.1 用历史数据训练,模型学到的是“策略”而不是“因果”

这是最普遍的坑。某次我们想做一个复购优惠券模型,觉得应该先跑通流程,便从数据库里捞了过去三个月发过券的用户和没发券的用户,特征用了年龄、性别、消费频次、最近一次购买间隔,标签是是否复购。离线验算AUUC很高,超出随机模型一大截。

上线后却傻眼了:触达组和对照组的增量几乎为零。复盘发现,过去三个月发券的规则本身就是“优先发给近30天有复购行为的用户”,触达组天然就是高复购人群,对照组则是低价值沉默用户。模型学到的是两个人群的差异,而不是优惠券的因果效应。这个模型从一开始就不成立,所有AUUC都是虚假信号。

修复方案只有一个:停用这个模型,重新设计随机实验,用真正的实验数据训练。虽然花了一个多月的时间,但之后模型带来的增量ROI一直稳定在1.8以上。

7.2 对“增益分数”过度排序,忽略了预测不确定性

增益模型的预测天然带有更大的方差,尤其是树模型,在某些叶子节点上样本量很小,预测出的增益可能非常极端。最初一版模型做人群圈选时,我们直接按增益分数从高到低截取前10%。结果投放后,这部分用户的真实表现远不如模型预测。

后来把模型预测结果按分位切片画出误差,发现分数最高的2%用户,置信区间宽得吓人——它们的预测增益主要靠个位数样本撑起来。解决方法是调整模型参数:增加叶子节点最小样本量,或者改用Causal Forest这类能输出置信区间的模型。同时在策略层面对“高增益但高不确定”的用户做小流量探索,不一次性全量投放。

7.3 渠道叠投导致实验污染,真实增益被严重低估

还有一次做新品推广,模型训练用的实验数据只通过App Push一种渠道触达,效果非常好。上线时为了冲量,运营同时开启了App Push、短信、微信服务通知三个渠道。结果一周后反馈,模型选出的用户整体ROI大幅下降。原因不是模型失效,而是对照组用户虽然没收到App Push,却收到了短信和服务通知,购买转化被其他渠道拉高了。触达组和对照组的真实差异被抹平,增量被严重稀释。

这个问题的本质是实验设计里的“干扰”。如果业务希望多渠道同时上,随机实验就应该把所有渠道视为同一个干预手段,以用户为随机单元,并且保证每个用户在实验期间接受的是统一的渠道策略。否则,模型学到的是“Push+短信+微信的组合效果”,跟单一渠道场景完全不是一回事。

8. 给培训者:这套PPT+视频讲解材料该怎么串

标题叫“PPT+视频”,但我更想说的是:做这份材料的重点不是把算法讲得多深,而是让听的人愿意相信“增量”这件事。很多团队推广增益模型失败,不是模型效果不行,而是业务方不认同这套因果逻辑。

8.1 把“为什么会亏钱”放在第一页

培训时我习惯用一个真实活动复盘开场,就是文章开头那个20万人发券的案例。先让运营自己算一遍账,然后抛出一个问题:如果只看响应率,我们差点继续加码;如果看增量,其实在亏钱。这样认知反差建立起来,后面讲四象限、讲因果推断、讲建模方法,业务方才会带着问题听。

听众不同,侧重点也要调整:给运营讲,多讲案例和四象限;给数据分析师讲,多讲A/B实验设计和Qini曲线;给算法工程讲,多讲T-Learner、CTM、Causal Forest的实现差异,以及数据陷阱。

8.2 一套30页PPT和20分钟视频的模块分配

我通常把这套内容切成六个模块,每个模块都有明确的产出物:

模块核心内容PPT页数视频时长核心交付物
场景冲突高响应率活动亏钱案例5页4分钟让听众理解“增量”为何重要
用户四象限四类人群定义与策略5页4分钟画出一张人群分类图
因果与实验反事实、选择偏差、随机实验5页4分钟理解实验数据是建模前提
三套模型S/T-Learner、CTM、Uplift Tree8页5分钟跑通一个最小Demo
评估复盘Qini/AUUC、增量ROI4页2分钟知道怎么向老板汇报
避坑清单数据、方差、渠道污染3页1分钟减少团队返工

视频录制时,保持动作感的画面比静态PPT更好。把Qini曲线做成随着人群扩展而逐渐抬升的动画,比公式逐行出现更容易让人记住。直播或录播时,至少留一个“模拟数据集Demo”的现场环节:随机生成2万条用户数据,跑一遍增益模型,当场输出top 10%人群和对应的Qini曲线,效果远好于专门讲十分钟理论。

8.3 记住一句话收尾

我最早讲这套内容时,总想把CATE、元学习器、因果森林一次性灌输给听众,结果运营同事在第二页就开始玩手机。后来我把亏损案例放到最前面,把公式全部后置,大家的目光才回到屏幕上。如果你也准备讲增益模型,无论PPT还是视频,建议始终围绕同一个质询:我们花钱买来的,到底是多少本来就不会发生的转化?把这个问题想透,增益模型才算真正落地。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询