【Python实战因果推断】2_因果效应异质性2

目录

CATE with Regression

Evaluating CATE Predictions


CATE with Regression

我想你可能已经预料到了:与应用因果推理中的大多数情况一样,答案往往从线性回归开始。但在走这条路之前,让我们把事情变得更具体一些。假设你在一家遍布全国的连锁餐厅工作。这项业务的一个关键组成部分是了解何时应该给顾客打折。为此,该公司在全国范围内进行了一项为期三年的实验,在连锁店中的六家不同餐厅随机提供折扣。数据存储在以下数据框中:

您的目标是了解何时是打折的最佳时机。在这些数据中,每家餐厅和每一天都有一行数据。这与本书中使用的大多数示例有些不同,以前的示例以顾客为单位。现在,单位是日-餐厅组合。即便如此,你仍然可以运用以前的推理方法,只是你要 "对待"(给予折扣)的不是顾客,而是 "对待 "日。您也可以在每一天的每家餐厅采用不同的价格,但我们还是把问题简化为保持各餐厅的价格一致。

您可以将这一业务问题视为 CATE 估算问题。如果您能创建一个模型,输出每一天的销售额对折扣的敏感度以及协变量,即 \frac\partial{\partial t}E[Sales(t)|X] ,那么,您就可以使用该模型来决定何时打折以及打多少折。

现在你有了更具体的东西可以利用,让我们来看看回归如何帮助你。回想一下,您当时的情况很复杂。您需要预测 \frac{\delta Y_{i}}{\delta T_{i}},但遗憾的是,它是不可观测的。所以你不能简单地使用多项式回归算法,然后将其作为目标。但也许你并不需要观察 \frac{\delta Y_{i}}{\delta T_{i}} 来预测它。

例如,假设您对数据拟合了以下线性模型:y_i=\beta_0+\beta_1t_i+\beta_2X_i+e_i

如果在治疗上加以区分,结果会如下:\frac{\delta y_i}{\delta t_i}=\beta_1  即 在随机治疗的情况下ATE。

由于可以通过估计前面的模型得到 \widehat{\beta}_{1} ,因此甚至可以说,即使无法观察到斜率,也可以预测斜率。在这个例子中,预测相当简单。您预测的是每个人的恒定值 \widehat{\beta}_{1}。这是件好事,但并不是您想要的。这是 ATE,而不是 CATE。这对您计算何时给予折扣没有任何帮助,因为每个单位(日和餐厅组合)得到的斜率预测都是一样的。

要改进它,可以做以下简单的改变:y_i=\beta_0+\beta_1t_i+\beta_2X_i+\beta_3t_iX_i+e_i,这样就可以预测出以下坡度:\frac{\widehat{\delta y_i}}{\delta t_i}=\widehat{\beta_1}+\widehat{\beta_3}X_i其中,\beta_3 是 X 特征的向量系数!

每个由不同 Xi 定义的实体都会有不同的斜率预测。换句话说,斜率预测会随着 X 的变化而变化。直观地说,包含治疗与协变因素之间的交互作用可以让模型了解效果如何随着这些协变因素的变化而变化。这就是回归如何为您提供估计 CATE 的方法,即使您无法直接预测它。
理论就讲到这里。让我们来看看如何编写代码。首先,您需要定义协变量。在本例中,协变量基本上是日期的特定特征,如月份、星期以及是否是节假日。我还加入了竞争对手的平均价格,因为这可能会影响顾客对每家餐厅折扣的反应。

一旦有了协变量,就需要将它们与治疗进行交互。* 运算符就可以做到这一点。它为左侧和右侧创建一个加法项,再加上一个交互项。例如,a*b 将在回归中包含 a、b 和 a * b 项。在你的例子中,结果如下:

sales_i=\beta_0+\beta_1discount_i+\beta_2X_i^\star discount_i+\beta_3X_i+e_i

import statsmodels.formula.api as smf
X = ["C(month)", "C(weekday)", "is_holiday", "competitors_price"]
regr_cate = smf.ols(f"sales ~ discounts*({'+'.join(X)})",data=data).fit()

估算出模型后,就可以从参数估算值中提取预测斜率:

\frac{\delta sales_i}{\delta discounts_i}=\widehat{\beta_1}+\widehat{\beta_3}X_i

其中,β1 是折扣系数,β3 是交互系数向量。您可以直接从拟合模型中提取这些参数,但获得斜率预测的更简便方法是使用导数的定义:\frac{\delta y}{\delta t}=\frac{y(t+\epsilon)-y(t)}{(t+\epsilon)-t}\epsilon趋近0, 您可以用 1 代替 \epsilon 来近似地理解这一定义:\frac{\delta y}{\delta t}\approx\hat{y}(t+1)-\hat{y}(t), 其中 y 由模型预测值给出。由于这是一个线性模型,因此近似值是精确的。

换句话说,您将用模型做出两个预测:一个通过原始数据,另一个通过原始数据,但处理量增加了一个单位。这两个预测之间的差异就是您的 CATE 预测。下面是一些代码:

