因果推断(三):causalml的使用(1)_元学习器的使用

元学习器是利用一些现成的机器学习方法来进行因果推断的方法。也是相对来说最简单的进行因果推断的模型,在econml和causalml都有实现,调用也相对比较方便。

1.1. S_Learner

S 指的是 single,在S_Learner中,只需要训练一个机器学习模型,训练时把干预变量作为一个特征来预测结果,然后在不同的方案下做出预测,实验组和对照组的预测差异就是估计的CATE
优点:简单,易用
缺点:它倾向于把干预效果趋向于0,即真正的因果效应通常比估计的更大。
模型如下:
X是特征,T是干预变量,M可以是任意机器学习模型。
在这里插入图片描述
causalml调用S_learner

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from xgboost import XGBRegressor

from causalml.inference.meta import LRSRegressor
from causalml.inference.meta import XGBTRegressor, MLPTRegressor, XGBRRegressor
from causalml.inference.meta import BaseXRegressor, BaseRRegressor, BaseSRegressor, BaseTRegressor
from causalml.match import NearestNeighborMatch, MatchOptimizer, create_table_one
from causalml.propensity import ElasticNetPropensityModel
from causalml.dataset import *
from causalml.metrics import *

import warnings
warnings.filterwarnings('ignore')

# synthetic_data,是causalml.dataset内置的模拟数据函数,提供了4种mode,可生成4种数据
y, X, treatment, tau, b, e = synthetic_data(mode=1, n=1000, p=8, sigma=1.0)
# e:倾向性得分, treatment:干预变量(离散,二分)
print(y.shape, X.shape, treatment.shape, "\n", pd.Series(treatment).value_counts())

learner_s = LRSRegressor()   # 线性回归
ate_s = learner_s.estimate_ate(X=X, treatment=treatment, y=y)

print(ate_s)
print('ATE estimate: {:.03f}'.format(ate_s[0][0]))
print('ATE lower bound: {:.03f}'.format(ate_s[1][0]))
print('ATE upper bound: {:.03f}'.format(ate_s[2][0]))

# output
(1000,) (1000, 8) (1000,) 
 1    550
0    450
dtype: int64
(array([0.76908845]), array([0.62108639]), array([0.91709051]))
ATE estimate: 0.769
ATE lower bound: 0.621
ATE upper bound: 0.917

其他参数:
p: 倾向性得分。
pretrain: (默认为False), 表示是否跳过训练。

ate_s = learner_s.estimate_ate(X=X, treatment=treatment, y=y)
print(ate_s)
print('ATE estimate: {:.03f}'.format(ate_s[0][0]))
print('ATE lower bound: {:.03f}'.format(ate_s[1][0]))
print('ATE upper bound: {:.03f}'.format(ate_s[2][0]))


# pretrain=True 表示跳过训练
ate_s = learner_s.estimate_ate(X=X, treatment=treatment, y=y, pretrain=True)
print(ate_s)
print('ATE estimate: {:.03f}'.format(ate_s[0][0]))
print('ATE lower bound: {:.03f}'.format(ate_s[1][0]))
print('ATE upper bound: {:.03f}'.format(ate_s[2][0]))

# output(两次估计结果一样)
(array([0.61557233]), array([0.46094647]), array([0.7701982]))
ATE estimate: 0.616
ATE lower bound: 0.461
ATE upper bound: 0.770
(array([0.61557233]), array([0.46094647]), array([0.7701982]))
ATE estimate: 0.616
ATE lower bound: 0.461
ATE upper bound: 0.770

1.2. T_Learner

T指的是Two,在T_Learner中,通过干预变量对样本进行拆分,需要训练两个模型。
优点:避免了干预效果较弱的干预变脸被剔除模型的问题
缺点:存在过拟合问题,因为拟合的数据被分为了两个子集,数据点少了。
在这里插入图片描述
causalml调用T_learner

