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,隱藏了因果推斷的複雜數學,同時仍讓你完全控制圖、估計器和穩健性檢查。它適合需要超越相關性、基於 因果性 做出決策的資料科學家、研究人員和工程師。
相關
- 專案
- 專案
- 專案
- 專案
- 專案