首页/新闻资讯/正文详情

DoWhy 的 dowhy.graph_learners 包:因果图发现 API、工厂式动态加载机制与迁移指引

发布时间:2026/9/25 14:18:55 来源:云帆数科 栏目:资讯中心
DoWhy 的 dowhy.graph_learners 包:因果图发现 API、工厂式动态加载机制与迁移指引
机器学习数据分析【免费下载链接】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 的dowhy.graph_learners包展开基于该包的 API 文档页 dowhy.graph_learners.rst 与包内全部源码讲清三件事包中CDT、GES、LINGAM三个图发现子模块各自的实现与输入输出约定get_discovery_class_object/get_library_class_object这套工厂式动态导入机制如何把字符串方法名解析为可执行的发现器以及CausalModel.learn_graph()的完整调用链、结果如何从邻接矩阵转换为 DoWhy 可消费的 DOT 图和该模块当前的弃用状态与替代路线。读完本文你能够准确使用或判断是否继续使用该图发现接口并知道如何在 DoWhy 的识别与估计流程中接入外部发现的因果图。1. 包的定位一个薄封装层而非算法实现dowhy.graph_learners的文档页由 Sphinx 的automodule指令生成覆盖四个目标dowhy.graph_learners.cdt、dowhy.graph_learners.ges、dowhy.graph_learners.lingam三个子模块以及包本体即 dowhy/graph_learners/init.py 中的函数。需要首先明确该包在 DoWhy 架构中的位置DoWhy 本身不实现因果图发现算法而是为外部发现结果提供一个标准化的接入层。官方用户指南 learning_causal_structure.rst 说明图发现算法如基于独立性检验、基于评分搜索的算法只能给出与数据一致的候选图完全非参数设定下从观测数据还原真实结构是可证明不可能的因此用户应将学习到的图结合领域知识检视、修改后交给 DoWhy唯一约束是算法需输出有向无环图DAG。更重要的是该包目前处于弃用状态。从源码结构看调用入口CausalModel.learn_graph()在 dowhy/causal_model.py 中会先发出DeprecationWarningCausalModel.learn_graph() and the dowhy.graph_learners module are deprecated and will be removed in a future major release.弃用信息明确建议直接使用causal-learn或dodiscover等库完成图发现再把结果图通过CausalModel的graph参数传入。第 7 节会给出具体的迁移写法。2. 基类 GraphLearner约定统一的状态与接口三个子模块共同继承的基类定义在 dowhy/graph_learner.py仅有两个成员却约定了整个包的契约class GraphLearner: Base class for causal discovery methods. def __init__(self, data, library_class, *args, **kwargs): self._data data self._labels list(self._data.columns) self._adjacency_matrix None self._graph_dot None def learn_graph(self): Discover causal graph and the graph in DOT format. raise NotImplementedError可以归纳出两条核心约定输入约定构造参数data是 pandas DataFrame基类自动以list(self._data.columns)初始化_labels即列名即节点名——后续邻接矩阵到图节点的映射依赖于此输出约定子类实现learn_graph(labelsNone)把底层库的结果收敛为两个内部状态self._adjacency_matrixnumpy 邻接矩阵和self._graph_dotDoWhy 认可的 DOT 字符串并返回 DOT 字符串。labels参数是可选的节点名覆盖入口若传入则用其替代 DataFrame 列名若不传则沿用基类初始化的_labels。三个子模块的实现都严格遵循这一模式。3. 三个子模块的实现对比3.1 cdt 子模块CDT 类dowhy/graph_learners/cdt.py 封装 Causal Discovery ToolboxCDT。其__init__通过工厂函数get_library_class_object(full_method_name)按“模块路径.类名”的形式实例化底层方法learn_graph的调用链是def learn_graph(self, labelsNone): graph self._method.predict(self._data) # CDT 算法返回 NetworkX 图 self._adjacency_matrix nx.to_numpy_array(graph) # 转邻接矩阵 self._adjacency_matrix np.asarray(self._adjacency_matrix) if labels is not None: self._labels labels self._graph_dot adjacency_matrix_to_graph(self._adjacency_matrix, self._labels) self._graph_dot str_to_dot(self._graph_dot.source) return self._graph_dot特点CDT 的predict直接返回 NetworkX 图对象因此 CDT 是三个封装中唯一显式执行“NetworkX 图 → 邻接矩阵”转换nx.to_numpy_array的实现其余两个库本来就输出矩阵。3.2 ges 子模块GES 类dowhy/graph_learners/ges.py 封装 GESGreedy Equivalence Search库。它与另两个封装的差异在于__init__不实例化类而是import_module(full_method_name)直接导入模块本身即self._method是模块对象调用的是模块级函数fit_bicself._adjacency_matrix, self.score self._method.fit_bic(self._data.to_numpy())注意两点实现细节输入是self._data.to_numpy()纯 numpy 数组标签由_labels单独维护fit_bic同时返回邻接矩阵和 BIC 评分评分被保存在self.score可供调用方检查拟合优劣。3.3 lingam 子模块LINGAM 类dowhy/graph_learners/lingam.py 封装 lingam 库LiNGAM 一族算法包括 VanillaLiNGAM、DirectLiNGAM 等走与 CDT 相同的工厂路径get_library_class_object(lingam.VanillaLiNGAM)会按最后一个点号切分出模块lingam与类VanillaLiNGAM并实例化。learn_graph的调用链是self._method.fit(self._data) self._adjacency_matrix self._method.adjacency_matrix_即调用 sklearn 风格的fit后读取adjacency_matrix_属性。与另两者相比LINGAM 类没有对矩阵做np.asarray归一化直接使用库返回的数组。三个封装殊途同归无论底层库返回 NetworkX 图还是 numpy 数组最终都汇入统一的adjacency_matrix_to_graphstr_to_dot转换管线见第 5 节。4. 包本体的工厂式动态加载机制文档页的 “Module contents” 一节对应 dowhy/graph_learners/init.py它提供两个工厂函数是整个包“用字符串驱动算法选择”的关键。4.1 get_discovery_class_object选择 DoWhy 内部的封装类def get_discovery_class_object(method_name, *args, **kwargs): Import class from graph_learners. try: module_name method_name class_name module_name.upper() discovery_module import_module(. module_name, packagedowhy.graph_learners) discovery_class getattr(discovery_module, class_name) if not issubclass(discovery_class, GraphLearner): raise TypeError(Causal discovery class must inherit from GraphLearner) except (AttributeError, ImportError): raise ImportError({} is not an existing causal discovery method..format(method_name)) return discovery_class其约定是传入库名如cdt、ges、lingam函数动态导入dowhy.graph_learners.库名子模块取出同名大写的类CDT/GES/LINGAM并强制校验其必须是GraphLearner子类任何一环缺失都收敛为一条可读的ImportError。这个“模块名 类名小写”的映射约定解释了为什么三个封装类的类名被设计为各自库名的大写形式。4.2 get_library_class_object定位第三方库中的具体算法类def get_library_class_object(module_method_name, *args, **kwargs): Import library for causal inference. try: (module_name, _, class_name) module_method_name.rpartition(.) discovery_module import_module(module_name) discovery_class getattr(discovery_module, class_name) except (AttributeError, AssertionError, ImportError): raise ImportError( Error loading {}.{}. Double-check the method name and ensure that all library dependencies are installed..format(module_name, class_name) ) return discovery_class与上一函数不同它处理的是外部库的完整路径用rpartition(.)从最后一个点号切分例如cdt.causality.graph.LiNGAM切出模块cdt.causality.graph与类LiNGAM。错误提示中特别提到“确保依赖已安装”——这也解释了为什么使用这些封装前需要单独安装 CDT、GES 或 lingam它们不是 DoWhy 的硬依赖。两个工厂函数共同构成两级路由库名 → DoWhy 封装类 → 第三方算法类。5. 结果转换管线邻接矩阵如何变成 DoWhy 的 DOT 图三个子模块的learn_graph都复用 dowhy/utils/graph_operations.py 中的两个工具函数这是理解输出格式的关键。adjacency_matrix_to_graph(adjacency_matrix, labelsNone)校验矩阵必须是二维否则抛ValueError并把np.matrix归一化为 ndarray边阈值只有np.abs(adjacency_matrix) 0.01的项才被视为边。这意味着底层算法输出的弱因果强度|w| ≤ 0.01会被静默丢弃图的结构由该阈值隐含决定节点标签缺省时按x0, x1, x2, ...命名因此实践中应确保_labelsDataFrame 列名被正确传递输出为graphviz.Digraph对象DOT 文本在其.source属性中。str_to_dot(string)则做格式归一化把 graphviz 输出的多行文本压成以分号分隔的单行、去除制表符并剥掉外层digraph { ... }包裹graph[:9] graph[10:-2] graph[-1]产出 DoWhy 的CausalGraph可直接解析的 DOT 片段。这一“压缩成单行分号分隔”的格式正是 DoWhy 图字符串的内部表示。6. 完整调用链CausalModel.learn_graph() 如何使用本包用户侧入口是CausalModel.learn_graph定义在 dowhy/causal_model.py签名为learn_graph(self, method_namecdt.causality.graph.LiNGAM, *args, **kwargs)。执行流程为发出DeprecationWarning见第 1 节method_name.split(., maxsplit1)取第一段作为库名交给get_discovery_class_object得到封装类以causal_discovery_class(self._data, method_name, *args, **kwargs)构造实例并调用model.learn_graph()得到 DOT 字符串用该 DOT 字符串调用self.init_graph(graphgraph, identify_varsFalse)初始化CausalGraph并返回。因此一次典型调用是import dowhy import pandas as pd data pd.DataFrame({ x: [0.1, 0.4, 0.5, 0.7], y: [0.3, 0.6, 0.8, 0.9], z: [0.2, 0.5, 0.7, 1.0], }) model dowhy.CausalModel(datadata, treatmenty, outcomez) # 默认即 cdt.causality.graph.LiNGAM也可换成 lingam.VanillaLiNGAM 等 graph model.learn_graph() # 返回 CausalGraph 实例注意*args, **kwargs会透传给第三方算法类的构造器因此算法超参数如 LiNGAM 的实现变体参数可以直接从这里传入这与各封装类构造函数里library_class(*args, **kwargs)的透传方式对应。测试侧的证据在 tests/test_causal_model.py 的test_learn_graph_initializes_the_graph它注入一个仅继承GraphLearner的 stub 学习器返回一个三节点 DiGraph 的 DOT 字符串调用model.learn_graph(stub)后断言graph is model._graph且节点集合为{W0, v0, y}。该测试从两个方向印证了第 4、5 节的机制动态导入按“模块名.大写类名”匹配 stub 模块且learn_graph的返回值确实被回灌进CausalModel._graph后续identify_effect、estimate_effect等步骤都在这张图上运行。官方示例笔记本 dowhy_causal_discovery_example.ipynb 演示了基于 CDT 的完整发现流程可作为本文调用链的端到端参照。7. 迁移指引弃用状态下的替代路线由于learn_graph()与dowhy.graph_learners已被标记为弃用且“将在未来主版本移除”在新代码中建议采用官方指南推荐的外部发现 graph参数注入的路线from cdt.causality.graph import LiNGAM causal_graph LiNGAM().predict(dataset) # 直接得到 NetworkX 图 # 将外部发现结果转为 DoWhy 可解析的图字符串后传入 model dowhy.CausalModel( datadataset, treatmenty, outcomez, graphdigraph {y - z}, # 由 causal_graph 转换/检视后得到的 DOT )这条路线的好处是发现算法完全由 causal-learn / dodiscover / CDT 等专用库承担功能面与算法迭代都优于本包内置的三个封装而 DoWhy 只保留它擅长的图识别、效应估计与可反驳检验环节。如果你仍在维护基于learn_graph的旧代码可以保持现状并容忍DeprecationWarning、用warnings.filterwarnings显式过滤、或按上文改为外部发现 graph注入在迁移期间本包CDT/GES/LINGAM三类的行为弱边 0.01 阈值、labels 覆盖、DOT 单行化输出仍然如源码所示可作为排查旧代码行为差异的参照。8. 小结dowhy.graph_learners是一个职责单一、结构清晰的接入层基类契约dowhy/graph_learner.pyDataFrame 输入、learn_graph(labelsNone)输出 DOT三个子模块cdt.py、ges.py、lingam.py分别适配 CDT 的 NetworkX 图输出、GES 的模块级fit_bic函数与 lingam 的 sklearn 风格fitadjacency_matrix_属性统一收敛到adjacency_matrix_to_graph/str_to_dot管线双级工厂函数init.pyget_discovery_class_object按库名路由到内部封装get_library_class_object按“模块路径.类名”定位第三方算法入口与状态CausalModel.learn_graph()dowhy/causal_model.py完成字符串解析、实例化、图学习并经init_graph(identify_varsFalse)落地为CausalGraph测试用例 tests/test_causal_model.py 验证了回灌行为。在DeprecationWarning已发出的背景下理解该包的价值在于读懂旧代码中图发现的真实行为阈值、标签、DOT 格式并据此平滑迁移到外部发现库 graph参数注入的新范式。赞分享机器学习数据分析【免费下载链接】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点击查看免费下载相关推荐探索PowerToys动态模块加载机制打造高效Windows生产力工具探索PowerToys动态模块加载机制打造高效Windows生产力工具 PowerToys作为一款强大的Windows系统实用工具集其核心优势在于能够动态加桌面应用开发工具深度解析 DoWhy 的 dowhy.gcm 包:图形因果模型 (GCM) 完整 API 与实战指南深度解析 DoWhy 的 dowhy.gcm 包:图形因果模型 GCM 完整 API 与实战指南 本文以 DoWhy 官方 API 参考文档 dowhy.gcm机器学习数据分析drawio-desktop Linux 构建完整指南如何生成 AppImage 与 deb 安装包drawio desktop Linux 构建完整指南如何生成 AppImage 与 deb 安装包 drawio desktop 是 draw.io 的官方桌面应用图形学上一篇LRCGET 终极指南批量歌词下载与音乐歌词同步完整解决方案下一篇一键批量获取音乐同步歌词LRCGET让你的本地音乐库焕然一新创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Oracle 11.2.0.4季度PSU补丁实战:从opatch到数据字典升级全流程
Oracle 11.2.0.4季度PSU补丁实战:从opatch到数据字典升级全流程