learner_t = XGBTRegressor()
ate_t = learner_t.estimate_ate(X=X, treatment=treatment, y=y)
print(ate_t)

learner_t = BaseTRegressor(learner=XGBRegressor())
ate_t = learner_t.estimate_ate(X=X, treatment=treatment, y=y)
print(ate_t)

# output
(array([0.68477325]), array([0.61274193]), array([0.75680456]))
(array([0.68477325]), array([0.61274193]), array([0.75680456]))

causalml提供了两种方式调用各种元学器,一个是直接实例化机器学习模型对应的元学习器,例如:XGBTRegressor();另一个是先实例化BaseTRegressor,然后再learner中指定需要的机器学习模型。从前面代码可以看到,估计的ATE是一样的。
其他参数
bootstrap_ci=False : 是否返回效应区间
n_bootstraps=1000, bootstrap_size=1000 : 效应区间是通过 bootstrap方法得到的,这两个是相关参数
其中,BaseTRegressor还可以指定两次建模用不同的指定机器学习模型,如果直接指定learner = XX,那么两次建模都会用同一个模型

learner_t = BaseTRegressor(
    control_learner = XGBRegressor(),
    treatment_learner = LinearRegression(),
    ate_alpha = 0.05, # 信效度
    control_name = 0  # 控制组是哪一类
)

ate_t = learner_t.estimate_ate(X=X, treatment=treatment, y=y,
    bootstrap_ci=False,
    n_bootstraps=10,
    bootstrap_size=10)
print(ate_t)

# output
(array([0.65123114]), array([0.53089023]), array([0.77157204]))

1.3. X_Learner

X_Learner同样包含两个阶段和一个倾向性得分模型
第一阶段与T_Learner相同,对干预样本和未干预样本分别拟合一个机器学习模型。
第二阶段使用上面拟合的两个模型来估计干预样本和未干预样本的干预效果,然后拟合两个模型来预测这些影响,最后通过倾向性得分模型来将两者结合起来。

  • 当Treatment T和Outcome Y受共同的因素X影响时,就会发生混淆偏差。为去除偏差,需要控制住X,使得实验组和控制组的特征X分布一致,此时的Treatment独立于Y,满足无混淆假设,之后就可以正确地估计因果效应。去除混淆偏差的方法包括:
    • 1.3.1. 倾向性得分匹配(Propensity Score Matching,PSM)
      • 首先通过X预测T,得到一个条件概率P(T|X),也称之为倾向性得分(Propensity Score, PS),之后基于PS得分进行匹配,对于实验组的每一个样本,在对照组找到与之匹配(即二者相似)的一个样本,组成一个样本对,最后基于所有的样本对进行因果建模,以达到控制偏差的目的

在这里插入图片描述

learner_x = BaseXRegressor(learner=XGBRegressor())
ate_x = learner_x.estimate_ate(X=X, treatment=treatment, y=y, p=e)
print(ate_x)

# output
(array([0.41004427]), array([0.36615182]), array([0.45393672]))

