【因果推断python】50_去偏/正交机器学习2

目录

Frisch-Waugh-Lovell on Steroids

CATE Estimation with Double-ML


Frisch-Waugh-Lovell on Steroids

双重/偏差 ML 其思想非常简单:在构建结果和治疗残差时使用 ML 模型:

Y_i-\hat{M}_y(X_i)=\tau\cdot(T_i-\hat{M}_t(X_i))+\epsilon

\hat{M}_y(X_i)是估计E[Y|X]\hat{M}_t(X_i)是估计E[T|X]

我们的想法是,ML 模型具有超强的灵活性,因此在估计 Y和 T残差,同时仍然保持 FWL 风格的正交化。这意味着我们不必对协变量 X与结果 Y或协变因素与治疗之间的关系作出任何参数假设,以获得正确的治疗效果。只要没有未观察到的混杂因素,我们就可以通过以下正交化程序计算ATE:

1.估计结果 Y 使用特征 X, 使用灵活的 ML 回归模型 M_{y}
2.估计治疗 T 利用特征 X,使用灵活的 ML 回归模型M_{t}
3.获取残差 \tilde{Y}=Y-M_y(X)\tilde{T}=T-M_t(X)
4. 将结果的残差与处理的残差进行回归 \tilde{Y}=\alpha+\tau\tilde{T}

\tau就是ATE,我们可以用 OLS 对其进行估计。ML 的强大之处在于灵活性。ML 功能强大,可以捕捉干扰关系中复杂的函数形式。但这种灵活性也带来了麻烦,因为这意味着我们现在必须考虑过度拟合的可能性。

Chernozhukov 等人(2016 年)对过度拟合如何造成问题进行了更深入、更严谨的解释,我强烈建议您去看看。但在这里,我将基于直觉进行解释。

要了解这个问题,假设您的 M_{y} 模型正在过度拟合。其结果是残差 Y 将小于其应有的值。这也意味着 M_{y} 所捕捉的不仅仅是 X 和 Y 之间的关系,其中还有一部分是 T 和 Y 之间的关系,如果 M_{y} 捕捉到了其中的一部分,那么残差回归将偏向于零。换句话说、 M_{y} 正在捕捉因果关系,而不是将其留给最终的残差回归。

现在来看看过度拟合 M 的问题,注意它对 T 方差的解释将超过它应该解释的方差。因此,T残差的方差会小于其应有的方差。如果处理的方差较小,最终估计值的方差就会很大。这就好比几乎每个人的待遇都是一样的。如果每个人的治疗水平都相同,那么就很难估计不同治疗水平下的情况。另外,当 T是 X 的确定性函数时,也会出现这种情况,这意味着违反了positivity 。

这些就是我们在使用 ML 模型时遇到的问题,但我们如何才能纠正这些问题呢?答案就在于我们所说的交叉预测和折外残差。

我们将把数据分成大小相等的 K 部分。然后,对于每个 K 部分,我们将在所有其他 K-1 个样本上估计 ML 模型,并得出 K 部分的残差。请注意,这些残差是通过折外预测得出的。我们在一部分数据上拟合模型,但在另一部分数据上进行预测和计算残差。

因此,即使模型拟合过度,也不会人为地将残差推向零。最后,我们综合所有 K 部分的预测结果,估计出最终的因果模型 \tilde{Y}=\alpha+\tau\tilde{T}.

好了,我们已经讲了很多,如果不举例说明,可能很难跟上。为了配合这些理论,让我们一步一步来实现双重/偏差 ML。在此过程中,我将借此机会解释每个步骤的作用。

首先,让我们使用 ML 模型来估计干扰关系。我们将使用一个 LGBM 模型,根据协变量温度、工作日和成本来预测价格。这些预测将是交叉预测,我们可以使用 sklearn 的 cross_val_predict 函数来获得。我还将平均 \hat{\mu}_{t} 以实现可视化。

from lightgbm import LGBMRegressor
from sklearn.model_selection import cross_val_predict

y = "sales"
T = "price"
X = ["temp", "weekday", "cost"]

debias_m = LGBMRegressor(max_depth=3)

train_pred = train.assign(price_res =  train[T] -
                          cross_val_predict(debias_m, train[X], train[T], cv=5)
                          + train[T].mean()) # add mu_t for visualization. 

请注意,我把 M_{t} 模型称为debias 模型。这是因为该模型在 Double/Debias ML 中扮演的角色是使治疗去偏。残差 \tilde{T}=T-M_t(X) 可以看作是治疗的一个版本,在这个版本中模型已经消除了 X 带来的所有混杂偏差。换句话说,\tilde{T} 与 X 是正交的。因为它已经被 X 解释过了

