新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/25 14:19:01来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

在 VoltAgent 中接入 Weights  Biases 模型路由:wandb 提供方使用指南 2026/9/25 14:54:23

在 VoltAgent 中接入 Weights Biases 模型路由:wandb 提供方使用指南

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 导…

阅读更多 →
从零搭建个人金融数据服务系统:全链路架构与关键技术实践 2026/9/25 14:54:23

从零搭建个人金融数据服务系统:全链路架构与关键技术实践

最近在整理沉淀项目时,我发现一个特别值得聊的题材:一套从零搭建的个人金融数据服务系统。这个标题叫"financial-services"的项目,实际上就是把散落在各个渠道的资产、账单、交易记录聚合起来,做成一套统一查询、统一分…

阅读更多 →
桌面通信自动沉淀客户资产:DeskcommCRM设计思路与落地实践 2026/9/25 14:54:16

桌面通信自动沉淀客户资产:DeskcommCRM设计思路与落地实践

做CRM实施这些年,我见过太多客户管理系统半路夭折的例子。工具选得很大牌,销售却不填数据,管理层看不到真实进度,最后CRM变成通讯录。其实问题不在于销售懒,而是系统设计离一线操作太远。直到我接触DeskcommCRM这个方向…

阅读更多 →
从选型到落地:DeskcommCRM在销售客服团队的实战复盘 2026/9/25 14:53:57

从选型到落地:DeskcommCRM在销售客服团队的实战复盘

1. 为什么我在一堆CRM里盯上了DeskcommCRM做客户管理这件事,很多团队都卡在同一个地方:工具换了好几轮,客户数据还是乱的。我之前带过一个十来人的销售加客服混合团队,最早用共享表格记录客户,后来换过轻量级在线CRM&a…

阅读更多 →
STM32开源项目:代码+原理图+仿真的可信闭环构建 2026/9/25 14:53:57

STM32开源项目:代码+原理图+仿真的可信闭环构建

1. 项目概述:为什么一个“带仿真”的STM32开源项目,比单纯扔出一堆代码值钱十倍?你有没有遇到过这种情况:在GitHub上搜到一个标着“STM32完整项目”的仓库,点进去——代码有,main.c看着挺长;原理…

阅读更多 →
单电阻FOC电流重构偏差建模与补偿实战 2026/9/25 14:53:50

单电阻FOC电流重构偏差建模与补偿实战

1. 项目概述:为什么单电阻采样在FOC控制里是个“省成本但不省心”的选择单电阻采样在FOC(Field-Oriented Control,磁场定向控制)电机驱动系统中,是工业级低成本方案绕不开的一道坎。它用一个电流检测电阻串联在逆变器下…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