跳至主要内容

使用 DoWhy 库的 Python 因果 AI 入门

本教程介绍如何在 Python 中使用 DoWhy 库进行因果 AI。内容涵盖基本原理,并提供代码示例。
· 14分钟 阅读

使用 AI 探索

在基于数据做决策时,许多业内人士始终心存疑虑:常用的预测算法并非总是可靠。比如,人均巧克力消费量可以高度预测一个国家的诺贝尔奖得主数量;冰淇淋销量与鲨鱼袭击之间也存在相关性。然而,这并不意味着我们该把大量鲨鱼吸引到沙滩上来促进冰淇淋生意。

这里的关键当然是“相关不代表因果”这一熟悉概念。两个变量存在相关性,并不意味着我们可以通过改变一个来影响另一个。二者可能共同受第三个变量驱动,例如在鲨鱼与冰淇淋销量的例子中,“晴朗天气”就是二者的共同原因。同时,理解现象的根本成因,并借助数据分析推动改变,对任何企业都至关重要。这也是为什么包括微软、亚马逊、Uber、Spotify、麦肯锡以及更多企业纷纷加大对因果 AI 能力的投入。

本教程将使用 Python 中的 DoWhy 库,讲解因果 AI 的一些基础概念与思路。因果推断在概念上与标准机器学习有很大不同,因此大多数人起步时背景知识有限。不过,具备回归分析与统计建模的基础将有助于您跟进。如果您是回归分析新手或需要快速复习,不妨学习 DataCamp 的Python 线性建模入门课程。

您也可以在 DataCamp 的商业机器学习课程中探索预测模型与因果模型之间的差异。

因果 AI 的基石

谈到因果推断,我们需要一种不同于标准机器学习与预测分析的思维方式。

哲学家Nancy Cartwright曾提出“无因输入,亦无因输出”(No causes in, no causes out)。这意味着,为了得到因果性的答案,我们必须对所研究现象背后的因果结构做出假设。仅凭数据驱动的方法并不够。

这乍听像是循环论证,但其实并非如此。

如果我们想知道巧克力消费与诺贝尔奖得主之间的相关性是否具有因果性,我们需要排除其他解释。这些替代性解释构成了因果知识,这类知识未必能在数据中直接体现,而需要我们从外部引入。

假设我们正在考虑推出一项新的在家办公(WFH)政策,并想知道这是否会影响员工生产力。初步分析显示,居家办公的同事每天完成的任务更多。

然而,政策一旦全面实施,这种相关性还能保持吗?换句话说,我们能确定 WFH 与生产力之间的关系是因果关系吗?

Graph created by causalfusion.net

注:图由 causalfusion.net 创建

在这个情境下,一个简单的因果模型可能如下所示。

我们假设居家办公会影响生产力,但并不知道这种影响的方向或强度。同时,看到居家办公者生产力更高,可能还有其他原因。

有孩子的员工,或性格更内向、不太能适应大型开放式办公室噪音的员工,可能会因为方便而更常选择在家办公。而这些变量本身也可能与生产力相关,使其成为共同原因,从而可能导致我们观察到的相关性。

为将这些假设明确化,我们把它们绘制为所谓的因果图,即用图形方式刻画系统中变量之间关系的工具,特别关注因果关系。

您会发现,在真实世界中,这些假设有时可能相当强。因果图的最大优势是把假设和先验知识以非常明确的方式呈现出来,但我们始终需要准备好对其提出质疑并加以修正,以提升分析的可信度。

在 Python 中开始使用 DoWhy

微软的 DoWhy 库由亚马逊云科技协作开发,是 PyWhy 生态的一部分,正迅速成为 Python 领域的因果分析业界标准。我们可以用 DoWhy 按照上面的因果模型模拟一个数据集,以演示因果推断流程中的关键步骤。首先,我们需要在环境中安装 DoWhy。

!pip install git+https://github.com/microsoft/dowhy.git

完成后,我们可以加载所需的库。

import numpy as np
import pandas as pd
import dowhy

现在,我们自己创建一个数据集。学习因果 AI 时使用模拟数据的最大好处在于,我们能完全掌控数据生成过程,并且知道“真实值”,而这在真实世界数据中通常做不到。

我们将真实因果效应设为 1(beta=1),指定两个共同原因,并根据模型中变量之间的简单线性关系生成一万个样本。

我们所研究的处理变量被设置为二元变量,即只能取 0 或 1。

在此之前,我们为随机数生成设定了固定的起点——using np.random.seed(1)——以实现对数据集的精确复现。

from dowhy import CausalModel
import dowhy.datasets

# Set seed to enable exact replication
np.random.seed(1)

# Simulate sample data
data = dowhy.datasets.linear_dataset(
    beta=1,
    num_common_causes=2,
    num_discrete_common_causes=1,
    num_instruments=1,
    num_samples=10000,
    treatment_is_binary=True)

