干预效果持续监控 + IV/RDD 因果验证 & Bandit 动态调优
场景:游戏玩家流失干预——对高流失风险玩家发放奖励,评估和优化干预效果
一、问题背景:为什么需要因果验证?
对高流失风险玩家发放"回归奖励"后,观察到领奖玩家留存 60%、未领奖的只有 30%。但这不是因果效果——存在三类偏差:
| 偏差类型 | 表现 |
|---|---|
| 自选择偏差 | 领奖励的人本来就更活跃/更可能留下来 |
| 混杂变量 | 第三因素同时影响"是否领奖"和"是否留存" |
| 反向因果 | 留下来的人更可能领到奖励,而非奖励让人留下 |
标准 A/B 测试可以通过随机分组解决,但实际运营中常常无法做到:
- 伦理约束:不能故意对高风险玩家不干预
- 阈值触发:策略基于流失分 > 0.8 才发奖
- 持续评估需求:已上线策略需要实时验证效果
二、RDD(断点回归):利用阈值做"准实验"
核心直觉
当干预基于某个分数阈值触发时,阈值两侧的玩家几乎一样,唯一区别是是否收到了干预——这等价于一次"自然随机分配"。
- 玩家 A:流失分 = 0.801(过线,收到奖励)
- 玩家 B:流失分 = 0.799(没过线,没收到奖励)
这两个玩家的特征几乎完全一样,唯一变化的就是"是否过了阈值收到了干预"。
估计方法
留存率(Y) 70% | • • • ← 收到奖励的玩家趋势 | • 60% | • | ↑ 跳跃 = 因果效果(如 +15%) 45% | • ↓ | • ← 没收到奖励的玩家趋势 40% | • | • +--+--+--+--+--+--+--+--→ 流失预测分 0.6 0.7 0.8 0.9 1.0 ↑ 阈值(cutoff)- 对阈值左侧(未干预)玩家拟合留存趋势线
- 对阈值右侧(已干预)玩家拟合另一条趋势线
- 在阈值点,两条线的落差(跳跃)= 因果效果
适用条件
- 阈值附近的玩家不能自己操纵是否过线
- 需要阈值附近有足够样本
- 使用阈值附近的窗口数据(如 0.7~0.9),拟合两侧趋势线
三、IV(工具变量):应对"不完全服从"
问题
现实中,过了阈值的人未必都领奖(比如没登录),这时 Sharp RDD 退化为 Fuzzy RDD。那 30% 没领的人往往不是随机的——可能正好是最不活跃的人。
解法:把"是否超过阈值"当作工具变量
是否超过阈值 0.8 ──→ 是否实际领取奖励 ──→ 留存率 (工具变量 Z) (内生处理变量 D) (结果 Y)工具变量的两个核心条件:
- ✅相关性:Z 强影响 D(过阈值的人 70% 会领,没过的人 0% 会领)
- ✅排他性:Z 不直接影响 Y(分数从 0.79 变到 0.81 本身不会让人留下来)
计算
通过两阶段最小二乘(2SLS):
- 第一阶段:过阈值 → 领取概率提升多少?(如 +70%)
- 第二阶段:过阈值 → 留存率跳跃多少?(如 +10%)
- 因果效果(LATE)= 第二阶段 / 第一阶段 = 10% / 70% ≈14.3%
这是局部平均处理效应:对那些"因为过了阈值才去领奖"的边际服从者的效果。
四、持续监控:从一次性分析到生产系统
为什么需要持续监控?
- 群体漂移:玩家构成在变化,上月有效的干预本月可能失效
- 新鲜感衰减:奖励效果随时间递减
- ROI 追踪:实时判断干预是否值得继续投入
实现方式
时间轴: Week 1 Week 2 Week 3 Week 4 Week 5 [RDD效果] [RDD效果] [RDD效果] [RDD效果] [RDD效果] +15% +14% +11% +7% +3% ← 效果在衰减!触发告警- 滚动时间窗口:每周对阈值附近新样本重做 RDD 分析
- 效果趋势图:计算因果效果估计值 + 置信区间
- 告警机制:
- 效果连续 N 期低于最低可接受阈值
- 置信区间包含 0(不再显著)
- 触发策略调整或方案切换
五、Thompson Sampling:多方案动态调优
问题:多种干预方案如何分配流量?
假设有 4 种方案(金币奖励、限时活动、客服回访、免费道具),效果未知,每天有 1000 个高风险玩家需要干预。
| 策略 | 做法 | 问题 |
|---|---|---|
| 均等 A/B/C/D 测试 | 各 25% 流量 | 大量玩家被分到差方案,"遗憾"高 |
| 纯利用(选当前最优) | 100% 给估计最好的 | 如果估计不准,永远无法发现更好的 |
| Thompson Sampling | 从分布中抽样选最大 | 自适应平衡探索与利用 |
算法步骤
1. 建模:Beta 分布表示信念
每个方案用 Beta(α, β) 分布表示对其留存率的不确定信念:
- α = 成功(留存)次数 + 1
- β = 失败(流失)次数 + 1
- 均值= α / (α + β)
- 方差= αβ / [(α+β)² × (α+β+1)]
- 数据越多 → α+β 越大 → 方差越小 → 越确定
初始状态(一无所知): 方案 A: Beta(1, 1) → 均匀分布 方案 B: Beta(1, 1) 方案 C: Beta(1, 1) 方案 D: Beta(1, 1) 积累数据后: 方案 A: Beta(81, 171) 均值 = 0.321 方案 B: Beta(61, 191) 均值 = 0.242 方案 C: Beta(91, 161) 均值 = 0.361 方案 D: Beta(51, 201) 均值 = 0.2022. 决策:抽样后比较
每来一个新玩家:
Step 1: 从每个方案的 Beta 分布中各抽一个随机值 - A 的 Beta(81, 171) 抽样 → 0.34 - B 的 Beta(61, 191) 抽样 → 0.22 - C 的 Beta(91, 161) 抽样 → 0.38 - D 的 Beta(51, 201) 抽样 → 0.19 Step 2: 选抽样值最大的 → C (0.38) → 该玩家分配到方案 C关键:用的不是均值,而是抽样值。抽样值围绕均值波动,方差大的方案波动更大。
3. 更新:观察结果后更新分布
该玩家最终留存了 → 方案 C 的分布更新: Beta(91, 161) → Beta(92, 161) 该玩家最终流失了 → 方案 C 的分布更新: Beta(91, 161) → Beta(91, 162)为什么能自动平衡探索与利用?
早期(数据少,分布宽):
- 各方案的抽样值波动大,重叠多
- 即使均值低的方案也可能偶然抽到高值 →自然探索
后期(数据多,分布窄):
- 最优方案分布集中在高处,几乎每次抽样都最高 →自然利用
- 差方案分布集中在低处,几乎不可能胜出 →自动放弃
早期:分布宽,重叠大(探索为主) A: [====|========|====] 均值 0.32 C: [=====|=========|===] 均值 0.36 后期:分布窄,分离清晰(利用为主) A: [=|==|=] 均值 0.32 C: [=|==|=] 均值 0.36,几乎总是赢本质:每个方案被选中的概率 ≈ 它是最优方案的后验概率。不需要手动设定探索比例,不确定性本身就是探索的驱动力。
六、系统联动:RDD 监控 + Bandit 调优
┌─────────────────────────────────────────────────┐ │ 完整系统架构 │ ├─────────────────────────────────────────────────┤ │ │ │ ① 流失预测模型 → 输出流失分 │ │ ↓ │ │ ② Thompson Sampling → 选择干预方案 │ │ ↓ │ │ ③ 执行干预(发奖励/推活动/客服回访) │ │ ↓ │ │ ④ 观察结果(留存/流失) │ │ ↓ │ │ ⑤ 更新 Bandit 的 Beta 分布(在线学习) │ │ ↓ │ │ ⑥ RDD/IV 持续验证因果效果(是否真的有用) │ │ ↓ │ │ ⑦ 监控仪表盘 + 告警 │ │ - 某方案效果衰减 → Bandit 自然转移流量 │ │ - 整体效果崩塌 → 触发策略重设计 │ │ │ └─────────────────────────────────────────────────┘分工:
- Bandit 提供"做什么"的决策:在多个方案中动态选择最优
- RDD/IV 提供"是否真的有效"的验证:排除混杂因素,确认因果性
互补关系:Bandit 可能因为噪声或混杂因素"觉得"某方案好,RDD 能帮你确认这是不是真的因果效果而非虚假相关。
七、关键概念速查
| 概念 | 含义 | 应用场景 |
|---|---|---|
| RDD(断点回归) | 利用阈值触发的"准随机"估计因果效果 | 已上线的基于分数的干预策略 |
| IV(工具变量) | 找间接"开关"解决内生性问题 | 干预存在不完全服从时 |
| Fuzzy RDD | 阈值不完全决定是否受干预 | 用 IV 方法处理的 RDD |
| LATE | 局部平均处理效应 | 仅对边际服从者有效 |
| Thompson Sampling | 从后验分布抽样做决策 | 多方案在线优化 |
| Beta 分布 | [0,1] 区间上的概率分布,二项数据的共轭先验 | 建模留存率的不确定性 |
| 遗憾(Regret) | 因探索而放弃的收益 | 衡量 Bandit 策略优劣 |