ols_cate_pred = (
 regr_cate.predict(data.assign(discounts=data["discounts"]+1))
 -regr_cate.predict(data)
 )

好了,您有了 CATE 模型及其预测。但仍有一个潜伏的问题:它到底有多好?换句话说,如何评估这个模型?您可能已经知道,比较实际值和预测值在这里是行不通的,因为实际治疗效果并不是在单位水平上观察到的。

Evaluating CATE Predictions

如果您有传统数据科学的背景,您可能会发现这种 CATE 预测看起来很像常规的机器学习预测,但却有一个无法在单位层面观察到的隐秘目标。这意味着,传统机器学习中使用的大量模型评估技术(如交叉验证)在这里仍然适用,而其他技术则需要一些调整。

因此,为了保持传统,我们将数据分为训练集和测试集。既然有时间维度,那就用它吧。训练集将包含 2016 年和 2017 年的数据,测试集则包含 2018 年以后的数据:

train = data.query("day<'2018-01-01'")
test = data.query("day>='2018-01-01'")

现在,让我们重试之前的 CATE 回归模型,但只使用训练数据进行估计,并对测试集进行预测:

X = ["C(month)", "C(weekday)", "is_holiday", "competitors_price"]
 regr_model = smf.ols(f"sales ~ discounts*({'+'.join(X)})",
 data=train).fit()
 cate_pred = (
 regr_model.predict(test.assign(discounts=test["discounts"]+1))
 -regr_model.predict(test)
 )

为了增加趣味性,让我们用一个纯粹的预测性机器学习模型来衡量这个回归模型。这个机器学习模型只是试图预测结果 Y:

from sklearn.ensemble import GradientBoostingRegressor
 X = ["month", "weekday", "is_holiday", "competitors_price", "discounts"]
 y = "sales"
 np.random.seed(1)
 ml_model = GradientBoostingRegressor(n_estimators=50).fit(train[X],
 train[y])
 ml_pred = ml_model.predict(test[X])

最后,让我们把一个非常糟糕的模型也纳入比较范围。这个模型简单地输出-1 和 1 之间的随机数。这显然是无稽之谈,但也是一个值得关注的有趣基准。归根结底,你想知道用 CATE 模型分配治疗是否会比随机分配更好,这就是最后一个模型的作用。

为了方便起见,我将所有数据存储在一个新的数据帧 test_pred:

np.random.seed(123)
 test_pred = test.assign(
 ml_pred=ml_pred,
 cate_pred=cate_pred,
 rand_m_pred=np.random.uniform(-1, 1, len(test)),
 )

有了模型之后,就该想办法评估和比较它们了。也就是说,你必须面对ground truth是不可观测的这一事实。正如你很快就会看到的,诀窍在于认识到,尽管你无法测量单个个体的治疗效果,但你可以估计很小群体的治疗效果。因此,如果你想用 CATE 来评估你的模型,就必须依赖于群体层面的指标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nuxt3项目打包后获取.env设置的环境变量无效的解决办法

问题描述 在nuxt3项目开发过程中&#xff0c;设置了开发环境变量和生产环境变量&#xff0c;在本地开发时都能正常获取&#xff0c;但打包部署时获取不到&#xff0c;设置如下&#xff1a; //.env.development文件示例 SERVER_API_PATHhttp://192.168.25.100//.env.productio…

Shell (一)Ubuntu的网络配置及软件安装

Ubuntu的配置及软件安装 网络配置 虚拟机提供的网络类型 桥接模式 主机和虚拟机分别拥有不同的ip地址&#xff0c;可以实现和外界设备通信 NAT模式 也可以联网&#xff0c;但是和主机共用同一个ip地址&#xff0c;外界无法识别虚拟机和主机发送的信息 仅主机模式 虚拟机不可…

【Chapter9】设备与IO管理,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]零、设备管理的功能和目标0.1 设备管理的功能0.2 设备管理的目标 一、设备的分类1.1 输入输出型设备和存储型设备&#xff08;用途&#xff09;1.2 独占型设备和共享型设备 二、设备的物理特性2.1 IO设备的物理特性2.2 存储型设备的物理特性2.2.1 磁带的物理特性…

nest.js关键笔记

Nest.js 介绍核心功能设计模式&#xff1a;IOC 控制反转 DI 依赖注入前置知识&#xff1a;装饰器前置知识装饰器-实现一个GET请求 Nestjs脚手架Nestjs cli 常用命令 RESTful 风格设计Nestjs 控制器控制器中常见的参数装饰器 Session 实例Nestjs 提供者工厂模式异步模式 Nestjs …

高中数学:不等式-常用不等式知识点汇总

一、基本性质 比较大小的常用两种方法&#xff1a;作差法&#xff0c;作商法 等式性质 不等式性质 二、基本(均值)不等式 扩展 三、二次函数与一元二次方程不等式 定义 解的对应关系 一元二次不等式的求解过程 四、二元一次不等式(组)与线性规划 关键在于求多个不等…

vite-ts-cesium项目集成mars3d修改相关的包和配置参考