df = data['df']

DoWhy 赋予了如下标签:

表 1

标签

变量

类型

均值

v0

处理变量,即我们分析中最关注的变量(在家办公)

二元

0.608

y

关注的结果(生产力)

连续

1.583

W0

内向性

连续

-0.148

W1

子女数量

分类型

1.5

Z0

仅影响 v0 而不影响 y 的工具变量(地铁停运)

二元

0.281

在这里,我们通过设置处理类型与共同原因的数量,隐式地定义了一个因果图。DoWhy 使用 DOT 语言存储图对象,这为我们在处理真实世界数据时自行指定有向因果图(digraph)提供了便捷方式。

digraph {v0->y;W0-> v0; W1-> v0;Z0-> v0;W0-> y; W1-> y;}

最后,我们将以上信息整合为一个因果模型。

# Create a causal model from the data and given graph.
model=CausalModel(
        data = df,
        treatment=data['treatment_name'],
        outcome=data['outcome_name'],
        graph=data['gml_graph']
        )

释放因果 AI 的力量

在开展因果分析之前,我们先用基于简单线性预测算法的朴素方法做个基准。

# Run a linear regression of column y on v0 in df
import statsmodels.api as sm

X = df['v0'].astype(float)
y = df['y'].astype(float)

X = sm.add_constant(X)

ols = sm.OLS(y, X).fit()

# Display a more parsimonious results summary
print(ols.summary().tables[1])

在双变量回归中,斜率系数为 1.298。然而我们知道,真实的因果效应其实等于 1,因为数据就是按这一设定生成的。

这说明两个共同原因——内向性与是否有孩子——同时影响生产力与居家办公的可能性,从而在本例中导致了近 30% 的高估。

所幸,只要我们拥有这些变量的数据,就可以在多变量分析中纳入共同原因,以轻松纠正这种偏差。

在因果 AI 文献中,这被称为背门准则。我们希望控制因果图中所有指向处理变量的变量。它们“从后门进入”,可能在处理与结果之间制造并非因果的虚假相关。在我们的例子中,这适用于内向性与子女数量。

WFH <— 内向性 —> 生产力

WFH <— 子女 —> 生产力

DoWhy 提供了一系列算法,用于判断在给定特定因果模型的情况下,是否能够识别所需的因果效应。

# Check whether causal effect is identified and return target estimands
identified_estimand = model.identify_effect()

不出所料,在我们关于居家办公影响的简单因果模型中,因果识别是可行的。

接下来,我们关注估计,即利用可用数据来量化目标效应的过程。

DoWhy 提供了多种可选算法,包括回归、匹配、分层与加权估计器。由于我们模拟的数据基于线性关系,使用简单回归已足够。如果您需要复习,DataCamp 的Python 中使用 statsmodels 的回归入门课程会有所帮助。

不过,为了让分析更具普适性,我们将使用逆概率加权,它同样能处理非线性数据。

# Estimate the causal effect using inverse probability weighting
estimate = model.estimate_effect(identified_estimand,
                                 method_name="backdoor.propensity_score_weighting")

DoWhy 返回的因果效应估计值为 1.001。当然,在模拟环境中具体数值本身意义不大;关键在于,它非常接近真实值 1。与之前的回归相比,偏差被惊人地减少了 99.6%。

对结果进行压力测试

这固然不错,但我们不应止步于此。

“无因输入,亦无因输出”的原则告诉我们,任何因果分析的有效性,取决于我们带入的假设。

例如,如何确保只有内向性和是否有孩子会影响 WFH,就像我们简单因果模型所设定的那样?

为增强对假设的信心,DoWhy 提供了一整套反驳(检验)测试,可对分析进行压力测试,包括但不限于子样本检验或安慰剂处理等。

# Check sensitivity of obtained estimate to unobserved confounders
refute_results = model.refute_estimate(identified_estimand, estimate,
                                       method_name="add_unobserved_common_cause")

让我们看看,在内向性与子女之外再加入一个共同原因会发生什么。

这一次,我们没有该变量的数据,因此它对我们来说是不可观测的。我们的估计有多可靠?遗憾的是,答案并不让人安心。

图 2 所示的曲线表明,未观测的共同原因会对估计的因果效应产生巨大影响,范围从 -0.222 到 1.003。这个区间非常宽,甚至可能让估计效应增加一倍。

Figure 2

不过,这并不奇怪。涉及不可观测变量的替代性因果机制,无法在分析中纳入考量,总会给因果研究带来挑战。

幸运的是,在该情境下还有另一种实现识别的方式,而 DoWhy 足够智能,能为我们找出来。

寻找替代的因果策略

尽管内向的员工或有孩子的员工可能更频繁地在家办公,但也可能存在与生产力无关的 WFH 决定因素。

