目录
X-Learner
X-Learner
X-learner 在解释上要比前一个学习器复杂得多,但其实现却非常简单,所以如果你一开始不理解,也不用担心。X 学习器有两个阶段和一个倾向得分模型。第一个阶段与 T 学习器相同。首先,将样本分为治疗组和非治疗组,并为每组拟合一个模型:
现在,事情开始有了转机。在第二阶段,您首先需要使用之前拟合的模型来估算缺失的潜在结果:
在之前的示例数据中, 和 是第二幅图中的数据点。在下图中,我再现了同样的数据,以及预测模型 和 。请注意,即使您有更多的控制数据, 还是错误的。这是因为它是使用 建立的,而 是在非常小的样本中拟合的。因此,由于 是错误的, 也会产生误导。相反, 很可能是正确的,因为 也是正确的,因为它是使用 模型生成的:
总之,你有一个模型是错误的,因为你错误地估算了干预效果,而另一个模型是正确的,因为你正确地估算了这些值。现在,您需要一种方法将两者结合起来,使正确的模型具有更大的权重。为此,您可以使用倾向得分模型。使用该模型,您可以将两个第二阶段模型组合如下:
在本例中,由于处理的单位很少, 非常小,因此错误的 CATE 模型 的权重非常小。 相反,1 - 接近 1,因此正确的 CATE 模型 的权重会更大。更一般地说,这种使用倾向得分的加权平均值将有利于从使用更多数据训练的 模型中得到的干预效果估计值。
下图显示了 X 学习器给出的 CATE 估计值,以及分配给每个数据点的权重。请注意,它实际上是如何抛弃错误数据的:
可以看出,与 T-learner 相比,X-learner 在纠正非线性估计的错误 CATE 方面做得更好。一般来说,当干预组的规模远大于其他组时,X-learner 的表现会更好。
我知道这可能需要消化很多东西,但希望您在查看代码时会更清楚。下图 总结了这个学习器。
你还可以试试领域适应学习器。它是 X 学习器,但使用倾向得分模型来估计 ,权重设置为 。
让我们看看如何编写这些代码。这里是第一阶段,与 T-learner 完全相同。如果计划使用倾向得分进行领域适应,则需要对训练样本进行 的重新加权,因此现在也是拟合倾向得分的时候:
from sklearn.linear_model import LogisticRegression
from lightgbm import LGBMRegressor
# propensity score model
ps_model = LogisticRegression(penalty='none')
ps_model.fit(train[X], train[T])
# first stage models
train_t0 = train.query(f"{T}==0")
train_t1 = train.query(f"{T}==1")
m0 = LGBMRegressor()
m1 = LGBMRegressor()
np.random.seed(123)
m0.fit(train_t0[X], train_t0[y],
sample_weight=1/ps_model.predict_proba(train_t0[X])[:, 0])
m1.fit(train_t1[X], train_t1[y],
sample_weight=1/ps_model.predict_proba(train_t1[X])[:, 1]);
接下来,您需要预测治疗效果,并对这些预测效果拟合第二阶段的模型:
# second stage
tau_hat_0 = m1.predict(train_t0[X]) - train_t0[y]
tau_hat_1 = train_t1[y] - m0.predict(train_t1[X])
m_tau_0 = LGBMRegressor()
m_tau_1 = LGBMRegressor()
np.random.seed(123)
m_tau_0.fit(train_t0[X], tau_hat_0)
m_tau_1.fit(train_t1[X], tau_hat_1);
最后,一旦你拥有了所有这些,你就可以使用倾向得分模型来结合来自第二阶段模型的预测来获得CATE。所有这些都可以在测试集上进行估计:
# estimate the CATE
ps_test = ps_model.predict_proba(test[X])[:, 1]
x_cate_test = test.assign(
cate=(ps_test*m_tau_0.predict(test[X]) +
(1-ps_test)*m_tau_1.predict(test[X])
)
)
让我们看看 X-learner 在累积收益方面的表现如何。在这组数据中,干预和对照的大小几乎相同,所以不要指望会有巨大的差异。X-learner 试图纠正的问题在这里可能并不明显:
不出所料,X-learner 的性能与 T-learner 相差不大。事实上,从曲线下的面积来看,X-learner 略逊于 T-learner。请记住,这些学习器的质量取决于具体情况。就像我前面说的,在这个特定的数据中,干预和对照的样本量都足够大,因此不会遇到 X 学习器试图解决的那种问题。这或许可以解释为什么这两种模型的表现相似。