R package bnlearn:cpquery vs predict - 结果不同?

时间:2018-05-09 10:41:19

标签: r predict bnlearn

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

使用完整数据,可以轻松使用R的predict函数:

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

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

当涉及到不完整的证据(只知道某些节点的结果)时,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的“prob” - 属性给了我一个p(假)= 27%,而cpquery给了我p(假)= 2.2%。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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