1. 从"相关不等于因果"说起:为什么做模型的人迟早要补上这一课
做推荐、风控、增长的同学大概都经历过这种场面:离线模型的AUC涨了两个点,上线之后核心指标纹丝不动,甚至倒退;反过来,某个拍脑袋的运营动作看起来平平无奇,效果却好得离谱。前一种是预测能力没转化成决策能力,后一种则更微妙——你以为自己发现了规律,其实只是撞上了数据里的选择性偏差。这两件事指向同一个东西:因果模型。
因果模型要回答的不是"什么和什么一起变",而是"如果我动手改了X,Y会变成什么样"。它是一套把"干预"从"观测"里剥离出来的方法论,涉及图模型、潜在结果、识别策略、估计量和敏感性分析。适合谁看?做AB实验平台的同学、做Uplift营销的算法工程师、做风控策略的分析师,以及任何需要在"没有实验、只有历史数据"的条件下做决策的人。这篇入门综述不打算把你送进计量经济学的深水区,而是把因果模型的主干脉络、常见方法的适用边界、以及我在实际项目里踩过的坑,一次性讲清楚。
1.1 辛普森悖论:一个让业务方和算法团队同时沉默的例子
假设某电商做了一次首页改版,整体数据看起来是这样:新版本转化率12.5%,旧版本转化率11.8%,新版本赢了0.7个百分点,业务方很高兴。但当你按用户类型拆开看:
| 用户类型 | 新版本转化率 | 旧版本转化率 | 流量占比(新版/旧版) |
|---|---|---|---|
| 新用户 | 8% | 9% | 70% / 30% |
| 老用户 | 25% | 26% | 20% / 60% |
分层之后,新版本在两个子群里都输了,但整体反而赢了。原因很简单:新版被大量投放给了转化率天然偏低的新用户,而旧版承接了更多高转化的老用户。这就是辛普森悖论——一个在聚合层和分层层给出相反结论的经典陷阱。
它要命的地方在于,两个结论都不是"算错"了,而是回答了两个不同的问题。整体对比回答的是"这次投放的整体结果如何",分层对比回答的是"如果我强制把所有用户都切到新版会怎样"。前者是观测量的描述,后者才是干预效应的估计。很多团队吵架吵到最后发现,双方其实在争论两个不同的量。
1.2 混淆、对撞与中介:三类变量决定了你的系数能不能信
在动手建模之前,先搞清楚你手里的变量属于哪一类,这比选什么算法重要得多。
混淆变量(Confounder):同时影响处理变量和结果变量的变量。比如"用户活跃度"既影响他是否看到新版页面,也影响他是否下单。不控制它,你估计出来的效应就是混合了"活跃度差异"和"版本差异"的混合物。
对撞变量(Collider):由处理变量和结果变量共同影响的变量。比如"是否收到客服回访"同时受"是否用了新功能"和"是否投诉"影响。对撞变量最反直觉——控制它反而会引入偏差。经典的例子是"演技好"和"长得帅"都影响"是否成为明星",如果你只统计"已经成为明星的人",会得出演技和颜值负相关的荒谬结论。
中介变量(Mediator):处在处理到结果路径中间的变量。比如新版页面通过"停留时长"影响转化。如果你把停留时长放进回归,得到的是直接效应,而总效应被遮掉了一部分。到底要不要控制中介,取决于你想回答"直接"还是"总"的问题,没有标准答案。
判断这三类变量靠的不是统计检验,而是业务理解和领域知识。一个实操建议:在建模前先手画一张因果图(DAG),把你能想到的变量和它们之间的箭头都画出来,然后逐个问"这条箭头成立吗"。这张图丑一点没关系,它会逼着你想清楚建模假设,后面所有方法选择都依赖它。
1.3 因果模型的三个层次:关联、干预、反事实
Judea Pearl把因果推断分成三层,这个框架我认为是入门最值得先记住的东西。
第一层是关联:P(Y|X=x),看到X等于某个值时Y的分布。所有的机器学习预测模型基本都在这一层,它们擅长的是拟合条件分布,而不是回答"改了会怎样"。
第二层是干预:P(Y|do(X=x)),主动把X设成x时Y的分布。这里的关键符号是do(),它代表"强制干预",切断了X的所有入边。从P(Y|X)到P(Y|do(X))的跨越,靠的是识别策略——后门准则、前门准则、工具变量等等。
第三层是反事实:给定已经观测到的事实,问"如果当时做了另一个选择会怎样"。这一层最贴近业务语言("这个用户如果当时不给他发券,他还会不会买"),但也最难估计,因为它需要完整的结构模型。
三层之间的跃迁不是靠更多数据或更深的网络就能完成的,它靠的是假设。这也是因果模型和纯预测模型最大的分歧点:预测模型可以靠数据说话,因果模型必须靠假设说话,数据只能帮你检验假设是否与观测相容。
2. 两套主流语言:潜在结果框架与结构因果模型该怎么选
因果推断领域有两套并行的语言体系,一套来自统计学,一套来自计算机科学和流行病学。刚入门的人经常被"潜在结果""do算子""后门路径"这些词搞得晕头转向,其实它们描述的是同一件事,只是切入角度不同。搞清楚两套语言的对应关系,能省下你大量读论文的时间。
2.1 潜在结果框架:从ATE到CATE的定义方式
潜在结果框架(Rubin Causal Model)的核心思想是:每个个体都有两个潜在结果,Y(1)表示接受处理时的结果,Y(0)表示未接受处理时的结果。个体处理效应就是ITE = Y(1) - Y(0)。
问题在于,你永远只能观测到其中一个——这叫因果推断的根本问题。观测到Y(1)的人,Y(0)是反事实;观测到Y(0)的人,Y(1)是反事实。所以个体层面的效应永远无法直接计算,只能估计群体层面的平均量:
- ATE(平均处理效应):E[Y(1) - Y(0)],适用于"要不要对全体上这个策略"。
- ATT(处理组平均处理效应):E[Y(1) - Y(0) | T=1],适用于"已处理的这批人受益多少"。
- ATU(未处理组平均处理效应):适用于评估"如果扩展到未处理人群会怎样"。
- CATE(条件平均处理效应):E[Y(1) - Y(0) | X=x],随特征变化的效应,是做个性化决策的关键。
潜在结果框架有一个非常干净的识别假设组:无混淆性(给定协变量X后处理与潜在结果独立)、正性(每个X下都有接受和未接受处理的个体)、SUTVA(个体间无干扰、处理版本唯一)。这三个假设只要有一个不成立,ATE的估计就有系统性偏差,而且偏差不会因为样本变大而消失。
2.2 结构因果模型:DAG、do算子与后门准则
结构因果模型(SCM)的入口是有向无环图(DAG)。每个节点是一个变量,每条有向边代表一个直接的因果机制。相比潜在结果框架里抽象的假设,DAG的好处是把假设画出来了,别人可以直接指着你的图说"这条边我不认同"。
识别因果效应时,最常用的是后门准则:如果你想估计X对Y的效应,需要找到一组变量Z,满足两点——Z阻断了X和Y之间所有指向X的路径(后门路径),且Z中不含X的后代。满足后门准则的Z就叫充分调整集。把所有后门路径都挡住之后,P(Y|do(X))就等于在Z分层下的P(Y|X,Z)加权平均。
还有两个进阶工具值得知道名字:前门准则,当混淆变量不可观测但存在一个完整的中介链时使用;do演算,一套把含do的表达转化成纯观测表达的代数规则。入门阶段不必急着推公式,但要知道它们存在,遇到"混淆不可测"的场景时能想起来还有别的路。
2.3 两套框架的翻译表与选型建议
| 概念 | 潜在结果框架 | 结构因果模型 |
|---|---|---|
| 效应定义 | Y(1) - Y(0) | do(X)引起的分布变化 |
| 核心假设 | 无混淆、正性、SUTVA | 因果马尔可夫性、忠实性 |
| 识别工具 | 倾向得分、匹配、加权 | 后门准则、前门准则、do演算 |
| 优势 | 估计量理论成熟、统计性质清楚 | 假设可视化、适合复杂多变量系统 |
| 短板 | 假设抽象、难以表达复杂结构 | 图结构依赖领域知识、检验困难 |
实际项目里我的做法是两套混用:先用DAG和领域专家把结构理清楚,确定调整集;再用潜在结果框架下的成熟估计量(IPW、AIPW、双重机器学习)去做数值估计。DAG负责"我该调整什么",潜在结果负责"怎么估得准",各司其职。
3. 识别策略工具箱:从随机实验到准实验方法
假设你已经有了DAG和调整集,下一步是选识别策略。这里的核心矛盾是:方法越可信,适用的业务场景越窄;方法越通用,需要的假设越强。下面按可信度从高到低排一遍。
3.1 黄金标准:随机实验与它无法覆盖的场景
随机实验(A/B测试)之所以被称为黄金标准,是因为随机化让处理变量独立于所有潜在混淆,无混淆性自动成立。你不需要画DAG,不需要找调整集,直接比较两组的均值就是ATE的无偏估计。
但A/B测试有三个绕不过去的限制。第一,伦理和成本:你不能随机给用户提高利率来测违约率。第二,溢出效应:社交产品里处理组和对照组用户会互相影响,SUTVA被破坏。第三,长期效应和新鲜感:短期实验测出的往往是新奇效应,长期均衡效应可能完全不同。还有一类常见问题是实验污染和触发偏差——用户被分到处理组但根本没看到实验内容,直接算ITT和按实际曝光算CACE会给出不同答案。
提示:只要条件允许,优先做实验。因果模型不是在替代实验,而是在实验做不了的时候,用更弱的假设换取一个可用的估计。
3.2 基于可观测变量的方法:匹配、倾向得分与双重稳健
当只有观测数据时,最直接的做法是控制可观测混淆。倾向得分把高维协变量压成一个一维概率e(X) = P(T=1|X),然后做匹配或加权。IPW(逆概率加权)给每个样本按1/e(X)或1/(1-e(X))加权,构造出一个伪总体,使得处理组和对照组在协变量上分布一致。
IPW的致命弱点是对倾向得分模型的设定极度敏感,尤其是接近0或1的极端概率会让权重爆炸,方差失控。实践中必须做重叠性检查,把倾向得分分布画出来看两组是否重叠,重叠差的区域直接裁剪或截断权重(trimming)。
AIPW(增广逆概率加权)和双重机器学习(DML)是对这个问题的回应:同时训练结果模型和倾向模型,只要其中一个是正确的,估计就是一致的,这叫双重稳健性。DML进一步用交叉拟合(cross-fitting)消除了正则化偏差,在高维协变量场景下表现明显优于传统IPW。我在一个用户增长项目里对比过,DML在协变量维度超过200时,估计的方差比IPW低了将近一半。
3.3 基于设计的方法:工具变量、断点回归、双重差分、合成控制
当混淆不可观测时,需要借助外部的"准随机"变异源:
- 工具变量(IV):找一个影响处理但不直接影响结果的变量Z。经典的例子是"距离最近医院的距离"作为"是否接受治疗"的工具。2SLS是标准估计手段,但弱工具问题会让估计极不稳定,务必检查第一阶段F统计量。
- 断点回归(RDD):处理由一个连续变量是否越过阈值决定。比如"考试分数超过60分才能进重点班",那么在60分附近的样本近似随机。关键是操纵检验——确认没人能精确控制这个变量。
- 双重差分(DID):比较处理组和对照组在处理前后的变化之差。核心假设是平行趋势,即无处理时两组的变化轨迹相同。务必做事件研究图来目视检查。
- 合成控制(SC):用多个未处理单位加权组合出一个"假处理单位",比较真实处理单位与合成单位的轨迹。适合"只有一个处理单位"的场景,比如某城市试点政策的效果评估。
3.4 方法选型对照表
| 方法 | 核心假设 | 适用场景 | 主要风险 |
|---|---|---|---|
| 随机实验 | 随机化 | 能做实验的一切场景 | 溢出、合规、长期效应 |
| 倾向得分/IPW | 无未观测混淆 | 混淆可观测、样本充足 | 模型误设、重叠不足 |
| AIPW/DML | 其一模型正确 | 高维协变量 | 交叉拟合实现复杂 |
| 工具变量 | 排除性约束 | 存在外生冲击 | 弱工具、约束不可检验 |
| 断点回归 | 阈值附近连续 | 有明确阈值规则 | 操纵阈值、带宽敏感 |
| 双重差分 | 平行趋势 | 面板数据、政策冲击 | 趋势不平行、预期效应 |
| 合成控制 | 凸组合近似 | 单一处理单位 | 供体池选择、拟合期长度 |
4. 因果发现:当连DAG都画不出来的时候
前面所有方法都建立在一个前提上:你有一张可信的DAG。但现实里更常见的情况是,业务方说不清变量之间的箭头方向,或者有几十个变量根本理不出头绪。这时候就要用因果发现算法从数据里学结构。先给结论:因果发现在业务数据上的表现远不如论文里好看,把它当作生成假设的工具,而不是当作结论。
4.1 基于约束与基于评分:PC、GES的适用边界
PC算法是典型的基于约束的方法。它从完全图出发,通过一系列条件独立性检验逐步删边,再定向。理论上是可证明的(在忠实性和因果马尔可夫性下),但实践中有两个大坑:一是条件独立性检验的样本量需求随条件集大小指数增长,条件集一大,检验功效就崩了;二是多个等价的马尔可夫等价类,算法只能给出无向边和部分定向边,剩下的方向要靠领域知识补。
GES(贪婪等价搜索)是基于评分的方法,通过加边、删边、翻边来优化BIC之类的评分。它比PC稳一些,但也受限于评分函数的设定,而且在高维下搜索空间巨大。
我的经验是:变量数控制在20以内,样本量至少在几千以上,PC和GES才有一点参考价值。超过这个规模,跑出来的图基本没法看。
4.2 函数因果模型与LiNGAM的假设代价
如果愿意接受更强的假设,LiNGAM这类函数因果模型可以直接定向。它假设每个变量是其他变量的线性组合加非高斯噪声,通过独立成分分析来恢复因果顺序。假设很漂亮,但要求噪声非高斯且过程线性,真实业务数据里经常不满足。
更通用的是加性噪声模型(ANM):Y = f(X) + N,N独立于X。可以做X→Y和Y→X的拟合对比,残差独立性更好的那个方向获胜。实测下来,ANM在连续变量、噪声不强的情况下方向判断准确率大概70%出头,比随机猜好,但绝不到可以盲信的程度。
4.3 连续优化路线:NOTEARS及其变体在业务数据上的表现
NOTEARS把无环约束写成一个光滑的等式约束(矩阵指数形式),把结构学习变成一个连续优化问题,可以用梯度下降解。后面的DAG-GNN、GraN-DAG、GOLEM都是这条路线的延伸。
这类方法在标准数据集(如Sachs蛋白质信号数据)上表现不错,但搬到业务数据上我遇到的实际问题是:参数敏感,正则化强度稍微变一下结构就大不同;可扩展性有限,变量上千之后显存和计算都吃紧;结果稳定性差,换一批样本跑出来的图差异明显。
所以我的实际用法是:因果发现只用来生成候选假设,最终的结构必须经过领域专家判断和小规模实验验证。把它当成一个"帮我看看数据里有什么可疑关系"的助手,而不是"告诉我真相"的权威。
5. 因果感知模型融合:把因果结构塞进机器学习管线
这是最近两年比较热的方向,也是"因果感知模型融合"这个热搜词背后真正在讨论的东西。核心思路是:不再把因果推断当作一个独立的事后分析步骤,而是把因果结构或不变性约束直接编进模型训练过程。下面挑四个我实际接触过的方向讲。
5.1 不变性学习与因果表征:为什么换环境就不掉点
传统机器学习模型学的是P(Y|X),一旦部署环境变化,联合分布漂移,模型就掉点。**不变性学习(Invariant Learning)**的思路是:真正的因果关系在所有环境下保持不变,只有因果特征才值得依赖,伪相关特征会随环境变化。
具体做法是跨环境风险最小化(IRM):把训练数据按环境切分(比如不同的时间段、不同的渠道),要求模型在每个环境下的风险都接近,这样模型会被迫学环境不变的因果特征。实测下来,在推荐场景的跨渠道迁移里,IRM类方法相比普通ERM在目标域的AUC能高1-2个点,但前提是你得有明确的环境划分,环境切得不对,效果会适得其反。
因果表征学习则更进一步,试图学出解耦的隐变量表示,让每个维度对应一个独立的因果机制。思路很美,但目前落地案例还不多,主要卡在隐变量的可识别性需要很强的假设。
5.2 去混淆建模:推荐、广告与风控里的落地姿势
推荐和广告里有一个根深蒂固的混淆:曝光由推荐系统自己决定。用户看到某个商品本身就是系统基于预测的分数选出来的,这就构成了选择性偏差。直接拿曝光数据训练CTR模型,模型学到的很大一部分是"系统喜欢推什么",而不是"用户真的喜欢什么"。
主流做法是把曝光当作处理变量,用逆概率加权或双重稳健估计来纠正。具体到工程上,就是训练一个曝光倾向模型,然后在损失函数里给每条样本乘上权重的倒数。代价是方差会变大,而且权重需要裁剪。我在一个信息流项目里做过对比,加权之后的CTR预估在冷启动品类上提升明显,但在头部品类上反而略降,因为头部品类曝光充足、偏差本来就小,加权只是引入了噪声。
风控场景更复杂,因为标签本身受策略影响:你拒绝了某笔申请,就永远不知道它是否会违约。这类问题叫拒绝推断(Reject Inference),严格来说需要因果框架来处理,常用的做法有外推法、增强法、混合法,各有各的偏差走向,没有免费午餐。
5.3 异质效应与Uplift:从"会不会"到"对谁会"
营销场景里最值钱的问题不是"发券能提升多少转化",而是"应该给谁发券"。这就从ATE转向了CATE。业界的标准工具族是元学习器(Meta-Learner):
- S-Learner:把处理变量当作一个普通特征丢进模型。简单,但处理变量容易被其他特征淹掉,效应估计偏保守。
- T-Learner:处理组和对照组各训一个模型,效应是两者预测之差。适合处理组和对照组样本都充足的情况,但两组模型误差会累积。
- X-Learner:先训T-Learner,再用处理组模型去预测对照组的反事实、用对照组模型预测处理组的反事实,最后加权融合。样本不平衡时表现更稳。
- R-Learner:把CATE估计问题转化为残差上的加权回归,配合双重机器学习使用,理论性质比较干净。
评估Uplift模型比评估普通预测模型难得多,因为个体效应不可观测。常用的替代指标有Qini系数和AUUC,它们衡量的是"按模型推荐排序发放,累积增益曲线是否优于随机发放"。我建议在离线评估时同时看Qini和多组实验的增益一致性,单看Qini容易被过拟合骗到。
5.4 决策优化与因果强化学习
当决策是多轮、序列相关的时候,因果模型要和强化学习结合。比如定价、库存、动态补贴,每次动作都会改变用户的状态,进而影响未来的动作空间。因果强化学习的核心是把环境动力学分解成因果机制,避免策略学到"看起来相关但实际是混淆"的状态特征。
这块目前工业界的成熟案例还比较少,主要卡在反事实估计的方差和探索成本上。一个务实的做法是先用因果模型估计单步效应,把结果喂给一个约束优化器,而不是直接上完整的因果RL。
6. 评估、敏感性与落地节奏:没有真值的时候怎么验证
因果模型最尴尬的地方在于:你永远拿不到个体层面的反事实真值。A/B测试能给你一个"金标准",但如果没有A/B,怎么知道自己估得对不对?这一节讲我在项目里常用的几套兜底手段。
6.1 反事实不可观测:用安慰剂检验与负对照兜底
安慰剂检验的思路是:找一个理论上不该有因果效应的变量或时间点,如果模型在那里也报出了显著效应,说明你的方法有系统性问题。比如把处理时间人为提前三个月,看模型是否还能"估出"效应——能估出来就说明存在预趋势或残差混淆。
负对照结果是同一个思路的变量版:选一个明知不受处理影响的指标(比如用户的地理位置分布),如果模型显示处理改变了它,那就是出问题了。
正对照则相反:选一个理论上肯定受影响的指标(比如发券一定影响领券率),如果模型连这个都测不出来,说明估计的功效不足或调整集选得太激进,把真实效应也一起挡住了。
这三套对照组合起来,是我判断一个观测研究可信度下限的基本盘,成本低、见效快,比任何漂亮的置信区间都更能说明问题。
6.2 敏感性分析:E-value与Rosenbaum边界
所有观测研究都建立在"无未观测混淆"的假设上,而这条假设永远无法用数据检验。既然检验不了,那就量化"要推翻这个结论,未观测混淆需要多强"。
E-value的含义是:一个未观测混淆需要把处理组和对照组的风险比同时提高多少倍,才能把观测到的效应完全解释掉。E-value越大,结论越稳健。比如你估计出的风险比是2.0,对应的E-value是3.4,意味着未观测混淆需要跟处理变量和结果都有3.4倍的关联强度才能抹掉这个效应。如果业务上根本不存在这么强的混淆变量,结论就比较可信。
Rosenbaum边界是匹配研究里的版本,它给出一个Γ值,表示处理组和对照组的匹配成功几率最多差多少倍时,结论仍然成立。Γ接近1说明结论对隐藏偏差极度敏感。
我的习惯是在报告里强制附上敏感性分析,哪怕业务方不看。它至少能挡住"你这个结论是不是被我没想到的某个变量解释了"这类质疑。
6.3 落地节奏:从一张DAG开始的四周计划
如果让我给一个从零开始的团队排计划,大概是这样:
第一周:画图和对齐。找业务方、数据分析师、产品经理一起画DAG。重点不是画得多漂亮,而是把"大家默认的因果假设"显式化。这个过程中通常能发现三四个团队内部本来就有分歧的地方,早发现比建模后返工强。
第二周:数据核查。检查调整集里每个变量的可得性、缺失率、以及是否存在后处理(即测量时间在处理之后)的问题。后处理变量一旦混进调整集,会引入严重偏差。
第三周:跑基线和重叠性检查。先用最简单的IPW或回归调整跑一个基线,然后必做重叠性检查。发现重叠差的区域要么裁剪样本,要么明确说明估计的适用范围。
第四周:敏感性分析和对照检验。跑安慰剂、负对照,算E-value,把所有假设和局限写成一段话。这段话是最后交付文档里最重要的部分,比点估计值本身更重要。
7. 工具选型与几个我踩过的坑
最后聊点实在的,工具和坑。
7.1 工具与库的选型
Python生态里,EconML(微软)和DoWhy(也是微软)是我用得最多的两个。DoWhy负责"建模—识别—估计—反驳"这套流程,它把DAG、后门准则、估计量和敏感性分析串起来了,适合把整条链路工程化。EconML专注异质效应估计,DML、Meta-Learner、DR-Learner都有现成实现,文档里的例子也够用。CausalML(Uber)在Uplift评估上的工具更全,Qini、AUUC都有。CausalNex偏向贝叶斯网络和结构学习,GUI不错,适合跟业务方一起探索结构。R里的话,dagitty画DAG、MatchIt做匹配、did包做DID,都是各自领域的事实标准。
选型的核心问题不是"哪个最强",而是"你的瓶颈在识别还是在估计"。识别不清,用再好的估计量也没用;识别清楚了,一个几十行的IPW就能跑出可用的结果。
7.2 我踩过的几个坑
第一个坑:把后处理变量放进调整集。有一个项目,我为了提高预测精度,把"用户近7天的活跃天数"放进了倾向得分模型,但这个变量是在处理发生之后测的,属于处理后变量。结果估计的效应被严重压缩。教训是:调整集里的每个变量都要问清楚"它的测量时间点在哪"。
第二个坑:忽略重叠性,直接看结果。有一次跑IPW,几个权重上万,估计出来的效应大得离谱。回头画倾向得分分布才发现,处理组和对照组几乎没有重叠区。不要跳过重叠性检查,这是廉价且高价值的动作。
第三个坑:把因果发现的结果当结论。早期跑NOTEARS跑出几张好看的图,直接拿去指导业务,后来做了小规模实验才发现有两条边方向错了。教训很朴素:因果发现生成的是假设,验证还得靠干预。
第四个坑:低估敏感性分析的沟通价值。一开始我觉得E-value这种东西业务方不看,后来发现,只要用它来解释"为什么这个结论不是拍脑袋",业务方的接受度明显提高。它不是给统计学家的,它是给决策者的。
因果模型这个东西,入门门槛不算高,但真正入门的标志不是会跑几个模型,而是养成先问"我的识别策略是什么、假设是什么、假设破了会怎样"的习惯。工具会换,方法会迭代,这个习惯不会过时。