共计 1557 个字符,预计需要花费 4 分钟才能阅读完成。
为什么我们需要因果推断?
先看一个经典案例:某电商平台 AB 测试显示,新推荐算法在女性用户群体中转化率提升 15%,在男性用户中提升 10%,但整体数据却下降 5%。这就是辛普森悖论——当忽略用户性别这个混杂变量时,相关性与因果性完全相反。

在广告投放、医疗疗效评估等场景中,传统机器学习发现的 ” 特征重要性 ” 很可能是虚假关联。比如:
- 数据偏差:ICU 患者使用某种药物死亡率更高,可能是因为该药物只开给重症患者
- 混淆变量:教育水平与收入正相关,但可能同时受家庭背景影响
方法论大比拼
1. 随机对照试验(RCT)
- 黄金标准:通过随机分组消除混淆偏差
- 局限:成本高(需主动干预),存在伦理问题(如医疗试验)
- 适用场景:新产品功能评估、小规模用户实验
2. 双重差分法(DID)
- 公式:
$$\hat{\tau}^{DID} = (E[Y_{1,t}] – E[Y_{1,t-1}]) – (E[Y_{0,t}] – E[Y_{0,t-1}])$$ - 优势:控制时间趋势和组间固有差异
- 案例:评估政策对地区经济的影响
3. 工具变量(IV)
- 关键条件:
- 相关性:工具变量 Z 与处理变量 D 相关
- 排他性:Z 只能通过 D 影响结果 Y
- 典型工具:天气变化(影响商品价格但不直接影响销量)
PyWhy 实战:倾向得分匹配
import numpy as np
from sklearn.linear_model import LogisticRegression
from causalinference import CausalModel
# 生成模拟数据
np.random.seed(42)
X = np.random.normal(size=(1000, 3)) # 协变量
treatment = (X[:, 0] + 0.5*X[:, 1] > 0).astype(int) # 非随机处理分配
y = 2*treatment + X[:, 1] + np.random.normal(0, 0.5) # 结果变量
# 计算倾向得分
ps_model = LogisticRegression().fit(X, treatment)
ps_score = ps_model.predict_proba(X)[:, 1]
# 匹配与效应评估
cm = CausalModel(y, treatment, X)
cm.est_propensity_s() # 估计倾向得分
cm.trim_s() # 修剪非重叠区域
cm.stratify_s() # 分层
cm.est_via_matching(bias_adj=True) # 匹配估计
print(cm.estimates)
工程细节:
- 连续变量分箱:建议使用基于分位数的等频分箱,避免空层
- 卡尺半径:通常取倾向得分标准差的 0.2 倍,需通过平衡性检验调整
- 平衡诊断:检查标准化均值差异 (SMD) 是否 <0.1
生产环境挑战
未测量混淆变量
即使所有观测变量都平衡,隐藏变量仍会导致偏差。解决方案:
- 进行敏感性分析(如 Rosenbaum 边界)
- 引入代理变量(如用用户设备类型代替收入水平)
样本重叠不足
当处理组和对照组倾向得分分布差异大时:
- 优先选择马氏距离匹配
- 使用熵平衡(Entropy Balancing)
- 考虑断点回归设计(RDD)
三大避坑指南
- 错误:直接使用线性回归
- 问题:忽略处理效应异质性
-
改进:采用双重机器学习(DML)
-
错误:忽略时变混淆
- 场景:用户历史行为影响当前处理分配
-
方案:构造时变倾向得分模型
-
错误:错误定义因果图
- 案例:将中介变量误判为混淆变量
- 验证:使用 d 分离测试
前沿思考方向
- 如何将因果发现算法(如 PC 算法)与领域知识结合?
- 大语言模型能否自动识别数据中的因果结构?
- 在线学习场景下如何增量更新因果效应估计?
结语
在推荐系统、金融风控等场景,因果推断能帮我们区分 ” 预测效果好 ” 和 ” 决策有效 ”。虽然技术门槛较高,但 PyWhy、EconML 等工具的出现降低了应用难度。建议从小规模 AB 测试开始,逐步构建因果分析能力。
正文完
