水熊虫
水熊虫
不认命,就拼命!
260文章 52分类

营销补贴--基于元模型建模

S-Learner(Single Learner)

S-Learner(Single Learner)是因果推断中用于估计个体处理效应(ITE)或条件平均处理效应(CATE)的一种单模型方法。其核心思想是将处理变量作为特征输入模型,通过预测不同处理状态下的潜在结果差异来量化因果效应。

核心假设

  • 无未观测混杂(Unconfoundedness):所有影响处理分配和结果的变量均被观测。
  • 重叠性(Overlap):每个个体均有概率被分配到处理组和对照组(即0<P(T=1X=x)<10 < P(T=1|X=x) < 1)。
  • 模型灵活性:模型需足够复杂以捕捉T 与 X 的交互效应。

算法步骤

  • 数据准备:
    输入数据:协变量X 、处理变量T 、结果变量Y 。
    构造特征:将T 作为特征与X 合并,形成新特征空间[X, T] 。
  • 模型训练:
    选择模型(如线性回归、随机森林、神经网络等),拟合Y 与 [X, T] 的关系:μ(X,T)=E[YX,T]\mu(X, T) = \mathbb{E}[Y | X, T]
  • 处理效应预测:
    对每个样本x ,分别计算 T=1 和 T=0 时的预测值:Y^(1)=μ(x,1),Y^(0)=μ(x,0)\hat{Y}(1) = \mu(x, 1), \quad \hat{Y}(0) = \mu(x, 0)
    计算个体处理效应:τ^(x)=Y^(1)Y^(0)\hat{\tau}(x) = \hat{Y}(1) – \hat{Y}(0)

优缺点分析

优点

  • 模型简单:仅需训练单一模型,计算成本低,易于实现。
  • 自然捕捉交互效应:将T 作为特征,模型可自动学习处理变量与协变量的交互作用。
  • 适用性广:兼容任意预测模型(线性/非线性),灵活性高。

缺点

  • 处理效应稀释:若处理变量T 对结果影响较小,模型可能难以有效区分处理效应。
  • 偏向主要群体:当处理组和对照组样本量差异大时,模型可能偏向预测主要群体的结果。
  • 模型误设风险:若模型未正确建模T 与X 的交互,会导致处理效应估计偏差。

适用场景

  • 随机对照试验(RCT)数据:处理组和对照组分布均衡,满足无混杂假设。
  • 高维特征与小样本:单模型减少参数数量,降低过拟合风险。
  • 明确交互效应:处理变量与某些协变量存在已知的交互作用,需模型自动捕捉。

T-Learner(Two Learner)

T-Learner(Two Learner)是因果推断中用于估计个体处理效应(ITE)或条件平均处理效应(CATE)的一种双模型方法。其核心思想是分别对处理组和对照组训练两个独立的预测模型,通过对比两个模型的预测结果差异来量化因果效应。

建模思想

在处理组(T=1)和对照组(T=0)上分别训练模型μ1(X)\mu_1(X)μ0(X)\mu_0(X),预测潜在结果Y(1)和Y(0)。
处理效应为两模型的预测差值:τ^(x)=μ1(x)μ0(x)\hat{\tau}(x) = \mu_1(x) – \mu_0(x)

核心假设

  • 无未观测混杂(Unconfoundedness):所有影响处理分配和结果的变量均被观测。
  • 重叠性(Overlap):每个个体均有概率被分配到处理组和对照组(即0<P(T=1X=x)<10 < P(T=1|X=x) < 1)。
  • 模型独立性:处理组和对照组的模型需独立捕捉各自群体的特征与结果关系。

优缺点分析

优点

  • 灵活捕捉异质性:处理组和对照组模型独立训练,可更好适应两群体的特征差异(如非线性关系、交互效应)。
  • 避免处理效应稀释:与S-Learner不同,T-Learner直接建模两群体的差异,避免处理变量被其他特征主导。
  • 兼容复杂模型:可针对处理组和对照组分别选择最优模型(如处理组用神经网络,对照组用随机森林)。

缺点

  • 样本利用率低:数据被分割为两部分,单个模型训练样本减少,可能导致过拟合(尤其是小数据场景)。
  • 模型不一致性风险:若处理组和对照组模型结构差异大(如一个线性、一个非线性),预测结果可能不可比。
  • 处理组-对照组样本量失衡:当两群体样本量差异大时,小样本群体的模型预测准确性下降,影响处理效应估计。

适用场景

  • 处理组和对照组差异显著:两群体的特征分布或结果响应模式差异较大(如营销中高价值用户与普通用户)。
  • 大样本数据:处理组和对照组均有足够样本支持独立建模。
  • 需要高精度处理效应估计:如医疗领域需精准评估不同患者亚群的治疗效果差异。

X-Learner(Cross-Learner)

