伯努利贝叶斯类BernoulliNB
多项式朴素贝叶斯可同时处理二项分布(抛硬币)和多项分布(掷骰子),其中二项分布又叫做伯努利分布,它是一种现实中常见,并且拥有很多优越数学性质的分布。因此,既然有着多项式朴素贝叶斯,自然也就又专门用来处理理二项分布的朴素贝叶斯:伯努利利朴素贝叶斯。
伯努利贝叶斯类BernoulliNB假设数据服从多元伯努利分布,并在此基础上应用朴素贝叶斯的训练和分类过程。多元伯努利分布简单来说,就是数据集中可以存在多个特征,但每个特征都是二分类的,可以用布尔变量表示,也可以表示为{0,1}或者{-1,1}等任意二分类组合。因此,这个类要求将样本转换为二分类特征向量,如果数据本身不是二分类的,可以使用类中专门用来二值化的参数binarize来改变数据。
伯努利朴素贝叶斯与多项式朴素贝叶斯非常相似,都常用于处理文本分类数据。但由于伯努利朴素贝叶斯是处理二项分布的,所以它更加在意的是“存在与否”,而不是“出现多少次”这样的次数或频率,这就是伯努利贝叶斯与多项式贝叶斯的根本性不同。在文本分类的情况下,伯努利朴素贝叶斯可以使用单词出现向量(而不是单词计数向量)来训练分类器。文档较短的数据集上,伯努利朴素贝叶斯的效果会更加好。如果时间允许,建议两种模型都试试看。
来看看伯努利朴素贝叶斯类的参数:
class sklearn.naive_bayes.BernoulliNB (alpha=1.0, binarize=0.0, fit_prior=True,class_prior=None)
参数
alpha : 浮点数, 可不填 (默认为1.0)
拉普拉斯或利德斯通平滑的参数λ\lambdaλ,如果设置为0则表示完全没有平滑选项。但是需要注意的是,平滑相当于人为给概率加上一些噪音,因此λ\lambdaλ设置得越大,伯努利朴素贝叶斯的精确性会越低(虽然影响不是非常大),布里尔分数也会逐渐升高。
binarize : 浮点数或None,可不填,默认为0
将特征二值化的阈值,如果设定为None,则假定为特征已经被二值化完毕
fit_prior : 布尔值, 可不填 (默认为True)
是否学习先验概率P(Y=c)。如果设置为false,则不使用先验概率,而使用统一先验概率(uniform prior),即认为每个标签类出现的概率是1n_classes\frac1{n\_classes}n_classes1。
class_prior:形似数组的结构,结构为(n_classes, ),可不不填(默认为None)
类的先验概率P(Y=c)。如果没有给出具体的先验概率则自动根据数据来进行计算。
sklearn实现
在sklearn中,伯努利朴素贝叶斯的实现也非常简单:
from sklearn.naive_bayes import BernoulliNB
#通常,应该使用二值化的类sklearn.preprocessing.Binarizer来将特征逐个二值化
#然而这样效率过低,因此我们选择归⼀化之后直接设置⼀个阈值
mms = MinMaxScaler().fit(Xtrain)
Xtrain_ = mms.transform(Xtrain)
Xtest_ = mms.transform(Xtest)
#不设置二值化
bnl_ = BernoulliNB().fit(Xtrain_, Ytrain)
bnl_.score(Xtest_,Ytest)
0.49666666666666665
可见,不设置二值化阈值(binarize)的效果不好
#设置二值化阈值为0.5
bnl = BernoulliNB(binarize=0.5).fit(Xtrain_, Ytrain)
bnl.score(Xtest_,Ytest)
0.9833333333333333
和多项式贝叶斯⼀样,伯努利贝叶斯的结果也受到数据结构非常大的影响。因此,根据数据的模样选择贝叶斯,是贝叶斯模型选择中十分重要的一点。

伯努利朴素贝叶斯是处理二项分布的朴素贝叶斯算法,适用于二分类特征。sklearn中的BernoulliNB类提供了参数如alpha、binarize和fit_prior等进行模型配置。在文本分类中,特别是在文档较短的数据集上,伯努利朴素贝叶斯表现出色。记得根据数据特性选择合适的贝叶斯模型。
1767





