因果推断之微软开源的dowhy使用学习
创始人
2024-06-02 17:52:59
0

本文参考微软dowhy官网文档,并参考相关博客进行整理而来,官方地址:https://github.com/py-why/dowhy

0x01. 概述

因果推理是基于观察数据进行反事实估计,分析干预与结果之间的因果关系。

DoWhy是微软发布的端到端因果推断Python库,主要特点是:

  • 基于一定经验假设的基础上,将问题转化为因果图,验证假设。
  • 提供因果推断的接口,整合了两种因果框架。
  • DoWhy支持对后门、前门和工具的平均因果效应的估计,自动验证结果的准确性、鲁棒性较高。

DoWhy 的整个因果推断过程可以划分为四大步骤:

  1. 「建模」(model): 利用假设(先验知识)对因果推断问题建模。
  2. 「识别」(identify): 在假设(模型)下识别因果效应的表达式(因果估计量)。
  3. 「估计」(estimate): 使用统计方法对表达式进行估计。
  4. 「反驳」(refute): 使用各种鲁棒性检查来验证估计的正确性。

先看一张流程图:

在这里插入图片描述
对四个流程进行解释说明:

0x01_1. 建模

为每个问题创建一个因果图模型,以保证因果假设的明确性。该因果图不需要是完整的,你可以只提供部分图,来表示某些变量的先验知识(即指定其类型),DoWhy 支持自动将剩余的变量视为潜在的混杂因子

目前,DoWhy支持以下形式的因果假设:

  • 「图」(Graph): 提供 gml 或 dot 形式的因果图,具体可以是文件或字符串格式
  • 命名变量集合」(Named variable sets): 直接提供变量的类型,包括 混杂因子(common causes / cofounders)工具变量(instrumental variables)结果修改变量(effect modifiers)、**前门变量(front-door variables)**等。

0x01_2. 识别

基于构建的因果图,DoWhy 会基于所有可能的方式来识别因果效应。识别方式包含:

  • 后门准则(Back-door criterion)
  • 前门准则(Front-door criterion)
  • 工具变量(Instrumental Variables)
  • 中介-直接或间接结果识别(Mediation-Direct and indirect effect identification)

0x01_3. 估计

  • 基于估计干预分配的方法(Methods based on estimating the treatment assignment)

    • 基于倾向的分层(Propensity-based Stratification)
    • 倾向得分匹配(Propensity Score Matching)
    • 逆向倾向加权(Inverse Propensity Weighting)
  • 基于估计结果模型的方法(Methods based on estimating the outcome model)

    • 线性回归(Linear Regression)
    • 广义线性模型(Generalized Linear Models)
  • 基于工具变量等式的方法(Methods based on the instrumental variable equation)

    • 二元工具/Wald 估计器(Binary Instrument/Wald Estimator)
    • 两阶段最小二乘法(Two-stage least squares)
    • 非连续回归(Regression discontinuity)
  • 基于前门准则和一般中介的方法(Methods for front-door criterion and general mediation)

    • 两层线性回归(Two-stage linear regression)

0x01_4. 反驳

DoWhy 支持多种反驳方法来验证估计的正确性,具体列表如下:

  • 添加随机混杂因子:添加一个随机变量作为混杂因子后估计因果效应是否会改变(期望结果:不会)
  • 安慰剂干预:将真实干预变量替换为独立随机变量后因果效应是否会改变(期望结果:因果效应归零)
  • 虚拟结果:将真实结果变量替换为独立随机变量后因果效应是否会改变(期望结果:因果效应归零)
  • 模拟结果:将数据集替换为基于接近给定数据集数据生成过程的方式模拟生成的数据集后因果效应是否会改变(期望结果:与数据生成过程的效应参数相匹配)
  • 添加未观测混杂因子:添加一个额外的与干预和结果相关的混杂因子后因果效应的敏感性(期望结果:不过度敏感)
  • 数据子集验证:将给定数据集替换为一个随机子集后因果效应是否会改变(期望结果:不会)
  • 自助验证:将给定数据集替换为同一数据集的自助样本后因果效应是否会改变(期望结果:不会)

0x02. 入门案例学习

依旧以微软官方文档为主进行学习,其中包含基础案例和酒店住宿分析问题。

0x02_1. 安装环境

windows环境下,请在python3.8以上的环境下进行安装。

pip install dowhy

conda install -c conda-forge dowhy

其次是需要安装pygraphviz,windows具体安装教程参考:传送门

0x02_1. 导包加载数据

