跳转到主要内容

DoWhy是一个支持显式建模和测试因果假设的Python库,用于因果推断。

项目描述

BuildStatus PyPiVersion PythonSupport Downloads discord

dowhy-logo-large.png

查看文档

更多示例笔记本请见此处!

介绍 & 关键特性

决策涉及理解不同变量之间如何相互影响,并预测当其中一些变量改变为新值时的结果。例如,给定一个结果变量,人们可能感兴趣的是确定潜在行动(们)如何影响它,了解导致其当前值的原因,或者模拟如果某些变量发生变化会发生什么。回答此类问题需要因果推理。DoWhy 是一个 Python 库,它引导您通过因果推理的各个步骤,并提供一个统一的接口来回答因果问题。

DoWhy 提供了广泛的各种算法,用于效应估计、预测、因果影响的量化、因果结构的诊断、干预和反事实。DoWhy 的一个关键特性是其反驳和证伪 API,它可以测试任何估计方法的因果假设,从而使推理更加稳健,并使非专业人士能够访问。

图形因果模型和潜在结果:两者的最佳结合

DoWhy 建立在因果推理中最强大的两个框架之上:图形因果模型和潜在结果。对于效应估计,它使用基于图的准则和 do-演算来建模假设并识别非参数因果效应。对于估计,它切换到主要基于潜在结果的基于潜在结果的估计方法。

对于效应估计之外的因果问题,它通过在每个节点上通过显式因果机制来建模数据生成过程,使用图形因果模型的力量,从而解锁将观察到的效应归因于特定变量的能力或估计点估计反事实。

对于因果推理的快速介绍,请参阅amit-sharma/causal-inference-tutorial。我们还在 ACM 知识发现和数据挖掘(KDD 2018)会议上提供了一个更全面的教程:causalinference.gitlab.io/kdd-tutorial。有关因果推理的四个步骤及其对机器学习的影响的介绍,您可以访问微软研究院的视频教程DoWhy 网络研讨会,以及有关图形因果模型 API 的介绍,请参阅PyCon 上使用 DoWhy 进行根本原因分析的演示

关键特性

https://raw.githubusercontent.com/py-why/dowhy/main/docs/images/dowhy-features.png

DoWhy 支持以下因果任务

  • 效应估计(识别、平均因果效应、条件平均因果效应、工具变量等)

  • 量化因果影响(中介分析、直接箭头强度、内在因果影响)

  • 假设分析(从干预分布生成样本、估计反事实)

  • 根本原因分析和解释(将异常归因于其原因、寻找分布变化的起因、估计特征相关性等)

有关更多详细信息以及如何在实践中使用这些方法的说明,请查阅https://py-why.github.io/dowhy上的文档。

快速入门

DoWhy支持Python 3.8及以上版本。安装时,您可以使用pip、poetry或conda。

最新版本

使用pip安装最新版本release

pip install dowhy

使用poetry安装最新版本release

poetry add dowhy

使用conda安装最新版本release

conda install -c conda-forge dowhy

如果您在使用conda时遇到“解决环境”问题,请尝试执行conda update --all然后安装dowhy。如果不起作用,请使用conda config --set channel_priority false并再次尝试安装。如果问题仍然存在,请在此处添加您的问题

开发版本

如果您想使用最新的开发版本,您的依赖关系管理工具需要指向我们的GitHub存储库。

pip install git+https://github.com/py-why/dowhy@main

要求

DoWhy需要一些依赖项。具体版本的详细信息可以在pyproject.toml中的tool.poetry.dependencies部分找到。

如果您遇到任何问题,请尝试手动安装依赖项。

pip install '<dependency-name>==<version>'

可选地,如果您想以dot格式输入图,则可以安装pydot(或pygraphviz)。

为了获得更好的图形外观,您可以可选地安装pygraphviz。要继续,首先安装graphviz然后安装pygraphviz(在Ubuntu和Ubuntu WSL上)。

sudo apt install graphviz libgraphviz-dev graphviz-dev pkg-config
## from https://github.com/pygraphviz/pygraphviz/issues/71
pip install pygraphviz --install-option="--include-path=/usr/include/graphviz" \
--install-option="--library-path=/usr/lib/graphviz/"

示例:效应识别和估计

DoWhy中的大多数因果任务只需要几行代码即可编写。在这里,我们以示例估计处理对结果变量的因果效应。

from dowhy import CausalModel
import dowhy.datasets

# Load some sample data
data = dowhy.datasets.linear_dataset(
    beta=10,
    num_common_causes=5,
    num_instruments=2,
    num_samples=10000,
    treatment_is_binary=True)

因果图可以以不同的方式定义,但最常见的方式是通过NetworkX。加载数据后,我们使用DoWhy中效应估计的四个主要操作:modelidentifyestimaterefute

# I. Create a causal model from the data and given graph.
model = CausalModel(
    data=data["df"],
    treatment=data["treatment_name"],
    outcome=data["outcome_name"],
    graph=data["gml_graph"])  # Or alternatively, as nx.DiGraph

# II. Identify causal effect and return target estimands
identified_estimand = model.identify_effect()