比如,若公共交通发生重大中断,我们城市的一条地铁线被迫停运三个月。结果,住在这条线路附近区域的员工更可能选择在家办公,即使他们原本更愿意来办公室。

我们可以如下展示这一扩展后的因果模型。

Augmented causal model

在这种情况下,地铁停运就充当了所谓的工具变量。

直观地讲,停运对通勤安排造成冲击,形成一种自然实验。

在这三个月里,住在受影响线路附近的人更常在家办公,但这与他们的生产力并无其他关系。您可能注意到,我们在上面的模拟数据生成中已经通过设置 num_instruments=1 包含了这样一个工具变量 Z0。DoWhy 的 identify_effect() 函数随后能在因果图中自动为我们找到合适的工具变量。

iv_estimate = model.estimate_effect(identified_estimand,
                                    method_name="iv.instrumental_variable")

估计之后,我们发现因果效应为 0.920。虽然略逊于背门策略的精确度,但仍远胜于朴素预测。

工具变量估计的优势在于,它不依赖于关于 WFH 与生产力之间未观测共同原因数量的假设。

因此,尽管估计可能不那么精确,但由于假设更弱,结果更具稳健性。这是因果分析中的常见权衡。

接下来做什么?

DoWhy 是入门因果 AI 的绝佳选择。它是一个功能强大的端到端库,提供了灵活的因果推断流程,引导用户完成关键步骤。

在掌握基本流程后,您可以深入更高级的话题,如因果发现,并结合 DoubleML 等库提升分析,或在 R 中使用 daggity、ggdag 与 pcalg。当您对基础内容已驾轻就熟后,也可以探索更高级的因果推断主题。DataCamp 的R 语言高级因果推断课程是不错的下一步。

因果推断为数据分析提供了全新的视角。大多数方法依赖对因果图或其他因果性假设的理解。关键在于为您的具体场景选择合适的技术与假设,而这需要外部知识与领域专长。

因此,咨询市场或人力资源专家的意见,看看他们是否能帮助您构建合适的模型,是个好主意。

在许多商业场景中,因果知识至关重要。比如,我们需要判断新品发布是否成功,或广告策略的效果如何。

相比训练一个简单的预测算法,从数据中获取因果答案的确更难,但绝对物有所值。而像 DoWhy 这样的库提供了一套强大的工具,帮助您找到最契合需求的解决方案。

如果您觉得本教程对您有所启发,且希望在自己的项目中应用因果 AI 技术,现在正是深化学习的好时机。在全面的商业机器学习课程中,您将不仅学习预测模型,还会学习能够帮助您做出更佳商业决策的因果模型。

Paul Hünermund

作者

Paul Hünermund

Paul Hünermund 是哥本哈根商学院战略与创新领域的助理教授。在其研究中,Hünermund 博士探讨企业如何在机器学习与人工智能领域利用新技术实现价值创造与竞争优势。他的工作研究组织决策中的偏见可能性以及管理者应对这些偏见的方法。由此,他揭示了在技术竞争高度激烈的市场中,有效商业战略的起源,以及其对经济增长与环境可持续性的影响。
 
他的研究发表在《Journal of Management Studies》《Econometrics Journal》《Research Policy》《Journal of Product Innovation Management》《International Journal of Industrial Organization》《MIT Sloan Management Review》与《Harvard Business Review》等期刊与媒体上。其研究亦被《Frankfurter Allgemeine Zeitung》《Süddeutsche Zeitung》《Politiken》与《Neue Zürcher Zeitung》报道。Hünermund 博士担任《Journal of Causal Inference》编委,并在管理学会(Academy of Management)技术与创新管理分部的执行团队任职。他在比利时鲁汶大学(KU Leuven)获得企业经济学博士学位,并在德国曼海姆大学取得经济学硕士学位。
Jermain Kaminski

作者

Jermain Kaminski

Jermain Kaminski 是马斯特里赫特大学的创业与创新助理教授。他的研究将机器学习与自然语言处理相结合,重点关注创业领域的文本、音频和视频数据。值得一提的是,他当前的研究聚焦于战略决策,深入探讨因果机器学习对决策过程的影响。他与合著者的研究成果已发表在 Journal of Business Venturing、Journal of Business Venturing Insights、Journal of Product Innovation Management、Small Business Economics、ACM Conference on Human Factors in Computing Systems、Harvard Business Review 等期刊与会议上。
 
Jermain 曾就读于德国维滕/赫尔德克大学以及美国麻省理工学院。在麻省理工学院期间,他是斯隆管理学院 MIT 集体智能中心与 MIT 媒体实验室的访问学生与研究人员。Jermain 在亚琛工业大学完成博士研究。他是 Causal Data Science Meeting 的联合创办人兼联合主席(causalscience.org)。

主题