前言
在做携程的笔试的时候,考到了利用朴素贝叶斯方法进行情感分析的问题,其实就是一道利用NB进行文本分类的题。所以在这里总结一下贝叶斯的基本知识,以做回顾。
从贝叶斯判定准则讲起
(这里省略一些公式)
贝叶斯判定准则的大意是说,对于一个多分类问题,我们的目的是要找到一个判定准则
h
h
,使得总体风险最小化(这里的风险是指一个属于i的样本被误分到j类中)。而为使总体风险最小化,只需要在每个样本上选择条件风险最小化的类别标记。更进一步,如果我们的目标是最小化分类错误率,那么对于样本x来说,要选择能使后验概率 最大的类别标记。
从这个角度来说,机器学习的目的,就是在有限的训练样本的基础上,尽可能准确的估计后验概率 P(c|x) P ( c | x ) 从而给出样本所属的分类标签。为了求得后验概率,主要有两种方式:
直接建模后验概率 P(c|x) P ( c | x ) 来预测样本x所属的类别。这样得到的模型被称为“判别式模型”,比如神经网络,SVM,决策树等。
另一种是先对x,c的联合分布进行建模,然后再求后验概率。与之对应的就是“生成式模型”,比如这里讲的朴素贝叶斯。
对于生成式模型来说,
P(c|x)=P(x,c)P(x)
P
(
c
|
x
)
=
P
(
x
,
c
)
P
(
x
)
,进一步根据贝叶斯定理,上式又可以写为:
P(c|x)=P(c)P(x|c)P(x)
P
(
c
|
x
)
=
P
(
c
)
P
(
x
|
c
)
P
(
x
)
,其中
P(c)
P
(
c
)
为类先验概率。根据大数定律,假设样本独立同分布,并且数量足够多,那么类先验就可以用类在样本中的频率来代替。
P(x|c)
P
(
x
|
c
)
为样本x相对于类标记c的条件概率,也称为似然。
P(x|c)
P
(
x
|
c
)
实际来说是不好估计的,因为它和属性的联合概率分布有关。
为了解决这个问题,于是有了朴素贝叶斯。
朴素贝叶斯
什么是朴素呢?
为了求
P(x|c)
P
(
x
|
c
)
类条件概率,我们加上了一个前提条件,所有属性之间条件独立。那就好了,既然属性之间条件独立,那么上式
P(x|c)
P
(
x
|
c
)
就可以写成:
其中d代表属性个数, xi x i 代表在第i个属性上的取值。
于是,上面的后验概率表达式就可以写为: P(c|x)=P(c)∏di=1P(xi|c)P(x) P ( c | x ) = P ( c ) ∏ i = 1 d P ( x i | c ) P ( x ) . P(x) P ( x ) 是一个与类标记无关的量,而且是个常数,因此,我们可以忽略它。于是,我们得到了基于朴素假设的贝叶斯判定准则:
以上就是朴素贝叶斯的表达式。
显然,朴素贝叶斯的训练过程就是:根据样本集合估计类先验概率,并为每个属性估计类条件概率。
令
Dc
D
c
表示训练样本集合
D
D
中属于类别c的样本,则根据样本独立同分布的假设及大数定律,类先验.
对于离散属性值,估计 P(xi|c) P ( x i | c ) :假设 Dxi,c D x i , c 表示属于类别c的样本中第i个属性的取值为 xi x i 的样本,则 P(xi|c)=|Dxi,c||Dc| P ( x i | c ) = | D x i , c | | D c | ;
对于连续属性,可以先假定属性值服从某个分布,常用的是正态分布,那么可以利用在第i个属性上值的均值和方差去估计类条件概率。即 P(xi|c)=12π√σc,iexp(−(xi−μc,i)22σ2c,i) P ( x i | c ) = 1 2 π σ c , i e x p ( − ( x i − μ c , i ) 2 2 σ c , i 2 )
平滑的重要性
上面求后验概率的过程中,假如有的属性和某个类别从来没有一起出现过,没被观测到并不意味着不存在,那么通过类条件概率连乘后,得到的后验概率值为0.这显然不符合实际。于是,为了避免其他属性携带的信息被训练集中未出现的属性值抹去,在计算概率值时需要进行平滑操作,常用的有拉普拉斯平滑/修正。
(在点击率预估中,也会出现类似的问题,貌似常用的有贝叶斯平滑)
具体的实现如下:
其中N:样本中类的个数; Ni N i 是表示第i个属性可能的取值数。
平滑的好处显而易见,避免了因样本不充分而导致的概率估计值为0的状况,那么会不会因此而带来误差呢?当数据量很大时,在修正过程中引入的先验的影响会逐渐变得可忽略,使估计值逐渐趋向于实际的概率值,所以当然是不会~
贝叶斯分类在不同的场景下有不同的使用方式:
1. 当要求效率的时候,可以先将朴素贝叶斯涉及的概率都先计算出来,用到的时候查表
2. 对于任务数据更替频繁的情况,就什么时候需要什么时候计算
3. 如果数据是不断增加的,则可在现有估值的基础上,仅对新增样本属性值所涉及的的概率估值进行计数修正即可实现增量学习。
朴素贝叶斯的前提假设:属性条件独立,在实际中很难满足,但是朴素贝叶斯的实际效果却很不错,原因可能为:
1. 分类效果仅与条件概率值的排序有关,而与具体的值的大小无关,所以只要类别的条件概率排序正确,那么效果就会不错
2. 如果属性之间不独立,而是相关的,如果属性间的以来对所有类别的影响相同,那么整体来看这些影响就相互抵消了,所以不会对性能有影响。
其他
前面说到朴素贝叶斯有一个强烈的假设,属性之间条件独立。这种情况是很难满足的。所以针对这个问题进行了优化,于是产生了半朴素贝叶斯、贝叶斯网模型。
其中半朴素贝叶斯是说,我不假设所有属性都条件独立,认为他们之间有一部分属性是相互依赖的。比如独依赖估计(ODE),假设每个属性在类别之外最多依赖一个其他属性。最直接的做法就是所有属性都依赖一个属性,称这个属性为“超父”,然后通过交叉验证等模型选择方法来确定超父属性。由此形成SPODE。与之类似的还有kDE.
更为复杂的,还有贝叶斯网,即借助有向无环图来刻画属性之间的依赖关系。(这里略)
参考《机器学习》周志华