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

2024-06-23 11:44

本文主要是介绍【因果推断python】51_去偏/正交机器学习3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

What is Non-Parametric About?


What is Non-Parametric About?

在我们继续之前,我只想强调一个常见的误解。当我们考虑使用非参数 Double-ML 模型来估计 CATE 时,我们似乎会得到一个非线性治疗效果。例如,让我们假设一个非常简单的数据生成过程(DGP),其中 discont 对销售额的影响是非线性的,但却是通过平方根函数产生的。

Sales_i=20+10*\sqrt{Discount_i}+e_i
治疗效果由该销售函数相对于治疗的导数给出。

 \frac{\partial Sales_i}{\partial Discount_i}=\frac{10}{2\sqrt{Discount_i}}

我们可以看到,治疗效果不是线性的。实际上,治疗效果会随着治疗次数的增加而减弱。这对 DGP 有很大的意义。起初,一点点折扣会使销售额大幅增加。但是,当我们给予的折扣太多时,多一个单位的折扣对销售额的影响就会越来越小,因为人们不会想买到无穷多。因此,折扣只在人们满足之前有效。

那么问题来了,非参数 ML 能否捕捉到治疗效果中的这种饱和行为?它能否从较小的折扣水平推断出,如果折扣更高,治疗效果会更低?答案是......可以这么说。为了更好地理解这一点,让我们生成类似上述 DGP 的数据。

np.random.seed(321)
n=5000
discount = np.random.gamma(2,10, n).reshape(-1,1)
discount.sort(axis=0) # for better ploting
sales = np.random.normal(20+10*np.sqrt(discount), 1)

如果我们绘制这个 DGP,就可以看到这些变量之间的平方根关系。

plt.plot(discount, 20 + 10*np.sqrt(discount))
plt.ylabel("Sales")
plt.xlabel("Discount");

现在,让我们对这些数据应用非参数双重/偏差 ML。

debias_m = LGBMRegressor(max_depth=3)
denoise_m = LGBMRegressor(max_depth=3)# orthogonalising step
discount_res =  discount.ravel() - cross_val_predict(debias_m, np.ones(discount.shape), discount.ravel(), cv=5)
sales_res =  sales.ravel() - cross_val_predict(denoise_m, np.ones(sales.shape), sales.ravel(), cv=5)# final, non parametric causal model
non_param = LGBMRegressor(max_depth=3)
w = discount_res ** 2 
y_star = sales_res / discount_resnon_param.fit(X=discount_res.reshape(-1,1), y=y_star.ravel(), sample_weight=w.ravel());

通过上述模型,我们可以得到 CATE 估计值。这里的问题是 CATE 不是线性的。随着治疗次数的增加,CATE 应该减少。我们要回答的问题是,非参数模型能否捕捉到这种非线性。

要正确回答这个问题,让我们记住双重/偏差 ML 对数据生成过程的基本假设是什么。这些假设可以从我们之前列出的等式中看出。

\tilde{Y}_i=\tau(X_i)\tilde{T}_i+e_i

也就是说,残差结果等于残差治疗乘以条件治疗效果。这意味着治疗对结果的影响是线性的。这里不存在非线性。上述模型表明, 如果我们将治疗从 1 增加到 10 或从 100 增加到 110, outcome将提高一个固定的 \tau(X_i)。这是一个简单的乘法。

那么,这是否意味着非参数模型无法捕捉治疗效果的非线性呢?也不尽然... 相反,Double/ML 找到了非线性 CATE 的局部线性近似值。换句话说,它找到的是在治疗水平上或治疗周围,结果相对于治疗的导数这相当于找到与治疗点上的结果函数相切的线的斜率。

这意味着,是的,非参数双 ML 会发现随着治疗量的增加,治疗效果会变小。但是,不,它不会发现非线性治疗效果,而是局部线性治疗效果。我们甚至可以将这些线性近似值与地面真实的非线性因果效应进行对比,事实上,它们是很好的近似值。

cate = non_param.predict(X=discount)plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
plt.scatter(discount, sales)
plt.plot(discount, 20 + 10*np.sqrt(discount), label="Ground Truth", c="C1")
plt.title("Sales by Discount")
plt.xlabel("Discount")
plt.legend()plt.subplot(1,2,2)
plt.scatter(discount, cate, label="$\hat{\\tau}(x)$", c="C4")
plt.plot(discount, 5/np.sqrt(discount), label="Ground Truth", c="C2")
plt.title("CATE ($\partial$Sales) by Discount")
plt.xlabel("Discount")
plt.legend();

这听起来像是技术性问题,但却有非常实际的意义。例如,假设您在上面的例子中发现对某位顾客的处理效应为 2,这意味着如果您将折扣提高 1 个单位,您对该顾客的销售额就会增加 2 个单位。看到这个结果,你可能会想:"太好了!我会给这个单位很多折扣!毕竟,每增加 1 个单位的折扣,我就能获得 2 个单位的销售额"。然而,这是错误的结论。只有在这个折扣水平上,治疗效果才是 2。只要提高折扣,效果就会下降。例如,假设这位顾客只获得了 5 折,所以她的治疗效果很高。如果你看到了这个巨大的治疗效果,并以此为理由给这位顾客 20 折。但是,当你这样做时,效果可能会从 2 降到 0.5 左右。在治疗效果为 2 时,打 20 折是合理的,但在治疗效果为 0.5 时,打 20 折就不再有利可图了。

这意味着,在将非线性治疗效果推断到新的治疗水平时,您必须格外小心。否则,你最终可能会做出非常无利可图的决定。另一种说法是,当治疗效果不是线性的时候,即使是非参数的双重/偏差-ML 也很难做出反事实结果预测。它会试图将治疗效果(TE)从低治疗水平线性推断到高治疗水平,或反过来推断。由于非线性,这种推断很可能会出现偏差。

为了解决这个问题,有一个最终的想法。请记住,与我们之前看到的方法相比,这个方法的科学性要低得多。它可以归结为在应用正交化程序后使用 S-学习器,但我说得太快了。让我们接下来看看。

这篇关于【因果推断python】51_去偏/正交机器学习3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087066

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数