paper2skills Playbook

智能归因 - 因果森林 (Causal Forest)

Skill-Intelligent-Attribution-Causal-Forest · 01-因果推断

causalexperimentforecastingoptimizationpricing广告与投放定价与利润WF-B 广告优化WF-F 动态定价
年化 ROI50 万
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色增长负责人 / CMO · 数据分析师 · 广告优化师
适用平台Amazon · TikTok Shop · Meta Ads · DTC 独立站
什么情况下用广告预算花了,但不确定哪个渠道真的带来新客;做了大促,不知道销量增长是促销效果还是季节规律
成功是什么样的能区分「真实增量」和「自然购买」,砍掉虚假归因渠道后同等预算 ROI 提升 20-40%
业务痛点
钱花出去了不知道有没有用各渠道报告都说自己贡献最大怎么向老板证明这笔钱值得花

1. 解决的问题

我们在美国、加拿大、英国、德国同步投放吸奶器广告,不同市场的用户行为差异显著

2. 核心算法逻辑

Causal Forest(因果森林)是 Uplift Modeling 的进阶方法,通过随机森林的集成学习框架直接估计异质性处理效应(CATE)。与传统 Uplift Modeling 的元学习方法(T/XLearner)不同,因果森林将"处理效应异质性发现"本身作为优化目标,自动识别哪些用户特征维度对处理效应影响最大。

3. 业务应用场景

业务问题: 我们在美国、加拿大、英国、德国同步投放吸奶器广告,不同市场的用户行为差异显著。美国妈妈注重性价比,德国妈妈注重品质认证,英国妈妈注重环保可持续。传统的统一归因模型无法捕捉这些市场差异,需要一种能自动发现市场-用户特征交互效应的方法,实现"千人千面"的投放归因。

数据要求: - 用户特征:年龄、收入水平、是否新手妈妈、浏览行为、加购金额 - 市场特征:国家/地区、语言、时区 - 干预数据:Facebook/Instagram/TikTok 广告曝光记录 - 标签:是否购买、购买金额、购买时间 - 数据量:建议每个市场至少 5,000 样本

预期产出: - 自动发现的用户分群:因果森林自动识别高 uplift 用户特征组合(如"德国高收入新手妈妈") - 变量重要性排序:哪些特征对广告效果影响最大(如国家 > 收入 > 是否新手妈妈) - 细分策略: - 美国:针对价格敏感型用户,突出性价比卖点 - 德国:针对品质关注型用户,强调医疗认证 - 英国:针对环保意识型用户,强调可持续材料

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • 数据要求:需要 A/B 测试数据,每个细分市场样本充足
  • 技术门槛:中高,需理解随机森林和因果推断结合
  • 工程复杂度:中,grf 包封装良好
  • 维护成本:中,需定期重新训练模型
  • 业务价值极高:多市场投放是母婴出海的核心场景
  • 可解释性强:变量重要性直接指导运营策略

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
智能归因 - 因果森林 (Causal Forest)
用于母婴出海电商多市场智能广告归因和促销时机优化
基于 grf (Generalized Random Forests) 实现
"""

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
import warnings
warnings.filterwarnings('ignore')

# 注意:需要安装 grf 包
# pip install grf
# 或 R 的 grf 包通过 rpy2 调用


class CausalForestAttribution:
    """
    因果森林智能归因模型
    自动发现异质性处理效应,支持多市场场景
    """

    def __init__(self, n_trees=1000, min_node_size=5, max_depth=None):
        """
        初始化因果森林

        Args:
            n_trees: 树的数量(默认 1000)
            min_node_size: 叶子节点最小样本数(默认 5)
            max_depth: 最大深度(默认无限制)
        """
        self.n_trees = n_trees
        self.min_node_size = min_node_size
        self.max_depth = max_depth
        self.model = None
        self.scaler = StandardScaler()
        self.feature_names = None

    def fit(self, X, treatment, outcome, **kwargs):
        """
        训练因果森林

        Args:
            X: 特征矩阵 (DataFrame 或 np.array)
            treatment: 干预标志 (1=干预组, 0=对照组)
            outcome: 结果变量 (0/1 或连续值)
            **kwargs: 传递给底层实现的额外参数
        """
        try:
            from grf import CausalForest
            self.model = CausalForest(
                n_estimators=self.n_trees,
                min_samples_leaf=self.min_node_size,
                max_depth=self.max_depth,
                **kwargs
            )
            self.model.fit(X, treatment, outcome)
            self.feature_names = list(X.columns) if isinstance(X, pd.DataFrame) else None

8. 论文来源

  • 2502.02110