使用CausalNex生成Python DAG输出错误?原因及替代方案咨询
CausalNex生成DAG与预期不符的原因及解决办法
问题描述
我正在用CausalNex在Python中从数据集生成DAG,节点正确但边完全不符合预期。测试用的DataFrame包含四个自变量(Requestor、Risk、Size、Developer)和一个因变量(Duration),生成的DAG如下:
我是否错误使用了该库?为何输出与真实数据生成过程差异巨大?贝叶斯网络模型是否能优于CausalNex?
测试代码如下:
# Generate initial data import numpy as np import pandas as pd np.random.seed(42) fib_list = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] df = pd.DataFrame({ "Requestor": np.random.randint(1, 4, 100), "Size": np.random.randint(1, 4, 100), "Risk": np.random.randint(1, 4, 100) }) df['Developer'] = np.random.choice(fib_list, df.shape[0]) df["Duration"] = ( 0.1 * df["Requestor"] + 0.2 * df["Size"] + 0.2 * df["Risk"] + 0.5 * df["Developer"] ) # Generate graph from causalnex.structure.notears import from_pandas import matplotlib.pyplot as plt import networkx as nx sm = from_pandas(df) sm.remove_edges_below_threshold(0.8) nx.draw_shell(sm, with_labels=True, font_weight ="bold") plt.show()
期望得到的DAG如下:
原因分析
1. 样本量不足
CausalNex默认采用的NOTEARS算法,需要足够的数据量才能准确识别变量间的因果关联。仅100条样本的规模下,算法极易把随机波动误判为真实关联,或是漏掉弱但存在的因果关系。
2. 变量关联强度差异过大
Duration的计算公式中,Requestor的权重仅为0.1,与Duration的相关性极弱;而Developer的权重达0.5,相关性极强。NOTEARS对弱关联的捕捉能力有限,再加上样本量不足,直接漏掉了Requestor→Duration这条真实边,反而可能误识别其他变量间的随机关联。
3. 边过滤阈值设置过高
你使用了sm.remove_edges_below_threshold(0.8),这个阈值过于严苛。NOTEARS输出的边权重代表关联强度,0.8的阈值会过滤掉大部分弱关联但真实存在的边,仅保留最强的关联,自然与预期结构偏差极大。
调整方案
- 增大样本量:将样本数从100提升至1000以上,给算法足够的数据支撑以识别真实因果关系。
- 降低过滤阈值:将
remove_edges_below_threshold的参数调整为0.1或0.2,先保留所有潜在关联边,后续结合领域知识手动修剪错误边。 - 引入先验知识:若已知部分因果关系,可手动添加边或限制算法推断范围。比如禁止Duration作为父节点(因它是因变量),示例代码如下:
# 生成结构时禁止Duration指向其他变量 sm = from_pandas(df, tabu_edges=[("Duration", "Requestor"), ("Duration", "Size"), ("Duration", "Risk"), ("Duration", "Developer")]) # 手动添加已知的因果边 sm.add_edge("Requestor", "Duration") sm.add_edge("Size", "Duration") sm.add_edge("Risk", "Duration") sm.add_edge("Developer", "Duration")
贝叶斯网络 vs CausalNex
两者没有绝对的优劣,需结合需求选择:
- CausalNex主打因果结构自动推断,适合从数据中探索未知因果关系的场景,工具链更贴合因果推断需求。
- 传统贝叶斯网络(如pgmpy实现的)更偏向概率推理,通常需先手动定义结构(或借助其他结构学习算法),再学习条件概率分布。若已明确因果结构,贝叶斯网络在概率预测上更成熟;但如果需要从无到有学习结构,CausalNex调整参数后也能达到不错的效果。
内容的提问来源于stack exchange,提问作者rafaela medeiros
相关产品推荐
相关产品推荐

