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

使用pyAgrum进行贝叶斯网络分析时遇DatabaseError问题求助

问题解决与拟合优度评估方案

一、DatabaseError 错误解决方法

错误本质是训练数据中不存在COL=0, RA=4, INC=0这个条件组合对应的PARTNER样本,导致贝叶斯网络的参数估计无法进行。以下是可行的解决思路:

  • 添加先验平滑:在学习器中引入平滑先验,填补稀疏或缺失的条件组合。pyAgrum中可以通过以下两种方式实现:
    # 拉普拉斯平滑(简单加1平滑)
    learner.useSmoothing(1.0)
    # 或者使用狄利克雷先验,灵活设置伪计数
    learner.useDirichletPrior(0.5)
    
  • 调整数据拆分策略:
    • 取消按PARTNER分层,改为随机拆分,避免分层后某类样本过度集中到测试集,导致训练集出现极端稀疏组合;
    • 若必须分层,可尝试基于COL、RA、INC、PARTNER多变量联合分层,减少单变量分层带来的偏差。
  • 数据预处理优化:
    • 合并RA的稀有类别(如RA=4)到相邻类别,减少变量取值数,降低稀疏组合出现的概率;
    • 若RA=4样本量极少,可结合业务场景判断是否直接剔除该类样本。
  • 更换学习策略:
    • 改用基于约束的结构学习算法(如usePC()),这类算法对稀疏数据鲁棒性更强;
    • 切换到自带先验的评分函数,比如useScoreBDeu(),该评分默认包含狄利克雷先验,能缓解稀疏数据问题。

二、拟合优度评估方法

针对拟合后的贝叶斯网络,可通过以下方法评估其拟合效果:

  • 对数似然值(Log-Likelihood):计算模型在测试集上的对数似然总和,值越大说明模型对数据的拟合程度越好。pyAgrum中可通过以下代码计算:
    from pyAgrum import utils
    log_likelihood = utils.logLikelihood(bn, df_test)
    
  • 交叉验证评分:采用k折交叉验证,将数据分为k份,轮流用k-1份训练、1份测试,最终取平均的对数似然或BIC评分,更稳定地评估模型泛化能力。
  • 卡方拟合检验:对比模型预测的联合分布与真实数据的联合分布,通过卡方统计量判断两者是否存在显著差异,若p值大于显著性水平(如0.05),则认为模型拟合良好。
  • 预测性能指标:针对目标变量PARTNER,计算模型的预测准确率、混淆矩阵、F1分数等指标,评估模型分类能力:
    # 生成测试集的预测结果
    predictions = [bn.predict("PARTNER", row.to_dict()) for _, row in df_test.iterrows()]
    # 计算准确率
    from sklearn.metrics import accuracy_score
    acc = accuracy_score(df_test["PARTNER"], [p["PARTNER"] for p in predictions])
    
  • 概率校准评估:绘制可靠性曲线,检查模型预测的概率值与实际观测频率的一致性,若曲线接近对角线,说明模型的概率预测校准良好。

内容的提问来源于stack exchange,提问作者ella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:09