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

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

时间: 2024-08-05 08:49:51

Step by Step 改进朴素贝叶斯算法的相关文章

挖掘算法(1)朴素贝叶斯算法

原文:http://www.blogchong.com/post/NaiveBayes.html 1 文档说明 该文档为朴素贝叶斯算法的介绍和分析文档,并且结合应用实例进行了详细的讲解. 其实朴素贝叶斯的概念以及流程都被写烂了,之所以写这些是方便做个整理,记录备忘.而实例部分进行了详细的描述,网络上该实例比较简单,没有过程. 至于最后部分,则是对朴素贝叶斯的一个扩展了,当然只是简单的描述了一下过程,其中涉及到的中文分词以及TFIDF算法,有时间再具体补上. 2 算法介绍 2.1 贝叶斯定理 (1

朴素贝叶斯算法 原理及推导

朴素贝叶斯算法主要用来解决分类问题,比如通常的二分类,多分类. 1.数学知识: 贝叶斯定理: 特征条件独立: 1.朴素贝叶斯 输入空间: 输出空间:y={C1,C2,…,CK}. 训练集:T={(x1,y1),(x2,y2),…,(xN,yN)}. 对于每个实例,其P(X,Y)独立同分布.在进行分类之前,需要先将计算先验概率和条件概率然后据此计算出后验概率. 1)先验概率分布: P(Y=Ck),k=1,2,..,K. 先验概率的极大似然估计: 2)条件概率分布: 设第j个特征可能取值的集合为:{

机器学习回顾篇(5):朴素贝叶斯算法

1 引言 说到朴素贝叶斯算法,很自然地就会想到贝叶斯概率公式,这是我们在高中的时候就学过的只是,没错,这也真是朴素贝叶斯算法的核心,今天我们也从贝叶斯概率公式开始,全面撸一撸朴素贝叶斯算法. 2 贝叶斯概率公式 2.1 联合概率与全概率公式 定义1:完备事件组 ${A_1} \cup {A_2} \cup \cdots \cup {A_n} = \Omega $,且${A_i} \cap {A_j} = \emptyset ,1 \le i \ne j \le n$,则称${A_1},{A_2}

统计学习方法 -> 朴素贝叶斯算法

需要知道的是在什么时候可以用朴素贝叶斯算法:需要保证特征条件独立. 主要过程是学习输入和输出的联合概率分布. 预测的时候,就可以根据输入获得对打后验概率对应的输出y. 先验概率:已知输出,求输入.后验概率相反. 简单来说朴素贝叶斯算法,就是在对样本进行学习之后,到了需要做决策的时候,给定x,给出最大概率的y.这个本质上就是一个典型的后验概率模型.不过在该模型的算法推到上,还用到了先验概率的计算.但注意:最终朴素贝叶斯就是一种后验概率模型求P(y|x). 后验概率模型有一个好处,相当于期望风险最小

朴素贝叶斯算法及实现

1.朴素贝叶斯算法介绍 一个待分类项x=(a,b,c...),判断x属于y1,y2,y3...类别中的哪一类. 贝叶斯公式: 算法定义如下: (1).设x={a1, a2, a3, ...}为一个待分类项,而a1, a2, a3...分别为x的特征 (2).有类别集合C={y1, y2,  y3,  ..} (3).计算p(y1|x), p(y2|x), p(y3|x), .... (4).如果p(y(k)|x)=max{p(y1|x), p(y2|x), p(y3|x), ....},则x属于

朴素贝叶斯算法资料整理和PHP 实现版本

朴素贝叶斯算法简洁 http://blog.csdn.net/xlinsist/article/details/51236454 引言 先前曾经看了一篇文章,一个老外程序员写了一些很牛的Shell脚本,包括晚下班自动给老婆发短信啊,自动冲Coffee啊,自动扫描一个DBA发来的邮件啊, 等等.于是我也想用自己所学来做一点有趣的事情.我的想法如下: 首先我写个scrapy脚本来抓取某个网站上的笑话 之后写个Shell脚本每天早上6点自动抓取最新的笑话 然后用朴素贝叶斯模型来判断当前的笑话是否属于成

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积

题记:          近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用ROC面积评估模型准确率,一般认为越接近0.5,模型准确率越低,最好状态接近1,完全正确的模型面积为1.下面进行展开介绍: ROC曲线的面积计算原理 一.朴素贝叶斯法的工作过程框架图 二.利用weka工具,找到训练的预处理数据 1.利用朴素贝叶斯算法对weather.nominal.arff文件进行

数据挖掘|朴素贝叶斯算法

作者:张一 链接:https://zhuanlan.zhihu.com/p/21571692 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 因为后期的项目将涉及到各种各样的价格数据处理问题,所以我们现在开始学习一些简单的数据清洗与算法的知识.关于算法,以前听起来觉得好高大上,现在开始学,觉得书上的描述并不是很通俗易懂,所以用自己的语言来简要写一下这些算法~ 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(ht