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 生态系统的一部分,专注于因果性工具。

核心功能

功能 可实现的操作
效应估计 识别因果效应,计算平均或条件处理效应,使用工具变量等
因果影响量化 中介分析,直接/间接效应强度,内在影响度量
假设/反事实分析 从干预分布生成样本,计算个体的反事实结果
根本原因分析与解释 将异常归因于特定变量,解释分布变化,排序特征重要性
反证/验证 运行稳健性检查(例如,随机共同原因、安慰剂测试),以检验在替代假设下你的因果主张是否成立

典型工作流程(四步法)

  1. 建模 – 提供数据、处理/结果名称和因果图(NetworkX、DOT 等)。
  2. 识别 – 让 DoWhy 应用 do-演算推导出估计量(因果效应的数学表达式)。
  3. 估计 – 使用统计估计器(倾向得分匹配、线性回归、EconML 的 DML 等)计算效应。
  4. 反证 – 自动运行一个或多个虚假测试以评估稳健性。

快速开始

# 安装最新稳定版
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)

社区与贡献

总结 DoWhy 提供了一个简洁、高级的 API,隐藏了因果推断的复杂数学,同时仍让你完全控制图、估计器和稳健性检查。它适合需要超越相关性、基于 因果性 做出决策的数据科学家、研究人员和工程师。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目