paper2skills Playbook

预算约束因果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