3. 混淆变量与后门准则:识别广告投放中的隐藏偏差
做广告算法这几年,我踩过最大的坑,就是「相关性不等于因果性」。
你想想看,我们每天盯着后台数据:曝光量、点击率、转化率。看到某个渠道的转化率特别高,第一反应就是「加预算」。但有没有想过——也许这个渠道的用户本身就更优质?跟广告本身关系不大?
嗯,这就是混淆变量在捣鬼。
3.1 什么是混淆变量?
先给个直观的定义:混淆变量,就是同时影响「投放策略」和「转化效果」的那个第三方变量。
举个例子。我去年帮一个电商客户做投放优化。他们发现「晚间投放」的转化率比白天高30%。团队立刻想加大晚间预算。但我拦住了他们。
为什么?
因为晚间投放的用户群体,跟白天完全不同。晚间大多是上班族、白领,消费能力强。白天呢?学生、退休人群居多。所以「用户群体」就是那个混淆变量。
核心逻辑:混淆变量会导致我们误判因果关系。你以为广告有效,其实是用户本身就好。
用因果图来表示,就是这样的结构:
看到没?用户群体同时指向了投放策略和转化效果。这就形成了一个后门路径:投放策略 ← 用户群体 → 转化效果。
如果不控制这个路径,我们看到的「投放策略→转化效果」就是有偏的。
3.2 后门准则:怎么识别和消除偏差?
Pearl老爷子提出的后门准则,说白了就是一句话:找到所有混淆变量,然后控制住它们。
具体怎么做?我总结了三步:
- 画因果图——把你知道的变量都画出来,标出箭头方向
- 找后门路径——从投放策略到转化效果,有没有非因果的路径?
- 阻断后门——通过分层、匹配、加权等方式控制混淆变量
我的经验:画图这一步最容易被忽略。很多人上来就跑模型,结果跑出来的系数根本没法解释。我建议你花70%的时间在画图上,30%的时间跑模型。
3.3 实战案例:广告频次控制的混淆问题
讲个真实案例。之前做信息流广告,我们想优化「广告展示频次」。直觉上,频次越高,转化越好。但数据一跑,发现频次和转化率居然是负相关。
团队里有人慌了:「是不是用户讨厌我们的广告?」
我让他们先别急。画个因果图看看。
# 因果图结构
# 用户兴趣度 → 广告频次(兴趣高的用户,系统会多推)
# 用户兴趣度 → 转化效果(兴趣高的用户,更容易转化)
# 广告频次 → 转化效果(我们关心的因果效应)
看到了吗?用户兴趣度就是那个混淆变量。兴趣高的用户,系统会多推广告,他们也更容易转化。但如果我们只看频次和转化的相关性,就会得出「频次越高转化越好」的错误结论。
实际上,控制了用户兴趣度之后,频次和转化的真实关系可能是倒U型的——频次太低没效果,频次太高惹人烦。
3.4 怎么控制混淆变量?三种常用方法
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 分层分析 | 混淆变量是离散的,且取值少 | 简单直观,容易解释 | 维度一多就爆炸 |
| 倾向性得分匹配 | 混淆变量多,样本量大 | 能处理高维混淆 | 需要足够样本量 |
| 逆概率加权 | 混淆变量连续,或分布不均 | 不损失样本 | 权重极端时不稳定 |
我个人最常用的是倾向性得分匹配。为什么?因为广告数据里,混淆变量往往很多——用户画像、设备类型、时段、地域...分层根本分不过来。
注意:匹配之后一定要做平衡性检验。我曾经有一次匹配完,发现两组用户在「设备价格」上还有显著差异,赶紧回去重新调参数。这一步不能省。
3.5 代码示例:用Python实现后门调整
这里给一个简单的示例,用因果推断库dowhy来实现后门调整。
import dowhy
from dowhy import CausalModel
import pandas as pd
# 假设我们有这样的数据
df = pd.DataFrame({
'ad_frequency': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
'user_interest': [0.1, 0.3, 0.5, 0.7, 0.9, 0.2, 0.4, 0.6, 0.8, 1.0],
'conversion': [0.01, 0.03, 0.05, 0.04, 0.02, 0.02, 0.04, 0.06, 0.05, 0.03]
})
# 定义因果图
model = CausalModel(
data=df,
treatment='ad_frequency',
outcome='conversion',
common_causes=['user_interest'] # 这就是混淆变量
)
# 识别后门路径
identified_estimand = model.identify_effect()
print("后门路径识别结果:", identified_estimand)
# 估计因果效应
estimate = model.estimate_effect(
identified_estimand,
method_name="backdoor.linear_regression"
)
print("调整后的因果效应:", estimate.value)
跑完这段代码,你会发现调整前后的系数差别很大。这就是混淆变量的威力。
3.6 避坑指南
做后门调整这几年,我踩过不少坑。挑几个最典型的说说:
- 遗漏重要混淆变量——我曾经只控制了用户年龄,结果性别才是真正的混淆。后来加了性别,效果完全不一样。
- 过度控制——把中介变量也当成混淆控制了。比如「点击率」是广告频次和转化之间的中介,控制它就会阻断真正的因果路径。
- 混淆变量测量误差——用户兴趣度很难精确测量。测量误差会导致调整不彻底,残留偏差。
我的建议:做后门调整之前,先跟业务方聊一聊。他们往往知道哪些变量是「同时影响投放和转化」的。别闷头自己画图。
3.7 小结
混淆变量是广告投放优化里最常见的陷阱。后门准则给了我们一套系统的方法来识别和消除它。
核心就三点:
- 画因果图,找出后门路径
- 控制所有混淆变量
- 用分层、匹配或加权来调整
下次看到数据里某个变量和转化率高度相关,先别急着下结论。问问自己:有没有混淆变量在背后捣鬼?