py-why/dowhy
DoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions. DoWhy is based on a unified language for causal inference, combining causal graphical models and potential outcomes frameworks.
DoWhy – Python 中的端到端因果推断
是什么
- 一个 Python 库,可让你提出 因果性 问题(“如果我进行干预会怎样?”,“是什么导致了这个结果?”,“异常的根本原因是什么?”),并获得统计上可信的答案。
- 结合了两种主要的因果推断框架:图形因果模型(Pearl 的 do-演算)和 潜在结果方法。
- 属于 PyWhy 生态系统的一部分,专注于因果性工具。
核心功能
| 功能 | 可实现的操作 |
|---|---|
| 效应估计 | 识别因果效应,计算平均或条件处理效应,使用工具变量等 |
| 因果影响量化 | 中介分析,直接/间接效应强度,内在影响度量 |
| 假设/反事实分析 | 从干预分布生成样本,计算个体的反事实结果 |
| 根本原因分析与解释 | 将异常归因于特定变量,解释分布变化,排序特征重要性 |
| 反证/验证 | 运行稳健性检查(例如,随机共同原因、安慰剂测试),以检验在替代假设下你的因果主张是否成立 |
典型工作流程(四步法)
- 建模 – 提供数据、处理/结果名称和因果图(NetworkX、DOT 等)。
- 识别 – 让 DoWhy 应用 do-演算推导出估计量(因果效应的数学表达式)。
- 估计 – 使用统计估计器(倾向得分匹配、线性回归、EconML 的 DML 等)计算效应。
- 反证 – 自动运行一个或多个虚假测试以评估稳健性。
快速开始
# 安装最新稳定版
pip install dowhy # 或 `conda install -c conda-forge dowhy`
from dowhy import CausalModel
import dowhy.datasets as ds
# 加载合成数据集
data = ds.linear_dataset(beta=10, num_common_causes=5,
num_instruments=2, num_samples=10000,
treatment_is_binary=True)
model = CausalModel(data=data["df"],
treatment=data["treatment_name"],
outcome=data["outcome_name"],
graph=data["gml_graph"]) # graph 也可以是 NetworkX DiGraph
identified_estimand = model.identify_effect()
estimate = model.estimate_effect(identified_estimand,
method_name="backdoor.propensity_score_matching")
refute_res = model.refute_estimate(identified_estimand, estimate,
method_name="random_common_cause")
print(estimate)
print(refute_res)
该库会打印出假设摘要、识别出的估计量、数值估计和反证结果的可读性总结。
图形因果模型(GCM)扩展
- 超越效应估计,DoWhy-GCM 允许你定义具有每个节点显式函数机制的 结构因果模型(SCM)。
- 你可以将这些 SCM 拟合到数据中,评估其拟合度,然后执行以下任务:
- 根本原因归因 (
gcm.attribute_anomalies) - 干预采样 (
gcm.interventional_samples) - 反事实查询
- 根本原因归因 (
- 示例(X → Y → Z):
import networkx as nx, pandas as pd, numpy as np
from dowhy import gcm
# 合成数据
X = np.random.normal(size=1000)
Y = 2*X + np.random.normal(size=1000)
Z = 3*Y + np.random.normal(size=1000)
df = pd.DataFrame(dict(X=X, Y=Y, Z=Z))
scm = gcm.StructuralCausalModel(nx.DiGraph([('X','Y'),('Y','Z')]))
gcm.auto.assign_causal_mechanisms(scm, df)
gcm.fit(scm, df)
# 异常 Z 值的根本原因
anomaly = pd.DataFrame(dict(X=[0.1], Y=[6.2], Z=[19]))
print(gcm.attribute_anomalies(scm, "Z", anomaly))
学习资源
- 完整文档与教程: https://py-why.github.io/dowhy/
- 示例笔记本(效应估计、根本原因分析、使用 EconML 的 CATE 等)
- Microsoft Research 和 PyCon 演讲视频(README 中有链接)
- 学术论文:arXiv 2020(核心 DoWhy)和 JMLR 2024(DoWhy-GCM)
社区与贡献
- 问题讨论 Discord 频道: https://discord.gg/cSBGb3vsZb
- GitHub 上提交问题;欢迎通过常规的拉取请求流程贡献代码。
总结 DoWhy 提供了一个简洁、高级的 API,隐藏了因果推断的复杂数学,同时仍让你完全控制图、估计器和稳健性检查。它适合需要超越相关性、基于 因果性 做出决策的数据科学家、研究人员和工程师。
相关
- 项目
- 项目
- 项目
- 项目
- 项目