以下内容梳理了潜在结果框架的常用算法和原理,并依据相关论文推理,结合案例做了代码实现:
潜在结果框架:因果推断世界里的平行时空
Uplift Model:S-Learner类增益模型实战
Uplift Model:T-Learner类增益模型实战
Class Transformation Model增益模型
Uplift Tree Model:增益树模型原理
Uplift模型评估指标AUUC
T-Learner增益模型原理
基础版本
T-Learner增益模型方法,也就是Two models approach。python的scikit-uplift包实现了相应sklift.models.TwoModels算法类,基础版本是vanilla方法。
具体步骤参考上图公式:训练时,利用treatment组个体,训练treatment模型,利用control组个体,训练control模型;预估时,将测试个体特征分别喂入treatment模型和control模型,得到两个预测概率做差,即是这组个体的uplift。该方法的主要缺点是treatment组和control组分别训练响应模型,是间接建模增益uplift,存在较大的误差。
本文内容参考公众号原文: Uplift Model:T-Learner类增益模型实战
升级版本
此外,参考多分类问题的链式分类器方法,scikit-uplift包实现了T-Learner类增益模型的升级版本,即sklift.models.TwoModels类的ddr_control方法。该方法的主要思想如下:如果训练的是L分类问题,就训练L个分类器,每个分类器都是二分类的;训练时,第i个分类器 会使用前i-1个分类器的预估值作为特征,这样做可以建模第i类和前i-1类之间的依赖性。基于该思想的增益模型建模方法就是“两阶段增益建模方法”。
对于二元干预二分类响应变量的情况,具体步骤如下:
(1.)基于control组个体,训练分类器
P
C
P_C
PC
P
C
=
P
(
Y
=
1
∣
X
,
W
=
0
)
P^C=P(Y=1|X,W=0)
PC=P(Y=1∣X,W=0)
(2.)对于treatment组个体,利用
P
C
P_C
PC获得预测值
P
C
(
X
)
P_C(X)
PC(X),作为补充特征
X
X
X一起喂入模型,训练分类器
P
T
P_T
PT
P
T
=
P
(
Y
=
1
∣
X
,
P
C
(
X
)
,
W
=
1
)
P^T=P(Y=1|X,P_C(X),W=1)
PT=P(Y=1∣X,PC(X),W=1)
(3.)由此,增益值就是二者的差值
u
p
l
i
f
t
(
x
i
)
=
P
T
(
x
i
,
P
C
(
x
i
)
)
−
P
C
(
x
i
)
uplift(x_i)=P^T(x_i, P_C(x_i))-P^C(x_i)
uplift(xi)=PT(xi,PC(xi))−PC(xi)
显然,第二个分类器就是学习个体在treatment组相比在control组的增益。详细步骤参考下图公式,上述过程是先学习 后学习 ,类似地,也可以先学习 后学习 。
Scikit-uplift包TwoModels类源码
在scikit-uplift包TwoModels类是实现T-Learner类增益模型的源码,如下代码片段是拟合样本数据的fit()函数核心实现部分,self.method取值vanilla,对应T-Learner基础版本,就是控制组和干预组各自的样本训练各自的模型;self.method取值ddr_control,对应T-Learner升级版本,先基于控制组样本 训练控制模型;再利用控制模型 预测干预组样本,得到预测概率;将该概率与干预组样本特征拼接,一起用于 训练干预模型;self.method取值ddr_treatment,与ddr_control类似,仅仅是控制组模型和干预组模型的训练顺序调换。
if self.method == 'vanilla': # T-Learner基础版本,控制组和干预组各自的样本 训练各自的模型
self.estimator_ctrl.fit(
X_ctrl, y_ctrl, **estimator_ctrl_fit_params
)
self.estimator_trmnt.fit(
X_trmnt, y_trmnt, **estimator_trmnt_fit_params
)
if self.method == 'ddr_control': # T-Learner升级版本
self.estimator_ctrl.fit( # 先基于控制组样本 训练控制模型
X_ctrl, y_ctrl, **estimator_ctrl_fit_params
)
if self._type_of_target == 'binary': # 利用控制模型 预测干预组样本,得到预测概率
ddr_control = self.estimator_ctrl.predict_proba(X_trmnt)[:, 1]
else:
ddr_control = self.estimator_ctrl.predict(X_trmnt)
if isinstance(X_trmnt, np.ndarray): # 将该概率与干预组样本特征拼接,一起用于 训练干预模型
X_trmnt_mod = np.column_stack((X_trmnt, ddr_control))
elif isinstance(X_trmnt, pd.DataFrame):
X_trmnt_mod = X_trmnt.assign(ddr_control=ddr_control)
else:
raise TypeError("Expected numpy.ndarray or pandas.DataFrame, got %s" % type(X_trmnt))
self.estimator_trmnt.fit(
X_trmnt_mod, y_trmnt, **estimator_trmnt_fit_params
)
T-Learner增益模型实战案例
更多内容参考公众号原文: Uplift Model:T-Learner类增益模型实战
更多内容欢迎关注微信公众号:瑞行AI