人类思维具有将原因与特定事件联系起来的能力,我们不断地联系导致特定效果的事件链。神经心理学将这种认知能力称为因果推理。计算机科学和经济学研究一种特定形式的因果推理,称为因果推理,侧重于探索两个观察到的变量之间的关系。多年来,机器学习产生了许多因果推理的方法,但是在没有A / B测试的情况下这些基于模式识别和相关分析的传统机器学习方法不足以进行因果推理,这导致它们仍然难以在主流应用中使用。最近,微软研究院开源了DoWhy,一个专注因果思考和分析的框架。
就像机器学习库为预测所做的那样,“DoWhy”是一个旨在激发因果思考和分析的Python库。DoWhy为因果推理方法提供了统一的界面,并自动测试了许多假设,从而使非专家可以进行推理。
为什么需要因果推断
与监督学习不同,因果推断取决于对未观察量的估计。预测模型揭示了连接观察数据中输入和结果的模式。但是,为了进行干预,我们需要估计从当前值更改输入值的各种效果,因为没有数据存在。这些涉及估计反事实的问题在决策方案中很常见。
它会起有效吗?对系统的拟议更改是否会改善人们的结果?它为什么有效?是什么导致了系统结果的变化?我们应该做什么?系统的哪些变化可能会改善人们的成果?总体效果如何?系统如何与人类行为相互作用?系统建议对人们活动的影响是什么?回答这些问题需要因果推理。虽然存在许多用于因果推理的方法,但很难比较它们的假设和结果的稳健性。
微软的DoWhy这一基于Python的因果推理和分析库,试图简化机器学习应用中因果推理的采用。受到Judea Pearl的因果推理的微积分的启发,DoWhy在一个简单的编程模型下结合了几种因果推理方法,消除了传统方法的许多复杂性。
什么是DoWhy
DoWhy除了为常见的因果推断方法提供一个程序设计界面,DoWhy的设计还是为了显示常被忽略的因果分析假设。所以,DoWhy的特点之一就是会让潜在的假设更容易理解。另外,DoWhy可以进行敏感度分析和其他鲁棒性检查。我们的目的是让人们关注他们在对因果推断做假设时的思考而不是其中的细节。
总结一下,DoWhy为因果推理模型的实施做出了三项重要贡献。
提供将给定问题建模为因果图的原则方法,以便明确所有假设。为许多流行的因果推理方法提供统一的界面,结合图形模型的两个主要框架和潜在的结果。如果可能,自动测试假设的有效性,并评估估计对违规的稳健性。从概念上讲,DoWhy是根据两个指导原则创建的:明确要求因果假设,并测试对违反这些假设的估计的稳健性。换句话说,DoWhy将因果效应的识别与其相关性的估计分开,这使得能够推断出非常复杂的因果关系。
为了实现其目标,DoWhy通过四个基本步骤对工作流中的任何因果推断问题进行建模:模型,识别,估计和反驳。
模型: DoWhy使用因果关系图来模拟每个问题。当前版本的DoWhy支持两种图形输入格式:gml(首选)和点。该图可能包括变量中因果关系的先验知识,但DoWhy没有做出任何直接的假设。识别:使用输入图,DoWhy根据图形模型找到识别所需因果效果的所有可能方法。它使用基于图形的标准和do-calculus来找到可以找到可以识别因果效应的表达式的潜在方法估计: DoWhy使用统计方法(如匹配或工具变量)估算因果效应。当前版本的DoWhy支持基于倾向的分层或倾向得分匹配的估计方法,这些方法侧重于估计治疗分配以及侧重于估计响应面的回归技术。验证:最后,DoWhy使用不同的稳健性方法来验证因果效应的有效性。如何使用DoWhy
开发人员可以使用以下命令安装Python模块来开始使用DoWhy:
python setup.py install
DoWhy支持Python 3+,它需要以下包:
numpySciPyscikit-learnpandasnetworkx(用于分析因果图)matplotlib(用于一般情节绘图)sympy(用于呈现符号表达式)与任何其他机器学习程序一样,DoWhy应用程序的第一步是加载数据集。在这个例子中,假设我们试图推断出不同医学治疗和由以下数据集代表的结果之间的相关性。
Treatment Outcome w00 2.964978 5.858518 -3.1733991 3.696709 7.945649 -1.9369952 2.125228 4.076005 -3.9755663 6.635687 13.471594 0.7724804 9.600072 19.577649 3.922406
DoWhy依靠pandas数据帧来捕获输入数据:
rvar = 1 if np.random.uniform() >0.5 else 0 data_dict = dowhy.datasets.xy_dataset(10000, effect=rvar, sd_error=0.2) df = data_dict['df']print(df[["Treatment", "Outcome", "w0"]].head())
在这一点上,我们只需要四个步骤来推断变量之间的因果关系。这四个步骤对应于DoWhy的四个操作:模型,估计,推断和反驳。我们可以将问题建模为因果图:
model= CausalModel( data=df, treatment=data_dict["treatment_name"], outcome=data_dict["outcome_name"], common_causes=data_dict["common_causes_names"], instruments=data_dict["instrument_names"])model.view_model(layout="dot")from IPython.display import Image, displaydisplay(Image(filename="causal_model.png"))
下一步是确定图中的因果关系:
identified_estimand = model.identify_effect()
现在我们可以估计因果效应并确定估计是否正确。此示例使用线性回归来简化:
estimate = model.estimate_effect(identified_estimand, method_name="backdoor.linear_regression")# Plot Slope of line between treamtent and outcome =causal effectdowhy.plotter.plot_causal_effect(estimate, df[data_dict["treatment_name"]], df[data_dict["outcome_name"]])
最后,我们可以使用不同的技术来反驳因果估计:
res_random = model.refute_estimate(identified_estimand,estimate,method_name = “random_common_cause”)
DoWhy是一个非常简单和有用的框架来实现因果推理模型。当前版本可以用作独立库,也可以集成到流行的深度学习框架中,如TensorFlow或PyTorch。单一框架下的多种因果推理方法和四步简单编程模型的结合使得DoWhy非常易于使用数据科学家来解决因果推理问题。目前可以在Github上搜索DoWhy,在那里你可以找到更多细节,有兴趣的朋友不去看看。