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

news2024/11/18 0:39:03

目录

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 来评估你的模型,就必须依赖于群体层面的指标。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)

1.pytest数据参数化 假设你需要测试一个登录功能&#xff0c;输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…

NoSQL之Redis配置与管理

目录 一、关系型数据库和非关系型数据库 1.关系型数据库 2.非关系型数据库 3.关系型数据库和非关系型数据库区别 二、Redis 1.Redis简介 2.Redis 的优点 3.Redis 使用场景 4.Redis的数据类型 5.哪些数据适合放入缓存中&#xff1f; 6.Redis为什么这么快&#xff1f;…

Uniapp的使用

为什么要使用uniapp uniapp 可以进行多端开发&#xff0c;uniapp 在设计的时候就拥有许多兼容性代码&#xff0c;可以兼容很多的平台 如 支付宝小程序 html页面 微信小程序等&#xff0c;注重开发效率而不是运行效率时 &#xff0c;就可以考虑一下 uniapp 当然也可以去…

08 元组和集合

目录 一、元组&#xff08;tuple&#xff09; 1. 什么是元组 2. 查操作 3. 函数和方法 二、集合&#xff08;set&#xff09; 1. 什么是集合 2. 数学集合运算 一、元组&#xff08;tuple&#xff09; 1. 什么是元组 元组是容器型数据类型&#xff0c;将( )作为容器的标…

嵌入式学习——硬件(ARM内核汇编指令)——day52

ARM汇编指令 学习arm汇编的主要目的是为了编写arm启动代码&#xff0c;启动代码启动以后&#xff0c;引导程序到c语言环境下运行。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。因此启动代码的主要任务有&#xff1a; 初始化异常向量表&#xff1b;初…

强大的资源提取工具

一、简介 1、是一款功能强大的文件提取工具&#xff0c;它可以从多种不同类型的存档文件或安装程序中提取文件&#xff0c;包括但不限于ZIP、RAR、7z、ISO等格式。这款软件的独特之处在于它不仅能够处理常规的压缩文件&#xff0c;还能处理各种软件安装程序&#xff0c;甚至是加…

TMGM外汇平台: 纽元未来走势,新西兰即将降息

2024年6月26日&#xff0c;全球金融市场对新西兰联储即将采取的货币政策持续关注。分析师普遍预估新西兰将实施降息政策&#xff0c;这一政策调整预计将对新西兰元&#xff08;纽元&#xff09;的国际交易价值产生重大影响。本文将TMGM深入探讨新西兰经济的当前状况&#xff0c…

java:spring-security的简单例子

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.springf…

java使用Graphics2D生成图片

UI图 实际图片数据库中只存了一个二维码转的base64的数组,直接导出只有一个二维码 这里使用 Graphics2D 画图 public static void main(String[] args) {// 假设你有一个Base64编码的字符串&#xff0c;它表示一张图片String base64ImageString "/9j/4AAQSkZJRgABAgAAA…

考研数学(4/9):微分方程

微分方程 微分方程是高等数学中一个重要的分支&#xff0c;也是考研数学数一中必考的内容。本章主要介绍微分方程的概念、一阶微分方程、高阶线性微分方程以及微分方程的应用。 1. 微分方程的概念 1.1 微分方程的定义 微分方程 是指包含未知函数及其导数的方程。 更准确地说&am…

【数学建模】——【python库】——【Pandas学习】

专栏&#xff1a;数学建模学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 总篇&#xff1a;【数学建模】—【新手小白到国奖选手】—【学习路线】 第一卷&#xff1a;【数学…

老板电器 45 年的烹饪经验,浓缩在这款烹饪大模型中

在科技不断进步的时代&#xff0c;人工智能&#xff08;AI&#xff09;迅速成为推动各行各业发展的重要力量。家电行业也不例外&#xff0c;根据 Gartner 的报告预测&#xff0c;到 2024 年&#xff0c;AI 家电市场的规模将达到万亿美元级别。这一预估凸显了智能化在家电行业中…

大猫咪守护LoRA:定制你的大猫私人大猫咪宠物写真合影,某音某书流行款

&#x1f339;大家好&#xff01;我是安琪&#xff01;感谢大家的支持与鼓励。 大猫咪LoRA模型简介 今天应群里同学大猫咪宠物合影写真提议&#xff0c;为大家介绍一款来自作者 沐沐人像合成的主题为大猫咪守护的LoRAl模型&#xff1a;沐沐-大猫咪。这是一款当下在某音、某书…

python-docx 使用xml为docx不同的章节段落设置不同字体

本文目录 前言一、完整代码二、代码详细解析1、处理过程解释(1) 引入库并定义路径(2) 创建docx的备份文件(3) 定义命名空间(4) 打开并处理.docx文件(5) 分析和组织文档结构(6) 设置字体(7) 保存结果前言 本文主要解决的内容,就是为一个docx的不同章节段落设置不同的字体,因为…

【Week-G1】调用官方GAN实现MNIST数字识别,Pytorch框架

文章目录 1. 准备数据1.1 配置超参数1.2 下载数据1.3 配置数据 2. 创建模型2.1 定义鉴别器2.2 定义生成器 3. 训练模型3.1 创建实例3.2 开始训练3.3 保存模型 4. 什么是GAN&#xff08;对抗生成网络&#xff09;? &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学…

追求准确,还是追求举一反三,聊天机器人智能程度的困境 | Chatopera

在为企业客户上线聊天机器人客服的过程中&#xff0c;总会遇到一个问题&#xff0c;这让用户和我们都感到纠结。 到底是追求让机器人能准确的回答问题&#xff0c;还是让机器人可以举一反三的回答问题。 准确的回答问题&#xff0c;就是不容许回答错了&#xff0c;但是这样机…

windows中使用anaconda管理python版本

anaconda下载 python的版本问题实在是很大,版本低了高了都会影响脚本的执行,anaconda工具为此而生,不管是在windows下还是linux下,Anaconda的命令跟操作逻辑都是相同的,窥一斑而知全豹,本文在windows下示例如何使用anaconda anaconda的逻辑就是 他是一个全局的管理者,能创建工…

在Ubuntu中使用ROS搭建PX4 Gazebo 模拟飞行 四旋翼 固定翼

综合了网上很多教程以及踩了很多坑总结下来的教程 Ubuntu安装 此处不在详细说明&#xff0c;网上可随处搜到 ROS安装 感谢鱼香ROS大佬提供一键安装脚本 wget http://fishros.com/install -O fishros && sudo bash fishros 接下来按顺序按 1 1 2 3 1 再次运行 w…

红酒哲学:品味流转时光,探寻生活之深邃奥秘

在繁华的都市中&#xff0c;我们时常被各种声音和色彩所包围&#xff0c;追求着速度与激情。然而&#xff0c;在这喧嚣之中&#xff0c;总有那么一刻&#xff0c;我们渴望静下心来&#xff0c;品味一份不同的宁静与深度。这时&#xff0c;一杯雷盛红酒便成了我们与内心对话的桥…

太赞了!SD AI绘画,热门青衫映雪写真制作,一键出片,轻松复刻!【内含相关模型及ComfyUI工作流】

hello&#xff0c;大家好我是安琪&#xff01; 今天安琪给大家带来了一篇关于写真制作&#xff0c;我通过SD WebUI进行本次青衫映雪主题的写真制作。(相关内容文末可自行扫描获取) 准备工作&#xff1a; 1.大模型准备真人写实大模型&#xff0c;我这里使用了TQing v3.4 2.…