【Python实战因果推断】6_元学习器1

目录

Metalearners for Discrete Treatments

T-Learner


简单回顾一下,在之前的部分中,你们的重点是干预效果的异质性,也就是确定各单位对治疗的不同反应。在此框架下,您希望估算

\tau_i(x)=E\big[Y_i(1)-Y_i(0)\big|X\big]=E\big[\tau_i\big|X\big]

或连续情况下的 E[\delta Y_i(t)|X]。换句话说,您想知道单位对干预的敏感程度。在无法干预所有人,需要对干预进行优先排序的情况下,这一点超级有用;例如,当您想给予折扣但预算有限时。或者当某些单位的干预效果为正,而其他单位的干预效果为负时。

在此之前,您已经了解了如何使用带有交互项的回归来获得条件平均干预效果 (CATE) 估计值。现在,是时候加入一些机器学习算法了。

Metalearners 是一种利用现成的预测性机器学习算法来近似干预效果的简便方法。它们可以用来估计 ATE,但一般来说,它们主要用于 CATE 估计,因为它们可以很好地处理高维数据。Metalearners 用于回收预测模型,以进行因果推断。所有预测模型,如线性回归、提升决策树、神经网络或高斯过程,都可以利用本章介绍的方法重新用于因果推理。因此,metalearner 的成功与否在很大程度上取决于它所使用的机器学习技术。很多时候,你只需尝试多种不同的方法,看看哪种最有效。

Metalearners for Discrete Treatments

假设你在一家在线零售商的营销团队工作。你的目标是找出哪些客户能够接受营销电子邮件。你知道这封电子邮件有可能让顾客花更多的钱,但你也知道有些顾客并不喜欢收到营销电子邮件。为了解决这个问题,您打算估算电子邮件对客户未来购买量的条件平均干预效果。这样,您的团队就可以利用这个估计值来决定向谁发送电子邮件。

与大多数商业应用一样,您拥有大量向客户发送营销电子邮件的历史数据。您可以利用这些丰富的数据来匹配您的 CATE 模型。此外,您还有一些来自随机发送营销电子邮件实验的数据点。您计划将这些宝贵的数据仅用于评估您的模型,因为您拥有的数据太少了:

 import pandas as pd
 import numpy as np
 data_biased = pd.read_csv("./data/email_obs_data.csv")
 data_rnd = pd.read_csv("./data/email_rnd_data.csv")
 print(len(data_biased), len(data_rnd))
 data_rnd.head()

随机数据和观察数据都有完全相同的列。干预变量是 mkt_email,您关心的干预结果是收到电子邮件一个月后的购买量-next_mnth_pv。除了这些列之外,数据还包含一系列协变量,如客户的年龄、在您的网站上首次购买的时间(任期),以及他们在每个类别中的购买量数据。这些协变量将决定您计划拟合的干预异质性。

为了简化 CATE 模型的开发,您可以创建变量来存储处理、干预和协变量,以及训练集和测试集。

一旦掌握了所有这些,建造几乎所有的元学习器都将变得简单易行:

 y = "next_mnth_pv"
 T = "mkt_email"
 X = list(data_rnd.drop(columns=[y, T]).columns)
 train, test = data_biased, data_rnd

一旦掌握了所有这些,建造几乎所有的元学习器都将变得简单易行:

T-Learner

如果您要进行分类干预,首先应该尝试的学习器是 T 学习器。它非常直观,我猜你已经想到了。 它为每个干预拟合一个结果模型 \mu_t(x),以估计潜在结果 Y_{t}。在二元情况下,您只需要估计两个模型(因此称为 T):学习器在T = 1上训练ML模型,在T = 0上训练ML模型;在预测时间,它使用这两种模型来估计治疗和控制之间的差异

\mu_{0}(x)=E[Y|T=0,X]\\\mu_{1}(x)=E[Y|T=1,X]为了编写代码,我将使用提升回归树来建立结果模型。具体来说,我将使用 LGBMRegressor,这是一种非常流行的回归模型。我也会使用默认参数,但如果你愿意,也可以随意优化:

 from lightgbm import LGBMRegressor
 np.random.seed(123)
 m0 = LGBMRegressor()
 m1 = LGBMRegressor()
 m0.fit(train.query(f"{T}==0")[X], train.query(f"{T}==0")[y])
 m1.fit(train.query(f"{T}==1")[X], train.query(f"{T}==1")[y]);

现在我有了这两个模型,对测试集进行 CATE 预测就非常容易了:

 t_learner_cate_test = test.assign(
 cate=m1.predict(test[X]) - m0.predict(test[X])
 )

为了评估这个模型,我使用了相对累积增益曲线和该曲线下的面积。

T-learner 在这个数据集中运行良好。从弯曲的累积增益曲线上可以看出,它可以很好地按 CATE 对客户进行排序。

一般来说,T-学习器往往是合理的首选,这主要是因为它简单易用。但它有一个潜在的问题,可能会根据具体情况表现出来:它容易产生正则化偏差。

考虑这样一种情况:未处理的数据很多,而处理的数据很少。这种情况在很多应用中都很常见,因为干预的成本很高。现在假设干预结果 Y 具有一定的非线性,但治疗效果是恒定的。 下图中的第一幅图描述了这种情况:如果数据看起来像这样,与未处理的数据相比,处理过的观测数据非常少,那么 μ1 模型很有可能最终会变得简单,以避免过度拟合。相比之下,μ0 会更加复杂,但没关系,因为大量的数据可以防止过度拟合。重要的是,即使两个模型使用相同的超参数,也会出现这种情况。例如,为了生成前面的数据,我使用了 LGBM 回归模型,其 min_child_samples=25 且其他参数设置为默认值。 在处理较少的数据点时,很多 ML 算法都会自我规范化,min_child_samples 就是这种情况。它强制 LGBM 中的树在每个叶节点中至少有 25 个样本。

从机器学习的角度来看,自规范化非常有意义。如果数据很少,就应该使用更简单的模型。以至于上图中的两个模型都具有相当不错的预测性能,因为它们都针对各自的样本量进行了优化。但是,如果使用这些模型来计算 CATE \hat{\tau}=\mu_{1}(X)-\mu_{0}(X)\mu_{0}(X) 的非线性减去 \mu_{1}(X) 的线性将导致非线性 CATE(虚线减去实线),这是错误的,因为在这种情况下,CATE 是恒定的,等于 1。您可以在上图的第二幅图中看到这种情况。

这里发生的情况是,未治疗者的模型可以捕捉到非线性,但治疗者的模型却捕捉不到,因为它是为了处理小样本量而正则化的。当然,你也可以减少对该模型的正则化处理,但这样会有过拟合的风险。在这里,您似乎陷入了进退两难的境地。如何解决这个问题呢?这就是 X-learner 的用武之地。

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值