为了说明这一点,我们可以展示我们之前看到的同一幅图,但现在用价格残差代替了价格。还记得之前周末的价格更高吗?现在,这种偏差消失了。所有工作日的价格残差分布都是一样的。

np.random.seed(123)
sns.scatterplot(data=train_pred.sample(1000), x="price_res", y="sales", hue="weekday");

M_{t} 的作用是消除T 的偏差,但 M_{y} 又是什么呢?它的作用是去除 Y 的方差。直观地说,M_{y} 创造了一个outcome版本,在这个版本中,由 X 引起的所有方差都被解释掉了。这样一来,对 \tilde{Y} 的因果关系进行估计就变得更容易了。 由于噪音较小,因果关系变得更容易看清。

np.random.seed(123)
sns.scatterplot(data=train_pred.sample(1000), x="price_res", y="sales_res", hue="weekday");

现在,我们不难看出价格与销售额之间的负相关关系。

最后,为了估计这种因果关系,我们可以对残差进行回归。

final_model = smf.ols(formula='sales_res ~ price_res', data=train_pred).fit()
final_model.summary().tables[1]

我们可以看到,当我们使用销售额和价格的残差或正交化版本时,我们可以非常确信价格和销售额之间的关系是负的,这非常有意义。当我们提高价格时,冰淇淋的需求量就会下降。

但是,如果我们看一下价格与销量之间的未重构关系或原始关系,由于存在偏差,我们会发现两者之间存在正相关关系。这是因为,在预期高销售量的情况下,价格会提高。

final_model = smf.ols(formula='sales ~ price', data=train_pred).fit()
final_model.summary().tables[1]

CATE Estimation with Double-ML

到目前为止,我们已经了解了双重/偏差 ML 如何让我们专注于估计平均治疗效果 (ATE),但它也可用于估计治疗效果异质性或条件平均治疗效果 (CATE)。从本质上讲,我们现在说的因果参数\tau 
 会随单位协变量的变化而变化。

Y_i-M_y(X_i)=\tau(X_i)\cdot(T_i-M_t(X_i))+\epsilon_i
为了估计这一模型,我们将使用相同的价格和销售额残差,但现在我们将价格残差与其他协变量进行交互。然后,我们可以拟合一个线性 CATE 模型。

\tilde{Y}_{i}=\alpha+\beta_{1}\tilde{T}_{i}+\boldsymbol{\beta}_{2}\boldsymbol{X}_{​{\boldsymbol{i}}}\tilde{T}_{i}+\epsilon_{i}
估算出这样一个模型后,为了进行 CATE 预测,我们将使用随机测试集。由于这个最终模型是线性的,因此我们可以机械地计算 CATE, M是我们最终的模型。

\hat{\mu}(\partial Sales_i,X_i)=M(Price=1,X_i)-M(Price=0,X_i)

final_model_cate = smf.ols(formula='sales_res ~ price_res * (temp + C(weekday) + cost)', data=train_pred).fit()

cate_test = test.assign(cate=final_model_cate.predict(test.assign(price_res=1))
                        - final_model_cate.predict(test.assign(price_res=0)))

为了检验该模型在区分价格敏感度高的单位和价格敏感度低的单位方面的效果如何,我们将使用累积弹性曲线。

gain_curve_test = cumulative_gain(cate_test, "cate", y=y, t=T)
plt.plot(gain_curve_test, color="C0", label="Test")
plt.plot([0, 100], [0, elast(test, y, T)], linestyle="--", color="black", label="Baseline")
plt.legend();
plt.title("R-Learner");

从上面的曲线可以看出,使用最终线性模型的双重/偏差 ML 程序已经非常好了。但是,也许我们可以做得更好。事实上,这是一个非常通用的程序,我们可以把它理解为元学习器。聂和瓦格将其称为 R 学习器,以此来认可罗宾逊(1988 年)的研究成果,并强调残差化的作用。

这种概括来自于我们意识到双重/偏差 ML 程序定义了一个新的损失函数,我们可以任意最小化这个函数。接下来,我们将看到如何以一种与之前讨论目标变换方法时非常相似的方式来做到这一点。

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

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

相关文章

【RK3588/算能/Nvidia智能盒子】AI算法应用于中国生物疫苗生产过程智能监测,赋能生产安全,提升品质管控

因操作失误导致食品药品质量事故频发 计算机视觉检测技术为监管提供新思路 近年来,各类因人员操作失误导致的食品药品质量事故不断发生。例如有员工取出原材料及称重确认时未进行双人复核导致“混药”、员工未能按照生产步骤对生牛奶进行杀菌导致奶酪污染、员工误将…

webpack5入门,根据官方文档简单学习,简单总结

