【因果推断python】47_元学习1

目录

S-Learner


简单回顾一下,我们现在感兴趣的是发现治疗效果的异质性,即确定单位对治疗的不同反应。在这个框架中,我们想估计

在连续的情况下。换句话说,我们想知道这些单位对治疗的敏感程度。这在我们不能治疗所有人并且需要对治疗进行优先排序的情况下非常有用,例如,当你想提供折扣但预算有限时。

之前,我们看到了如何转换结果变量Y以便我们可以将其插入预测模型中,并获得条件平均治疗效果(CATE)估计。在那里,我们不得不付出方差增加的代价。这是我们在数据科学中经常看到的。没有一个最好的方法,因为每种方法都有其优缺点。因此,值得学习许多技术,以便根据具体情况进行权衡。本着这种精神,本章将侧重于为您提供更多可供您使用的工具。

元学习器是一种利用现成的预测机器学习方法来解决我们迄今为止一直在研究的相同问题的简单方法:估计CATE。同样,它们都不是最好的,每一个都有自己的弱点。我会试着复习一下,但请记住,这些内容高度依赖于上下文。不仅如此,元学习器还部署了预测ML模型,这些模型可以从线性回归和增强决策树到神经网络和高斯过程。元学习器的成功也将在很大程度上取决于它使用的机器学习方法。通常,你只需要尝试许多不同的东西,看看什么最有效。

python 复制代码
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
from nb21 import cumulative_gain, elast

在这里,我们将使用与以前相同的数据,重新考虑投资广告电子邮件。同样,这里的目标是找出谁能更好地回复电子邮件。不过也有一点小转折。这一次,我们将使用非随机数据来训练模型,并使用随机数据来验证它们。处理非随机数据是一项困难得多的任务,因为元学习者需要对数据进行去噪并估计CATE。

python 复制代码
test = pd.read_csv("./data/invest_email_rnd.csv")
train = pd.read_csv("./data/invest_email_biased.csv")
train.head()

我们的结果变量是转化率,我们的治疗是通过电子邮件1。让我们创建变量,将这些变量与功能一起存储。探索治疗效果的异质性。

python 复制代码
y = "converted"
T = "em1"
X = ["age", "income", "insurance", "invested"]

S-Learner

我们将使用的第一个学习者是S-learner。这是我们能想到的最简单的学习者。我们将使用单个(因此为S)机器学习模型

估计

为此,我们将简单地将治疗作为一个特征包括在试图预测结果Y的模型中。

python 复制代码
from lightgbm import LGBMRegressor

np.random.seed(123)
s_learner = LGBMRegressor(max_depth=3, min_child_samples=30)
s_learner.fit(train[X+[T]], train[y]);

然后,我们可以在不同的治疗方案下进行预测。测试和对照之间的预测差异将是我们的CATE估计

如果我们把它放在一个图表中,下面是它的样子

现在,让我们看看如何在代码中实现这个学习器。

python 复制代码
s_learner_cate_train = (s_learner.predict(train[X].assign(**{T: 1})) -
                        s_learner.predict(train[X].assign(**{T: 0})))

s_learner_cate_test = test.assign(
    cate=(s_learner.predict(test[X].assign(**{T: 1})) - # predict under treatment
          s_learner.predict(test[X].assign(**{T: 0}))) # predict under control
)

为了评估这个模型,我们将查看测试集中的累积增益曲线。我还在火车上画增益曲线。由于训练是有偏差的,如果模型是好的,这条曲线不能给出任何指示,但它可以指出我们是否过度拟合训练集。当这种情况发生时,列车组中的曲线将非常高。如果您想看看它是什么样子,请尝试将max_depth参数从3替换为20。

python 复制代码
gain_curve_test = cumulative_gain(s_learner_cate_test, "cate", y="converted", t="em1")
gain_curve_train = cumulative_gain(train.assign(cate=s_learner_cate_train), "cate", y="converted", t="em1")
plt.plot(gain_curve_test, color="C0", label="Test")
plt.plot(gain_curve_train, color="C1", label="Train")
plt.plot([0, 100], [0, elast(test, "converted", "em1")], linestyle="--", color="black", label="Baseline")
plt.legend()
plt.title("S-Learner");

正如我们从累积增益中看到的那样,S-学习器虽然简单,但在这个数据集上可以表现良好。需要记住的一件事是,这种性能对于这个数据集来说是非常特殊的。根据你掌握的数据类型,S学习者可能会做得更好或更差。在实践中,我发现S-学习器是解决任何因果问题的好方法,主要是因为它的简单性。不仅如此,S-学习者可以处理连续和离散处理,而本章中的其他学习者只能处理离散处理。

S学习者的主要缺点是它倾向于将治疗效果偏向于零。由于S学习器使用通常是正则化的机器学习模型,该正则化可以限制估计的治疗效果。‪切尔诺茹科夫‬ 等人(2016)使用模拟数据概述了这个问题:

在这里,他们绘制了真实因果效应(红色轮廓)和估计因果效应之间的差异,,使用S-学习器。估计的因果效应有很大偏差。

更糟糕的是,如果治疗相对于其他协变量在解释结果时所起的作用非常弱,则S学习者可以完全放弃治疗变量。请注意,这与您所使用的所选ML模型高度相关。正则化程度越高,问题就越严重。我们将看到下一个学习者尝试解决这个问题。

相关推荐
qq_342295829 小时前
Go语言错误处理如何做_Go语言error错误处理教程【实用】
jvm·数据库·python
qq_334563559 小时前
如何在phpMyAdmin中执行多条SQL语句_分号分隔与批量执行解析
jvm·数据库·python
cd_949217219 小时前
新北洋亮相2026 CHINASHOP:以“智印零售全生态”赋能效率与增长
大数据·人工智能·零售
lizz6669 小时前
Hermes-Agent:使用SOUL.md设定智能体身份
人工智能
2401_897190559 小时前
Golang如何做Clean Architecture_Golang整洁架构教程【详解】
jvm·数据库·python
3Dmax效果图渲染研习社9 小时前
ai生成的视频有没有版权?注意事项
人工智能·ai作画·aigc
llm大模型算法工程师weng9 小时前
人格识别模型:理解人类行为差异的心理测量工具
人工智能
qq_189807039 小时前
如何在网页中实现国际象棋棋子的拖拽与格点吸附功能
jvm·数据库·python
IoT物联网产品手记9 小时前
IoT产品模块化架构设计:从功能堆叠到能力组合的系统方法
大数据·人工智能·物联网
C系语言9 小时前
ONNX Runtime安装
人工智能·python·深度学习