朴素贝叶斯分类器
简介
假定输入的特征是x1,x2,...,xnx_1,x_2,...,x_nx1,x2,...,xn,输出的分类是y,朴素贝叶斯模型使用贝叶斯公式计算后验概率:
P(y∣x1,…,xn)=P(y)P(x1,…xn∣y)P(x1,…,xn) P\left(y | x_{1}, \ldots, x_{n}\right)=\frac{P(y) P\left(x_{1}, \ldots x_{n} | y\right)}{P\left(x_{1}, \ldots, x_{n}\right)} P(y∣x1,…,xn)=P(x1,…,xn)P(y)P(x1,…xn∣y)
朴素贝叶斯模型假设给定分类y的条件下,输入的特征之间是相互独立的,因此对于任意的i都有:
P(xi∣y,x1,…,xi−1,xi+1,…,xn)=P(xi∣y) P\left(x_{i} | y, x_{1}, \dots, x_{i-1}, x_{i+1}, \ldots, x_{n}\right)=P\left(x_{i} | y\right) P(xi∣y,x1,…,xi−1,xi+1,…,xn)=P(xi∣y)
代入前面的式子得到:
P(y∣x1,…,xn)=P(y)∏i=1nP(xi∣y)P(x1,…,xn) P\left(y | x_{1}, \ldots, x_{n}\right)=\frac{P(y) \prod_{i=1}^{n} P\left(x_{i} | y\right)}{P\left(x_{1}, \ldots, x_{n}\right)} P(y∣x1,…,xn)=P(x1,…,xn)P(y)∏i=1nP(xi∣y)
因为输入固定,P(x1,...,xn)P(x_1,...,x_n)P(x1,...,xn)是一个常量,所以我们可以用下式来分类:
P(y∣x1,…,xn)∝P(y)∏i=1nP(xi∣y)y^=argmaxyP(y)∏i=1nP(xi∣y) P\left(y | x_{1}, \ldots, x_{n}\right) \propto P(y) \prod_{i=1}^{n} P\left(x_{i} | y\right) \hat{y}=\arg \max _{y} P(y) \prod_{i=1}^{n} P\left(x_{i} | y\right) P(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)y^=argymaxP(y)i=1∏nP(xi∣y)
在实际使用中,特征会很多,概率p(xi∣y)p(x_i|y)p(xi∣y)通常会比较小,直接相乘会下溢,因此我们可以取对数,把概率的乘法变成log域的加法。p(y)可以简单地用最大似然的方法从训练数据中估计出来。而p(xi∣y)p(x_i|y)p(xi∣y)可以有多种不同的分布,从而得到不同的朴素贝叶斯模型的具体实现。
高斯朴素贝叶斯(Gaussian Naive Bayes)模型
P(xi∣y)=12πσy2exp(−(xi−μy)22σy2) P\left(x_{i} | y\right)=\frac{1}{\sqrt{2 \pi \sigma_{y}^{2}}} \exp \left(-\frac{\left(x_{i}-\mu_{y}\right)^{2}}{2 \sigma_{y}^{2}}\right) P(xi∣y)=2πσy21exp(−2σy2(xi−μy)2)
因此它适合特征是集中分布于某个中心点的连续特征。
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data,iris.target).predict(iris.data)
print("Number of mislabeled points of a total %d points : %d"
% (iris.data.shape[0],(iris.target != y_pred).sum()))
输出
Number of mislabeled points of a total 150 points : 6
Bernoulli朴素贝叶斯模型
Bernoulli朴素贝叶斯模型假设似然概率服从二项分布,也就是特征$x_i$
是二值特征。为了使用Bernoulli朴素贝叶斯模型,我们需要对输入进行二值化。比如朴素贝叶斯模型来进行垃圾邮件过滤。假设词典的大小是1000,那么每一个邮件都可以表示成一个1000维的向量。如果某个词在邮件里出现了,那么对应的位置的值就是1,否则就是0.
因此p(xi∣y=1)p(x_i|y=1)p(xi∣y=1)是一个Bernoulli分布,它有一个参数p1p_1p1,表示p(xi=1∣y=1)=p1p(x_i=1|y=1)=p_1p(xi=1∣y=1)=p1,而p(xi=0∣y=1)=1−p1p(x_i=0|y=1)=1-p_1p(xi=0∣y=1)=1−p1。类似的p(xi∣y=0)p(x_i|y=0)p(xi∣y=0)也是一个Bernoulli分布,它的参数是p0p_0p0。注意,p0p_0p0和p1p_1p1没有任何关系。
要估计p1p_1p1,首先统计一下训练数据里有多少个邮件的分类是1(垃圾),记为N1N_1N1,接着统计这些邮件里有多少封出现了词1,记为N11N_{11}N11,那么p1^=N11/N1\hat{p_1}=N_{11}/N_1p1^=N11/N1。
和语言模型一样,很多词没有在训练数据中,或者只在正/负样本里出现,从而出现概率为零的情况,我们可以采取平滑方法。
多项式朴素贝叶斯模型
Bernoulli朴素贝叶斯模型的问题是不考虑一个词在文档中出现的频率,这是有一些问题的。而多项式朴素贝叶斯可以利用词频信息。多项式朴素贝叶斯也是把一篇文档变成长度为N(词典大小)的向量,某个词在文档中出现的次数就是对应位置的值,和Bernoulli相比,Bernoulli模型的特征是二值的而多项式模型的特征不是。
假设所有的类别集合是C,词典的大小是N,第i个文档是tit_iti。那么分类的时候需要计算后验概率:
Pr(c∣ti)=Pr(ti∣c)Pr(c)Pr(ti) \operatorname{Pr}\left(c | t_{i}\right)=\frac{\operatorname{Pr}\left(t_{i} | c\right) \operatorname{Pr}(c)}{\operatorname{Pr}\left(t_{i}\right)} Pr(c∣ti)=Pr(ti)Pr(ti∣c)Pr(c)
分母与C无关,因此可以忽略,Pr(c)Pr(c)Pr(c)是分类C的先验概率,而Pr(ti∣c)Pr(t_i|c)Pr(ti∣c)是分类C"生成"文档tit_iti的概率。这个概率我们假设它服从多项式分布:
Pr(ti∣c)=(∑nfni)!∏nPr(wn∣c)fnifni! \operatorname{Pr}\left(t_{i} | c\right)=\left(\sum_{n} f_{n i}\right) ! \prod_{n} \frac{\operatorname{Pr}\left(w_{n} | c\right)^{f_{n i}}}{f_{n i} !} Pr(ti∣c)=(n∑fni)!n∏fni!Pr(wn∣c)fni
上式的n是词典里的第n个词,fnif_{ni}fni表示第n个词wnw_nwn在文档t中出现的次数,Pr(wn∣c)Pr(w_n|c)Pr(wn∣c)是类别c的文档产生词wnw_nwn的概率。上式的核心是∏nPr(wn∣c)fni\prod_{n} \operatorname{Pr}\left(w_{n} | c\right)^{f_{n i}}∏nPr(wn∣c)fni,其余的阶乘只是为了归一化。
假设一篇文档中有5个词,2个hello,2个world,1个bye,则它们组成的不重复文档共有5!2!2!1!\frac{5 !}{2 ! 2 ! 1 !}2!2!1!5!。
推广一些,假设文档的词频向量为f1,f2,...fnf_1,f_2,...f_nf1,f2,...fn,fif_ifi表示第i个词出现的频次,那么不重复的文档数为(∑i=1nfi)!∏i=1nfi!\frac{\left(\sum_{i=1}^{n} f_{i}\right) !}{\prod_{i=1}^{n} f_{i} !}∏i=1nfi!(∑i=1nfi)!。
而我们的多项式分布假设文档的表示与顺序无关,也就是词袋模型。因此文档Pr(ti∣c)Pr(t_i|c)Pr(ti∣c)的概率可以这样来理解:如果不考虑重复,那么Pr(ti∣c)=∏i=1nPr(wn∣c)fni\operatorname{Pr}\left(t_{i} | c\right)=\prod_{i=1}^{n} \operatorname{Pr}\left(w_{n} | c\right)^{f_{n i}}Pr(ti∣c)=∏i=1nPr(wn∣c)fni,但是那些重复的都应该算到这篇文档里,乘起来就得到了
Pr(ti∣c)=(∑nfni)!∏nPr(wn∣c)fnifni!\operatorname{Pr}\left(t_{i} | c\right)=\left(\sum_{n} f_{n i}\right) ! \prod_{n} \frac{\operatorname{Pr}\left(w_{n} | c\right)^{f_{n i}}}{f_{n i} !}Pr(ti∣c)=(∑nfni)!∏nfni!Pr(wn∣c)fni。
在分类的时候,因为(∑nfni)!,∏n1fni\left(\sum_{n} f_{n i}\right) !, \prod_{n} \frac{1}{f_{n i}}(∑nfni)!,∏nfni1与c无关,因此可以看出归一化常量,所以只需要计算∏i=1nPr(wn∣c)fni\prod_{i=1}^{n} \operatorname{Pr}\left(w_{n} | c\right)^{f_{n i}}∏i=1nPr(wn∣c)fni。问题的关键就是估计参数Pr(wn∣c)\operatorname{Pr}(w_n|c)Pr(wn∣c),我们可以用最大似然估计,为了避免数据稀疏带来的零概率问题,我们加入了Laplace平滑,计算公式如下:
Pr^(wn∣c)=1+FncN+∑x=1NFxc \widehat{\operatorname{Pr}}\left(w_{n} | c\right)=\frac{1+F_{n c}}{N+\sum_{x=1}^{N} F_{x c}} Pr
(wn∣c)=N+∑x=1NFxc1+Fnc
假设共有3个词,分类c有两篇文档
w1 w2 w1
w2 w1
那么F1c=3,F2c=2,F3c=0F_{1c}=3,F_{2c}=2,F_{3c}=0F1c=3,F2c