from dowhy import CausalModel
import dowhy.datasets# Load some sample data
data = dowhy.datasets.linear_dataset(beta=10, # 因果效应值num_common_causes=5, # 混杂因子,用w表示,作用于干预变量和结果变量num_instruments=2, # 工具变量,用 Z 表示,作用于干预变量(间接影响结果)num_samples=10000,  # 样本数量treatment_is_binary=True) # 干预为二元变量,用 v 表示
df = data["df"] # DoWhy 使用 pandas 的 dataframe 来载入数据
print(df.head(5))

结果输出如下:

    Z0	   Z1			W0			W1			W2			W3			W4		 v0			y
0	0.0	0.478130	0.313025	0.274645	1.794765	-1.551661	1.250724	True	17.033979
1	0.0	0.546833	-0.197845	-2.404349	1.120160	-1.011344	0.812087	True	3.074740
2	0.0	0.874135	1.047078	-0.056460	0.440413	-0.067349	0.970203	True	15.530070
3	0.0	0.913483	0.934282	-1.180582	0.498135	-1.079074	-1.659924	True	5.046809
4	0.0	0.366969	-0.364818	0.630643	-0.330043	0.572139	-0.433893	True	11.004590

输出 gml_graph,内容一致只是表达形式不同,查看一下构建的,代码如下:

print(data["dot_graph"])

结果如下:

digraph {v0->y;W0-> v0; W1-> v0; W2-> v0; W3-> v0; W4-> v0;Z0-> v0; Z1-> v0;W0-> y; W1-> y; W2-> y; W3-> y; W4-> y;}

0x02_2. 执行因果推断

0x02_2_1. 建模

model=CausalModel(data = df,treatment=data["treatment_name"],outcome=data["outcome_name"],graph=data["gml_graph"])
model.view_model() # 对构建的因果图可视化
from IPython.display import Image, display
display(Image(filename="causal_model.png"))

执行代码后,结果如下:

在这里插入图片描述
上图包含了数据中给定的先验知识,我们可以利用这张图来识别因果效应(从因果估计量到概率表达式)并进行估计。

0x02_2_2. 识别

可以脱离于数据,仅根据图进行识别,其给出的结果是一个用于计算的「表达式」。具体的代码如下:

identified_estimand = model.identify_effect()
print(identified_estimand)

输出结果如下:

Estimand type: EstimandType.NONPARAMETRIC_ATE### Estimand : 1
Estimand name: backdoor
Estimand expression:d                       
─────(E[y|W1,W0,W4,W2,W3])
d[v₀]                     
Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W1,W0,W4,W2,W3,U) = P(y|v0,W1,W0,W4,W2,W3)### Estimand : 2
Estimand name: iv
Estimand expression:⎡                              -1⎤⎢    d        ⎛    d          ⎞  ⎥
E⎢─────────(y)⋅⎜─────────([v₀])⎟  ⎥⎣d[Z₁  Z₀]    ⎝d[Z₁  Z₀]      ⎠  ⎦
Estimand assumption 1, As-if-random: If U→→y then ¬(U →→{Z1,Z0})
Estimand assumption 2, Exclusion: If we remove {Z1,Z0}→{v0}, then ¬({Z1,Z0}→y)### Estimand : 3
Estimand name: frontdoor
No such variable(s) found!

0x02_2_3. 估计

estimate = model.estimate_effect(identified_estimand,method_name="backdoor.propensity_score_stratification")
print(estimate)

输出结果如下:

*** Causal Estimate ***## Identified estimand
Estimand type: EstimandType.NONPARAMETRIC_ATE### Estimand : 1
Estimand name: backdoor
Estimand expression:d                       
─────(E[y|W1,W0,W4,W2,W3])
d[v₀]                     
Estimand assumption 1, Unconfoundedness: If U→{v0} and U→y then P(y|v0,W1,W0,W4,W2,W3,U) = P(y|v0,W1,W0,W4,W2,W3)## Realized estimand
b: y~v0+W1+W0+W4+W2+W3
Target units: ate## Estimate
Mean value: 9.942351552191596

可以通过 target_units 参数来选择因果效应分析的群体,如 ate(群体层面)、att(干预组)、ate(对照组)。也可以指定结果修改变量来分析不同变量对结果的影响。

0x02_2_4. 反驳

反驳阶段参考其他博客内容进行实验,采用多种方式验证。

添加一个随机的混杂因子变量

res_random=model.refute_estimate(identified_estimand, estimate, method_name="random_common_cause")
print(res_random)

输出结果如下:

Refute: Add a random common cause
Estimated effect:9.942351552191596
New effect:9.942351552191594
p value:2.0

添加一个未观测的混杂因子变量

res_unobserved=model.refute_estimate(identified_estimand, estimate, method_name="add_unobserved_common_cause", confounders_effect_on_treatment="binary_flip", confounders_effect_on_outcome="linear", effect_strength_on_treatment=0.01, effect_strength_on_outcome=0.02)
print(res_unobserved)

输出结果如下:

Refute: Add an Unobserved Common Cause
Estimated effect:9.942351552191596
New effect:9.451291104262298

用随机变量代替干预

res_placebo=model.refute_estimate(identified_estimand, estimate, method_name="placebo_treatment_refuter", placebo_type="permute")
print(res_placebo)

输出结果如下:

Refute: Use a Placebo Treatment
Estimated effect:9.942351552191596
New effect:-0.014386044006960131
p value:0.8999999999999999

移除数据的一个随机子集

res_subset=model.refute_estimate(identified_estimand, estimate, method_name="data_subset_refuter", subset_fraction=0.9)
print(res_subset)

输出结果如下:

Refute: Use a subset of data
Estimated effect:9.942351552191596
New effect:9.934071804782558
p value:0.8600000000000001

我们可以通过 random_seed 参数来保证结果的可重现性。

0x03. 总结

跟着官网的实验跑一趟,对该分析工具认识加深,特别是工具安装和使用,分析的结果可呈现。对该工具的认识也加深不少。

参考链接:

  1. 微软DoWhy官方教程
  2. 因果推断框架 DoWhy 入门

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...