尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DoWhy 因果图证伪指南:用条件独立性与置换检验验证 DAG 与数据的一致性

DoWhy 因果图证伪指南:用条件独立性与置换检验验证 DAG 与数据的一致性 机器学习数据分析【免费下载链接】dowhyDoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions. DoWhy is based on a unified language for causal inference, combining causal graphical models and potential outcomes frameworks.项目地址https://gitcode.com/gh_mirrors/do/dowhy点击查看免费下载在 DoWhy 中拿到一个用户给定的因果图DAG之后紧接着的核心问题是这张图对吗它与观测数据一致吗本文围绕 DoWhy 用户指南中的“Refuting a Causal Graph”index.rst一章系统讲解因果图证伪graph falsification的理论基础——局部马尔可夫条件LMC与 d-分离随后手把手演示用gcm.independence_test测试单条条件独立约束用falsify_graph对整张图做置换检验并深入源码剖析falsify_graph的两项检验LMC 与 TPa、结果对象EvaluationResult、因果最小性建议suggestions与边删除工具apply_suggestions。读完本文你将掌握一套可复用的“图-数据一致性验证”实操方案能在正式开展因果效应估计、干预分析等下游任务之前先验证手头因果图的可信度。1. 为什么需要“证伪”一张因果图因果图通常由领域专家手工构建或由因果发现算法学习而来它本质上是关于数据生成机制的一种假设。DoWhy 的建模流程中指定因果图是后续因果效应识别与估计的第一步因此图的正确性直接决定了下游结论的可靠性。“图是否正确”在数据层面有一个可操作的检验方式每个因果图都会在其节点上蕴含一组条件独立conditional independence约束。这些由图结构推导出的条件独立性称为局部马尔可夫条件Local Markov ConditionsLMCs。如果数据集无法满足图中蕴含的任一 LMC那么这张图就是无效的反之图通过检验并不能证明图正确只能说明它“没有被数据证伪”。以三个节点 X、Y、Z 为例它们可以构成三种基本图结构链ChainZ→X→Y叉ForkZ←X→Y碰撞ColliderZ→X←Y。前两种结构都蕴含“给定 X 时Z 与 Y 条件独立”第三种结构则蕴含“Z 与 Y 无条件独立但一旦以 X 为条件二者会变得相关”。这些条件的推导依赖 d-分离d-separation准则其核心思想是有向路径上的中间节点、以及叉结构中的汇合点会“阻塞”信息流动而碰撞节点则会“开启”信息流动。这里必须强调一个关键认识证伪测试只能否定错误图无法唯一确定正确图。例如用户给出 Chain 图我们可以检验数据是否满足 Z⫫Y|X若不满足则图无效。但即使满足真实图也可能是同样蕴含该独立性的 Fork 图。也就是说同一数据集可能同时与多张图同一马尔可夫等价类一致。因此当 Chain 图被证伪后用户可以修改为 Collider 图——此时条件独立约束恰好无法再否定它就可以放心进入下游分析。对于节点较多的图蕴含的条件独立检验会形成一个很长的列表DoWhy 可以自动枚举并运行这些检验。完整的示例可参考仓库中的笔记本 gcm_falsify_dag.ipynb。2. 单条独立性约束的检验gcm.independence_test在检验整张图之前先掌握最基本的单元——对单条条件独立性约束进行统计检验。2.1 构造带真实因果结构的数据假设我们有一个包含三个变量的数据集其中 X、Y、Z 的真实生成机制如下import numpy as np, pandas as pd X np.random.normal(loc0, scale1, size1000) Y 2 * X np.random.normal(loc0, scale1, size1000) Z 3 * Y np.random.normal(loc0, scale1, size1000) data pd.DataFrame(datadict(XX, YY, ZZ))2.2 检验链图蕴含的条件独立X⫫Z|Y假设用户提供的因果图是 X→Y→Z。这张图蕴含给定 Y 时X 与 Z 条件独立。用 DoWhy 的核方法独立性检验kernel dependence measure来验证import dowhy.gcm as gcm # 原假设Null hypothesis给定 Y 时X 与 Z 独立 p_value gcm.independence_test(X, Z, conditioned_onY, methodkernel) p_value # 0.48386151342564865若以 0.05 作为阈值只有当 p 值低于该阈值时才拒绝独立性。严格来说p 值高于阈值时我们“不能接受独立性只能不拒绝独立性”但在实践中上述结果通常被视为变量条件独立的证据——这与我们的预期一致因为数据正是按 X→Y→Z 生成的。2.3 检验碰撞图蕴含的独立性X⫫Z不给定 Y假设拿到的是错误图 X→Y←Z。该图把 Y 视为碰撞节点蕴含 X 与 Z无条件独立。于是我们调用同一个函数但省略第三个参数不对 Y 做条件化# 原假设X 与 Z 独立 p_value gcm.independence_test(X, Z, methodkernel) p_value # 0.0p 值0.0远低于 0.05 阈值可以明确拒绝独立性原假设——X 与 Z 实际相关。因此该图与数据不一致必须在用于因果任务前修正。这同样符合预期真实机制中 Z 依赖 Y、Y 依赖 X而我们在检验中并没有以 Y 为条件。2.4 independence_test 支持的四种检验方法从源码 dowhy/gcm/independence_test/init.py 可以看到independence_test(X, Y, conditioned_onNone, methodkernel, **kwargs)目前支持四种方法method 取值底层实现适用说明kernel默认kernel_basedKCIKernel-based Conditional Independence Testkernel.py非参数方法基于再生核希尔伯特空间可同时处理无条件和条件独立性检验基于 Zhang et al., UAI 2011 与 Gretton et al., NIPS 2007复用了 causal-learn 的 KCI 实现approx_kernelapprox_kernel_basedRCIT/RIT随机特征近似 置换检验的快速非参数方法适合大规模数据基于 Strobl et al., Journal of Causal Inference 2019regressionregression_based基于回归与 F 检验的条件独立性检验gcmgeneralised_cov_based基于广义协方差度量Generalised Covariance Measure基于 Shah Peters, Annals of Statistics 2018所有方法都以“条件独立性”为原假设返回 p 值。当传入conditioned_on时执行条件独立检验否则执行无条件独立检验X、Y、Z都支持多列数据矩阵多元情形。3. 整张图的自动证伪falsify_graph 置换检验对单条约束手工检验显然无法应对大型图。DoWhy 提供的falsify_graph会自动枚举图中蕴含的全部条件独立约束即全部 LMC并把这些检验组织成一次基于节点置换的统计检验。3.1 最小调用方式from dowhy.gcm.falsify import falsify_graph # causal_graph 是一个 networkx 有向无环图DiGraph result falsify_graph(causal_graph, data, show_progress_barFalse) print(result)输出即前文配图所示的表格化总结。falsify_graph的实现位于 dowhy/gcm/falsify.py默认同时运行两类检验并返回EvaluationResult对象dowhy/gcm/falsify.py。3.2 两项检验的含义检验一LMC局部马尔可夫条件。对图中每个节点 X检验“X 与其所有非后代节点在给定其父节点集合 PA(X) 时条件独立”是否成立即X ⟂ X_j ∈ NonDesc(X) | PA(X)实现对应validate_lmcdowhy/gcm/falsify.py它通过_get_parental_triples枚举所有“父三元组”并借助 joblib 并行执行条件独立检验同一测试的 p 值会被缓存在_PValuesMemory中复用因为独立性检验是对称的。随后对给定图的节点进行随机置换_PermuteNodes保持图结构不变、仅重命名节点见 dowhy/gcm/falsify.py得到一批随机图统计它们的 LMC 违反次数作为“随机基线”。如果给定图的 LMC 违反次数低于 5% 的最佳随机图显著性水平 0.05则不拒绝该图等价地报告 p 值衡量“给定图比随机图好多少”。检验二TPa基于 d-分离的 oracle 检验即“图是否可证伪”。假设给定图是正确的检验其他图与它共享多少个 LMC 违反——由于假设给定图为真其正确 LMC 数量即违反数为零。实现对应validate_tpadowhy/gcm/falsify.py它直接用 networkx 的 d-分离判定is_d_separator计算若随机置换图在给定图下违反了 0 条 d-分离约束则它与给定图处于同一个马尔可夫等价类MEC。若在显著性水平 0.05 下不足 5% 的随机图拥有零 LMC 违反说明该图蕴含的独立性足够“有辨识度”可以被证伪——反之如果大多数随机图都与给定图等价则任何数据都无法区分它们图不可证伪。EvaluationResult的判定逻辑dowhy/gcm/falsify.py如下falsifiedTrue且falsifiableTrue图可被证伪且 LMC 的 p 值 显著性水平 TPa 的 p 值即给定图明显不如随机基线拒绝该图两者均为FalseTPa 的 p 值 ≥ 显著性水平图本身不可证伪无法评价falsifiedFalse且falsifiableTrue图可证伪且通过了检验不拒绝。直接查询结果对象即可得到结论print(fGraph is falsifiable: {result.falsifiable}, Graph is falsified: {result.falsified})3.3 falsify_graph 的核心参数依据 dowhy/gcm/falsify.py 的签名关键参数如下参数默认值作用causal_graph必填networkx 的有向无环图节点名需与数据列名一致data必填pandas DataFrame各列对应图中节点independence_test/conditional_independence_testkernel_based分别用于无条件/条件独立性检验的可调用对象可替换为gcm、approx_kernel等significance_level0.05置换检验的显著性水平同时决定默认置换次数significance_ci0.05每次条件独立性检验自身的显著性水平n_permutationsNone随机置换次数None时取int(1 / significance_level)即 20 次设为-1则枚举全部 n! 种置换需要更精确的 p 值或绘制直方图时建议设为 100 或 1000show_progress_barNone跟随全局配置是否显示置换进度条默认读取 config.py 中的show_progress_barsn_jobsNone跟随全局配置并行任务数默认取config.default_n_jobs -1全部核心plot_histogramFalse是否绘制“随机图违反数分布 vs 给定图违反数”的直方图即前文配图plot_kwargs{}传给plot_evaluation_results的额外绘图参数suggestionsFalse是否额外运行因果最小性检验并给出“应删除哪条边”的建议allow_data_subsetTrueTrue时允许数据只覆盖部分节点False时若缺少任一节点数据则抛出ValueError两点实用提醒来自源码行为若图中某个节点在数据中缺失_compute_p_valuedowhy/gcm/falsify.py会跳过该测试并发出警告当所有测试都被跳过时EvaluationResult会显示 “Cannot be evaluated!”falsified与falsifiable均为None对应测试 tests/gcm/test_falsify.py。数据列与节点名必须完全一致否则同样会因找不到数据而跳过测试。4. 实战先用合成数据验证再用真实数据检验仓库示例笔记本 gcm_falsify_dag.ipynb 给出了完整的实战流程配套数据与图文件位于 docs/source/example_notebooks/ 目录下falsify_g_true.gml、falsify_data_nonlinear.csv、falsify_sachs.gml。4.1 步骤一用合成数据验证“正确图不被拒绝”import dowhy dowhy.enable_notebook_rendering() import numpy as np, pandas as pd, networkx as nx from dowhy.gcm.falsify import FalsifyConst, falsify_graph, plot_local_insights, run_validations, apply_suggestions from dowhy.gcm.util.general import set_random_seed set_random_seed(0) # 加载示例图与非线性 SCM 数据 g_true nx.read_gml(falsify_g_true.gml) data pd.read_csv(falsify_data_nonlinear.csv) # 对真实 DAG 做验证约 20 秒 result falsify_graph(g_true, data, plot_histogramTrue) print(result) print(fGraph is falsifiable: {result.falsifiable}, Graph is falsified: {result.falsified})如预期真实 DAG 不会被拒绝LMC 与 TPa 两条直方图与给定图的虚线标记基本重叠随机基线中没有或极少置换图能比真实图更好。4.2 步骤二模拟“领域专家”的错误图并被证伪模拟一个只掌握部分边、既删了真边又加了错边的图g_given g_true.copy() g_given.add_edges_from([(X4, X1)]) # 加入错误边 X4 - X1 g_given.remove_edge(X2, X0) # 删除真实边 X2 - X0 result falsify_graph(g_given, data, plot_histogramTrue) print(result)此时会出现两个现象给定图比真实图多违反 2 条 LMC且大量随机置换图与给定图拥有相同或更少的 LMC 违反——LMC 的 p 值明显升高。按默认显著性水平 0.05该图被拒绝。4.3 步骤三定位违反 LMC 的节点用plot_local_insights将违反 LMC 的节点在图上高亮标红print(Violations of LMCs) plot_local_insights(g_given, result, methodFalsifyConst.VALIDATE_LMC)底层对应plot_local_insightsdowhy/gcm/falsify.py对 LMC 方法将发生违反的节点 X即 X 与其非后代不再条件独立染成红色直接可视化问题节点。4.4 步骤四大规模真实数据——Sachs 蛋白网络Sachs et al. (2005) 的蛋白信号网络数据包含 11 个节点、7466 个样本。由于样本量大核方法检验过慢笔记本改用广义协方差度量GCM检验并以 sklearn 的梯度提升回归树作为回归模型from sklearn.ensemble import GradientBoostingRegressor from dowhy.gcm.ml import SklearnRegressionModel from dowhy.gcm.independence_test.generalised_cov_measure import generalised_cov_based def create_gradient_boost_regressor(**kwargs) - SklearnRegressionModel: return SklearnRegressionModel(GradientBoostingRegressor(**kwargs)) def gcm(X, Y, ZNone): return generalised_cov_based(X, Y, ZZ, prediction_model_Xcreate_gradient_boost_regressor, prediction_model_Ycreate_gradient_boost_regressor) data_sachs pd.read_csv(falsify_sachs.gml) # 实际加载方式见笔记本 result_sachs falsify_graph(g_sachs, data_sachs, n_permutations100, independence_testgcm, conditional_independence_testgcm, plot_histogramTrue) print(result_sachs)对 11 个节点枚举全部 11! 种置换不现实因此显式设置n_permutations100。结果显示共识 DAG 既“有信息量”100 个置换中 0 个与它同处一个 MEC又显著优于随机图。值得注意的是给定图的 LMC 违反数高于 CI 检验在默认significance_ci0.05下的预期 I 类错误率——这说明“违反数超过 5% 就拒绝图”这种朴素做法会误伤真实图必须使用置换检验的相对比较这正是falsify_graph的价值所在。5. 从证伪走向修复因果最小性建议与边删除falsify_graph并不止步于“拒绝/不拒绝”还可以给出具体的修复建议——哪些边应当删除。5.1 开启 suggestions 获得边级建议result falsify_graph(g_given, data, plot_histogramTrue, suggestionsTrue) print(result)开启suggestionsTrue后输出会额外出现一个Suggestions区块见 dowhy/gcm/falsify.py 的表格生成逻辑。建议来源于**因果最小性causal minimality**检验validate_cmdowhy/gcm/falsify.py依据 Peters, Janzing Schölkopf, Elements of Causal Inference, 2017 的 Proposition 6.36对每个有父节点的节点 X 及其每个父节点 P检验“给定 X 的其他父节点时P 与 X 是否独立”——若独立则边 P→X 可能是多余的。示例中该检验能正确建议删除领域专家错误添加的边 X4→X1。5.2 可视化并应用建议# 在图上高亮应删除的边 plot_local_insights(g_given, result, methodFalsifyConst.VALIDATE_CM) # 自动应用全部建议返回图的副本不会原地修改原图 g_given_pruned apply_suggestions(g_given, result)apply_suggestionsdowhy/gcm/falsify.py会复制输入图然后删除所有被判定为“多余”的边如果某些边无论如何都要保留可以通过edges_to_keep[(X3, X4)]指定豁免列表。6. 相关参考refute_causal_structure 与进一步阅读除了falsify_graphDoWhy 的 gcm 模块还提供了另一个图结构验证入口refute_causal_structuredowhy/gcm/validation.py。它的做法是逐节点执行两类检验边依赖检验edge dependence test检验每个节点与其每个父节点是否确实相关原假设为独立局部马尔可夫检验local markov test检验每个节点与其非后代在给定父节点时的条件独立性原假设为条件独立。所有 p 值会统一做多重比较校正默认fdr_bh即 Benjamini-Hochberg 的 FDR 控制可通过fdr_control_method修改最终返回RejectionResult.REJECTED / NOT_REJECTED及逐节点的 p 值、校正后 p 值和success标记。注意它只验证图结构本身马尔可夫性质不包含falsify_graph那种“与随机置换图比较”的可证伪性判断两套 API 可互为补充。本文讨论的主题在用户指南中归属于 modeling_causal_relations/refuting_causal_graph/ 目录其中index.rstLMC 与三种基本图结构的理论基础independence_tests.rst单条独立性检验的完整示例refute_causal_structure.rstfalsify_graph整图检验与结果解读。完整的端到端示例请见 gcm_falsify_dag.ipynb相关测试正确/错误链、碰撞、单节点、单边、分类数据、因果最小性等场景位于 tests/gcm/test_falsify.py可作为理解各校验函数行为的补充证据。7. 小结图证伪的实践要点证伪而非验证通过数据只能“否定”错误图不能“证明”正确图同一数据集可能同时与多张图一致马尔可夫等价类。因此把falsify_graph当作下游分析的“安检门”而非“认证机构”。理解两项检验的分工LMC 检验衡量“给定图是否显著优于随机置换图”TPa 检验衡量“给定图蕴含的独立性是否有足够辨识度可证伪性”。两者结合才能避免“无法评价”或“误拒真实图”。选择合适独立性检验数据规模较小时用默认kernel规模较大或希望更快时可换gcm广义协方差度量或approx_kernelRCIT并可按需自定义回归模型。善用修复工具suggestionsTrue触发因果最小性建议apply_suggestions可自动剪枝配合edges_to_keep保留已知正确的边plot_local_insights帮助定位违反 LMC 的节点或建议删除的边。注意数据与图的对应关系节点名必须与 DataFrame 列名一致数据缺失时测试会被跳过极端情况下结果将无法评价can_evaluateFalse。一张与数据不一致的因果图会让后续的效应估计、反事实分析全部失真。在投入昂贵的下游分析之前先用本文的流程对图做一次“证伪体检”是因果推断实践中成本最低、收益最直接的一步。赞分享机器学习数据分析【免费下载链接】dowhyDoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions. DoWhy is based on a unified language for causal inference, combining causal graphical models and potential outcomes frameworks.项目地址https://gitcode.com/gh_mirrors/do/dowhy点击查看免费下载相关推荐DoWhy GCM 条件独立性检验全解independence_test 包的四种方法与实现原理DoWhy GCM 条件独立性检验全解independence_test 包的四种方法与实现原理 DoWhy 的 gcm 子包提供了用于因果图验证falsi机器学习数据分析Evidently数据一致性多源数据一致性检查与验证实战Evidently数据一致性多源数据一致性检查与验证实战 还在为机器学习项目中数据不一致问题头疼吗数据漂移、格式错误、值域异常等问题常常导致模型性能下降。E人工智能大模型模型评测AI 评测机器学习MLOpsLLMOps数据可视化NetworkX D-Separation 完全指南基于 DAG 的条件独立性检验与最小 d-separator 求解NetworkX D Separation 完全指南基于 DAG 的条件独立性检验与最小 d separator 求解 D Separationd 分离是图计算数据分析科学计算上一篇Security Onion终极贡献指南从新手到核心开发者的完整路径下一篇MMTracking项目教程自定义多目标跟踪模型组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表