R中的多项朴素贝叶斯分类器

Posted

技术标签:

【中文标题】R中的多项朴素贝叶斯分类器【英文标题】:Multinomial Naive Bayes classifier in R 【发布时间】:2014-07-12 02:11:17 【问题描述】:

我再次提出问题(同名)Multinomial Naive Bayes Classifier。这个问题似乎已经接受了一个我认为是错误的答案,或者我需要更多解释,因为我仍然不明白。

到目前为止,我在 R 中看到的每个朴素贝叶斯分类器(包括 bnlearn 和 klaR)都有假设特征具有高斯似然性的实现。

在 R 中是否有使用多项似然的朴素贝叶斯分类器的实现(类似于 scikit-learn's MultinomialNB)?

特别是 - 如果事实证明在这些模块中的任何一个中都有某种调用 naive.bayes 的方法,以便使用多项分布来估计可能性 - 我真的很感激这个例子。我搜索了示例,但没有找到任何示例。例如:这就是usekernal 参数在klaR.NaiveBayes 中的用途吗?

【问题讨论】:

bnlearn 链接底部的第一个示例 (learning.test) 具有离散变量。要查看条件概率表,请使用 bn.fit(bn, learning.test) 感谢 user20650。我看到 naive.bayes 可以处理离散或连续数据。我的问题是:如何估计特征的可能性?在文档中它说它假设它们是高斯​​的。有办法改变吗? 我还没有研究预测是如何计算的,但我希望它们是使用 CPT 计算的 - 这是多项式分布的 mle .. 我添加了一个小的 ex - 也许有帮助 【参考方案1】:

我不知道predict 方法在naive.bayes 模型上调用什么算法,但您可以从条件概率表(mle 估计)中自己计算预测

# You may need to get dependencies of gRain from here
#   source("http://bioconductor.org/biocLite.R")
#   biocLite("RBGL")

    library(bnlearn)
    library(gRain)

使用naive.bayes帮助页面中的第一个示例

    data(learning.test)

    # fit model
    bn <- naive.bayes(learning.test, "A")   

    # look at cpt's
    fit <- bn.fit(bn, learning.test)    

    # check that the cpt's (proportions) are the mle of the multinomial dist.
    # Node A:
    all.equal(prop.table(table(learning.test$A)), fit$A$prob)
    # Node B:
    all.equal(prop.table(table(learning.test$B, learning.test$A),2), fit$B$prob)


    # look at predictions - include probabilities 
    pred <- predict(bn, learning.test, prob=TRUE)
    pr <- data.frame(t(attributes(pred)$prob))
    pr <- cbind(pred, pr)

    head(pr, 2)

#   preds          a          b          c
# 1     c 0.29990442 0.33609392 0.36400165
# 2     a 0.80321241 0.17406706 0.02272053

通过运行查询从 cpt 计算预测概率 - 使用“gRain”

    # query using junction tree- algorithm
    jj <- compile(as.grain(fit))

    # Get ptredicted probs for first observation
    net1 <- setEvidence(jj, nodes=c("B", "C", "D", "E", "F"), 
                                         states=c("c", "b", "a", "b", "b"))

    querygrain(net1, nodes="A", type="marginal")

# $A
# A
#        a         b         c 
# 0.3001765 0.3368022 0.3630213 

    # Get ptredicted probs for secondobservation
    net2 <- setEvidence(jj, nodes=c("B", "C", "D", "E", "F"), 
                                         states=c("a", "c", "a", "b", "b"))

    querygrain(net2, nodes="A", type="marginal")

# $A
# A
#         a          b          c 
# 0.80311043 0.17425364 0.02263593 

所以这些概率非常接近您从bnlearn 得到的概率,并且是使用 mle 计算的,

【讨论】:

谢谢。我之前也一定错过了这个——但 fit 描述了“节点 A 的参数(多项分布)”。

以上是关于R中的多项朴素贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯分类器(伯努利贝叶斯+高斯贝叶斯+多项式贝叶斯)

向多项式朴素贝叶斯分类器添加功能 - Python

scikit learn 使用多项式朴素贝叶斯作为三元分类器?

机器学习:贝叶斯分类器——高斯朴素贝叶斯分类器代码实现

在 Scala Spark 中使用数据框的朴素贝叶斯多项式文本分类器

Python 的多项朴素贝叶斯从零开始