首页 > 代码库 > Step by Step 改进朴素贝叶斯算法

Step by Step 改进朴素贝叶斯算法


引言

如果你对naive bayes认识还处于初级阶段,只了解基本的原理和假设,还没有实现过产品级的代码,那么这篇文章能够帮助你一步步对原始的朴素贝叶斯算法进行改进。在这个过程中你将会看到朴素贝叶斯假设的一些不合理处以及局限性,从而了解为什么这些假设在简化你的算法的同时,使最终分类结果变得糟糕,并针对这些问题提出了改进的方法。

 

 

 

朴素贝叶斯(Naive Bayes)

出处: 《机器学习》(Machine Learning by Tom M.Mitchell)

符号和术语

假设待分类的实例 X 可由属性值的集合来进行描述, 目标类别集合为 

算法推导

贝叶斯的目标是在给定实例的属性值下,得到最可能的目标值,表达式如下

可使用贝叶斯公式将此表达式重写为

朴素贝叶斯假设

朴素贝叶斯假设: 实例 X 的各属性之间相互独立

根据概率的乘法定理,可得

那么朴素贝叶斯表达式就为

 

多项式朴素贝叶斯(multinomial Naive Bayes)

符号和术语

多项式贝叶斯是将某个文档看成许多单词组成的一个序列,并以文档中的单词来建立多项式模型。即把文档中出现的单词看作数学多项式中的。假设目标类别集合数目确定, 为 , 每个都可以用一系列的多项式系数来表示。换句话说,对于其中的某个类别c来说,都有多项式系数  (n为所有单词组成的字典大小), 因为代表了某个单词在类别c中出现的可能性,所以其加和必然为1,公式为

公式推导

文档属于的概率为所有单词特征在该类别出现的可能性之积,公式如下

这里表示单词在该文档中出现的次数, 我们应用上面朴素贝叶斯讲解中提到的贝叶斯公式以及MAP假设就可以进行一步步推导

贝叶斯公式:

MAP假设以及将值取log:

在上面的公式中,为单词i属于类别c的权重,如何选取以及就是学者们研究的重点,这关系到Naive Bayes分类器的性能。

 

的选取

论文出处:Heckerman, D. (1995). A tutorial on learning with Bayesian networks (Technical Report MSR-TR-95-06). Microsoft Research

依据该论文,给出了一个简单的公式

, 其中为单词i在类别为c的文档集合中出现的次数, 为所有单词在类别为c的文档集合中出现的总次数,为单词i的平滑系数,的值则是所有单词的平滑系数的和。这里常用的方法是加入Laplace平滑, 即另所有单词的=1,那么就等于字典的大小N。

 

将上面的公式代入之前的MAP假设可以得到

在这里是类别c的先验概率,可以像计算单词的先验概率的方法那样计算,不过值得注意的是,在上面的式子中类别的先验概率相对单词的可能性(式子右边项)来说不占主导地位,因此我们可以选取统一的, 即

这个就是最终的多项式贝叶斯(MNB)的计算公式。

 

Complementary Naive Bayes

Complementary Naive Bayes, 也可以叫做互补朴素贝叶斯。

考虑这样一个问题,假设有一个类别有偏的训练数据集,即训练数据集中属于各个类别的文档数量各不相同, 问对比于类别均匀分布的训练数据集,分类结果有何不同?

假设类别c的数量较少,那么单词i属于类别c的权重也较低,最终导致分类结果向数量多的类别方向产生了偏移。为了降低该影响, 提出了一种计算补集的方法来得到分类结果,简称CNB

相对于MNB的计算某个类别的来说, CNB则计算除类别c外的其他类别的,能够这样做的原理在于,类别较多的情况下,其补集的文档数量比较多,这样各个类别的补集之间的数量都差不多,减弱了类别文档数量对分类结果的影响。

因此CNB的参数估计为

因此CNB的计算公式为

其中负号是由于单词i属于类别c与其补集的权重值正好是相反的,因此我们需要选取其补集权重小的作为分类结果,即前面加上一个负号。

 

 

Weight-normalized Complementary Naive Bayes

Weight-normalized Complementary Naive Bayes, 也可以叫做权重归一化互补朴素贝叶斯。

Naive Bayes假设单词之间相互独立,虽然这简化了计算, 但实际情况中该假设并不能很好满足。

考虑这样一个情形,我们假定有一些单词很少分开出现,比如地名 San Francisco, 由于San和Francisco都是一起出现,那么其对权重的贡献将是单一的San或者Francisco的两倍, 也就是说 San Francisco 的权重被Double-Counting了, 这样将导致分类器不准确。例如,在一个文档中Boston出现了5次而San Francisco只出现了3次,那么MNB更加倾向于将文档归于San Francisco(6次)而不是Boston(5次)。

有一种解决问题的办法就是将权重归一化,即将改写为

 

到目前为止我们在算法公式方面做了一些改进,以减弱一些不合理假设的影响,使得结果更加接近实际情况。现在我们可以更进一步,从另外一个方面来改进算法,那就是文本建模。

1.TFIDF

如果你有使用过Lucene的经历,可能会接触到一个概念,那就是TFIDF。因为该模型考虑到了包含字词的文档站整个数据集的比例,因此可以比TF更加准确地评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。因此将文本模型中的 替换成即可。

这里建议选用lucene中TFIDF的计算方式

1.

2.idf = 1 + log(numDocs / (1 + docFreq)

3.tfidf = tf * idf

 

2.Length norm

由于在大部分文档中单词出现有其内在的联系,即如果一个单词在某文档中出现,则该单词就有较大的概率再次出现。而MNB简单的假定单词出现的概率相互独立,因此在越长的文档中这种依赖关系造成的影响就越大,因此类似上面的Weighted-normalized,我们可以对长度进行归一化来减弱这种依赖造成的影响。公式为

 

 

总结

综上所述, naive bayes可以从根据考虑的角度以及侧重点不同,从多个方面进行改进。在实际选取模型的时候,可以先对文本数据集的规模,文档的长度,类别的数量以及分布情况等情况综合考虑,选取适合的算法。具体产品级的代码可以看Apache mahout项目的朴素贝叶斯部分,其实现了CNB以及TFIDF。

 

参考论文:

Tackling the Poor Assumptions of Naive Bayes Text Classifiers

Heckerman, D. (1995). A tutorial on learning with Bayesian networks (Technical Report MSR-TR-95-06). Microsoft Research