简介:面向 Oracle 11.2.0.4 数据库的官方 PSU 补丁包,适用于 Linux x86-64 平台,于 2022 年 1 月发布,对应补丁编号为 p33477185。该补丁属于 Oracle 定期安全更新系列,主要修复当前版本的安全漏洞、性能缺陷与已知问题… · 2026/9/25 14:18:30

GitHub热榜日榜怎么用?从筛选到实操的完整学习指南
GitHub热榜日榜怎么用?从筛选到实操的完整学习指南

每天上午,我打开 GitHub 的 Trending 页面,已经成了雷打不动的习惯。2026 年 9 月 19 日的日榜更新后,我照例把整页扫了一遍,然后在评论区看到一个新人问:“今天这些项目到底为什么上榜?我该点开哪一个&… · 2026/9/25 14:18:24

企业员工培训管理系统:JavaSwing+MySQL数据库课设全解析
企业员工培训管理系统:JavaSwing+MySQL数据库课设全解析

简介:这是湖南科技大学数据库系统课程设计项目,基于JavaSwing与MySQL构建的企业员工培训管理系统,面向数据库课程设计学生及需要实践企业培训业务场景的开发者,覆盖培训计划管理、课程考勤、资源分配与绩效评估等完整功能模块。资… · 2026/9/25 14:18:24

