朴素贝叶斯算法

1. 概念

在了解朴素贝叶斯的算法之前,我们需要对相关必须的统计学知识做一个回顾。
贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据大家好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。
我们先看看条件独立公式,如果X和Y相互独立,则有:
P(X,Y)=P(X)P(Y)
我们接着看看条件概率公式:
P(Y|X)=P(X,Y)/P(X)
P(X|Y)=P(X,Y)/P(Y)
或者说:
P(Y|X)=P(X|Y)P(Y)/P(X)
接着看看全概率公式
P(X)=∑kP(X|Y=Yk)P(Yk),其中∑kP(Yk)=1
从上面的公式很容易得出贝叶斯公式:
P(Yk|X)=P(X|Yk)P(Yk)∑kP(X|Y=Yk)P(Yk)

2. 朴素贝叶斯分类器:

假设某个体有n项特征(Feature),分别为F1、F2、…、Fi。现有m个类别(Category),分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值:
P(C|F1F2…Fi) = P(F1F2…Fn|C)P(C) / P(F1F2…Fi)
由于 P(F1F2…Fi) 对于所有的类别都是相同的,可以省略,问题就变成了求
P(F1F2…Fi|C)P(C)的最大值。
sklearn中朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此
P(F1F2…Fi|C)P(C) = P(F1|C)P(F2|C) … P(Fi|C)P(C)
上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类别。
在sklearn中朴素贝叶斯算法有”所有特征彼此独立”这个假设,但在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大。
如果当P(Fi|C)出现0时,这样会影响分类器的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有:

P(Fi|C)=Ni+λ / N+λm
λ为拉普拉斯平滑系数(通常为1),m为样本特征的个数

3. API: sklearn.naive_bayes.MultinomialNB

以下为参数源码

alpha为拉普拉斯平滑系数(通常设置为1)

4. 朴素贝叶斯算法的优点:

1)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
2)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

5. 朴素贝叶斯算法的缺点:

由于使用了样本独立性假设,当样本属性有关联时会对结果造成干扰

0条评论