这是之前写的一篇东西,目的是让人能够全面的理解以朴素贝叶斯为代表的相关算法。
0. 机器学习的任务
给定一系列分布未知的 数据 { x i , y i } i = 1 N \{{\bf{x_i}}, y_i\}_{i=1}^{N} {xi,yi}i=1N ,其中 y y y 符合未知条件分布 F ( y ∣ x ) F(y|{\bf x}) F(y∣x) 。
机器学习需要确定一个 函数集 f ( x , θ ) , θ ∈ Θ f({\bf x}, \theta), \theta \in \Theta f(x,θ),θ∈Θ ,并从该函数集中找出“最好”的那一个。
于是,机器学习需要解决如下几个问题:
- (1) 如何确定确定函数集?
- (2) 如何定义“最好”?
- (3) 如何找到最好的函数?
可以说,所有的监督学习算法,都可以归结为对上述问题的解答。
1. 贝叶斯视角
贝叶斯方法,实质上是 将一切都看成是随机的,区别只是概率的大小不同。
于是,我们关注的是 P ( y i ∣ x ) P(y_i | {\bf x}) P(yi∣x) 。
为了求得该条件分布,贝叶斯推理走了一条“不寻常”的路:利用 贝叶斯公式。
P
(
y
i
∣
x
)
=
P
(
x
∣
y
i
)
∗
P
(
y
i
)
P
(
x
)
P(y_i|{\bf x})=\frac{P({\bf x}|y_i) * P(y_i)}{P({\bf x})}
P(yi∣x)=P(x)P(x∣yi)∗P(yi)
由于对每个
y
i
y_i
yi(即类别),
P
(
x
)
P({\bf x})
P(x) 都一样,于是问题就转化为:
- 如何获得先验概率分布 P ( y ) P(y) P(y) ?
- 如何获得条件概率分布 P ( x ∣ y ) P({\bf x} | y) P(x∣y) ?
为什么说这条路“不寻常”呢?因为无论是先验概率分布,还是条件概率分布,并不容易获得。
特别是 P ( x ∣ y ) P({\bf x} | y) P(x∣y) ,是联合概率分布。假如 x {\bf x} x 维度为 d d d,属性都是2值的,也有 2 d 2^d 2d 种取值。当训练样本数有限时,很多样本取值在训练集中根本就没有出现,很难用频率直接估计。
2. 估计 P ( x ∣ y ) P({\bf x} | y) P(x∣y)
既然得到了 P ( x ∣ y ) P({\bf x} | y) P(x∣y),就能够计算出每个类别的概率,那么机器学习问题就转化为了对 P ( x ∣ y ) P({\bf x} | y) P(x∣y) 的估计问题。
2.1 传统的估计方法
在统计学中,这属于 参数估计 的内容。
传统参数估计的基本策略是:先确定目标是服从某一类分布,然后再基于样本,估计其参数。最常见的是 最大似然估计。
我们这里不准备叙述最大似然估计的过程,而是回过头去,对照一下 “机器学习的任务” 一节中的三个问题:
- 函数集:事先由人为确定,例如正态分布。
- 最优标准:最大似然法则。
- 如何找:参数估计的一些统计指标,这里不赘述。
于是,我们看到,机器学习的三个问题似乎都解决了。
2.2 传统方法的问题
上述传统的参数估计法,最大的问题是函数集的确定。人们仔细研究过的分布就那么有数几种,如果真实分布和人为指定的分布差距太大,那上面的一切推导都将不成立。
为了逼近真实分布,就不得不使用更多的样本。
例如,当样本足够多时,离散分布可以直接由频率描绘;连续分布则有一系列的 非参数估计 方法来估计概率密度。
然而,样本获取的成本往往很高,所以在这个问题上,需要根据具体问题具体分析,做一定的折中。
这也是不同的机器学习方法一直共存的原因之一,因为没有万能的算法。
3. 朴素贝叶斯分类器
在上一节我们知道,要逼近真实分布,需要更多的样本。体现到贝叶斯方法上,即估计 P ( x ∣ y ) P({\bf x} | y) P(x∣y) 这个联合概率分布,需要大量样本。
但如果没有足够的样本呢?朴素贝叶斯 从另外一个角度解决了此问题:样本不足,就缩小问题的范围。
朴素贝叶斯分类器假设,特征具有 条件独立性。于是,分类器表达式变成:
h
(
x
)
=
arg
max
y
∈
Y
P
(
y
)
∏
i
=
1
d
P
(
x
i
∣
y
)
h({\bf x}) = \mathop{\arg \max}_{y\in Y} P(y) \prod_{i=1}^d P(x_i | y)
h(x)=argmaxy∈YP(y)i=1∏dP(xi∣y)
每个特征上的条件分布都是1维的,这要比估计一般的联合分布简单多了(想想n维正态分布的协方差矩阵,参数多不少呢)。
3.1 离散和连续特征
特征是离散时,用频率来估计概率。这实际上是在利用训练数据,统计联合概率分布。
特征连续时,则使用参数估计的办法,估计联合分布的密度。
3.2 数据量的影响
如果样本量充足,那么无论是离散特征时用频率估计概率,还是连续特征时,使用非参数估计法,都能得到与真实分布十分接近的结果。
如果样本量有限,则更倾向于传统的参数估计法。数据量少,或者数据采集成本高的情况,加入更多的先验知识,也是有效的选择。
4. 朴素贝叶斯的例子
本例子来自阮一峰的网络日志,略有改动。
某社区网站,抽样统计10,000个账号,真实账号占89%( C 0 C_0 C0),虚假账号占11%( C 1 C_1 C1)。假如每个账号有 3 个特征:
- F1 :日均日志数
- F2:日均好友联系数
- F3:是否用真实头像(是:1,否:0)
那么账号 x = [0.1, 0.2, 0],真实还是虚假?
首先我们分析一下:
- 样本量:样本10000个,类别2个,特征3个,样本数相对于类别和特征,是充足的。
- 先验概率:由于样本充足,故可以认为真假账号占比接近于真实概率。于是得到了类别的先验概率。
- 条件概率:对于 P ( F i ∣ C j ) P(F_i | C_j) P(Fi∣Cj) :离散变量F3,直接统计频率。连续变量F1,F2,可使用非参数估计法,如Parzen窗。也可以结合业务知识,将连续变量离散化。
例子中,是用离散化将F1,F2分解为几个区间。这里我们试验一种新方式,直接估计连续变量。
P
(
C
0
∣
x
)
=
p
(
F
1
∣
C
0
)
p
(
F
2
∣
C
0
)
P
(
F
3
∣
C
0
)
P
(
C
0
)
P
(
x
)
P(C_0 | x)=\frac{p(F_1 | C_0) p(F_2 | C_0) P(F_3|C_0)P(C_0)}{P(x)}
P(C0∣x)=P(x)p(F1∣C0)p(F2∣C0)P(F3∣C0)P(C0)
首先,
P
(
C
0
)
=
0.89
P(C_0)=0.89
P(C0)=0.89,假设经统计,
P
(
F
3
=
1
∣
C
0
)
=
0.8
P(F_3=1 | C_0) = 0.8
P(F3=1∣C0)=0.8,
P
(
F
3
=
0
∣
C
0
)
=
0.2
P(F_3=0 | C_0) = 0.2
P(F3=0∣C0)=0.2 ;
P
(
F
3
=
1
∣
C
1
)
=
0.1
P(F_3 = 1 | C_1) = 0.1
P(F3=1∣C1)=0.1,
P
(
F
3
=
0
∣
C
1
)
=
0.9
P(F_3=0|C_1)=0.9
P(F3=0∣C1)=0.9 。
其次,F1和F2可以用非参数估计法,也可以用传统的参数估计法。由于非参数估计会占用很大篇幅,所以这里采用传统方法:
假设
P
(
F
1
∣
C
0
)
,
P
(
F
1
∣
C
1
)
P(F_1|C_0), P(F_1|C_1)
P(F1∣C0),P(F1∣C1) 服从正态分布,
μ
0
=
0.2
,
σ
0
2
=
0.01
μ
1
=
0.05
σ
1
2
=
0.01
\mu_0 = 0.2, \ \ \ \ \sigma^2_0 = 0.01 \\ \mu_1 = 0.05 \ \ \ \ \sigma^2_1 = 0.01
μ0=0.2, σ02=0.01μ1=0.05 σ12=0.01
于是,我们可以计算得到
p
(
F
1
=
0.1
∣
C
0
)
=
1
0.1
2
π
exp
[
−
(
0.1
−
0.2
)
2
2
⋅
0.01
]
=
α
⋅
exp
[
−
0.5
]
p(F_1=0.1 | C_0) = \frac{1}{0.1\sqrt{2\pi} } \exp{[-\frac{(0.1 - 0.2)^2}{2\cdot 0.01}]} \\ = \alpha \cdot \exp{[-0.5]}
p(F1=0.1∣C0)=0.12π1exp[−2⋅0.01(0.1−0.2)2]=α⋅exp[−0.5]
类似的,可以通过这个方法,估计
p
(
F
1
=
0.1
∣
C
1
)
,
p
(
F
2
=
0.2
∣
C
1
)
,
p
(
F
2
=
0.2
∣
C
0
)
p(F_1=0.1 | C_1),\\ p(F_2=0.2 | C_1), p(F_2=0.2 | C_0)
p(F1=0.1∣C1),p(F2=0.2∣C1),p(F2=0.2∣C0)
带入公式,即可求得
P
(
C
0
∣
x
)
P
(
C
1
∣
x
)
≈
10
\frac{P(C_0|x)}{P(C_1|x)} \approx 10
P(C1∣x)P(C0∣x)≈10,即更可能是真实用户。
5. 拉普拉斯修正
在统计条件分布过程中,有可能出现 P ( x i ∣ y j ) = 0 P(x_i | y_j) = 0 P(xi∣yj)=0 ,即没有取值为 ( x i , y i ) (x_i, y_i) (xi,yi) 的样本。如果不做处理,那么无论其它属性是什么,算出的概率值都是0。
例如,周志华的“西瓜书”中举了一个例子,为了判断一个瓜是否好瓜,采用了朴素贝叶斯算法。但是样本中 P ( 声 音 = 清 脆 ∣ 好 瓜 ) = 0 P(声音=清脆 | 好瓜) = 0 P(声音=清脆∣好瓜)=0 ,这造成了无论其它属性怎么像好瓜,最后都会被判别为坏瓜。
合适的做法是,既然没有采集到样本,那么最好不让该属性起作用,只用有效的属性判断。
方法就是 拉普拉斯修正,即将
P
(
y
)
P(y)
P(y) 和
P
(
x
∣
y
)
P({\bf x }| y)
P(x∣y) 统计公式修正为如下:
P
(
y
)
=
D
y
+
1
D
+
N
,
N
为
训
练
集
D
中
的
类
别
数
P(y) = \frac{D_y + 1}{D + N}, N 为训练集D中的类别数
P(y)=D+NDy+1,N为训练集D中的类别数
P ( x i ∣ y ) = D y , x i + 1 D y + N i , N i 为 第 i 个 属 性 取 值 个 数 P(x_i | y) = \frac{D_{y,x_i} + 1}{D_y + N_i}, N_i 为第i个属性取值个数 P(xi∣y)=Dy+NiDy,xi+1,Ni为第i个属性取值个数
之所以这样取值,一是平均分布等于屏蔽了该属性的作用;二是要保证概率和等于1。
6. 朴素贝叶斯的本质
我们看一下这张图,假如横轴纵轴分别是两个特征,那么,特征刚好把整个空间分成了一些列的“小区域”。
上图中,小区域的数量是 6 × 6 = 36 。如果在整个空间中,两类的比例是 1:1,即如果我们在整个空间中预测一点所属的类别,准确率只有50%.
但是,在小区域内,我们由于其分布比例的改变,我们的预测准确率就可能提高。情况可能有如下几种:
显著提高:在 x = [ 0 , 2 ] , y = [ 0 , 2 ] x=[0,2], y=[0,2] x=[0,2],y=[0,2] 这个区域中,红蓝点比例为1:19,显然在这个区域中,我们的预测准确率可提升为95% 。
略微提高:在区域 x = [ − 2 , 0 ] , y = [ 0 , 2 ] x=[-2, 0], y=[0,2] x=[−2,0],y=[0,2] 中,两类比例仍然为1:1,所以这个区域基本没有提升。
不能提高:在左上角和右下角区域,两类都没有样本,因而无从判断,只能使用整体空间的的比例去判断。
7. 局限
我们发现,朴素贝叶斯算法与决策树算法有异曲同工之妙。明白了这些,也就明白了朴素贝叶斯算法的优势和 局限 。
第一,样本需要尽量覆盖所有的特征组合。
第二,条件独立性。这意味着,其对特征的要求较苛刻。实际上,从其本质看,条件独立性或许并不一定必须,必须的是:特征划分的小区域中,样本比例向着好的方向变化,即 局部比例变化 。
这也能解释,为什么一些并没有条件独立性的场景,贝叶斯算法也能产生很好的效果。
第三,样本量 。样本量过少时,分布很难估计准确,会造成精度下降。