1.4. 去偏机器学习(正交机器学习,双重机器学习(Double Machine Learning,DML)

在这里插入图片描述
双重机器学习会训练三个模型,先采用两步正交化过程

  1. 训练一个模型Mt(x),用协变量X预测干预变量T,计算预测T和和真实T的残差 T ~ T\tilde{} T~。该模型称为去偏模型。
  2. 训练一个模型My(x),用协变量X预测结果变量Y,计算预测Y和真实Y的残差 Y ~ Y\tilde{} Y~。该模型称为去噪模型。
    有了这些残差,就能够在 T ~ T\tilde{} T~上回归 Y ~ Y\tilde{} Y~得到ATE的线性近似,进一步还可以采用机器学习模型估计CATE
    在这里插入图片描述
    R_Learner就是双重机器学习方法的一种
learner_x = BaseXRegressor(XGBRegressor())
ate_x = learner_x.estimate_ate(X=X, treatment=treatment, y=y)
print(ate_x)

# output
(array([0.42084109]), array([0.37669545]), array([0.46498674]))

其他参数:
R_Learner还提供了sample_weights,用来给每个样本赋一个权重

learner_r = BaseRRegressor(learner=XGBRegressor())
sample_weight = np.random.randint(1, 3, len(y))
ate_r = learner_r.estimate_ate(X=X, treatment=treatment, y=y, p=e, sample_weight=sample_weight)
print(ate_r)

1.5. 元学习器计算Individual Treatment Effect (ITE/CATE)

元学习器计算CATE,都是统一采用的fit_predict()方法

# S Learner
learner_s = LRSRegressor()
cate_s = learner_s.fit_predict(X=X, treatment=treatment, y=y)

# T Learner
learner_t = BaseTRegressor(learner=XGBRegressor())
cate_t = learner_t.fit_predict(X=X, treatment=treatment, y=y)

# X Learner with propensity score input
learner_x = BaseXRegressor(learner=XGBRegressor())
cate_x = learner_x.fit_predict(X=X, treatment=treatment, y=y, p=e)

# X Learner without propensity score input
learner_x_no_p = BaseXRegressor(learner=XGBRegressor())
cate_x_no_p = learner_x_no_p.fit_predict(X=X, treatment=treatment, y=y)

# R Learner with propensity score input
learner_r = BaseRRegressor(learner=XGBRegressor())
cate_r = learner_r.fit_predict(X=X, treatment=treatment, y=y, p=e)

# R Learner without propensity score input
learner_r_no_p = BaseRRegressor(learner=XGBRegressor())
cate_r_no_p = learner_r_no_p.fit_predict(X=X, treatment=treatment, y=y)

遇到的问题:
1:根据定义,按理说R_learner已经能支持连续的干预变量,但BaseRRegressor依然不支持连续的干预变量
2:似乎causalml各种模型训练时,输入数据最好是numpy。我在jupyterlab上使用causalml的因果随机森林时,当输入数据是pandas格式,训练的时候,总是会内核死亡,并且在命令行提示窗口的log中也没报错提示,就是很自然的内核死亡,换成numpy格式就不会。。。

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

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

相关文章

贪吃蛇游戏C语言破解:成为编程高手的必修课!

​ 个人主页:秋风起,再归来~ 文章专栏:C语言实战项目 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、游戏效果演示 贪吃蛇游戏效果演示 2、win32 A…

【深度学习实战(20)】使用torchsummary打印模型结构

一、安装torchsummary库 pip install torchsummary 二、代码 import torchvision.models as models from torchsummary import summarymodel models.AlexNet() model.to(cuda) summary(model,(3,224, 224))

AI智能边缘分析一体机,32T算力,可同时处理32路1080p高清视频

产品概述 XM-AIBOX-32智能边缘分析一体机是一款高性能、低功耗边缘计算产品。搭载BM1684X主芯片,INT8算力高达32TOPS,FP16/BF16算力高达16TFLOPS,FP32算力高达2TFLOPS,可同时处理32路高清视频,支持32路1080P高清视频硬…

【NOI】C++算法设计入门之深度优先搜索

文章目录 前言一、深度优先搜索1.引入2.概念3.迷宫问题中的DFS算法步骤4.特点5.时间、空间复杂度5.1 时间复杂度 (Time Complexity)5.2 空间复杂度 (Space Complexity)5.3 小结 二、例题讲解1.问题:1586 - 扫地机器人问题:1430 - 迷宫出口 三、总结四、感…

docker安装并跑通QQ机器人实践(3)-bs-nonebot搭建

NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解和异步优先特性(兼容同步),能够为你的需求实现提供便捷灵活的支持。同时,NoneBot 拥有大…

Rust实战 | 用 RustRover 开发猜数字游戏

#1、概述 从这期开始,我会以实际项目的形式,分享个人学习 Rust 语言的过程。期间,我不会讲太多语法知识,需要各位看官自行查阅文档😄。 开始前,需具备 Rust 环境(我用的是当前最新版本1.77.2&…

【Transformer】detr之encoder逐行梳理(二)

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 detr之encoder逐行梳理 1. 整体 encoder由encoder layer构成 输入进encoder的特征shape:(hw,b,c),后文将给出说明 class Transformer(nn.…

Nacos分布式配置中心

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

常见的数据抽取工具对比

1.什么是ETL? ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程&#xff0c;是数据仓库的生命线。 …

C#仿QQ抽屉式窗体的设计方法:创建特殊窗体

目录 1.WindowFromPoint函数 2.GetParent函数 3.实例 &#xff08;1&#xff09; 图片集合编辑器 &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs 4.生成效果 QQ软件对于绝大多数的人来说再熟悉不过了&#xff0c;它以使用方便、界面美…

Scala 05 —— 函数式编程底层逻辑

Scala 05 —— 函数式编程底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 Scala 05 —— 函数式编程底层逻辑函数式编程假如...副作用是必须的&#xff1f;函数的定义函数是数据的函数&#xff0c;不是数字的函数如何把业务逻辑做成纯函…

多因素不同水平的正交表设计(并列法)

文章目录 一、问题提出二、举例说明 一、问题提出 参考高等教育课本《实验设计与数据处理》 很多时候&#xff0c;我们要考察的因素水平数不尽相同&#xff0c;这时候一般采用混合水平正交表或者对普通的正交表作修改&#xff0c;其中&#xff0c;混合水平正交表由于水平数不规…

JAVA程序设计-对象设计

无论是根据某马还是某谷的适配教程做项目时候,发现了大部分都是重复的crud,大部分只要做好笔记复习即可,但是却往往忘记了编码设计,所以这里开始复习编码设计,对象设计中,长期使用Mp的那一套导致就是Service Mapper,一套梭哈完了,这样很容易忘记基本功夫 POJO&#xff1a; 简单…

Java、Spring、Dubbo三者SPI机制原理与区别

Java、Spring、Dubbo三者SPI机制原理与区别 什么是SPI SPI全称为Service Provider Interface&#xff0c;是一种动态替换发现的机制&#xff0c;一种解耦非常优秀的思想&#xff0c;SPI可以很灵活的让接口和实现分离&#xff0c;让api提供者只提供接口&#xff0c;第三方来实…

刷题训练之二分查找

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握二分查找算法 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

网卡技术解密:理解网卡背后的原理

✍✍在这个信息爆炸的时代&#xff0c;网卡承载着无数数据的流动&#xff0c;是我们日常生活和工作不可或缺的一部分。但是&#xff0c;您是否曾经好奇过&#xff0c;这些小小的硬件是如何在瞬息万变的网络世界中稳定地发挥作用的呢&#xff1f; 想象一下&#xff0c;每当我们…

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…

智能时代 | 合合信息Embedding模型荣获C-MTEB榜单第一

目录 前言 1. MTEB与C-MTEB 2. acge模型的优势 3. Embedding模型应用 4. 大模型发展的关键技术 结语 前言 随着人工智能的不断发展&#xff0c;大语言模型吸引着社会各界的广泛关注&#xff0c;支撑模型应用落地的Embedding模型成为业内的焦点&#xff0c;大模型的发展给…

Electron 30.0.0 发布,升级 Node 和 V8 引擎

近日&#xff0c;Electron 30.0.0 正式发布&#xff01;你可以通过 npm install electronlatest 进行安装&#xff0c;或者从 Electron 的发布网站下载&#xff0c;继续阅读了解此版本的详细信息。 &#x1f525; 主要更新 Windows 上支持 ASAR 完整性融合。如果未正确配置&am…

【后端】python与django的开发环境搭建指南

安装Git 双击Git 客户端安装文件&#xff0c;在安装页面&#xff0c;单击“Next” 在安装路径选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在功能组件选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在开始菜单文件夹设置页面&#xff0c;保持默认&am…