# III. Estimate the target estimand using a statistical method.
estimate = model.estimate_effect(identified_estimand,
                                 method_name="backdoor.propensity_score_matching")

# IV. Refute the obtained estimate using multiple robustness checks.
refute_results = model.refute_estimate(identified_estimand, estimate,
                                       method_name="random_common_cause")

DoWhy强调其输出的可解释性。在任何分析点,您都可以检查未测试的假设、已识别的效应(如果有)以及估计(如果有)。以下是一个线性回归估计器的示例输出。

https://raw.githubusercontent.com/py-why/dowhy/main/docs/images/regression_output.png

有关完整的代码示例,请参阅DoWhy入门笔记本。

您还可以使用来自EconML的条件平均处理效应(CATE)估计方法,如条件处理效应笔记本所示。以下是一个代码片段。

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LassoCV
from sklearn.ensemble import GradientBoostingRegressor
dml_estimate = model.estimate_effect(identified_estimand, method_name="backdoor.econml.dml.DML",
                control_value = 0,
                treatment_value = 1,
                target_units = lambda df: df["X0"]>1,
                confidence_intervals=False,
                method_params={
                    "init_params":{'model_y':GradientBoostingRegressor(),
                                   'model_t': GradientBoostingRegressor(),
                                   'model_final':LassoCV(),
                                   'featurizer':PolynomialFeatures(degree=1, include_bias=True)},
                    "fit_params":{}})

示例:基于图形因果模型(GCM)的推理

DoWhy的图形因果模型框架提供了强大的工具来处理超出效应估计的因果问题。它基于Pearl的图形因果模型框架,并通过因果机制显式地建模每个变量的因果数据生成过程,以支持广泛的因果算法。有关更多详细信息,请参阅书籍《因果推断要素》

可以使用几行代码执行复杂的因果查询,例如将观察到的异常归因于系统中的节点。

import networkx as nx, numpy as np, pandas as pd
from dowhy import gcm

# Let's generate some "normal" data we assume we're given from our problem domain:
X = np.random.normal(loc=0, scale=1, size=1000)
Y = 2 * X + np.random.normal(loc=0, scale=1, size=1000)
Z = 3 * Y + np.random.normal(loc=0, scale=1, size=1000)
data = pd.DataFrame(dict(X=X, Y=Y, Z=Z))

# 1. Modeling cause-effect relationships as a structural causal model
#    (causal graph + functional causal models):
causal_model = gcm.StructuralCausalModel(nx.DiGraph([('X', 'Y'), ('Y', 'Z')]))  # X -> Y -> Z
gcm.auto.assign_causal_mechanisms(causal_model, data)

# 2. Fitting the SCM to the data:
gcm.fit(causal_model, data)

# Optional: Evaluate causal model
print(gcm.evaluate_causal_model(causal_model, data))

# Step 3: Perform a causal analysis.
# results = gcm.<causal_query>(causal_model, ...)
# For instance, root cause analysis:
anomalous_sample = pd.DataFrame(dict(X=[0.1], Y=[6.2], Z=[19]))  # Here, Y is the root cause.

# "Which node is the root cause of the anomaly in Z?":
anomaly_attribution = gcm.attribute_anomalies(causal_model, "Z", anomalous_sample)

# Or sampling from an interventional distribution. Here, under the intervention do(Y := 2).
samples = gcm.interventional_samples(causal_model, interventions={'Y': lambda y: 2}, num_samples_to_draw=100)

GCM框架还提供了许多其他功能,超出了这些示例。有关完整的代码示例,请参阅在线商店示例笔记本

有关更多功能、DoWhy的示例应用以及输出细节,请参阅用户指南或查看Jupyter笔记本

更多信息及资源

微软研究博客 | 效应估计视频教程 | 根本原因分析视频教程 | arXiv 论文 | arXiv 论文(图形因果模型扩展) | 演示文稿

引用此包

如果您觉得 DoWhy 对您的工作有所帮助,请引用以下两个参考文献中的任意一个

Bibtex

@article{dowhy,
  title={DoWhy: An End-to-End Library for Causal Inference},
  author={Sharma, Amit and Kiciman, Emre},
  journal={arXiv preprint arXiv:2011.04216},
  year={2020}
}

@article{dowhy_gcm,
    author = {Bl{\"o}baum, Patrick and G{\"o}tz, Peter and Budhathoki, Kailash and Mastakouri, Atalanti A. and Janzing, Dominik},
    title = {DoWhy-GCM: An extension of DoWhy for causal inference in graphical causal models},
    journal={arXiv preprint arXiv:2206.06821},
    year={2022}
}

问题

如果您遇到 DoWhy 的问题或对 DoWhy 有特殊要求,请提出问题

贡献

本项目欢迎贡献和建议。有关贡献指南和所有贡献者的列表,请参阅CONTRIBUTING.md和我们的代码贡献文档。我们的贡献者行为准则可在此处查阅。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

dowhy-0.11.1.tar.gz (11.9 MB 查看哈希值)

上传时间

构建分布

dowhy-0.11.1-py3-none-any.whl (383.4 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面