朴素贝叶斯的三个常用模型

高斯、多项式、伯努利

朴素贝叶斯(naive_bayes)

若一个样本有n个特征,分别用$x_{1},x_{2},…,x_{n}$表示,将其划分到类yk的可能性$P(y_{k}|x_{1},x_{2},…,x_{n})$为:
$P(y_{k}|x_{1},x_{2},…,x_{n}) = P(y_{k})\prod_{i=1}^{n}P(x_{i}|y_{k})$

上式中等号右侧的各个值可以通过训练得到。根据上面的公式可以求的某个数据属于各个分类的可能性(这些可能性之和不一定是1),该数据应该属于具有最大可能性的分类中。
一般来说,如果一个样本没有特征xi,那么P(xi|yk)将不参与计算。不过下面的伯努利模型除外。

以上是朴素贝叶斯的最基本的内容。


高斯模型(GaussianNB)

有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布,也就是
$P(x_{i}|y_{k}) = \frac{1}{\sqrt{2\pi\sigma_{y_{k}}^{2}}}exp( -\frac{(x_{i}-\mu_{y_{k}})^2} {2\sigma_{y_{k}}^{2}} )$

sklearn实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB

iris = datasets.load_iris()
#四个特征的名字
print(iris.feature_names)
clf = GaussianNB()
clf.fit(iris.data,iris.target)
#第0个数据的标签及其预测
print(iris.target[0])
print(clf.predict(iris.data[0].reshape(1,-1)))
#第149个数据的标签及其预测
print(iris.target[149])
print(clf.predict(iris.data[149].reshape(1,-1)))

运行结果:

1
2
3
4
5
6
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
0
[0]
2
[2]
[Finished in 0.9s]

多项式模型(MultinomialNB)

该模型常用于文本分类,特征是单词,值是单词的出现次数。
$P(x_{i}|y_{k}) = \frac{N_{y_{k}x_{i}}+\alpha}{N_{y_{k}}+\alpha n}$
其中,$N_{y_{k}x_{i}}$是类别$y_{k}$下特征$x_{i}$出现的次数;$N_{y_{k}}$是类别$y_{k}$下所有特征出现的总次数。对应到文本分类里,如果单词word在一篇分类为label1的文档中出现了5次,那么$N_{label1,word}$的值会增加5。如果是去除了重复单词的,那么$N_{label1,word}$的值会增加1。$n$是特征的数量,在文本分类中就是去重后的所有单词的数量。$α$的取值范围是[0,1],比较常见的是取值为1。

待预测样本中的特征xi在训练时可能没有出现,如果没有出现,则$N_{ykxi}$值为0,如果直接拿来计算该样本属于某个分类的概率,结果都将是0。在分子中加入$α$,在分母中加入$αn$可以解决这个问题。

sklearn实例:

1
2
3
4
5
6
7
8
import numpy as np
from sklearn.naive_bayes import MultinomialNB
#随机生成6*100个小于5大于等于0的数
X = np.random.randint(5, size=(6,100))
Y = np.array([1, 2, 3, 4, 5, 6])
clf = MultinomialNB()
clf.fit(X, Y)
print(clf.predict(X[2].reshape(1,-1)))

运行结果:

1
2
[3]
[Finished in 0.5s]

Tips: 多项式模型在训练一个数据集结束后可以继续训练其他数据集而无需将两个数据集放在一起进行训练。在sklearn中,MultinomialNB()类的partial_fit()方法可以进行这种训练。这种方式特别适合于训练集大到内存无法一次性放入的情况。

在第一次调用partial_fit()时需要给出所有的分类标号。

1
2
3
4
5
6
7
8
import numpy as np
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
#在第一次调用时需要给出所有的分类标号
clf.partial_fit(np.array([1,1]).reshape(1,-1), np.array(['aa']), ['aa','bb'])
clf.partial_fit(np.array([6,1]).reshape(1,-1), np.array(['bb']))

print(clf.predict(np.array([9,1]).reshape(1,-1)))

运行结果:

1
2
['bb']
[Finished in 0.5s]

伯努利模型

在伯努利模型中,对于一个样本来说,其特征用的是全局的特征。每个特征的取值是布尔型的,也就是true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。

如果特征值$x_{i}$为1,那么
$P(x_{i}|y_{k}) = P(x_{i}=1|y_{k})$
如果特征值$x_{i}$为0,那么
$P(x_{i}|y_{k}) = 1-P(x_{i}=1|y_{k})$

这意味着,“没有某个特征”也是一个特征。

sklearn实例:

1
2
3
4
5
6
7
import numpy as np
from sklearn.naive_bayes import BernoulliNB
X = np.random.randint(2, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])
clf = BernoulliNB()
clf.fit(X, Y)
print(clf.predict(X[2].reshape(1, -1)))

运行结果:

1
2
[3]
[Finished in 1.0s]
LeetCode DAY 1 (1-3) XSS结合Beef的社会工程学窃取密码实验
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×