朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。它和其他绝大多数的分类算法都不同。
对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数 Y = f ( X ) Y=f(X) Y=f(X),要么是条件分布 P ( Y ∣ X ) P(Y|X) P(Y∣X),但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布 P ( X , Y ) P(X,Y) P(X,Y),然后用 P ( Y ∣ X ) = P ( X , Y ) / P ( X ) P(Y|X) = P(X,Y)/P(X) P(Y∣X)=P(X,Y)/P(X).
朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用,这里我们就对朴素贝叶斯算法原理做一个小结。
一、朴素贝叶斯的相关统计学知识
我们先看看独立公式,如果X和Y相互独立,则有: P ( X , Y ) = P ( X ) ∗ P ( Y ) P(X,Y)=P(X)*P(Y) P(X,Y)=P(X)∗P(Y)
若X和Y不独立,则有: P ( Y ∣ X ) = P ( X , Y ) / P ( X ) P(Y|X) = P(X,Y)/P(X) P(Y∣X)=P(X,Y)/P(X) P ( X ∣ Y ) = P ( X , Y ) / P ( Y ) P(X|Y) = P(X,Y)/P(Y) P(X∣Y)=P(X,Y)/P(Y)
或者说: P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) / P ( X ) P(Y|X) = P(X|Y)P(Y)/P(X) P(Y∣X)=P(X∣Y)P(Y)/P(X)
但是如果X,Y不独立,但是可以在条件Z发生的情况下条件独立: P ( X , Y ) ≠ P ( X ) ∗ P ( Y ) P(X,Y) \neq P(X)*P(Y) P(X,Y)̸=P(X)∗P(Y) P ( X , Y ∣ Z ) = P ( X ∣ Z ) ∗ P ( Y ∣ Z ) P(X,Y|Z)=P(X|Z)*P(Y|Z) P(X,Y∣Z)=P(X∣Z)∗P(Y∣Z)
接着看看全概率公式: P ( X ) = ∑ k P ( X ∣ Y = Y k ) P ( Y k ) 其 中 ∑ k P ( Y k ) = 1 P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1 P(X)=k∑P(X∣Y=Yk)P(Yk)其中k∑P(Yk)=1
从上面的公式很容易得出贝叶斯公式: P ( Y k ∣ X ) = P ( X ∣ Y k ) P ( Y k ) ∑ k P ( X ∣ Y = Y k ) P ( Y k ) P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)} P(Yk∣X)=k∑P(X∣Y=Yk)P(Yk)P(X∣Yk)P(Yk)
二、朴素贝叶斯的模型
从统计学知识回到我们的数据分析。假如我们的分类模型样本是: ( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y 1 ) , ( x 1 ( 2 ) , x 2 ( 2 ) , . . . x n ( 2 ) , y 2 ) , . . . ( x 1 ( m ) , x 2 ( m ) , . . . x n ( m ) , y m ) (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m) (x1(1),x2(1),...xn(1),y1),(x1(2),x2(2),...xn(2),y2),...(x1(m),x2(m),...xn(m),ym)
即我们有m个样本,每个样本有n个特征,特征输出有K个类别,定义为 C 1 , C 2 , . . . , C K {C_1,C_2,...,C_K} C1,C2,...,CK.
从样本我们可以学习得到朴素贝叶斯的先验分布
P
(
Y
=
C
k
)
(
k
=
1
,
2
,
.
.
.
K
)
P(Y=C_k)(k=1,2,...K)
P(Y=Ck)(k=1,2,...K),接着学习到条件概率分布
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)
P(X=x∣Y=Ck)=P(X1=x1,X2=x2,...Xn=xn∣Y=Ck),这里用到了一个强假设(特征条件独立假设):即分类的特征在类确定的条件下都是条件独立的,然后我们就可以用贝叶斯公式得到X和Y的联合分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)了。联合分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)定义为:
P
(
X
,
Y
=
C
k
)
=
P
(
Y
=
C
k
)
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
Y
=
C
k
)
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
=
P
(
Y
=
C
k
)
P
(
X
1
=
x
1
∣
Y
=
C
k
)
P
(
X
2
=
x
2
∣
Y
=
C
k
)
.
.
.
P
(
X
n
=
x
n
∣
Y
=
C
k
)
\begin{aligned} P(X,Y=C_k) & =P(Y=C_k)P(X=x|Y=C_k) \\ & = P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)\\ &=P(Y=C_k)P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k) \end{aligned}
P(X,Y=Ck) =P(Y=Ck)P(X=x∣Y=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)=P(Y=Ck)P(X1=x1∣Y=Ck)P(X2=x2∣Y=Ck)...P(Xn=xn∣Y=Ck)
从上面的式子可以看出 P ( Y = C k ) P(Y=C_k) P(Y=Ck)比较容易通过最大似然法求出,得到的 P ( Y = C k ) P(Y=C_k) P(Y=Ck)就是类别 C k C_k Ck在训练集里面出现的频数。虽然特征条件独立假设大大简化了计算,但是这也可能带来预测的不准确性。你会说如果我的特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型了,考虑使用其他的分类方法比较好。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。
最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征 ( x 1 ( t e s t ) , x 2 ( t e s t ) , . . . x n ( t e s t ) ) (x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}) (x1(test),x2(test),...xn(test)),我们如何判断它属于哪个类型?
既然是贝叶斯模型,当然是后验概率最大化来判断分类了。
我们只要计算出所有的K个条件概率 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck∣X=X(test)),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。
三、朴素贝叶斯的推断过程
上节我们已经对朴素贝叶斯的模型也预测方法做了一个大概的解释,这里我们对朴素贝叶斯的推断过程做一个完整的诠释过程。
我们预测的类别 C r e s u l t C_{result} Cresult是使 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck∣X=X(test))最大化的类别,数学表达式为:
C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ∣ X = X ( t e s t ) ) = a r g m a x ⎵ C k P ( X = X ( t e s t ) ∣ Y = C k ) P ( Y = C k ) P ( X = X ( t e s t ) ) \begin{aligned} C_{result} &=\underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)})\\ &=\underbrace{argmax}_{C_k}\frac{P(X=X^{(test)}|Y=C_k)P(Y=C_k)}{P(X=X^{(test)})} \end{aligned} Cresult=Ck argmaxP(Y=Ck∣X=X(test))=Ck argmaxP(X=X(test))P(X=X(test)∣Y=Ck)P(Y=Ck)
由于对于所有的类别分别计算 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck∣X=X(test))时,上式的分母是一样的,都是 P ( X = X ( t e s t ) ) P(X=X^{(test)}) P(X=X(test)),因此,我们的预测公式可以简化为: C r e s u l t = a r g m a x ⎵ C k P ( X = X ( t e s t ) ∣ Y = C k ) P ( Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) Cresult=Ck argmaxP(X=X(test)∣Y=Ck)P(Y=Ck)
接着我们利用朴素贝叶斯的特征条件独立假设,就可以得到通常意义上的朴素贝叶斯推断公式: C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ) ∏ j = 1 n P ( X j = X j ( t e s t ) ∣ Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) Cresult=Ck argmaxP(Y=Ck)j=1∏nP(Xj=Xj(test)∣Y=Ck)
四、朴素贝叶斯的参数估计
在上一节中,我们知道只要求出 P ( Y = C k ) 和 P ( X j = X j ( t e s t ) ∣ Y = C k ) ( j = 1 , 2 , . . . n ) P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n) P(Y=Ck)和P(Xj=Xj(test)∣Y=Ck)(j=1,2,...n),我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率。
对于 P ( Y = C k ) P(Y=C_k) P(Y=Ck),比较简单,通过极大似然估计我们很容易得到 P ( Y = C k ) P(Y=C_k) P(Y=Ck)为样本类别 C k C_k Ck出现的频率,即样本类别 C k C_k Ck出现的次数 m k m_k mk除以样本总数 m m m。
对于 P ( X j = X j ( t e s t ) ∣ Y = C k ) ( j = 1 , 2 , . . . n ) P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n) P(Xj=Xj(test)∣Y=Ck)(j=1,2,...n),这个取决于我们的先验条件:
-
如果我们的 X j X_j Xj是离散的值,那么我们可以假设 X j X_j Xj符合多项式分布(简单的如二项分布),这样得到 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)是在样本类别 C k C_k Ck中,特征 X j ( t e s t ) X^{(test)}_j Xj(test)出现的频率。即: P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t m k P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k} P(Xj=Xj(test)∣Y=Ck)=mkmkjtest
其中 m k m_k mk为样本类别 C k C_k Ck总的特征计数,而 m k j t e s t m_{kj^{test}} mkjtest为类别为 C k C_k Ck的样本中,第 j j j个特征 X j ( t e s t ) X_j^{(test)} Xj(test)的取值出现的计数。
之前我一直在想某个特征的取值有很多个,如果样本在该特征下的取值要是好几个,那该怎么计算呢,后来仔细想了一下,一个样本在该特征下的可能取值有很多个,但是确定后,取的值只能是一个。
某些时候,可能某些类别在样本中没有出现,这样可能导致 P ( X j = X j ( t e s t ) ∣ Y = C k ) 为 0 P(X_j=X_j^{(test)}|Y=C_k)为0 P(Xj=Xj(test)∣Y=Ck)为0,这样会影响后验的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有: P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t + λ m k + O j λ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda} P(Xj=Xj(test)∣Y=Ck)=mk+Ojλmkjtest+λ
其中 λ λ λ 为一个大于0的常数,常常取为1。 O j O_j Oj为第 j j j个特征的可能取值个数。
- 如果我们我们的 X j X_j Xj是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设 X j X_j Xj符合伯努利分布,即特征 X j X_j Xj出现记为1,不出现记为0。即只要 X j X_j Xj出现即可,我们不关注 X j X_j Xj的次数。这样得到 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)是在样本类别 C k C_k Ck中, X j ( t e s t ) X_j^{(test)} Xj(test)出现的频率。此时有: P ( X j = X j ( t e s t ) ∣ Y = C k ) = P ( X j ∣ Y = C k ) X j ( t e s t ) + ( 1 − P ( X j ∣ Y = C k ) ) ( 1 − X j ( t e s t ) ) P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)}) P(Xj=Xj(test)∣Y=Ck)=P(Xj∣Y=Ck)Xj(test)+(1−P(Xj∣Y=Ck))(1−Xj(test))
其中, X j ( t e s t ) X_j^{(test)} Xj(test)取值为0和1。
- 如果我们我们的 X j X_j Xj是连续值,我们通常取 X j X_j Xj的先验概率为正态分布,即在样本类别 C k C_k Ck中, X j X_j Xj的值符合正态分布。这样 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)是: P ( X j = X j ( t e s t ) ∣ Y = C k ) = 1 2 π σ k 2 e x p ( − ( X j ( t e s t ) − μ k ) 2 2 σ k 2 ) P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^{2}}) P(Xj=Xj(test)∣Y=Ck)=2πσk21exp(−2σk2(Xj(test)−μk)2)
其中 μ k 和 σ k 2 \mu_k和\sigma_k^2 μk和σk2是正态分布的期望和方差,可以通过极大似然估计求得。 μ k \mu_k μk为在样本类别 C k C_k Ck中,所有 X j X_j Xj的平均值。 σ k 2 \sigma_k^2 σk2为在样本类别 C k C_k Ck中,所有 X j X_j Xj的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。
贝叶斯学派的先验假设一般是经不起推敲的,不过只要实际使用好用就行。一般的特征,只要是连续值,一般假设先验是正态分布,离散值一般假设是多项式分布,只有那些非常稀疏的特征值才指定为伯努利分布。
比如你遇到销售额数据,这肯定要假设它符合正态分布。遇到品牌类别,一般假设多项式分布。遇到大量文本中各个词的词频特征,则可以指定为伯努利分布。
五、朴素贝叶斯算法过程
我们假设训练集为m个样本n个特征,如下: ( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y 1 ) , ( x 1 ( 2 ) , x 2 ( 2 ) , . . . x n ( 2 ) , y 2 ) , . . . ( x 1 ( m ) , x 2 ( m ) , . . . x n ( m ) , y m ) (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m) (x1(1),x2(1),...xn(1),y1),(x1(2),x2(2),...xn(2),y2),...(x1(m),x2(m),...xn(m),ym)
共有K个特征输出类别,分别为 C 1 , C 2 , . . . , C K {C_1,C_2,...,C_K} C1,C2,...,CK,每个特征输出类别的样本个数为 m 1 , m 2 , . . . , m K {m_1,m_2,...,m_K} m1,m2,...,mK,在第k个类别中,如果是离散特征,则特征 X j X_j Xj各个类别取值为 x j l x_{jl} xjl,其中 l l l取值为 1 , 2 , . . . S j 1,2,...S_j 1,2,...Sj(因为每个特征的可能取值都不一定相同), S j S_j Sj为特征 j j j不同的取值数.
输出为实例 X ( t e s t ) X^{(test)} X(test)的分类。
算法流程如下:
- 如果没有Y的先验概率,则计算Y的K个先验概率: P ( Y = C k ) = ( m k + λ ) / ( m + K λ ) P(Y=C_k) = (m_k+\lambda)/(m+K\lambda) P(Y=Ck)=(mk+λ)/(m+Kλ),否则 P ( Y = C k ) P(Y=C_k) P(Y=Ck)为输入的先验概率。
- 分别计算第
k
k
k个类别的第
j
j
j个特征的第
l
l
l个取值条件概率:
P
(
X
j
=
x
j
l
∣
Y
=
C
k
)
P(X_j=x_{jl}|Y=C_k)
P(Xj=xjl∣Y=Ck)
a)如果是离散值: P ( X j = x j l ∣ Y = C k ) = m k j l + λ m k + S j λ P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda} P(Xj=xjl∣Y=Ck)=mk+Sjλmkjl+λ
λ λ λ可以取值为1,或者其他大于0的数字。
b)如果是稀疏二项离散值: P ( X j = x j l ∣ Y = C k ) = P ( j ∣ Y = C k ) x j l + ( 1 − P ( j ∣ Y = C k ) ( 1 − x j l ) P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) P(Xj=xjl∣Y=Ck)=P(j∣Y=Ck)xjl+(1−P(j∣Y=Ck)(1−xjl)
其中, x j l x_{jl} xjl的取值只有两种(0或1)
c).如果是连续值不需要计算各个 l l l的取值概率,直接求正态分布的参数 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck): P ( X j = x j l ∣ Y = C k ) = 1 2 π σ k 2 e x p ( − ( x j l − μ k ) 2 2 σ k 2 ) P(X_j=x_{jl}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp{(}-\frac{(x_{jl} - \mu_k)^2}{2\sigma_k^{2}}) P(Xj=xjl∣Y=Ck)=2πσk21exp(−2σk2(xjl−μk)2)
其中 μ k 和 σ k 2 \mu_k和\sigma_k^2 μk和σk2是正态分布的期望和方差,可以通过极大似然估计求得。 μ k \mu_k μk为在样本类别 C k C_k Ck中,所有 X j X_j Xj的平均值。 σ k 2 \sigma_k^2 σk2为在样本类别 C k C_k Ck中,所有 X j X_j Xj的方差。 - 对于实例
X
(
t
e
s
t
)
X^{(test)}
X(test),分别计算:
P
(
Y
=
C
k
)
∏
j
=
1
n
P
(
X
j
=
x
j
(
t
e
s
t
)
∣
Y
=
C
k
)
P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k)
P(Y=Ck)j=1∏nP(Xj=xj(test)∣Y=Ck)
其实每个值在第2步已经算出来了,直接对应提取使用即可。 - 确定实例
X
(
t
e
s
t
)
X^{(test)}
X(test)的分类
C
r
e
s
u
l
t
C^{result}
Cresult:
C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ) ∏ j = 1 n P ( X j = X j ( t e s t ) ∣ Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) Cresult=Ck argmaxP(Y=Ck)∏j=1nP(Xj=Xj(test)∣Y=Ck)
从上面的计算可以看出,没有复杂的求导和矩阵运算,因此效率很高。
六、朴素贝叶斯算法小结
朴素贝叶斯算法的主要原理基本已经做了总结,这里对朴素贝叶斯的优缺点做一个总结、
朴素贝叶斯的主要优点有:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
- 对小规模的数据表现很好,能够处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
- 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好,这是因为在特征较多的情况下,特征条件独立的假设就越弱,而在特征相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
- 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
- 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率.
- 对输入数据的表达形式很敏感。因为朴素贝叶斯是一个简单的基于特征进行统计的模型,因此数据的表现形式是连续特征,离散特征还是二元特征都会对模型的概率计算结果产生很大的影响,进而对基于特征的预测结果产生影响。