共计 1689 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:传统 AB 测试的局限性
在电商场景中,我们经常需要评估新功能的效果,比如推荐算法的改进。传统 AB 测试假设用户是随机分组的,但在实际业务中,用户行为往往存在自选择偏差。例如:

- 价格敏感用户更可能点击优惠券活动
- 高频用户更容易被新功能曝光
这种选择偏差会导致传统 AB 测试高估或低估策略效果。我们曾遇到某促销活动在 AB 测试中显示 10% 提升,但全量上线后实际收益仅 2%,这就是典型的混杂变量干扰。
技术方案对比
常见解决方案主要有三种:
- PSM(倾向得分匹配 /Propensity Score Matching)
- 优点:实现简单,适合观测变量明确的情况
-
缺点:无法处理未观测混杂因子
-
DID(双重差分 /Difference-in-Differences)
- 优点:能消除时间不变的混杂因素
-
缺点:需要平行趋势假设
-
因果推断(Causal Inference)
- 优点:通过因果图显式建模变量关系
- 缺点:计算复杂度较高
我们选择因果推断方案,因为它能:
- 通过因果图识别混杂变量
- 计算 ATE(Average Treatment Effect/ 平均处理效应)时自动调整偏差
- 支持反事实推理
核心实现
环境准备
# 安装因果推断工具包
!pip install causalml dowhy
数据预处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 模拟电商场景数据
data = pd.DataFrame({'user_age': np.random.normal(35, 5, 1000), # 用户年龄
'activity_level': np.random.poisson(3, 1000), # 活跃度
'treatment': np.random.binomial(1, 0.3, 1000), # 是否实验组
'conversion': np.zeros(1000) # 转化率(待填充)
})
# 标准化连续变量
scaler = StandardScaler()
data[['user_age']] = scaler.fit_transform(data[['user_age']])
因果图建模
from dowhy import CausalModel
# 定义因果图
model = CausalModel(
data=data,
treatment='treatment',
outcome='conversion',
common_causes=['user_age', 'activity_level']
)
# 可视化因果图
model.view_model()
ATE 计算
# 识别因果效应
identified_estimand = model.identify_effect()
# 使用线性回归估计 ATE
estimate = model.estimate_effect(
identified_estimand,
method_name='backdoor.linear_regression',
control_value=0,
treatment_value=1
)
print(f'ATE 估计值: {estimate.value:.4f}')
生产环境考量
样本需求
- 最小样本量公式:$n = \frac{16\sigma^2}{\Delta^2}$
- 其中 $\sigma$ 是标准差,$\Delta$ 是要检测的最小效应值
计算优化
- 对大数据集使用近似算法
- 考虑 Spark 分布式实现
常见问题解决方案
- 未观测混杂因子
-
方案:使用工具变量或敏感性分析
-
因果图错误设定
-
方案:结合业务知识验证,使用 PC 算法辅助构建
-
非随机实验数据
- 方案:采用双重机器学习 (Double ML) 方法
延伸思考
可以进一步探索:
– 如何建模动态处理效应?
– 当存在网络效应时如何调整模型?
推荐阅读
- 《Causal Inference: The Mixtape》- Scott Cunningham
- DoWhy 项目文档:https://microsoft.github.io/dowhy/
- CausalML 库案例:https://causalml.readthedocs.io/
通过这套方案,我们成功将某推荐策略的评估准确率提升了 40%,希望对你有所启发。
正文完
