0%

Naive Bayes

Pre-knowledge

  1. Conditionally independent \[P(X,Y)=P(X)P(Y)\]
  2. Conditional probability \[P(Y|X)=\frac{P(X,Y)}{P(X)}\]
  3. Total probability \[P(X)= \sum_{k}P(X|Y=Y_k)P(Y_k)\]
  4. Bayes' theorem \[P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum_k P(X|Y=Y_k)P(Y_k)}\]

Naive Bayes

若一个样本有n个特征,分别用\(x_1,x_2,x_3,\cdots,x_n\)表示,最终的目的是求将样本划分到类\(y_k\)的概率,即\(P(y_k|x_1,x_2,x_3,\cdots,x_n)\)。基于贝叶斯公式来估计后验概率\(P(y_k|x)\)的主要在于\(P(x|c)\)是所有属性上的联合概率。为了避开这个障碍,朴素贝叶斯采用“属性条件独立性假设”:对已知类别,假设所有属性相互独立。基于此,\(P(y_k|x_1,x_2,x_3,\cdots,x_n)\)可重写为: \[P(y_k|x_1,x_2,x_3,\cdots,x_n) = \frac{P(y_k)P(x_1,x_2,x_3,\cdots,x_n|y_k)}{P(X)} = \frac{P(y_k)}{P(X)}\prod_{i=1}^{n}p(x_i|y_k)\] 对于所有类别来说\(P(X)\)相同,因此最小化分类错误率的贝叶斯最优分类器为: \[h_{\theta}(X) = argmax_{y_k\in y}P(y_k)\prod_{i}^{n}P(x_i|y_k)\]

显然,朴素贝叶斯分类器的训练过程就是基于训练集\(D\)来估计类先验概率\(P(y_k)\),并为每个属性估计条件概率\(P(x_i|y_k)\).

\(D_{y_k}\)表示训练集\(D\)中第\(y_k\)类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率: \[P(y_k) = \frac{|D_{y_k}|}{|D|}\]

对于离散属性而言,令\(D_{y_k,x_i}\)表示\(D_{y_k}\)中第i个属性上取值为\(x_i\)的样本组成的集合,则条件概率\(P(x_i|y_k)\)可估计为:

\[P(x_i|y_k) = \frac{|D{y_k,x_i}|}{D_{y_k}}\]

Gaussian Naive Bayes

连续属性可以考虑概率密度函数,高斯朴素贝叶斯假设\(y_k\)上的属性\(x_i\)呈现高斯分布。假定\(P(x_i|y_k) \sim \mathcal N (\mu_{i,y_k},\sigma^2_{i,y_k})\), 其中 \(\mu_{i,y_k}\)\(\sigma^2_{i,y_k}\) 分别是第c类样本在第i个属性上取值的均值和方差,则有:

\[P(x_i|y_k) = \frac{1}{\sqrt{2\pi}\sigma_{y_k i}}exp\lgroup-\frac{(x_i - \mu_{y_k,i}^{2})}{(2\sigma_{y_k i}^{2})}\rgroup \]

1
2
3
4
5
6
7
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB

iris = datasets.load_iris()
clf = GaussianNB()
clf.fit(iris.data, iris.target)
print(clf.predict(iris.data[0]))

Multinomial Naive Bayes

MultinomialNB假设特征的先验概率为多项式分布,即如下式: \[P(X_i|y_k) = \frac{N_{y_k x_i} + \lambda}{N_{y_k} + n\lambda}\]

其中,\(N_{y_{k}x_{i}}\)是类别\(y_k\)下第i个特征为\(x_i\)的样本出现的总次数,\(N_{y_{k}}\)\(y_k\)类样本组成的集合。\(\lambda\)为一个大于0的常数,常常取为1,即拉普拉斯平滑。也可以取其他值。

该模型常用于文本分类,特征是单词,值是单词的出现次数。对应到文本分类里,如果单词word在一篇分类为label1的文档中出现了5次,那么\(N_{label1 word}\)的值会增加5。如果是去除了重复单词的,那么\(N_{label1 word}\)的值会增加1。\(n\)是特征的数量,在文本分类中就是去重后的所有单词的数量,\(\lambda\)的取值范围是[0,1],比较常见的是取值为1。

1
2
3
4
5
6
7
8
import numpy as np
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
print(clf.predict(X[2]))

值得注意的是,多项式模型在训练一个数据集结束后可以继续训练其他数据集而无需将两个数据集放在一起进行训练。在sklearn中,MultinomialNB()类的partial_fit()方法可以进行这种训练。这种方式特别适合于训练集大到内存无法一次性放入的情况。在第一次调用partial_fit()时需要给出所有的分类标号。

1
2
3
4
5
6
7
8
import numpy
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb'])
GaussianNB()
clf.partial_fit(numpy.array([6,1]), numpy.array(['bb']))
GaussianNB()
print(clf.predict(numpy.array([9,1])))

Bernoulli Naive Bayes

类 BernoulliNB 实现了对于服从多元伯努利分布的数据的朴素贝叶斯训练和分类算法; 也就是说,对于大量特征,每一个特征都是一个0-1变量 (Bernoulli, boolean)。 因此,这个类要求样本集合以0-1特征向量的方式展现。如果接收到了其他类型的数据作为参数, 一个 BernoulliNB 实例会把输入数据二元化(取决于 binarize 参数设置)。

BernoulliNB假设特征的先验概率为二元伯努利分布,即如下式: \[P(x_i|y_k) = P(i|y_k)x_i + (1 - p(i|y))(1-x_i)\]

1
2
3
4
5
6
7
8
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)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
print(clf.predict(X[2]))

不同的预测方法

  • predict方法就是我们最常用的预测方法,直接给出测试集的预测类别输出。
  • predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别。
  • predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。