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

目录

Cumulative Gain

Target Transformation


Cumulative Gain

如果采用与累积效应曲线完全相同的逻辑,但将每个点乘以累积样本 Ncum/N,就会得到累积增益曲线。现在,即使曲线的起点具有最高的效果(对于一个好的模型来说),它也会因为相对规模较小而缩小。看一下代码,变化在于我现在每次迭代都会将效果乘以(行/大小)。此外,我还可以选择按 ATE 对曲线进行归一化处理,这就是为什么我还要在每次迭代时从效果中减去归一化处理的原因:

def cumulative_gain_curve(df, prediction, y, t,
 ascending=False, normalize=False, steps=100):
 
 effect_fn = effect(t=t, y=y)
 normalizer = effect_fn(df) if normalize else 0
 
 size = len(df)
 ordered_df = (df
 .sort_values(prediction, ascending=ascending)
 .reset_index(drop=True))
 
 steps = np.linspace(size/steps, size, steps).round(0)
 effects = [(effect_fn(ordered_df.query(f"index<={row}"))
 -normalizer)*(row/size)
 for row in steps]
 return np.array([0] + effects)
 
 cumulative_gain_curve(test_pred, "cate_pred", "sales", "discounts")

如果您不想费心实现所有这些函数,可以使用Python库为您处理这些问题。您可以简单地从fklearn因果模块中导入所有曲线及其AUC

from fklearn.causal.validation.auc import *
from fklearn.causal.validation.curves import *

三种模型的累积增益和归一化累积增益如下图所示。在这里,CATE 排序较好的模型是曲线与代表 ATE 的虚线之间面积最大的模型:要将模型性能总结为一个数字,只需将归一化累积增益曲线上的数值相加即可。就 CATE 排序而言,数值最大的模型将是最佳模型。下面是您目前评估的三个模型的曲线下面积(AUC)。请注意,ML 模型的面积为负值,因为它对 CATE 进行了反向排序:

AUC for rand_m_pred: 6.0745233598544495
AUC for ml_pred: -45.44063124684
AUC for cate_pred: 181.74573239200615

同样,您可以将模型的性能浓缩为一个数字,这一点也非常了不起,因为它可以自动选择模型。不过,虽然我很喜欢最后这条曲线,但在使用时还是需要注意一些问题。首先,在你看到的所有曲线中,重要的是要记住曲线中的每个点都是一个估计值,而不是地面真实值。它是对某一特定群体--有时是非常小的群体--的回归斜率的估计值。既然是回归估计值,它就取决于 T 和 Y 之间的关系是否正确。即使是随机化,如果治疗与干预结果之间的关系是一个对数函数,那么将效果估计为一条直线就会得出错误的结果。如果知道干预反应函数的形状,就可以将效应函数调整为 y~log(t) 的斜率,而不是 y~t。但要做到这一点,您需要知道正确的形状。

其次,这些曲线并不真正关心你是否正确地计算了 CATE。它们只关心排序是否正确。例如,如果您将任何一个模型的预测值减去-1,000,它们的累积增益曲线将保持不变。因此,即使您对 CATE 的估计存在偏差,这种偏差也不会在这些曲线中显示出来。现在,如果您只关心干预的优先次序,这可能不是问题。在这种情况下,排序就足够了。但是,如果您关心的是如何精确估算 CATE,那么这些曲线可能会误导您。如果您有数据科学背景,您可以将累积增益曲线与 ROC 曲线相提并论。同样,具有良好 ROC-AUC 的模型并不一定经过校准。

第三,或许也是最重要的一点,上述所有方法都需要无偏差数据。如果存在任何偏差,你对分组或 ATE 的效果估计都将是错误的。如果干预不是随机的,从理论上讲,你仍然可以使用这些评估技术,前提是你之前通过使用 IPW 的正交化等方法对数据进行了去偏差处理。不过,我对此有点怀疑。相反,我强烈建议你投资一些实验数据,哪怕只是一点点,只用于评估目的。这样,您就可以专注于效应异质性,而不必担心混杂因素的悄然出现。

