作为机器学习中少有的生成模型,朴素贝叶斯(Naive Bayes) 是基于统计学中 贝叶斯定理 发展而来的,其中的 朴素(Navie) 二字表明假设数据特征之间均为独立的。它主要应用于 nlp 领域,例如文本分类,情感分析,语法纠错,语言模型等。我们则以传统分类算法进行展开。
在细致地了解朴素贝叶斯前回顾一些简单的概率统计知识,能有效帮助我们推导朴素贝叶斯。
假设有一种数据有两个特征 A A A, B B B
不管两者是否独立,我们都可以写出联合概率与条件概率之间的关系,为
P ( A , B ) = P ( A ∣ B ) P ( B ) = P ( B ∣ A ) P ( A ) P(A,B)=P(A|B)P(B)=P(B|A)P(A) P(A,B)=P(A∣B)P(B)=P(B∣A)P(A)
联合概率 P ( A , B ) P(A,B) P(A,B) 可以理解为数据中既符合特征 A A A,又符合特征 B B B的数据占比。
假设我们想求得联合概率 P ( A , B ) P(A,B) P(A,B),应该怎么办呢,可以试着从先求得数据中符合特征 A A A 的占比,然后 A A A 的条件基础之上求得符合特征 B B B 的占比。据此思路就是求得 P ( A ) P ( B ∣ A ) P(A)P(B|A) P(A)P(B∣A)。当然我们也可以从特征 B B B 的角度出发,同理得到 P ( B ) P ( A ∣ B ) P(B)P(A|B) P(B)P(A∣B)。
如果特征 A , B A,B A,B 之间是独立的,我们还可以有
P ( A , B ) = P ( A ) P ( B ) P(A,B)=P(A)P(B) P(A,B)=P(A)P(B)
基于上面所推得的联合概率与条件概率公式
P ( A , B ) = P ( A ∣ B ) P ( B ) = P ( B ∣ A ) P ( A ) P(A,B)=P(A|B)P(B)=P(B|A)P(A) P(A,B)=P(A∣B)P(B)=P(B∣A)P(A)
假设我们数据集含特征X,标签Y,同样有
P ( Y ∣ X ) P ( X ) = P ( X ∣ Y ) P ( Y ) P(Y|X)P(X)=P(X|Y)P(Y) P(Y∣X)P(X)=P(X∣Y)P(Y)
经过简单的变换可以得到著名的贝叶斯定理,为 P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X)=\cfrac{P(X|Y)P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)P(Y)
其中的 P ( Y ) , P ( X ) P(Y),P(X) P(Y),P(X) 为特征 X X X,与标签 Y Y Y 的 先验概率(边缘概率),先验概率指的是某件事情发生或存在的概率。比如 P ( Y ) P(Y) P(Y),表明所有数据中标签符合 Y Y Y 的概率,是可以通过检查数据集中的标签提前得到的,对特征 X X X 同理。
其中 P ( Y ∣ X ) , P ( X ∣ Y ) P(Y|X),P(X|Y) P(Y∣X),P(X∣Y) 为 后验概率(条件概率),指的是另一件事在某个条件下发生或存在的概率,也可以理解为在某件事已经发生或存在的前提下,另一件事情发生的概率。对于 P ( Y ∣ X ) P(Y|X) P(Y∣X),表明在已知特征X的前提下,求得它符合特定标签Y的概率。
假设存在一个数据集,有n个特征,序列为{ x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn},m个类别,序列为{ y 1 , y 2 . . . y m y_1,y_2...y_m y1,y2...ym},如果我们要求得某个特定数据 X j X_j Xj 属于类别 y k y_k yk 的概率,根据贝叶斯定理,我们有
P ( Y = y k ∣ X = X j ) = P ( X = X j ∣ Y = y k ) P ( Y = y k ) P ( X = X j ) P(Y=y_k|X=X_j)=\cfrac{P(X=X_j|Y=y_k)P(Y=y_k)}{P(X=X_j)} P(Y=yk∣X=Xj)=P(X=Xj)P(X=Xj∣Y=yk)P(Y=yk)
细致点可以写为
P ( y k ∣ x 1 j , x 2 j . . . x n j ) = P ( x 1 j , x 2 j . . . x n j ∣ y i ) P ( y k ) P ( x 1 j , x 2 j . . . x n j ) P(y_k|x^j_1,x^j_2...x^j_n)=\cfrac{P(x^j_1,x^j_2...x^j_n|y_i)P(y_k)}{P(x^j_1,x^j_2...x^j_n)} P(yk∣x1j,x2j...xnj)=P(x1j,x2j...xnj)P(x1j,x2j...xnj∣yi)P(yk)
由于我们算法在原本的贝叶斯定理上增加了 朴素(Navie) 二字,意味着我们假定所有特征之间为独立的(可能你会有疑惑,这种假设不会对我们得算法造成负面影响吗,理论上是有的;但实际使用,影响甚微,还是不错的效;因此可以忽略不计)。如果特征间的独立,根据之前的公式
P ( A , B ) = P ( A ) P ( B ) P(A,B)=P(A)P(B) P(A,B)=P(A)P(B)
此时对特征 X i X_i Xi,推导公式可以变为
P ( y k ∣ x 1 j , x 2 j . . . x n j ) = P ( y k ) Π i = 1 n P ( x i j ∣ y k ) ∑ i = 1 n P ( x i j ) P(y_k|x^j_1,x^j_2...x^j_n)=\cfrac{P(y_k)\Pi_{i=1}^nP(x^j_i|y_k)}{\sum_{i=1}^nP(x^j_i)} P(yk∣x1j,x2j...xnj)=∑i=1nP(xij)P(yk)Πi=1nP(xij∣yk)
到现在,我们就是设法求得其中公式右边各项的值了,其中先验概率 P ( y k ) , P ( x i j ) , P ( x i j ∣ y k ) P(y_k),P(x^j_i),P(x^j_i|y_k) P(yk),P(xij),P(xij∣yk),我们都是可以在得到数据集的时候就可以统计出来。只不过后两者在特征多,样本量大的情况下计算十分耗时。
由于我们希望对数据 X j X_j Xj 输出最可能大的标签 y m a x y_{max} ymax,因此对序列{ y 1 , y 2 . . . y m y_1,y_2...y_m y1,y2...ym}中的每一个元素都要进行计算,最后找到概率最大的那一个,公式为
y m a x = arg max y k P ( y k ∣ X j ) = arg max y k P ( X i ∣ y k ) P ( y k ) P ( X i ) y_{max}=\argmax_{y_k}P(y_k|X_j)=\argmax_{y_k}\cfrac{P(X_i|y_k)P(y_k)}{P(X_i)} ymax=ykargmaxP(yk∣Xj)=ykargmaxP(Xi)P(Xi∣yk)P(yk)
明显对于任意一个类别的计算,其分母都是相同的值,那么公式可简化为
y m a x = arg max y k P ( X i ∣ y k ) P ( y k ) y_{max}=\argmax_{y_k}P(X_i|y_k)P(y_k) ymax=ykargmaxP(Xi∣yk)P(yk)
如果简单的使用朴素贝叶斯进行计算,影响概率大小的有两项。对于 P ( y k ) P(y_k) P(yk),意味着如果该类别 y k y_k yk 占比越大,我们甚至可以在不看需要判断的数据本身的前提下进行瞎猜;而前者 P ( X i ∣ y k ) P(X_i|y_k) P(Xi∣yk),则是细看类似的样本在特定标签数据中是否存在很多,存在的越多,概率越大。总的来说,朴素贝叶斯算法与人分类数据的方法是十分相似的,只不过我们高级的多,能够提取更加潜在的关系。
朴素贝叶斯的种类有不少,主要根据数据集选择不同的模型,最常见的三种为:高斯(Gaussian),多项式(Multinomial),伯努利(Bernoulli)。其实sklearn 中还涉及到了 Complement Naive Bayes,Categorical Navie Bayes,Out-of-core naive Bayes model fitting,由于比较冷门,只需要有个印象就行。
高斯朴素贝叶斯作为其中最常用的一种模型,用于特征为连续值得模型(原因看公式就能明白)。对于朴素贝叶斯公式中的 P ( y k ) , P ( X ∣ y k ) P(y_k),P(X|y_k) P(yk),P(X∣yk),前者依旧按照标签占比决定概率大小,后者则是根据高斯分布公式进行计算,因为我们此时假设特征 X X X 序列中的 { x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn} 分别在所有标签序 { y 1 , y 2 . . . y m y_1,y_2...y_m y1,y2...ym} 都呈现正态分布,计算公式为
P ( x i ∣ y k ) = 1 2 π σ exp ( − ( x i − μ ) 2 2 σ 2 ) P(x_i|y_k)=\cfrac{1}{\sqrt{2\pi \sigma}}\exp(-\cfrac{{(x_i-\mu)}^2}{2 {\sigma}^2}) P(xi∣yk)=2πσ1exp(−2σ2(xi−μ)2)
μ \mu μ:为 x i x_i xi 所对应的特征在标签 y k y_k yk 下的均值
σ \sigma σ:为 x i x_i xi 所对应的特征在标签 y k y_k yk 下的方差
可以看到计算过程中包括根号与指数,实际代码中这样写进去计算量是很大的,因此我们可以简化公式做些修改,加上对数并去除常数项,但不影响它的增减性,如
P ( x i ∣ y k ) = log 1 σ − ( x i − μ ) 2 2 σ 2 P(x_i|y_k)=\log \cfrac{1}{\sigma}\ -\cfrac{{(x_i-\mu)}^2}{2{\sigma}^2} P(xi∣yk)=logσ1 −2σ2(xi−μ)2
多项式贝叶斯原理比较简单,适用于离散特征并假设特征在类别条件下符合多项式分布,这也意味着许多特征能出现多次。对于 P ( y k ) , P ( x i ∣ y k ) P(y_k),P(x_i|y_k) P(yk),P(xi∣yk),两者的计算都是简单的占比,后者公式为
P ( x i ∣ y k ) = N x i N y k P(x_i|y_k)=\cfrac{N_{x_i}}{N_{y_k}} P(xi∣yk)=NykNxi
N x i N_{x_i} Nxi:在 y k y_k yk 的条件下, x i x_i xi 在所对应的特征中出现的频率
N y k N_{y_k} Nyk:符合 y k y_k yk 的条件下的所有样本数
公式中存在一些不足,比如在做语法分析时,可能我们的 x i x_i xi 在数据中从未出现,此时得到的 P ( y k ) , P ( x i ∣ y k ) P(y_k),P(x_i|y_k) P(yk),P(xi∣yk) 的值为0,然而对于一个多特征的数据集,仅仅因为一个数值为零,后续连乘我们的 P ( y k ) Π j = 1 n P ( x j i ∣ y k ) P(y_k)\Pi_{j=1}^nP(x^i_j|y_k) P(yk)Πj=1nP(xji∣yk) 也为0,怎么看都觉得这公式容错率不够。因此我们加入了 平滑(smooth) 操作,其中的 one-smoothing ,也被称为拉普拉斯平滑,其公式为
P ( x i ∣ y k ) = N x i + α N y k + α n P(x_i|y_k)=\cfrac{N_{x_i}+\alpha}{N_{y_k}+\alpha n} P(xi∣yk)=Nyk+αnNxi+α
α \alpha α 为正整数, n n n为数据集的大小
当 α = 1 \alpha=1 α=1 时,为拉普拉斯平滑;其余情况为 K-smoothing
如果以后学习 自然语言处理(nlp) 的话,除了one-smoothing,K-smoothing,还会了解到Interpolation,Good-Turning Smoothing。有兴趣可以稍微查阅一下。
伯努利朴素贝叶斯一般用于特征为十分稀疏的离散值。此时假设某个特征 x i x_i xi 符合伯努利分布,如果数据在该特征处有值(不管它是多少)就记为1;如果数据在该特征无值,则记为0。对于朴素贝叶斯公式中某一个特征有式子
P ( x i ∣ y k ) = x i P ( x i = 1 ∣ y k ) + ( 1 − x i ) P ( x i = 0 ∣ y k ) P(x_i|y_k)=x_iP(x_i=1|y_k)+(1-x_i)P(x_i=0|y_k) P(xi∣yk)=xiP(xi=1∣yk)+(1−xi)P(xi=0∣yk)
其中的 x i = 1 o r 0 x_i=1\ or\ 0 xi=1 or 0,并且 P ( x i = 0 ∣ y k ) = 1 − P ( x i = 1 ∣ y i ) P(x_i=0|y_k)=1-P(x_i=1|y_i) P(xi=0∣yk)=1−P(xi=1∣yi),那么我们可以有
P ( x i ∣ y k ) = x i P ( x i = 1 ∣ y k ) + ( 1 − x i ) ( 1 − P ( x i = 1 ∣ y i ) ) P(x_i|y_k)=x_iP(x_i=1|y_k)+(1-x_i)(1-P(x_i=1|y_i)) P(xi∣yk)=xiP(xi=1∣yk)+(1−xi)(1−P(xi=1∣yi))