首页 > 解决方案 > R包bnlearn:cpquery vs predict - 不同的结果?

问题描述

我想使用我的贝叶斯网络作为分类器,首先是完整的证据数据(predict),还有不完整的数据(bnlearn::cpquery)。但似乎,即使使用相同的证据,这些函数也会给出不同的结果(不仅仅是基于采样引起的轻微偏差)。

有了完整的数据,可以很容易地使用 R 的predict功能:

predict(object = BN,
        node = "TargetVar",
        data = FullEvidence ,
        method = "bayes-lw",
        prob = TRUE)

通过分析prob属性,我了解到predict-function 只是选择分配概率最高的因子级别。

当涉及不完整的证据(仅知道某些节点的结果)时,predict不再起作用:

    Error in check.fit.vs.data(fitted = fitted, 
                               data = data, 
                               subset = setdiff(names(fitted),  : 
    required variables [.....] are not present in the data.` 

因此,我想使用bnlearn::cpquery已知证据列表:

cpquery(fitted = BN, 
        event = TargetVar == "TRUE", 
        evidence = evidenceList, 
        method = "lw",
        n = 100000)

同样,我只是想使用概率最高的因素作为预测。因此,如果结果cpquery高于 0.5,我将预测设置为 TRUE,否则设置为 FALSE。

我试图通过向两个函数提供相同(完整)的数据来监控该过程,但它们并没有给我相同的结果。有很大的差异,例如predict,“概率”属性给我 ap(false) = 27%,而cpquery给我 p(false) = 2,2%。

这样做的“正确”方式是什么?仅使用 cpquery,也用于完整数据?为什么会有很大的差异?

谢谢你的帮助!

标签: rpredictbnlearn

解决方案


正如 user20650 所说,增加预测调用中的样本数量是获得非常相似结果的解决方案。因此,只需n = ...在函数调用中提供参数即可。

当然这是有道理的,我只是不知道函数中的那个参数predict()在bn.fit 实用程序中没有关于它的文档,在predict的非常通用的文档中也没有。


推荐阅读