因果模型评估是一个仍在发展中的研究领域。因此,它仍有许多盲点。例如,目前展示的曲线只能告诉您一个模型在 CATE 排序方面有多好。我还没有找到一个很好的解决方案来检查您的模型是否能正确预测 CATE。我喜欢做的一件事是在使用累积增益曲线的同时使用量子效应曲线图,因为前者能让我了解模型的校准程度,后者能让我了解模型对 CATE 的排序情况。至于归一化累积增益,它只是一个使可视化更容易的放大图。但我承认这并不理想。如果你正在寻找像 R2 或 MSE 这样的总结性指标--它们都是预测模型中常用的指标--我很遗憾地告诉你,在因果建模领域我还没有找到与它们类似的指标。不过,我还是找到了目标转换。

Target Transformation

事实证明,即使无法观察到真实的干预效果 \tau(x_i),也可以创建一个目标变量来近似预期效果
Y_i^\star=\frac{\left(Y_i-\hat{\mu}_y(X_i)\right)(T_i-\hat{\mu}_t(X_i))}{(T_i-\hat{\mu}_t(X_i))^2}=\frac{Y_i-\hat{\mu}_y(X_i)}{T_i-\hat{\mu}_t(X_i)}
其中,μy 是干预结果的模型,μt 是治疗的模型。这个目标很有意思,因为 E[Y_i^\star]=\tau_i . 请注意,它看起来很像回归系数的计算公式,分子是 Y 与 T 之间的协方差,分母是 T 的方差。不过,它不是用期望值来定义的,而是在单位水平上计算的。
由于该目标近似于真实干预效果,您可以用它来计算偏差指标,如均方误差 (MSE)。如果您的 CATE 模型在预测个体水平效应 \tau_{i} 方面表现良好,那么相对于该目标,其预测的 MSE 应该很小。
但有一个问题。当接近干预平均值时,该目标的噪声会非常大,分母会趋向于零。要解决这个问题,可以对 T_i-\hat{\mu}_t(X_i) 较小的点进行加权,使其重要性降低。例如,您可以通过 (T_i-\hat{\mu}_t(X_i))^2 对单位进行加权
要对此目标进行编码,您可以简单地划分结果和治疗模型的残差:
 X = ["C(month)", "C(weekday)", "is_holiday", "competitors_price"]
 y_res = smf.ols(f"sales ~ {'+'.join(X)}", data=test).fit().resid
 t_res = smf.ols(f"discounts ~ {'+'.join(X)}", data=test).fit().resid
 tau_hat = y_res/t_res

接下来,您可以使用它来计算所有模型的MSE。注意我也如何使用前面讨论的权重:

 from sklearn.metrics import mean_squared_error
 for m in ["rand_m_pred", "ml_pred", "cate_pred"]:
 wmse = mean_squared_error(tau_hat, test_pred[m],
 sample_weight=t_res**2)
 print(f"MSE for {m}:", wmse)

根据这个加权MSE,再次,用于估计CATE的回归模型比其他两个表现更好。还有,这里还有一些有趣的东西。ML模型的性能比随机模型要差。这并不奇怪,因为ML模型试图预测Y,而不是τi。

只有当效应与结果相关时,预测 Y 才能很好地对 τi 进行排序或预测。这种情况一般不会发生,但在某些情况下可能会发生。其中有些情况在商业中相当常见,因此值得一探究竟。

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

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

相关文章

vue 实现 word/excel/ppt/pdf 等文件格式预览操作

效果图&#xff1a; 问题描述&#xff1a;一般情况下使用iframe标签就可以实现文件预览&#xff0c;但是这个标签只针对于ppt和pdf是有效的。对于doc文件就需要借助第三方插件&#xff08;vue-office/docx&#xff09;来实现预览了。下面介绍使用方法。 安装插件&#xff1a;n…

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }

C语言 | Leetcode C语言题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; //计算的过程函数&#xff0c;我没重点讲&#xff0c;很简单看一下代码就好了 int getSum(int n) {int sum 0;while (n) {sum (n % 10) * (n % 10);n / 10;}return sum; }bool isHappy(int n){int sum getSum(n);int hash[820] {0};whi…

数字时代的文化革命:Facebook的社会影响

随着数字技术的飞速发展和互联网的普及&#xff0c;社交网络如今已成为人们日常生活中不可或缺的一部分。在众多社交平台中&#xff0c;Facebook作为最大的社交网络之一&#xff0c;不仅连接了全球数十亿用户&#xff0c;更深刻影响了人们的社会互动方式、文化认同和信息传播模…