X-Learner(Cross-Learner)是因果推断中一种结合双模型框架与元学习(Meta-Learning)的方法,旨在更高效地估计条件平均处理效应(CATE)。其核心思想是通过交叉预测(Cross-Prediction)和残差学习(Residual Learning),利用处理组和对照组的信息互补性,提升小样本或非随机数据下的处理效应估计精度。

基本思路

  • 三步交叉学习:
    基础模型:类似T-Learner,先分别对处理组和对照组训练两个模型,预测潜在结果。
    反事实预测与残差计算:利用交叉预测生成反事实结果,并计算残差(实际结果与预测结果的差异)。
    元学习器建模:以残差为新的目标变量,训练元模型直接估计处理效应。
  • 核心公式:
    处理组模型μ1(X)\mu_1(X) 和对照组模型 μ0(X)\mu_0(X) 预测潜在结果:Y^1=μ1(X),Y^0=μ0(X)\hat{Y}_{1} = \mu_{1}(X), \quad \hat{Y}_{0} = \mu_{0}(X)
    反事实预测:
    处理组的反事实对照结果:Y~0=μ0(XT=1)\tilde{Y}_{0} = \mu_0(X_{T=1})
    对照组的反事实处理结果:Y~1=μ1(XT=0)\tilde{Y}_{1} = \mu_1(X_{T=0})
  • 残差计算:
    处理组残差:D1=YT=1Y~0D_{1}= Y_{T=1} – \tilde{Y}_{0}
    对照组残差:D0=Y~1YT=0D_{0} = \tilde{Y}_{1} – Y_{T=0}
  • 元模型训练:
    处理效应估计:τ1(X)=D1,τ0(X)=D0\tau_1(X) = D_{1} , \tau_0(X) = D_{0}
    元模型g(X)g(X)综合τ1\tau_{1}τ0\tau_{0}的加权平均:τ^(x)=g(x)=π(x)τ0(x)+(1π(x))τ1(x)\hat{\tau}(x) = g(x) = \pi(x) \tau_{0}(x) + (1-\pi(x)) \tau_{1}(x)
    π(x)\pi(x):倾向得分(处理概率),用于加权不同群体的残差信息。

算法步骤

image-1762602518929

  • 基础模型训练
    处理组模型𝜇1(𝑋):用处理组数据(𝑋𝑇=1,𝑌𝑇=1)(𝑋_{𝑇=1},𝑌_{𝑇=1})
    处理组模型𝜇0(𝑋):用处理组数据(𝑋𝑇=0,𝑌𝑇=0)(𝑋_{𝑇=0},𝑌_{𝑇=0})
  • 交叉预测与残差生成
    对处理组样本,用𝜇0(𝑋_{𝑇=1})预测反事实对照结果Y0^\hat{Y_{0}},计算残差𝐷1=𝑌𝑇=1Y0^𝐷1=𝑌_{𝑇=1}–\hat{Y_{0}}
    对对照组样本,用𝜇0(𝑋_{𝑇=0})预测反事实对照结果Y1^\hat{Y_{1}},计算残差𝐷2=Y1^𝑌𝑇=0𝐷2=\hat{Y_{1}}-𝑌_{𝑇=0}

这一步是解决模型误差的问题。

  • 元模型训练:
    处理组元模型𝜏1(𝑋):用处理组数据(𝑋𝑇=1,𝐷1)(𝑋_{𝑇=1},𝐷1)训练。
    对照组元模型𝜏0(𝑋):用对照组数据(𝑋𝑇=0,𝐷0)(𝑋_{𝑇=0},𝐷0)训练。
    倾向得分估计𝜋(𝑋):通过逻辑回归或机器学习模型预测𝑃(𝑇=1|𝑋)。
  • 加权集成处理效应:
    最终CATE估计:𝜏̂ (𝑥)=𝜋(𝑥)⋅𝜏0(𝑥)+(1−𝜋(𝑥))⋅𝜏1(𝑥)
    倾向得分作用:在非随机数据中,高倾向得分样本更可能属于处理组,因此更信任对照组元模型的估计。
    这一步是解决选择偏差的问题的。

优缺点分析

优点

  • 高效利用小样本:通过交叉预测,同时利用处理组和对照组的数据训练元模型,缓解样本不足问题。
  • 适应非随机数据:倾向得分加权可校正选择偏差,提升非随机实验中的估计无偏性。
  • 鲁棒的异质性捕捉:元模型直接建模处理效应,而非潜在结果,更聚焦于效应异质性。

缺点

  • 计算复杂度高:需训练四个模型(2个基础模型 + 2个元模型 + 倾向得分模型),计算成本显著增加。
  • 依赖倾向得分精度:若倾向得分估计不准确,加权集成可能引入偏差。
  • 模型链式误差累积:基础模型的预测误差会传递到元模型,影响最终CATE估计。

R-Learner(Robust-Learner)

