免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

从响应率到增量:增益模型如何重塑智能营销的因果推断与ROI评估

从响应率到增量:增益模型如何重塑智能营销的因果推断与ROI评估 快到年底运营同事把一份活动复盘报告拍在我桌上触达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)是小明在不触达条件下的转化结果。问题在于我们只会实施其中一种动作所以只能观察到两个潜在结果中的一个。这便是反事实问题我们永远不知道没走的那条路会发生什么。营销数据集里没有“同一个用户既被触达又没被触达”的记录所以我们永远无法精确计算个体层面的因果效应。能做的是通过随机实验或方法学假设估计整个群体或某个特征子群的平均因果效应。增益模型中的CATEConditional 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是最容易实现的方案。它把所有样本扔进同一个分类模型把“是否触达”作为一个普通特征输入然后预测时分别设置T1和T0两条预测概率相减就是增益。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]) # 推理时分别用 T1 和 T0 打分 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_controlS-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 MethodCTM、Uplift Tree和Causal Forest。CTM的思路很聪明把二分类转化目标做一个加权变换使得新目标变量的期望恰好等于个体增量。在随机实验且触达概率P(w1)已知的情况下可以构造z y * w / P(w1) - y * (1 - w) / (1 - P(w1))其中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曲线接近一条直线如果模型有区分能力曲线会早期快速上升然后在包含更多低增益人群后逐渐变平。AUUCArea 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%人群的增量表现。一个我常用的简易复盘表预测增益分位预估增量转化率预估增量订单触达成本增量毛利增量ROI0-5%4.2%420约12,00025,2002.15-10%2.8%280约12,00016,8001.410-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还是视频建议始终围绕同一个质询我们花钱买来的到底是多少本来就不会发生的转化把这个问题想透增益模型才算真正落地。
返回列表