邢台163信息网,珠海seo推广,周口集团网站建设,12380网站建设情况的报告在机器学任务中#xff0c;确定变量间的因果关系#xff08;causality#xff09;可能是一个具有挑战性的步骤#xff0c;但它对于建模工作非常重要。本文将总结有关贝叶斯概率#xff08;Bayesian probabilistic#xff09;因果模型#xff08;causal models#xff0…在机器学任务中确定变量间的因果关系causality可能是一个具有挑战性的步骤但它对于建模工作非常重要。本文将总结有关贝叶斯概率Bayesian probabilistic因果模型causal models的概念然后提供一个Python实践教程演示如何使用贝叶斯结构学习来检测因果关系。
背景
在许多领域如预测、推荐系统、自然语言处理等使用机器学习技术已成为获取有用观察和进行预测的标准工具。
虽然机器学习技术可以实现良好的性能但提取与目标变量的因果关系并不直观。换句话说就是哪些变量对目标变量有直接的因果影响 机器学习的一个分支是贝叶斯概率图模型(Bayesian probabilistic graphical models)也称为贝叶斯网络Bayesian networks, BN可用于确定这些因果因素。 图片 在我们深入讨论因果模型的技术细节之前让我们先复习一些术语包括相关性(correlation)和关联性(association)。 注意相关性或关联性并不等同于因果关系。换句话说两个变量之间的观察到的关系并不一定意味着一个导致了另一个。 从技术上讲相关性指的是两个变量之间的线性关系而关联性则指的是两个或更多变量之间的任何关系。而因果关系则意味着一个变量通常称为预测变量或自变量导致另一个变量通常称为结果变量或因变量。扩展阅读因果机器学习的前沿进展综述 接下来我将通过示例简要描述相关性和关联性。 1.1. 相关性 皮尔逊相关系数(Pearson correlation coefficient)是最常用的相关系数。系数强度由r表示取值区间-1到1。 在使用相关性时有三种可能的结果 正相关两个变量之间存在一种关系即两个变量同时朝同一方向移动。 负相关两个变量之间存在一种关系即一个变量增加与另一个变量减少相关联。 无相关性当两个变量之间没有关系时。
正相关的一个示例如图 1 所示图中展示了巧克力消费与每个国家的诺贝尔奖获得者数量之间的关系。 图片 图1巧克力消费与诺贝尔奖获得者之间的相互关系 巧克力消费可能意味着诺贝尔奖获得者增加。或者反过来诺贝尔奖获得者的增加同样可能导致巧克力消费增加。尽管存在强烈的相关性但更有可能的是未观察到的变量如社会经济地位或教育系统质量可能导致巧克力消费和诺贝尔奖获得者数量的增加。 换句话说我们仍然不知道这种关系是否是因果关系。但这并不意味着相关性本身没有用处它只是有着不同的目的。 相关性本身并不意味着因果关系因为统计关系并不能唯一限制因果关系。 1.1.2. 关联性 当我们谈论关联性时我们指的是一个变量的某些值倾向于与另一个变量的某些值共同出现。 从统计学的角度来看有许多关联性测量方法例如卡方检验(chi-square test)、费舍尔精确检验(Fisher exact test)、超几何检验(hypergeometric test)等。它们通常用于其中一个或两个变量为有序(ordinal)或名义(nominal)变量的情况。 注意相关性是一个技术术语而关联性不是因此在统计学中对其含义并不总是一致的。这意味着在使用这些术语时明确说明其含义总是一个好的做法。 为了举例说明我将使用超几何检验来演示是否存在两个变量之间的关联性使用泰坦尼克号数据集。 泰坦尼克号数据集在许多机器学习示例中都有使用众所周知性别女性是生存的一个很好的预测因子。让我演示一下如何计算幸存和女性之间的关联性。 首先安装 bnlearn 库并仅加载泰坦尼克号数据集。 问女性幸存的概率是多少 图片 零假设幸存与性别之间没有关系。 超几何检验使用超几何分布来测量离散概率分布的统计显著性。在这个例子中 是总体大小891 是总体中成功状态的数量342 是样本大小/抽样次数314 是样本中成功的数量233。 图片 方程 1使用超几何检验测试幸存与女性之间的关联性
在 的显著性水平下我们可以拒绝零假设因此可以说幸存和女性之间存在统计显著的关联。 注意关联性本身并不意味着因果关系。我们需要区分边际关联(marginal)和条件关联(conditional)。后者是因果推断的关键构建模块。 2. 因果关系 什么是因果关系causality 因果关系意味着一个independent变量导致另一个dependent变量并由 Reichenbach1956如下所述 如果两个随机变量 和 在统计上相关 那么要么a 导致 b 导致 或者c存在一个第三个变量 同时导致 和 。此外给定 的条件下 和 变得独立即 。 这个定义被纳入贝叶斯图模型中。 贝叶斯图模型又称贝叶斯网络、贝叶斯信念网络、Bayes Net、因果概率网络和影响图。都是同一技术不同的叫法。 为了确定因果关系我们可以使用贝叶斯网络BN。 让我们从图形开始并可视化 Reichenbach 所描述的三个变量之间的统计依赖关系参见图 2。节点对应变量有向边箭头表示依赖关系或条件分布。 图片 图 2有向无环图DAG编码条件独立性。a、b、c是等价类。a、b级联c共同父节点d是具有 V 结构的特殊类别
可以创建四个图a、b级联c共同父节点和dV 结构这些图构成了贝叶斯网络的基础。 但是我们如何确定什么是造成什么的原因(how can we tell what causes what?) 确定因果关系的概念思想是通过将一个节点保持不变然后观察其影响来确定因果关系的方向即哪个节点影响哪个节点。 举个例子让我们看一下图 2 中的有向无环图 DAGa它描述了 由 引起 由 引起。如果我们现在将 保持不变如果这个模型是正确的 不应该发生变化。每个贝叶斯网络都可以用这四个图来描述并且通过概率论参见下面的部分我们可以将这些部分组合起来。 需要注意的是贝叶斯网络是有向无环图Directed Acyclic Graph, DAG而 DAG 是具有因果性的。这意味着图中的边是有向的并且没有反馈循环无环。 2.1. 概率论 概率论或者更具体地说贝叶斯定理或贝叶斯规则构成了贝叶斯网络的基础。 贝叶斯规则用于更新模型信息数学上表示如下方程式 图片 方程式由四个部分组成: 后验概率(posterior probability)是给定 发生的概率。 条件概率(conditional probability)或似然是在假设成立的情况下证据发生的概率。这可以从数据中推导出来。 我们的先验(prior)信念是在观察到证据之前假设的概率。这也可以从数据或领域知识中推导出来。 最后边际(marginal)概率描述了在所有可能的假设下新证据发生的概率需要计算。如果您想了解更多关于分解的概率分布或贝叶斯网络的联合分布的详细信息请阅读这篇博客[6]。 3. 贝叶斯结构学习用于估计 DAG 通过结构学习我们希望确定最能捕捉数据集中变量之间因果依赖关系的图结构。 换句话说什么样的 DAG 最适合数据 一种朴素的方法是简单地创建所有可能的图结构组合即创建成十个、几百个甚至几千个不同的 DAG直到所有组合都耗尽为止。 然后可以根据数据的适应度对每个 DAG 进行评分。 最后返回得分最高的 DAG。 在仅有变量X的情况下可以创建如图 2 所示的图形以及更多的图形因为不仅可以是 XZY图 2a还可以是 ZXY 等等。变量X可以是布尔值True 或 False也可以有多个状态。 DAG 的搜索空间在最大化得分的变量数量上呈指数增长。这意味着在大量节点的情况下穷举搜索是不可行的因此已经提出了各种贪婪策略来浏览 DAG 空间。 通过基于优化的搜索方法可以浏览更大的 DAG 空间。这种方法需要一个评分函数和一个搜索策略。 常见的评分函数是给定训练数据的结构的后验概率例如BIC或BDeu。 BIC是贝叶斯信息准则Bayesian Information Criterion的缩写。它是一种用于模型选择的统计量可以用于比较不同模型的拟合能力。BIC值越小表示模型越好。在贝叶斯网络中BIC是一种常用的评分函数之一用于评估贝叶斯网络与数据的拟合程度。 BDeu是贝叶斯-狄利克雷等价一致先验Bayesian-Dirichlet equivalent uniform prior的缩写。它是一种常用的评分函数之一用于评估贝叶斯网络与数据的拟合程度。BDeu评分函数基于贝叶斯-狄利克雷等价一致先验该先验假设每个变量的每个可能状态都是等可能的。 在我们开始示例之前了解何时使用哪种技术总是很好的。在搜索整个 DAG 空间并找到最适合数据的图形的过程中有两种广泛的方法。 基于评分的结构学习
基于约束的结构学习 3.1. 基于评分的结构学习 基于评分的方法有两个主要组成部分 搜索算法用于优化所有可能的 DAG 搜索空间例如 ExhaustiveSearch、Hillclimbsearch、Chow-Liu 等。 评分函数指示贝叶斯网络与数据的匹配程度。常用的评分函数是贝叶斯狄利克雷分数如 BDeu 或 K2以及贝叶斯信息准则BIC也称为 MDL。 下面描述了四种常见的基于评分的方法 ExhaustiveSearch顾名思义对每个可能的 DAG 进行评分并返回得分最高的 DAG。这种搜索方法仅适用于非常小的网络并且阻止高效的局部优化算法始终找到最佳结构。因此通常无法找到理想的结构。然而如果只涉及少数节点即少于 5 个左右启发式搜索策略通常会产生良好的结果。 Hillclimbsearch 是一种启发式搜索方法可用于使用更多节点的情况。HillClimbSearch 实施了一种贪婪的局部搜索从 DAG“start”默认为断开的 DAG开始通过迭代执行最大化增加评分的单边操作。搜索在找到局部最大值后终止。 Chow-Liu 算法是一种特定类型的基于树的方法。Chow-Liu 算法找到最大似然树结构其中每个节点最多只有一个父节点。通过限制为树结构可以限制复杂性。 Tree-augmented Naive BayesTAN算法也是一种基于树的方法可用于建模涉及许多不确定性的庞大数据集的各种相互依赖特征集。 3.2. 基于约束的结构学习 一种不同但相当直观的构建 DAG 的方法是使用假设检验如卡方检验统计量来识别数据集中的独立性。 这种方法依赖于统计检验和条件假设以学习模型中变量之间的独立性。 卡方检验的 值是观察到的计算卡方统计量的概率假设空设为 和 在给定 的条件下是独立的。这可以用于在给定显著性水平的情况下进行独立判断。 约束性方法的一个示例是 PC 算法它从一个完全连接的图开始并根据测试的结果删除边如果节点是独立的直到达到停止准则。 4. 实践基于bnlearn 库 下面介绍Python中的学习贝叶斯网络图形结构的库——bnlearn。 bnlearn能解决一些挑战如 结构学习给定数据估计捕捉变量之间依赖关系的 DAG。
参数学习给定数据和 DAG估计各个变量的条件概率分布。
推断给定学习的模型确定查询的精确概率值。 bnlearn 相对于其他贝叶斯分析实现有如下优势 基于 pgmpy 库构建
包含最常用的贝叶斯管道
简单直观
开源
详细文档
4.1. 在洒水器数据集中进行结构学习 让我们从一个简单而直观的示例开始以演示结构学习的工作原理。 假设你在后院安装了一个洒水系统并且在过去的 1000 天里你测量了四个变量每个变量有两个状态雨是或否多云是或否洒水系统开启或关闭和湿草是或否。 下面导入 bnlearn 库加载洒水器数据集并确定哪个 DAG 最适合该数据。 使用 bnlearn 库用几行代码就能确定因果关系。 请注意洒水器数据集已经过处理没有缺失值所有值都处于 1 或 0 的状态。 图片 图片 图 3洒水器系统的最佳 DAG 示例。它表示以下逻辑草地潮湿的概率取决于洒水器和雨水。洒水器打开的概率取决于多云的状态。下雨的概率取决于多云的状态 这样我们有了如图 3 所示的学习到的结构。检测到的 DAG 由四个通过边连接的节点组成每条边表示一种因果关系。
湿草的状态取决于两个节点即雨水和洒水器
雨水的状态由多云的状态决定
而洒水器的状态也由多云的状态决定。 这个 DAG 表示了因式分解的概率分布其中 S 是洒水器的随机变量R 是雨水的随机变量G 是湿草的随机变量C 是多云的随机变量。 通过检查图形很快就会发现模型中唯一的独立变量是 C。其他变量都取决于多云、下雨和/或洒水器的概率。 一般来说贝叶斯网络的联合分布是每个节点在给定其父节点的条件下的条件概率的乘积: bnlearn 在结构学习方面的默认设置是使用hillclimbsearch方法和BIC评分。 值得注意的是可以指定不同的方法和评分类型。请参考下面的示例以指定搜索和评分类型
‘hc’ or ‘hillclimbsearch’
model_hc_bic bn.structure_learning.fit(df, methodtype‘hc’, scoretype‘bic’) model_hc_k2 bn.structure_learning.fit(df, methodtype‘hc’, scoretype‘k2’) model_hc_bdeu bn.structure_learning.fit(df, methodtype‘hc’, scoretype‘bdeu’)
‘ex’ or ‘exhaustivesearch’
model_ex_bic bn.structure_learning.fit(df, methodtype‘ex’, scoretype‘bic’) model_ex_k2 bn.structure_learning.fit(df, methodtype‘ex’, scoretype‘k2’) model_ex_bdeu bn.structure_learning.fit(df, methodtype‘ex’, scoretype‘bdeu’)
‘cs’ or ‘constraintsearch’
model_cs_k2 bn.structure_learning.fit(df, methodtype‘cs’, scoretype‘k2’) model_cs_bdeu bn.structure_learning.fit(df, methodtype‘cs’, scoretype‘bdeu’) model_cs_bic bn.structure_learning.fit(df, methodtype‘cs’, scoretype‘bic’)
‘cl’ or ‘chow-liu’ (requires setting root_node parameter)
model_cl bn.structure_learning.fit(df, methodtype‘cl’, root_node‘Wet_Grass’)
尽管洒水器数据集的检测到的 DAG 具有启示性并显示了数据集中变量的因果依赖关系但它并不能让你提出各种问题例如 如果洒水器关闭草地湿润的概率有多大
如果洒水器关闭且多云下雨的概率有多大
在洒水器数据集中根据你对世界的了解和逻辑思考结果可能是显而易见的。但是一旦你拥有更大、更复杂的图形可能就不再那么明显了。 通过所谓的推断我们可以回答“如果我们做了 会怎样”类型的问题这些问题通常需要进行控制实验和明确的干预才能回答。 4.2. 如何进行推断 要进行推断我们需要两个要素DAG 和条件概率表Conditional Probabilistic Tables, CPTs。 此时我们已经将数据存储在数据框df中并且已经计算出描述数据结构的 DAG。需要使用参数学习计算 CPTs以定量地描述每个节点与其父节点之间的统计关系。 让我们首先进行参数学习然后再回到推断的过程中。 4.2.1. 参数学习 参数学习是估计条件概率表CPTs的值的任务。 bnlearn 库支持离散和连续节点的参数学习 最大似然估计是使用变量状态出现的相对频率进行的自然估计。在对贝叶斯网络进行参数估计时数据不足是一个常见问题最大似然估计器存在对数据过拟合的问题。换句话说如果观察到的数据对于基础分布来说不具有代表性或者太少最大似然估计可能会相差甚远。例如如果一个变量有 3 个可以取 10 个状态的父节点那么状态计数将分别针对 个父节点配置进行。这使得最大似然估计对学习贝叶斯网络参数非常脆弱。减轻最大似然估计过拟合的一种方法是贝叶斯参数估计。 贝叶斯估计从已存在的先验 CPTs 开始这些 CPTs 表示在观察到数据之前我们对变量的信念。然后使用观察数据的状态计数来更新这些“先验”。可以将先验视为伪状态计数在归一化之前将其添加到实际计数中。一个非常简单的先验是所谓的 K2 先验它只是将“1”添加到每个单独状态的计数中。一个更明智的先验选择是 BDeu贝叶斯狄利克雷等效均匀先验。 我继续使用洒水器数据集来学习其参数并检测条件概率表CPTs。 要学习参数我们需要一个有向无环图DAG和一个具有完全相同变量的数据集。 思路是将数据集与 DAG 连接起来。在之前的示例中我们已经计算出了 DAG图 3。 图片 如果你已经到达这一点您已经使用最大似然估计MLE基于 DAG 和输入数据集 df 计算了 CPTs图 4。请注意为了清晰起见CPTs 在图 4 中包含在内。 图片 图 4使用最大似然估计进行参数学习推导的 CPTs 使用 MLE 计算 CPTs 非常简单让我通过示例来演示一下手动计算节点 Cloudy 和 Rain 的 CPTs。
Examples to illustrate how to manually compute MLE for the node Cloudy and Rain:# Compute CPT for the Cloudy Node:# This node has no conditional dependencies and can easily be computed as following:# P(Cloudy0)sum(df[‘Cloudy’]0) / df.shape[0] # 0.488# P(Cloudy1)sum(df[‘Cloudy’]1) / df.shape[0] # 0.512# Compute CPT for the Rain Node:# This node has a conditional dependency from Cloudy and can be computed as following:# P(Rain0 | Cloudy0)sum( (df[‘Cloudy’]0) (df[‘Rain’]0) ) / sum(df[‘Cloudy’]0) # 394/488 0.807377049# P(Rain1 | Cloudy0)sum( (df[‘Cloudy’]0) (df[‘Rain’]1) ) / sum(df[‘Cloudy’]0) # 94/488 0.192622950# P(Rain0 | Cloudy1)sum( (df[‘Cloudy’]1) (df[‘Rain’]0) ) / sum(df[‘Cloudy’]1) # 91/512 0.177734375# P(Rain1 | Cloudy1)sum( (df[‘Cloudy’]1) (df[‘Rain’]1) ) / sum(df[‘Cloudy’]1) # 421/512 0.822265625
请注意条件依赖关系可能基于有限的数据点。例如 基于 91 个观测结果。如果 Rain 有更多的状态和/或更多的依赖关系这个数字可能会更低。更多的数据是否是解决方案也许是也许不是。只要记住即使总样本量非常大由于状态计数是针对每个父节点的配置进行条件计数这也可能导致分段。与 MLE 方法相比查看 CPT 与之间的差异。 图片 4.2.2. 在 Sprinkler 数据集上进行推理 进行推理需要贝叶斯网络具备两个主要组成部分描述数据结构的有向无环图DAG和描述每个节点与其父节点之间的统计关系的条件概率表CPT。到目前为止您已经拥有数据集使用结构学习计算了 DAG并使用参数学习估计了 CPT。现在可以进行推理了 在推理中我们使用一种称为变量消除的过程来边缘化变量。变量消除是一种精确的推理算法。通过简单地将求和替换为最大函数它还可以用于确定具有最大概率的网络状态。不足之处是对于大型的贝叶斯网络它可能在计算上是棘手的。在这些情况下可以使用基于采样的近似推理算法如 Gibbs 采样或拒绝采样 [7]。 使用 bnlearn我们可以进行如下的推理 图片 图片 现在我们已经得到了我们的问题的答案 如果喷灌系统关闭草坪潮湿的可能性有多大P(Wet_grass1 | Sprinkler0) 0.51 如果喷灌系统关闭并且天阴有下雨的可能性有多大P(Rain1 | Sprinkler0, Cloudy1) 0.663 4.3. 我如何知道我的因果模型是正确的 如果仅使用数据来计算因果图很难完全验证因果图的有效性和完整性。然而有一些解决方案可以帮助增加对因果图的信任。例如可以对变量集之间的某些条件独立性或依赖性关系进行经验性测试。如果它们在数据中不存在则表明因果模型的正确性 。或者可以添加先前的专家知识例如 DAG 或 CPT以在进行推理时增加对模型的信任。 5. 讨论 在本文中涉及了一些关于为什么相关性或关联不等于因果性以及如何从数据向因果模型的转变使用结构学习的概念。 贝叶斯技术的优势总结如下 后验概率分布的结果或图形使用户能够对模型预测做出判断而不仅仅是获得单个值作为结果。
可以将领域/专家知识纳入到 DAG 中并在不完整信息和缺失数据的情况下进行推理。这是可能的因为贝叶斯定理基于用证据更新先验项。
具有模块化的概念。
通过组合较简单的部分来构建复杂系统。
图论提供了直观的高度交互的变量集。
概率论提供了将这些部分组合在一起的方法。 然而贝叶斯网络的一个弱点是寻找最佳 DAG 在计算上很耗时因为必须对所有可能的结构进行详尽搜索。 穷举搜索的节点限制可以达到约 15 个节点但也取决于状态的数量。如果有更多的节点就需要使用具有评分函数和搜索算法的替代方法。尽管如此要处理具有数百甚至数千个变量的问题需要使用基于树或基于约束的方法并使用变量的黑名单/白名单。这种方法首先确定顺序然后找到该顺序的最佳 BN 结构。这意味着在可能的排序搜索空间上进行工作这比网络结构空间小得多。 确定因果关系可能是一项具有挑战性的任务但 bnlearn 库旨在解决其中一些挑战如结构学习、参数学习和推理。它还可以推导出整个图的拓扑排序或比较两个图。