如果vite技术栈下使用原生cesium&#xff0c;请参考下面文件的包和配置修改&#xff0c;想用原生创建的viewer结合我们mars3d的功能的话。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

pytorch为自己的extension backend添加profiler功能

pytorch为自己的extension backend添加profiler功能 1.参考文档2.your-extension-for-pytorch需要增加的代码3.pytorch demo及如何调整chrome trace json文件4.[可视化](https://ui.perfetto.dev/) 本文演示了pytorch如何为自己的extension backend添加profiler功能 背景介绍 …

Verilog进行结构描述(二):Verilog基本单元(primitives)

目录 1.Verilog基本单元2.基本单元的引脚 (pin)的可扩展性3.带条件的基本单元4.基本单元实例化 微信公众号获取更多FPGA相关源码&#xff1a; 1.Verilog基本单元 Verilog基本单元提供基本的逻辑功能&#xff0c;也就是说这些逻辑功能是预定义的&#xff0c;用户不需要再定义…

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研发的一套通过java来操控数据库的工具&#xff0c;对应不同的数据库系统有不同的JDBC&#xff0c;而他们统称【驱动】&#xff0c;这就是上一篇我们提到创建Mybatis项目时要引入的依赖、以及连接数据库四要素里的第一要素。 JDBC有自己一套原始…

应用案例 | 如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

一、货物运输 不同种类的货物对运输的要求不同&#xff0c;钢铁、煤炭、矿石等大宗物资通常对运输要求较低&#xff0c;而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性和时效性&#xff0c;往往希望能尽可能安全和快速送达这类货物&#xff0c;使之尽快进入…

使用nvm命令进行node和npm版本下载以及切换

下载以及安装nvm方式 https://blog.csdn.net/ppz8823/article/details/130862191 1.查看nvm版本 nvm -v2.查看node 和 npm版本 node -v npm -v3.使用nvm查看已下载的node版本 nvm ls4.使用nvm 查看可使用的在线node版本 nvm list available4.下载想要使用的node版本&#x…

探索 LLMs 在数据标注中的应用潜力:观察、思考与前景展望

编者按&#xff1a; 目前&#xff0c;LLMs 在机器翻译、文本生成、多轮问答等任务上已表现得非常出色了。人们开始思考它们是否也可以用于数据标注工作。数据标注是训练和评估各种机器学习模型的基础&#xff0c;一直是一项昂贵且耗时的工作。是否能够借助 LLMs 的强大能力来为…

OpenAI将终止对中国提供服务,国内模型接棒

说起来&#xff0c;OpenAI自始至终就没有对中国提供过服务&#xff0c;OpenAI官方支持的国家和地区&#xff1a;https://platform.openai.com/docs/supported-countries 列表里面没有“Chinese”的选项&#xff0c;那为什么又要明令禁止呢&#xff0c;国类IT高手们&#xff0…

来给大家推荐得10个有效磁力导航链接(好用搜资料找资源)

都2024现在网上找资源像流水得鱼一样&#xff0c;抓一大把结果很难吃&#xff0c;我通宵特意整理的网站&#xff0c;网上有许多磁力导航网站可以提供海量的磁力链接资源&#xff0c;以下是一些有效的磁力导航网站推荐&#xff1a; 磁力搜索 网站地址&#xff1a;www.chiliso…

我国氮化硼市场规模逐渐扩大 市场集中度有望不断提升

我国氮化硼市场规模逐渐扩大 市场集中度有望不断提升 氮化硼&#xff08;BN&#xff09;俗称为白石墨&#xff0c;是由硼原子和氮原子所构成的一种晶体材料&#xff0c;在常温条件下多表现为一种棕色或暗红色晶体。氮化硼具有导热性好、硬度大、熔点高、抗化学侵蚀性等优点&…

flex 与 overflow 冲突

问题场景&#xff1a; 父盒子高度会变化&#xff0c;可能会比子盒子大&#xff0c;也可能会比子盒子小。 比子盒子大的时候&#xff0c;希望子盒子垂直居中&#xff1b;比子盒子小的时候&#xff0c;能够正常滚动&#xff1b; <body><div class"outer">…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

vscode下无法识别node、npm的问题

node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 因为node是在cmd安装的&#xff0c;是全局安装的&#xff0c;并不是在这个项目里安装的。 解决方案&#xff1a; 1.在vscode的控制台&#xff0c;针对一个项目安装特定版本的node&#xff1b; 2.已经…

SAP标准报表 S_ALR_8701XXXX是没有export to excel的 或者禁用 %PC也禁用了,如何开回来

以 s_alr_87012172为例子 系统-状态 进入程序 搜索 XXL 做下替换

手动将jar包导入本地Maven仓库

1、进入存放jar包的目录&#xff0c;可以先放进仓库底下 2、cmd回车 3、执行命令&#xff0c;看到BUILD SUCCESS就是成功了 -DgroupId、-DartifactId、-Dversion、-Dfile记得换成自己对应的 mvn install:install-file -DgroupIdcom.github.03 -DartifactIdonvif -Dversion1.0…