erdogant/bnlearn

Python package for Causal Discovery by learning the graphical structure of Bayesian networks. Structure Learning, Parameter Learning, Inferences, Sampling methods.

bnlearn – 用于贝叶斯网络学习与因果分析的 Python 库

功能 – bnlearn 允许您构建、训练和查询概率图模型(贝叶斯网络)。它涵盖了整个工作流程:

  • 结构学习 – 使用经典评分(BIC、K2、BDeu)和搜索策略(穷举、爬山、Chow-Liu、TAN 等)发现最能解释您数据的有向无环图(DAG)。
  • 参数学习 – 为给定的 DAG 估计条件概率表(CPT),即使数据不完整也可进行。
  • 推断与预测 – 计算后验概率、干预性(do-计算)和反事实查询,并进行因果预测。
  • 合成数据与工具 – 从学习到的模型中采样新数据,离散化连续变量,填补缺失值,并在图表示形式之间转换(邻接矩阵、边列表、Graphviz)。
  • 可视化 – 使用 Matplotlib 或 Graphviz 绘制网络结构,比较两个网络,并导出模型。

所有这些功能都封装在简洁、高层次的 API 中(bn.structure_learning.fit()、bn.parameter_learning.fit()、bn.inference.fit()、bn.predict() 等),您只需几行代码,即可从原始的 pandas DataFrame 快速构建出一个完整的因果模型。


快速开始

# 安装(需要 Python 3.10+)
pip install bnlearn          # 或通过 conda、uv,或直接从 GitHub 安装
import bnlearn as bn

# 加载示例数据集(经典的洒水系统网络)
df = bn.import_example()

# 1️⃣ 从数据中学习网络结构
model = bn.structure_learning.fit(df)

# 2️⃣ 可选地计算边强度统计信息
model = bn.independence_test(model, df)

# 3️⃣ 可视化学习到的 DAG
bn.plot(model)

# 4️⃣ 学习 CPT(参数学习)
model = bn.parameter_learning.fit(model, df)

# 5️⃣ 执行因果推断
query = bn.inference.fit(model, variables=['Rain'],
                         evidence={'Cloudy': 1, 'Sprinkler': 0, 'Wet_Grass': 1})
print(query.df)

该库还提供了针对特定任务的即用型流水线(例如,bn.sampling() 用于生成合成数据,bn.knn_imputer() 用于缺失值填补,bn.discretize() 用于连续特征分箱)。


适用场景

  • 因果发现 – 适合需要从观测数据中揭示有向关系的研究人员和数据科学家。
  • 概率建模 – 任何需要量化不确定性的领域(医学、金融、可靠性工程等)都非常有用。
  • 教育与原型开发 – 丰富的文档、笔记本和博客教程使其成为教授贝叶斯网络概念的良好教学工具。

文档与社区

  • 完整 API 文档 – https://erdogant.github.io/bnlearn/
  • 示例笔记本 – 文档中提供 Google Colab 链接。
  • 博客与播客 – 每个主要功能都有 Medium 文章和简短音频讲解。
  • 开源项目 – MIT 许可,积极维护(约 2k 星,定期发布),欢迎贡献。

TL;DR

bnlearn 是一个文档完善、可通过 pip 安装的 Python 包,它简化了基于贝叶斯网络的因果建模的端到端工作流程:发现结构、学习参数、运行推断、生成数据、可视化结果——仅需几个高层函数调用即可完成。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目