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)

社群與貢獻

  • 問題討論 Discord 頻道: https://discord.gg/cSBGb3vsZb
  • GitHub 上提交問題;歡迎透過常規的拉取請求流程貢獻程式碼。

總結 DoWhy 提供了一個簡潔、高階的 API,隱藏了因果推斷的複雜數學,同時仍讓你完全控制圖、估計器和穩健性檢查。它適合需要超越相關性、基於 因果性 做出決策的資料科學家、研究人員和工程師。

相關

  • 專案
  • 專案
  • 專案
  • 專案
  • 專案