预算约束因果Bandit - 新渠道从Day1开始的转化率估计
Skill-BCCB-Causal-Bandits · 02-A_B实验
causalexperimentoptimization广告与投放WF-B 广告优化WF-G Listing内容优化
收录于新品冷启动手册
年化 ROI⭐⭐⭐⭐⭐
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色运营负责人 / 产品经理 · 广告优化师 · 选品负责人
适用平台Amazon Listing · TikTok 广告素材 · DTC 落地页
什么情况下用改了主图/标题/价格,不确定销量变化是改动导致的还是流量波动;两个方案团队各持己见,需要数据裁决
成功是什么样的每次改动都有 ≥95% 置信度的数据结论,好的改动快速全量,坏的及时止损
业务痛点
1. 解决的问题
传统Uplift模型遵循两阶段离线流程——先收集历史数据估计异质性处理效应(HTE),再求解预算约束优化问题。这在数据丰富时效果良好,但在冷启动场景(新渠道、新市场、新用户群)中完全失效。
2. 核心算法逻辑
传统Uplift模型遵循两阶段离线流程——先收集历史数据估计异质性处理效应(HTE),再求解预算约束优化问题。这在数据丰富时效果良好,但在冷启动场景(新渠道、新市场、新用户群)中完全失效。
3. 业务应用场景
业务问题:刚在Pinterest上开了母婴用品广告,花了 $300,曝光 2000 次,只有 2 个转化。传统归因模型因为数据太少完全无法运作——但营销团队需要知道"Pinterest 的 CVR 大概是多少"来决定要不要加预算。
BCCB 从第一个用户起就在线学习转化率,每来一个用户都更新估计,第二天就能给出有统计意义的 CVR 置信区间。
数据要求: | 字段 | 说明 | 格式 | |------|------|------| | user_id | 用户唯一标识 | string | | user_features | 设备、地区、行为特征 | array[float] | | is_treated | 是否被展示广告(0/1) | binary | | converted | 是否发生转化(0/1) | binary | | timestamp | 事件时间 | datetime | | cost | 单次曝光成本 | float |
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 当前状态:每个新渠道测试期 14 天,日均预算 $300,总投入 $4,200/渠道
- BCCB 后:2 天即可获得初步决策信号,无效渠道提前 12 天停投
- 每年节省:若测试 10 个渠道,每次平均止损 $3,000,年节省 $30,000
- 转化提升:在预算不变前提下,BCCB 优先处理高响应用户,转化提升预期 15-25%
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Budget-Constrained Causal Bandits (BCCB) 完整实现
母婴出海场景:新渠道/新市场冷启动转化率估计
论文:arXiv:2604.26169 (2025)
数据集:Criteo Uplift Dataset 风格
包含:
- Causal Bandit 环境模拟
- BCCB 算法:CATE估计 + Thompson Sampling + 预算约束
- Baseline 对比:离线两阶段Uplift、Greedy HTE、Budgeted TS
- 数据效率对比图
- 方差分析(多次运行)
- 渠道CVR每日更新估计 + 置信区间
"""
import numpy as np
import pandas as pd
from scipy import stats
from typing import Dict, List, Tuple, Optional
import warnings
warnings.filterwarnings('ignore')
# ─────────────────────────────────────────────────────────────────────────────
# 1. 数据环境:Criteo Uplift 风格的母婴广告数据
# ─────────────────────────────────────────────────────────────────────────────
class MaternalAdEnvironment:
"""
母婴广告因果Bandit环境
模拟Criteo Uplift Dataset结构:用户特征 + 处理分配 + 转化结果
"""
def __init__(
self,
n_features: int = 12,
true_base_rate: float = 0.03,
true_ate: float = 0.015,
heterogeneity: float = 0.5,
cost_per_impression: float = 0.15, # 每次曝光成本(美元)
random_seed: int = 42,
):
"""
Args:
n_features: 用户特征维度(设备/地区/行为等)
true_base_rate: 自然转化率(未看广告)
true_ate: 平均处理效应(广告带来的转化提升)
heterogeneity: 异质性强度(0=均匀效应, 1=高度异质)
cost_per_impression: 单次曝光成本(美元)
"""
self.n_features = n_features
self.true_base_rate = true_base_rate
self.true_ate = true_ate
self.heterogeneity = heterogeneity
self.cost_per_impression = cost_per_impression
self.rng = np.random.RandomState(random_seed)
# 真实的CATE权重向量(实际中未知)
self.true_cate_weights = self.rng.randn(n_features) * heterogeneity
8. 论文来源
- 2604.26169