朴素贝叶斯 (Naive Bayes) 是机器学习中经典的分类算法,它利用贝叶斯理论通过事物的先验概率 (Prior probability) 来预测事物的后验概率 (Posterior probability) 。严格意义上讲,朴素贝叶斯 (包括 KNN 算法) 都属于统计学的方法,它并没有通过数据集去构建线性或树状模型,而是通过对事物的分析观察来计算事物发生的概率。
相信大家都知晓一句名言:Too young too simple, sometimes naive。这里的 Naive 含有 “天真的,缺乏经验的” 的贬义。而朴素贝叶斯之所以也叫 Naive ,是因为该算法也有一个 “天真的” 的设想,那就是特征空间中各个特征是独立的,即 每个特征的取值不受其他特征取值的影响 。然而事实证明,在实际应用中,我们很难做到每个特征都相互独立。相反地,各个特征相互影响、约束的条件屡见不鲜。从这个意义上来讲,朴素贝叶斯确实是很 Naive。
我看过很多写贝叶斯公式或理论的博客,他们往往一上来就介绍公式,如
P
(
A
∣
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
P(A|B) = \frac{P(B|A)P(A)}{P(B)}
P ( A ∣ B ) = P ( B ) P ( B ∣ A ) P ( A ) ,看起生硬且晦涩难懂。其实,要弄懂这贝叶斯理论以及朴素贝叶斯算法只需要一个简单的例子即可。
1. 一个简单的例子
假设你出席一个由 工人 和 农民 联合召开的会议上,看到了一个 身材高大 的人迎面向你走来,根据你以前的经验,大多数的工人都身材高大,因此你判断这个身材高大的人是工人。那么恭喜你,你的大脑已经自动在使用朴素贝叶斯算法了。“大多数工人都身材高大” 用概率的表示为
P
(
身
材
高
大
∣
工
人
)
P(身材高大|工人)
P ( 身 材 高 大 ∣ 工 人 ) ,最终的结果 “他身材高大他是工人” 用概率表示为
P
(
工
人
∣
身
材
高
大
)
P(工人|身材高大)
P ( 工 人 ∣ 身 材 高 大 ) 。
听不懂没关系,我们直接看图。假设大会上只来了工人和农民,其中工人 10 人,农民 100 人。在工人当中有 4 人是身材高大的,在农民当中有 10 人是身材高大的 (下图左侧所示)。现在问题变成了求解一个身材高大的人是工人还是农民的概率。 我们将实际情况抽象为上图中间的矩形。我们将 “是工人” 的事实记为事件
H
H
H ,“是农民” 的事实记为
¬
H
\neg H
¬ H 。则是工人的概率记为
P
(
H
)
=
10
100
P(H)=\frac{10}{100}
P ( H ) = 1 0 0 1 0 ,是农民的概率记为
P
(
¬
H
)
=
100
110
P(\neg H)=\frac{100}{110}
P ( ¬ H ) = 1 1 0 1 0 0 。我们将 “身材高大” 的特征记为观测
E
E
E ,则工人中身材高大的概率表示为
P
(
E
∣
H
)
=
4
10
P(E|H)=\frac{4}{10}
P ( E ∣ H ) = 1 0 4 ,而农民中身材高大的概率表示为
P
(
E
∣
¬
H
)
=
10
100
P(E|\neg H)=\frac{10}{100}
P ( E ∣ ¬ H ) = 1 0 0 1 0 。于是乎,我们求解“身材高大是工人的概率”,事实上就是求解
P
(
H
∣
E
)
P(H|E)
P ( H ∣ E ) 。
上图左侧抽象的表示了计算
P
(
H
∣
E
)
P(H|E)
P ( H ∣ E ) 的过程,我们最终能够得到下面这个式子,这个式子就是之前的贝叶斯定理。其中
P
(
E
∣
H
)
P(E|H)
P ( E ∣ H ) 称为先验概率,
P
(
H
∣
E
)
P(H|E)
P ( H ∣ E ) 称为后验概率,
P
(
H
)
P(H)
P ( H ) 称为似然估计。总的来讲,贝叶斯定理反映了条件概率下事物发生的可能性,在生活中太常见了。
P
(
H
∣
E
)
=
P
(
H
)
×
P
(
E
∣
H
)
P
(
H
)
×
P
(
E
∣
H
)
+
P
(
¬
H
)
×
P
(
E
∣
¬
H
)
P(H|E) = \frac{P(H)\times P(E|H)}{P(H)\times P(E|H)+P(\neg H)\times P(E|\neg H)}
P ( H ∣ E ) = P ( H ) × P ( E ∣ H ) + P ( ¬ H ) × P ( E ∣ ¬ H ) P ( H ) × P ( E ∣ H )
我们结合实际的例子,可以计算出 “身材高大是工人的概率”,即
P
(
H
∣
E
)
P(H|E)
P ( H ∣ E ) ,
P
(
H
∣
E
)
=
10
/
110
×
4
/
10
10
/
110
×
4
/
10
+
100
/
110
×
10
/
100
=
0.286
P(H|E)=\frac{10/110\times4/10}{10/110 \times 4/10 + 100/110 \times 10/100} = 0.286
P ( H ∣ E ) = 1 0 / 1 1 0 × 4 / 1 0 + 1 0 0 / 1 1 0 × 1 0 / 1 0 0 1 0 / 1 1 0 × 4 / 1 0 = 0 . 2 8 6
那么,“身材高大是农民的概率”,即
P
(
¬
H
∣
E
)
=
1
−
0.286
=
0.714
P(\neg H|E)= 1-0.286=0.714
P ( ¬ H ∣ E ) = 1 − 0 . 2 8 6 = 0 . 7 1 4 。那么综合比较,
P
(
¬
H
∣
E
)
>
P
(
H
∣
E
)
P(\neg H|E)>P(H|E)
P ( ¬ H ∣ E ) > P ( H ∣ E ) ,说明 这个身材高大的人更有可能是农民 !
在贝叶斯理论中,概率
P
(
H
)
P(H)
P ( H ) 称之为 先验概率 (Prior) ,概率
P
(
E
∣
H
)
P(E|H)
P ( E ∣ H ) 称之为 似然 (Likehood) ,概率
P
(
H
∣
E
)
P(H|E)
P ( H ∣ E ) 称之为 后验概率 (Posterior) 。
2. 分类问题中的贝叶斯定理
在分类问题中,特征是多维度的,即可认为观测 E 不再是一个单一的值,而是一个多维向量。通过 “朴素的” 假设,我们可以直接利用贝叶斯定理来帮助我们分类样本。
2.1 问题转化
在分类问题中,假定分类的结果
y
y
y 存在
k
k
k 种情况,即
y
∈
{
y
1
,
y
2
,
.
.
.
,
y
k
}
y\in \{y_1,y_2,...,y_k\}
y ∈ { y 1 , y 2 , . . . , y k } 。观测的结果
x
x
x 是
d
d
d 维向量,即
x
=
(
x
1
,
x
2
,
.
.
.
,
x
d
)
T
x=(x_1,x_2,...,x_d)^T
x = ( x 1 , x 2 , . . . , x d ) T 。那么分类问题就转化成:对于新的观测结果
x
n
e
w
=
(
a
1
,
a
2
,
.
.
.
,
a
d
)
T
x^{new}=(a_1,a_2,...,a_d)^T
x n e w = ( a 1 , a 2 , . . . , a d ) T ,判断
x
n
e
w
x^{new}
x n e w 属于各个类的概率,即
P
(
y
=
y
i
∣
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
)
,
i
∈
[
1
,
k
]
P(y=y_i|x_1=a_1,...,x_d=a_d), \ i \in [1,k]
P ( y = y i ∣ x 1 = a 1 , . . . , x d = a d ) , i ∈ [ 1 , k ]
针对上式计算出的
k
k
k 个概率结果,我们选取最大概率的
i
i
i ,将样本
x
n
e
w
x^{new}
x n e w 预测为类
y
i
y_i
y i 。 为了节省空间,我将上述这个概率记为
P
(
y
i
∣
x
n
e
w
)
P(y_i|x^{new})
P ( y i ∣ x n e w ) 。
2.2 利用贝叶斯定理计算结果
将上述问题套用贝叶斯定理,我们得到
P
(
y
i
∣
x
n
e
w
)
=
P
(
y
=
y
i
)
P
(
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
∣
y
=
y
i
)
P
(
y
=
y
i
)
P
(
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
∣
y
=
y
i
)
+
P
(
y
≠
y
i
)
P
(
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
∣
y
≠
y
i
)
P(y_i|x^{new})=\frac{P(y=y_i)P(x_1=a_1,...,x_d=a_d|y=y_i)}{P(y=y_i)P(x_1=a_1,...,x_d=a_d|y=y_i)+P(y \neq y_i)P(x_1= a_1,...,x_d=a_d|y\neq y_i)}
P ( y i ∣ x n e w ) = P ( y = y i ) P ( x 1 = a 1 , . . . , x d = a d ∣ y = y i ) + P ( y = y i ) P ( x 1 = a 1 , . . . , x d = a d ∣ y = y i ) P ( y = y i ) P ( x 1 = a 1 , . . . , x d = a d ∣ y = y i )
又因为特征之间是独立的,我们有下述两个式子成立,
P
(
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
∣
y
=
y
i
)
=
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
=
y
i
)
P
(
x
1
=
a
1
,
.
.
.
,
x
d
=
a
d
∣
y
≠
y
i
)
=
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
≠
y
i
)
P(x_1=a_1,...,x_d=a_d|y=y_i)=\prod_{j=1}^{d}P(x_j=a_j|y=y_i) \\ P(x_1=a_1,...,x_d=a_d|y \neq y_i)=\prod_{j=1}^{d}P(x_j=a_j|y \neq y_i)
P ( x 1 = a 1 , . . . , x d = a d ∣ y = y i ) = j = 1 ∏ d P ( x j = a j ∣ y = y i ) P ( x 1 = a 1 , . . . , x d = a d ∣ y = y i ) = j = 1 ∏ d P ( x j = a j ∣ y = y i )
于是乎,总的概率
P
(
y
i
∣
x
n
e
w
)
P(y_i|x^{new})
P ( y i ∣ x n e w ) 的值可以写成,
P
(
y
i
∣
x
n
e
w
)
=
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
=
y
i
)
P
(
y
=
y
i
)
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
=
y
i
)
P
(
y
=
y
i
)
+
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
≠
y
i
)
P
(
y
≠
y
i
)
P(y_i|x^{new}) = \frac{\prod_{j=1}^{d}P(x_j=a_j|y=y_i)P(y=y_i)}{\prod_{j=1}^{d}P(x_j=a_j|y=y_i)P(y=y_i)+\prod_{j=1}^{d}P(x_j=a_j|y \neq y_i)P(y \neq y_i)}
P ( y i ∣ x n e w ) = ∏ j = 1 d P ( x j = a j ∣ y = y i ) P ( y = y i ) + ∏ j = 1 d P ( x j = a j ∣ y = y i ) P ( y = y i ) ∏ j = 1 d P ( x j = a j ∣ y = y i ) P ( y = y i )
最后,按照上述式子分别计算样本
x
n
e
w
x^{new}
x n e w 属于不同类的概率,然后比较他们的大小。
P
(
y
i
∣
x
n
e
w
)
P(y_i|x^{new})
P ( y i ∣ x n e w ) 最大的
y
i
y_i
y i 即为最终的预测结果
y
^
\hat{y}
y ^ ,
y
^
=
a
r
g
m
a
x
<
y
i
>
P
(
y
i
∣
x
n
e
w
)
,
i
∈
[
1
,
k
]
\hat{y} = arg \ max_{<y_i>} P(y_i|x^{new}), \ i\in[1,k]
y ^ = a r g m a x < y i > P ( y i ∣ x n e w ) , i ∈ [ 1 , k ]
当然了这些概率之和也一定满足
∑
i
=
1
k
P
(
y
i
∣
x
n
e
w
)
=
1
\sum_{i=1}^{k}P(y_i|x^{new})=1
∑ i = 1 k P ( y i ∣ x n e w ) = 1 。事实上,在计算
P
(
y
=
y
i
∣
x
n
e
w
)
P(y=y_i|x^{new})
P ( y = y i ∣ x n e w ) 的时候,你会发现它的分母对所有的类 (
y
i
y_i
y i ) 是相同的。因此比较各个类发生的概率
P
(
y
i
∣
x
n
e
w
)
P(y_i|x^{new})
P ( y i ∣ x n e w ) 等价于比较各个类的分子,即
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
=
y
i
)
P
(
y
=
y
i
)
\prod_{j=1}^{d}P(x_j=a_j|y=y_i)P(y=y_i)
∏ j = 1 d P ( x j = a j ∣ y = y i ) P ( y = y i ) 。于是上述表达式又可写成如下形式,
y
^
=
a
r
g
m
a
x
<
y
i
>
∏
j
=
1
d
P
(
x
j
=
a
j
∣
y
=
y
i
)
P
(
y
=
y
i
)
,
i
∈
[
1
,
k
]
\hat{y} = arg \ max_{<y_i>} \prod_{j=1}^{d}P(x_j=a_j|y=y_i)P(y=y_i), \ i \in [1,k]
y ^ = a r g m a x < y i > j = 1 ∏ d P ( x j = a j ∣ y = y i ) P ( y = y i ) , i ∈ [ 1 , k ]
其中,
P
(
y
=
y
i
)
P(y=y_i)
P ( y = y i ) 这个比较好算,指的是总体样本中属于类
y
i
y_i
y i 的概率。
P
(
x
j
=
a
j
∣
y
=
y
i
)
P(x_j=a_j|y=y_i)
P ( x j = a j ∣ y = y i ) 指的是总体样本中第
j
j
j 个特征等于
a
j
a_j
a j 的属于样本
y
i
y_i
y i 的个数。以上就是朴素贝叶斯分类算法的表现形式。
2.3 常见的朴素贝叶斯算法
我暂时介绍 2 种常见的朴素贝叶斯算法 (详情请参考 SKlearn 官网),这些算法根据不同的先验分布的假设,使用不同的计算公式来计算
P
(
x
j
=
a
j
∣
y
=
y
i
)
P(x_j=a_j|y=y_i)
P ( x j = a j ∣ y = y i ) 。
a) 高斯朴素贝叶斯 (Gaussian Naive Bayes) 主要针对于连续性特征,它假设每个维度的特征服从正态分布 (高斯分布)。也就是说,
P
(
x
j
=
a
j
∣
y
=
y
i
)
=
1
2
π
σ
(
i
,
j
)
2
exp
(
x
j
−
μ
(
i
,
j
)
2
σ
(
i
,
j
)
2
)
P(x_j=a_j|y=y_i) = \frac{1}{\sqrt{2\pi \sigma_{(i,j)}^2}}\exp(\frac{x_j-\mu_{(i,j)}}{2\sigma_{(i,j)}^2})
P ( x j = a j ∣ y = y i ) = 2 π σ ( i , j ) 2
1 exp ( 2 σ ( i , j ) 2 x j − μ ( i , j ) )
上式中的参数
σ
(
i
,
j
)
\sigma_{(i,j)}
σ ( i , j ) 和
μ
(
i
,
j
)
\mu_{(i,j)}
μ ( i , j ) 分别表示类别为
y
i
y_i
y i 的样本中第
j
j
j 列特征的方差和均值。
b) 多项式朴素贝叶斯 (Multinomial Naive Bayes) 主要针对于离散型特征,它计算
P
(
x
j
=
a
j
∣
y
=
y
i
)
P(x_j=a_j|y=y_i)
P ( x j = a j ∣ y = y i ) 的方法就符合我们正常人的思维,也就是在类别为
y
i
y_i
y i 的样本中找特征
x
j
=
a
j
x_j=a_j
x j = a j 的样本来进行统计。另外,为了防止概率等于 0 的情况出现,我们在计算公式中引入了拉普拉斯常量
α
\alpha
α 。
P
(
x
j
=
a
j
∣
y
=
y
i
)
=
N
(
a
j
,
y
i
)
+
α
N
(
y
i
)
+
d
α
P(x_j=a_j|y=y_i) = \frac{N_{(a_j,y_i)}+\alpha}{N_{(y_i)} + d \alpha}
P ( x j = a j ∣ y = y i ) = N ( y i ) + d α N ( a j , y i ) + α
上式中
N
(
y
i
)
N_{(y_i)}
N ( y i ) 表示类别为
y
i
y_i
y i 的样本个数,
N
(
a
j
,
y
i
)
N_{(a_j,y_i)}
N ( a j , y i ) 表示类别为
y
i
y_i
y i 且第
j
j
j 个特征等于
a
j
a_j
a j 的样本个数,
d
d
d 表示向量的维度。当
α
=
1
\alpha=1
α = 1 时称之为拉普拉斯平滑 (Laplace smoothing),当
α
<
1
\alpha<1
α < 1 时称之为利德斯通平滑 (Lidstone smoothing)。
一些教材 在计算先验概率
P
(
y
=
y
i
)
P(y=y_i)
P ( y = y i ) 时,使用公式
P
(
y
=
y
i
)
=
N
(
y
i
)
+
λ
N
+
k
λ
P(y=y_i)=\frac{N_{(y_i)}+\lambda}{N+k\lambda}
P ( y = y i ) = N + k λ N ( y i ) + λ ,其中
N
N
N 表示训练样本总数,
k
k
k 表示类别个数。但是按照 Sklearn 官方的计算公式,
P
(
y
=
y
i
)
=
N
(
y
i
)
N
P(y=y_i)=\frac{N_{(y_i)}}{N}
P ( y = y i ) = N N ( y i ) ,我默认遵从 SKlearn 的标准。
3. 总结
朴素贝叶斯是经典的机器学习分类算法,它利用贝叶斯理论由先验概率推出事件的后验概率。在垃圾邮件分类和文本分类中应用比较广泛。它的优点在于 (1) 发源于古典数学理论,有稳定的分类效率;(2) 对小规模的数据表现很好,能个处理多分类任务; 它的缺点就在于 (a) 算法的准确性强烈依赖于事件的先验概率;(b) 需要假设特征之间相互独立,而现实生活中很难实现。
最后,使用贝叶斯理论的时候请记住第 1 节中的抽象矩形图案,不要去背公式!