You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CausalNex生成Python DAG输出错误?原因及替代方案咨询

CausalNex生成DAG与预期不符的原因及解决办法

问题描述

我正在用CausalNex在Python中从数据集生成DAG,节点正确但边完全不符合预期。测试用的DataFrame包含四个自变量(Requestor、Risk、Size、Developer)和一个因变量(Duration),生成的DAG如下:
CausalNex生成的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如下:
预期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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:40:26