BFS:队列+树的宽搜

一、二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 该题的层序遍历和以往不同的是需要一层一层去遍历&#xff0c;每一次while循环都要知道在队列中节点的个数&#xff0c;然后用一个for循环将该层节点走完了再走下一层 class Solution { public:vector<vec…

JeeSite中的数据库表动态建模与管理模块(DBM)

一、引言 在现代软件开发中&#xff0c;数据库作为系统数据存储和管理的核心&#xff0c;其设计和维护的灵活性、可扩展性对于系统的长期稳定运行至关重要。JeeSite作为一款流行的企业级快速开发平台&#xff0c;其数据库表动态管理模块&#xff08;DBM&#xff09;提供了强大…

LeetCode 585, 438, 98

目录 585. 2016年的投资题目链接表要求知识点思路代码 438. 找到字符串中所有字母异位词题目链接标签思路代码 98. 验证二叉搜索树题目链接标签合法区间思路代码 中序遍历思路代码 585. 2016年的投资 题目链接 585. 2016年的投资 表 表Insurance的字段为pid、tiv_2015、tiv…

C++ | Leetcode C++题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution { public:int ProductSum(int n){int sum 0;while(n){int temp n % 10;sum temp*temp;n / 10;}return sum;}bool isHappy(int n) {int slow n,fast n;// 快慢指针&#xff0c;找环的相遇位置do{slow ProductSum(slow)…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维…

Unity热更方案 YooAsset+HybridCLR,纯c#开发热更,保姆级教程,从零开始

文章预览&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

通达信机构买卖抓牛指标公式源码

通达信机构买卖抓牛指标公式源码&#xff1a; X_1:V/CLOSE/2; X_2:SUM(IF(X_1>100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_3:SUM(IF(X_1>100 AND CLOSE<REF(CLOSE,1),X_1,0),0); X_4:SUM(IF(X_1<100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_5:SUM(IF(X_1&l…

用英文介绍巴黎:Paris, France‘s MEGACITY Europe‘s Largest City

Paris, France’s MEGACITY: Europe’s Largest City Link: https://www.youtube.com/watch?vbdObzSwVAw4&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index22 Paris, France is the grand megacity of Europe at the forefront of human progress. Summary Summary …

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序&#xff0c;可以帮助我们做很多的重复的工作&#xff0c;可以创建工作流&#xff0c; 可以录制并回放操作&#xff0c; 还可以帮助我们创建自定的应用程序&#xff0c;下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

vue的ESLint 4格缩进 笔记

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一&#xff0c;代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…

【秋招刷题打卡】Day03-二分系列之-二分答案

Day03-二分系列之-二分答案 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;…

React 服务器渲染 Suspense 组件

React 服务器渲染支持 Suspense 组件&#xff0c;Suspense 在子组件未加载成功时会显示 fallback 组件。服务器渲染的时候&#xff0c;React 如何处理 Suspense 组件的呢&#xff1f;由于 Suspense 不同状态下&#xff0c;显示的内容不同&#xff0c;客户端展示时需要区分状态&…

GuLi商城-商品服务-API-三级分类-删除-页面效果

一步步学习Vue太慢了&#xff0c;准备跳过前端的学习&#xff0c;直接使用前端完整的项目 下载依赖npm install&#xff0c;会报错&#xff0c;排查了好久 我安装的是Node14&#xff0c;所以必须要安装4.14 Vscode终端输入&#xff1a;npm install node-sass4.14 输入&#x…

js异常处理方案

文章目录 异常处理方案同步代码的异常处理Promise 的异常处理async await 的异常处理 感谢阅读&#xff0c;觉得有帮助可以点点关注点点赞&#xff0c;谢谢&#xff01; 异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。…

一站式uniapp优质源码项目模版交易平台的崛起与影响

一、引言 随着信息技术的飞速发展&#xff0c;软件源码已成为推动行业进步的重要力量。源码的获取、交易和流通&#xff0c;对于开发者、企业以及项目团队而言&#xff0c;具有极其重要的意义。为满足市场对高质量源码资源的迫切需求&#xff0c;一站式uniapp优质源码项目模版…

深度学习实验第T1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 目录 一、前言 二、我的环境 三、…