HTML系列教程:24_HTML 速查列表(新手完整版)
HTML系列教程:24_HTML 速查列表(新手完整版)

本篇把前面所有教程的核心标签、属性、语法整理成速查表,方便写代码的时候快速翻看。 分为:文档结构标签、元数据 head、块级标签、行内文本标签、链接图像、表格、列表、表单基础、脚本、字符实体、颜色、URL 路径。 每一项附带简短说明 极简示例&… · 2026/9/25 14:48:38

ESPnet2 瑞士法语多音词语料 ASR 实战:Conformer 端到端语音识别 Recipe 与结果复盘
ESPnet2 瑞士法语多音词语料 ASR 实战:Conformer 端到端语音识别 Recipe 与结果复盘

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 本篇基于 ESPnet 仓库中 egs2/polyphone_swiss_french/asr1 的官方结果报告(READM… · 2026/9/25 14:48:31

不靠RSSI靠CSI:WiFi穿墙感知原理及RuView开源项目解析
不靠RSSI靠CSI:WiFi穿墙感知原理及RuView开源项目解析

1. WiFi"看穿墙"并不玄:CSI才是关键说实话,我第一次在GitHub上看到RuView这个开源项目时,第一反应是"标题党"——WiFi还能看穿墙壁?家里路由器又不是X光机。但把整个原理捋了一遍之后,我必须承认&… · 2026/9/25 14:48:25

Matlab/Simulink汽车电机控制仿真能力四阶跃迁
Matlab/Simulink汽车电机控制仿真能力四阶跃迁

1. 这不是学软件,是在练“电机控制的肌肉记忆”Matlab/Simulink 仿真汽车电机控制——这句话在秋招季的简历筛选池里,已经从加分项悄悄滑向“基础门槛”。我带过37个应届生做电驱系统岗面试辅导,其中21个卡在“你这个Simulink模型&#xff0c… · 2026/9/25 14:48:19

嵌入式固件升级机制全解析:从Bootloader到双备份
嵌入式固件升级机制全解析:从Bootloader到双备份

搞嵌入式这些年,经手过的驱动板卡少说也有几十种:液晶屏驱动板、步进电机驱动板、工业IO控制板、电源管理板,形态各异,但有个共同点——它们都绕不开固件升级。我见过太多板卡第一次出厂好好的,真正让售后崩溃、让用户… · 2026/9/25 14:48:13

DDR5内存的隐藏配电站:PMIC芯片深度解析
DDR5内存的隐藏配电站:PMIC芯片深度解析

最近收了条DDR5内存,拆开散热片的一瞬间,我在PCB中间看到一颗不起眼的小芯片,丝印是某家电源厂的logo。我盯着它看了半天,脑子里蹦出一句:原来你就是那个“隐藏的配电站”。内存条的PMIC(Power Management … · 2026/9/25 14:48:13

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码