Skip to main content
 首页 » 编程设计

python之为什么 BernoulliNBC 在 iris 数据集上的表现比 GaussianNBC 或 MultinomialNBC 差

2025年05月04日15thcjp

 from sklearn import datasets 
 iris = datasets.load_iris() 
 from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB 
 gnb = GaussianNB() 
 y_pred = gnb.fit(iris.data, iris.target).predict(iris.data) 
 print("Number of mislabeled points out of a total %d points : %d" % (iris.data.shape[0],(iris.target != y_pred).sum())) 
 
 mnb = MultinomialNB() 
 y_pred_mnb = mnb.fit(iris.data, iris.target).predict(iris.data) 
 print("Number of mislabeled points out of a total %d points : %d" % (iris.data.shape[0],(iris.target != y_pred_mnb).sum())) 
 
 bnb = BernoulliNB() 
 y_pred_bnb = bnb.fit(iris.data, iris.target).predict(iris.data) 
 print("Number of mislabeled points out of a total %d points : %d" % (iris.data.shape[0],(iris.target !=    y_pred_bnb).sum())) 

输出看起来像:
总共 150 个点中标记错误的点数:6
总共 150 个点中标记错误的点数:7
总共 150 个点中标记错误的点数:100

伯努利朴素贝叶斯分类器错误标记 100,这比其他分类器多得多。你能解释一下为什么吗?

请您参考如下方法:

简而言之,高斯朴素贝叶斯模型通常用于连续数据(其中每个特征都是实数),其中底层数据分布假设为高斯(正态)分布.

多项朴素贝叶斯模型计算特定事件在数据集中发生的频率(例如,特定单词在文档中出现的频率)。

伯努利朴素贝叶斯模型类似于多项朴素贝叶斯模型,但它不计算事件发生的频率,而是仅描述事件是否发生(例如是否发生某个词在文档中出现,出现一次或 100000 次都无关紧要)

现在专门针对包含真实值数据的鸢尾花数据集,GaussianNB 将是最合适的模型。 MultinomialNB 最适合的经典示例是文本分类。

因此,鉴于您的数据集和每个模型的特征,伯努利朴素贝叶斯模型表现不佳也就不足为奇了。更大的惊喜是多项式朴素贝叶斯模型几乎和高斯模型一样好,尽管它对于这个数据集(实值数据)来说是一个不合适的选择。但是,查看数据(我鼓励您这样做)应该可以正确地提示您为什么多项式朴素贝叶斯模型可以取得如此好的性能。

要深入比较用于文本分类的伯努利朴素贝叶斯模型和多项朴素贝叶斯模型,我建议您阅读 this纸。

您可能还想查看出色的 scikit-learn documentation在朴素贝叶斯上了解不同模型的概述,最后但并非最不重要的是,wikipedia page在朴素贝叶斯分类器上也给出了很好的概述。

更新:

正如 mbatchkarov 在下面的评论中指出的那样,您正在对相同的数据进行测试和训练,这被认为是非常不好的做法,因此无法从中得出明确的结论以上结果。考虑使用 cross validation或者至少将数据分成训练 block 和测试 block 。