R-Learner(Robust-Learner)是因果推断中一种基于双重机器学习(Double Machine Learning)和正交化(Orthogonalization)的方法,旨在通过分离倾向得分建模与结果建模,提升处理效应估计的鲁棒性。其核心思想是通过残差学习消除混杂变量影响,从而在模型误设或高维特征下仍能保持无偏估计(R-Learner的思路是通过做某种变换,把因果效应问题转化为一个Loss优化问题,这样的话就可以用大家早已擅长的Machine Learning的手段去优化了。)。

基本思路

第一阶段:分别估计倾向得分π^(𝑋)=𝑃(𝑇=1𝑋)\hat{\pi}(𝑋)=𝑃(𝑇=1|𝑋)和结果模型μ^0(𝑋)=𝔼[𝑌𝑇=0,𝑋]\hat{\mu}0(𝑋)=𝔼[𝑌|𝑇=0,𝑋]μ^1(𝑋)=𝔼[𝑌𝑇=1,𝑋]\hat{\mu}1(𝑋)=𝔼[𝑌|𝑇=1,𝑋]

第二阶段:通过残差正交化,消除混杂变量对处理效应估计的干扰。

结果残差:𝑌^𝑖=𝑌𝑖(𝑇𝑖μ1(𝑋𝑖)+(1𝑇𝑖)μ0(𝑋𝑖))\hat{𝑌}_{𝑖}=𝑌_{𝑖}–(𝑇_{𝑖} \mu 1(𝑋_{𝑖})+(1−𝑇_{𝑖})\mu0(𝑋_{𝑖}))
处理残差:𝑇^𝑖=𝑇𝑖π(𝑋𝑖)\hat{𝑇}_{𝑖}=𝑇_{𝑖}–\pi (𝑋_{𝑖})

处理效应估计:通过回归𝑌̃ 对𝑇̃ 的条件均值,直接估计CATE.

τ^(X)=arg mini=1n(𝑌^𝑖τ(x)𝑇^𝑖)2\hat{\tau}(X)=arg\ min \sum_{i=1}^{n}(\hat{𝑌}_{𝑖} - \tau(x) \hat{𝑇}_{𝑖})^{2}

其中τ^(X)\hat{\tau}(X) 就是CATE

核心假设

无未观测混杂:所有影响处理分配和结果的变量均被观测。
Neyman正交性:估计方程对倾向得分和结果模型的误设具有鲁棒性(通过正交化实现)。
交叉拟合(Cross-fitting):避免过拟合,提升泛化能力。

推理过程可以看这篇文章 R-Learner

优缺点分析

优点

  • 对模型误设鲁棒:正交化使估计量对倾向得分和结果模型的误设具有双鲁棒性(只要两者中一个正确即可)。
  • 适应高维数据:可结合Lasso、随机森林等高维模型处理大量特征。
  • 无偏性保障:在交叉拟合下,即使使用黑箱模型,仍能保证渐近无偏性。
    缺点
  • 计算复杂度高:需多次训练模型(交叉拟合)和残差计算,耗时较长。
  • 小样本表现不稳定:数据量不足时,残差估计可能波动较大。
  • 依赖交叉拟合实现:未正确应用交叉拟合时,可能导致过拟合。

适用场景

高维混杂变量:特征维度高(如基因数据、用户行为数据),需正则化模型。
观测性研究(非随机数据):存在复杂选择偏差,需双重去偏。
模型鲁棒性要求高:无法确保倾向得分或结果模型完全正确时。

代码实现

import numpy as np
from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression, Lasso
from sklearn.ensemble import GradientBoostingRegressor
from econml.dml import LinearDML

# 假设数据已加载:X为特征,T为处理变量(连续或二元),Y为结果

# 使用EconML库实现R-Learner(基于LinearDML)
model = LinearDML(
    model_y=GradientBoostingRegressor(),  # 结果模型
    model_t=LogisticRegression(),         # 倾向得分模型(若T为二元)
    discrete_treatment=True,              # 处理变量是否为离散
    cv=5                                  # 交叉拟合折数
)
model.fit(Y, T, X=X)

# 估计CATE
cate = model.effect(X)

# 自定义实现(简化版)
kf = KFold(n_splits=5)
cate_estimates = []

for train_idx, test_idx in kf.split(X):
    X_train, X_test = X[train_idx], X[test_idx]
    T_train, T_test = T[train_idx], T[test_idx]
    Y_train, Y_test = Y[train_idx], Y[test_idx]
    
    # 训练倾向得分模型
    ps_model = LogisticRegression().fit(X_train, T_train)
    pi_hat = ps_model.predict_proba(X_test)[:, 1]
    
    # 训练结果模型
    y_model = Lasso().fit(X_train, Y_train)
    mu_hat = y_model.predict(X_test)
    
    # 计算残差
    Y_tilde = Y_test - mu_hat
    T_tilde = T_test - pi_hat
    
    # 拟合CATE模型
    tau_model = GradientBoostingRegressor().fit(X_test, Y_tilde / T_tilde)
    cate_estimates.append(tau_model.predict(X_test))

# 合并交叉拟合结果
cate = np.concatenate(cate_estimates)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×