智能归因 - 因果森林 (Causal Forest)
Skill-Intelligent-Attribution-Causal-Forest · 01-因果推断
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