机器学习系列:朴素贝叶斯算法

这是之前写的一篇东西,目的是让人能够全面的理解以朴素贝叶斯为代表的相关算法。

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(yx)

机器学习需要确定一个 函数集 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(yix)

为了求得该条件分布,贝叶斯推理走了一条“不寻常”的路:利用 贝叶斯公式
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(yix)=P(x)P(xyi)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(xy)

为什么说这条路“不寻常”呢?因为无论是先验概率分布,还是条件概率分布,并不容易获得。

特别是 P ( x ∣ y ) P({\bf x} | y) P(xy) ,是联合概率分布。假如 x {\bf x} x 维度为 d d d,属性都是2值的,也有 2 d 2^d 2d 种取值。当训练样本数有限时,很多样本取值在训练集中根本就没有出现,很难用频率直接估计。

2. 估计 P ( x ∣ y ) P({\bf x} | y) P(xy)

既然得到了 P ( x ∣ y ) P({\bf x} | y) P(xy),就能够计算出每个类别的概率,那么机器学习问题就转化为了对 P ( x ∣ y ) P({\bf x} | y) P(xy) 的估计问题。

2.1 传统的估计方法

在统计学中,这属于 参数估计 的内容。

传统参数估计的基本策略是:先确定目标是服从某一类分布,然后再基于样本,估计其参数。最常见的是 最大似然估计

我们这里不准备叙述最大似然估计的过程,而是回过头去,对照一下 “机器学习的任务” 一节中的三个问题:

  • 函数集:事先由人为确定,例如正态分布。
  • 最优标准:最大似然法则。
  • 如何找:参数估计的一些统计指标,这里不赘述。

于是,我们看到,机器学习的三个问题似乎都解决了。

2.2 传统方法的问题

上述传统的参数估计法,最大的问题是函数集的确定。人们仔细研究过的分布就那么有数几种,如果真实分布和人为指定的分布差距太大,那上面的一切推导都将不成立。

为了逼近真实分布,就不得不使用更多的样本。

例如,当样本足够多时,离散分布可以直接由频率描绘;连续分布则有一系列的 非参数估计 方法来估计概率密度。

然而,样本获取的成本往往很高,所以在这个问题上,需要根据具体问题具体分析,做一定的折中。

这也是不同的机器学习方法一直共存的原因之一,因为没有万能的算法。

3. 朴素贝叶斯分类器

在上一节我们知道,要逼近真实分布,需要更多的样本。体现到贝叶斯方法上,即估计 P ( x ∣ y ) P({\bf x} | y) P(xy) 这个联合概率分布,需要大量样本。

但如果没有足够的样本呢?朴素贝叶斯 从另外一个角度解决了此问题:样本不足,就缩小问题的范围。

朴素贝叶斯分类器假设,特征具有 条件独立性。于是,分类器表达式变成:
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)=argmaxyYP(y)i=1dP(xiy)
每个特征上的条件分布都是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(FiCj) :离散变量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(C0x)=P(x)p(F1C0)p(F2C0)P(F3C0)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=1C0)=0.8 P ( F 3 = 0 ∣ C 0 ) = 0.2 P(F_3=0 | C_0) = 0.2 P(F3=0C0)=0.2 P ( F 3 = 1 ∣ C 1 ) = 0.1 P(F_3 = 1 | C_1) = 0.1 P(F3=1C1)=0.1 P ( F 3 = 0 ∣ C 1 ) = 0.9 P(F_3=0|C_1)=0.9 P(F3=0C1)=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(F1C0),P(F1C1) 服从正态分布,
μ 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.1C0)=0.12π 1exp[20.01(0.10.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.1C1)p(F2=0.2C1)p(F2=0.2C0)
带入公式,即可求得 P ( C 0 ∣ x ) P ( C 1 ∣ x ) ≈ 10 \frac{P(C_0|x)}{P(C_1|x)} \approx 10 P(C1x)P(C0x)10,即更可能是真实用户。

5. 拉普拉斯修正

在统计条件分布过程中,有可能出现 P ( x i ∣ y j ) = 0 P(x_i | y_j) = 0 P(xiyj)=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(xy) 统计公式修正为如下:
P ( y ) = D y + 1 D + N , N 为 训 练 集 D 中 的 类 别 数 P(y) = \frac{D_y + 1}{D + N}, N 为训练集D中的类别数 P(y)=D+NDy+1,ND

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(xiy)=Dy+NiDy,xi+1,Nii

之所以这样取值,一是平均分布等于屏蔽了该属性的作用;二是要保证概率和等于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. 局限

我们发现,朴素贝叶斯算法与决策树算法有异曲同工之妙。明白了这些,也就明白了朴素贝叶斯算法的优势和 局限

第一,样本需要尽量覆盖所有的特征组合。

第二,条件独立性。这意味着,其对特征的要求较苛刻。实际上,从其本质看,条件独立性或许并不一定必须,必须的是:特征划分的小区域中,样本比例向着好的方向变化,即 局部比例变化

这也能解释,为什么一些并没有条件独立性的场景,贝叶斯算法也能产生很好的效果。

第三,样本量 。样本量过少时,分布很难估计准确,会造成精度下降。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值