c.**loader加载器:**webpack 只能理解 JS文件和 JSON 文件,loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。(比如css,less&…

人人讲视频如何下载

一、工具准备 1.VLC media player 2.谷歌浏览器 二、视频下载 1.打开人人讲网页,需要下载的视频 谷歌浏览器打开调试窗口 搜索m3u8链接 拷贝到VLCplayer打开网络串流方式打开测试是否能正常播放 2.下载视频 能正常播放后,切换播放为转换选择mp4格式…

分享excel全套教程速成,高效人士的Excel必修课,附视频课程!

我是阿星。今天,我要来聊聊那些让Excel变得像魔法一样的课程,它们能让你们在办公室里像超人一样高效。别急,听我慢慢道来。 首先,得说说这些课程,它们都是mp4格式,就像电影一样,但比电影实用多…

Python一文轻松搞定正则匹配

一、前言 日常工作中,不可避免需要进行文件及内容的查找,替换操作,python的正则匹配无疑是专门针对改场景而出现的,灵活地运用可以极大地提高效率,下图是本文内容概览。 ​ 二、正则表达式符号 对于所有的正则匹配表达…

强化学习中的自我博弈(self-play)

自我博弈(Self-Play)[1]是应用于智能体于智能体之间处于对抗关系的训练方法,这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升,使得整个对抗系统…

动态规划02(Leetcode62、63、343、96)

参考资料: https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移…

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源(哪些可以作为时钟信号) 2.1 HSE时钟 2.1.1 高速外部时钟信号(HSE)来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟(哪些系统使用时…

html做一个分组散点图图的软件

在HTML中创建一个分组散点图,可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能,易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例: 要添加文件上传功能,可以让用户上传包含数据的文…

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…

matlab入门基础笔记

1、绘制简单三角函数: 绘制正弦曲线和余弦曲线。x[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); (1)明确x轴与y轴变量: 要求为绘制三角函数: X轴:角度对应的弧度数组 Y轴:对应sin(x)的值 求…

python pynput实现鼠标点击两坐标生成截图

脚本主要实现以下功能: 按ctrl开始截图,点击两个坐标,保存截图tk输出截图文本信息,文本输出内容倒序处理默认命名为A0自增。支持自定义名称,自增编号,修改自定义名称自增重新计算清空文本框内容 from pyn…

C++ (week8):数据库

文章目录 一、数据库简介1.数据库2.MySQL(1)数据库的结构(2)MySQL的三种使用方式(3)命令行(4)Navicat Premium 二、SQL1.SQL (Structured Query Language),即结构化查询语言2.数据定义语言 DDL (Data Definition Language) ,创建、修改、删除数据库、表结…

Leetcode3184. 构成整天的下标对数目 I

Every day a Leetcode 题目来源&#xff1a;3184. 构成整天的下标对数目 I 解法1&#xff1a;遍历 统计满足 i < j 且 hours[i] hours[j] 构成整天的下标对 i, j 的数目。 构成整天的条件&#xff1a;(hours[i] hours[j]) % 24 0。 代码&#xff1a; /** lc applee…

20分钟攻破DISCUZ论坛并盗取数据库(web安全白帽子)

20分钟攻破DISCUZ论坛并盗取数据库&#xff08;web安全白帽子&#xff09; 1 快速搭建discuz论坛1.1 攻击思路1.2 快速搭建实验环境1.2.1&#xff0c;漏洞概述1.2.2&#xff0c;在centos7虚拟机上搭建LAMP环境1.2.3&#xff0c;上传到discuz_X2_SC_UTF8.zip 到Linux系统/root下…

JAVA大型医院绩效考核系统源码:​医院绩效考核实施的难点痛点

JAVA大型医院绩效考核系统源码&#xff1a;​医院绩效考核实施的难点痛点 绩效考核数字化综合管理系统是一个基于数字化技术的管理平台&#xff0c;用于帮助企业、机构等组织进行绩效考评的各个环节的管理和处理。它将绩效考评的各个环节集成到一个系统中&#xff0c;包括目标…

RTA_OS基础功能讲解 2.10-调度表

RTA_OS基础功能讲解 2.10-调度表 文章目录 RTA_OS基础功能讲解 2.10-调度表一、调度表简介二、调度表配置2.1 同步三、到期点配置四、启动调度表4.1 绝对启动4.2 相对启动4.3 同步启动五、到期点处理六、停止调度表6.1 重新启动被停止的调度表七、切换调度表八、选择同步策略8.…

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…

一颗B+树可以存储多少数据?

一、前言 这个问题&#xff0c;非常经典&#xff0c;考察的点很多&#xff1a; 比如&#xff1a; 1、操作系统存储的单元&#xff0c;毕竟mysql也是运行在操作系统之上的应用。 2、B树是针对Mysql的InnoDB存储引擎&#xff0c;所以要理解InnoDb的最小存储单元&#xff0c;页&…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…