图形因果模型 (GCM) 建模#
为了执行基于图形因果模型的因果任务,例如根因分析或量化边的因果强度,我们还需要了解变量底层数据生成过程的本质。因果图本身,作为一种图表,不包含任何关于数据生成过程的信息。
DoWhy 中基于 GCM 推理的所有主要功能都围绕着图形因果模型的概念构建。图形因果模型由变量的因果有向无环图 (DAG) 和每个变量的因果机制组成。因果机制定义了给定图中父节点的情况下变量的条件分布,或者对于根节点变量,简单地定义了其分布。也就是说,对于非根节点,我们将节点 \(X_i\) 建模为 \(X_i = f(PA_{X_i}, N_i)\),其中 \(PA_{X_i}\) 是 \(X_i\) 的父节点,\(N_i\) 是未观测到的噪声,假定其独立于 \(PA_{X_i}\)(因果充分性)。
GCM 的最一般情况是概率因果模型 (PCM),其中因果机制由条件随机模型和随机模型定义。在 dowhy.gcm
包中,这些由 ProbabilisticCausalModel
、ConditionalStochasticModel
和 StochasticModel
表示。

然而,在实践中,我们通常使用可逆的结构因果模型 (SCM) 来表示我们的 GCM,因果机制对于非根节点由函数因果模型 (FCM) 定义,对于根节点由随机模型定义。可逆 SCM 实现了与 PCM 相同的特性,但除此之外,其 FCM 允许我们基于父节点和噪声对数据生成过程进行进一步推断,从而例如可以计算反事实。有关图类型及其含义的更多详细信息,请参见 图形因果模型的类型 章节。

为了保持本介绍的简单性,我们暂时坚持使用 SCM。
如上所述,因果机制描述了节点的值如何受到其父节点值的影响。我们将在 自定义因果机制分配 章节中更深入地探讨因果机制的细节及其含义。但在本介绍中,我们将它们视为回答因果问题所需的“黑箱”事物。
为了引入这种数据生成过程,我们使用基于因果图构建的 SCM
>>> from dowhy import gcm
>>> import networkx as nx
>>> causal_model = gcm.StructuralCausalModel(nx.DiGraph([("X", "Y"), ("Y", "Z")]))
此时我们通常会加载数据集。在本介绍中,我们转而生成一些合成数据。API 接受 Pandas DataFrame 形式的数据。
>>> import numpy as np, pandas as pd
>>> 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(data=dict(X=X, Y=Y, Z=Z))
>>> data.head()
X Y Z
0 -2.253500 -3.638579 -10.370047
1 -1.078337 -2.114581 -6.028030
2 -0.962719 -2.157896 -5.750563
3 -0.300316 -0.440721 -2.619954
4 0.127419 0.158185 1.555927
请注意,列 X、Y、Z 如何与上面构建的图中的节点 X、Y、Z 对应。我们还可以看到数据集中的 X 值如何影响 Y 值,以及 Y 值如何影响 Z 值。
上面创建的因果模型现在允许我们以函数因果模型的形式为每个节点分配因果机制。在这里,如果例如已知某些因果关系的先验知识,这些机制可以手动分配;或者可以使用 auto
模块自动分配。对于后者,我们只需调用
>>> gcm.auto.assign_causal_mechanisms(causal_model, data)
如果我们需要对分配的机制有更多的控制,我们也可以手动进行。例如,我们可以为根节点 X 分配一个经验分布,并为节点 Y 和 Z 分配线性加性噪声模型。
>>> causal_model.set_causal_mechanism('X', gcm.EmpiricalDistribution())
>>> causal_model.set_causal_mechanism('Y', gcm.AdditiveNoiseModel(gcm.ml.create_linear_regressor()))
>>> causal_model.set_causal_mechanism('Z', gcm.AdditiveNoiseModel(gcm.ml.create_linear_regressor()))
章节 自定义因果机制分配 将更详细地介绍如何定义完全自定义的模型或添加自己的实现。
在现实世界中,数据以“黑箱”流的形式出现,我们通常不知道一个变量如何影响另一个变量。图形因果模型可以帮助我们再次分解这些因果关系,即使我们之前不知道它们。
将 SCM 拟合到数据#
有了现有数据和之前构建的图,我们现在可以使用 fit
来训练 SCM
>>> gcm.fit(causal_model, data)
拟合意味着,我们根据数据学习 SCM 中变量的生成模型。
该因果模型现在已准备好用于 执行因果任务。
评估拟合的 SCM#
有关评估拟合模型的信息,请参见 评估 GCM。