人工智能算法—朴素贝叶斯分类

 

 

文/腾讯soso 林世飞

 

    以下是个人学习贝叶斯分类器—文本分类的学习笔记,和大家一起学习交流。

准备工作

    监督学习型分类器特点 ,能够从一个不确定度状态开始,通过提供 正确和错误的样本 ,不断来确定哪些特征(特征由特征提取函数,从样本中提取 )对于分类更重要,可以有很多个分类器,来应对不同的分类或者过滤需求。所以训练本身非常重要。

    先来复习下一个数学符号,条件概率:pr(A|B) 给定B条件下(也就是B发生情况下),A出现的概率。 

    Bayes公式和文本分类的基本原理

    Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B)

    其实是由 下面这个式子移项得到的

    Pr(A | B)×Pr(B) = Pr(B | A) × Pr(A) –个人了解含义是  A B同时出现的交集是一样的

    在文本分类中变成:

    Pr(Category | Document) = Pr(Document | Category) x Pr(Category) /Pr(Document)

    我们需要计算当某个Document(这个往往使用特征来表示)出现时候,他可能的分类的概率,取概率最大的一个。

    贝叶斯假设每项的各个概率是彼此独立的。即,一个单词在属于某个指定分类的文档中出现的概率,与其他单词出现于该分类的概率是不相关的。

    事实上这个假设是不成立的,因为你也许会发现,与有关Python编程的文档相比,包含单词“casino”的文档更有可能包含单词“money”。这意味着,我们无法将采用朴素贝叶斯分类器所求得的结果实际用作一篇文档属于某个分类的概率,因为这种独立性的假设会使其得到错误的结果。不过,我们还是可以对各个分类的计算结果进行比较,然后再看哪个分类的概率最大。在现实中,若不考虑假设的潜在缺陷,朴素贝叶斯分类器将被证明是一种非常有效的文档分类方法。

 

下面来计算贝叶斯公式的每一项:

    Pr(Document | Category)的计算方法:为了使用朴素贝叶斯分类器,首先我们须要确定整篇文档属于给定分类的概率。正如此前讨论过的,我们须要假设概率的彼此独立性,即:可以通过将所有的概率相乘,计算出总的概率值。例如,假设我们已经注意到有20%的“bad”类文档中出现了单词“Python”——Pr(Python | Bad) = 0.2——同时有80%的文档出现了单词“casino”(Pr(Casino | Bad) = 0.8)。那么,预期两个单词出现于同一篇“bad”类文档中的独立概率为——Pr(Python & Casino | Bad)——0.8×0.2 = 0.16。从中我们会发现,计算整篇文档的概率,只须将所有出现与某篇文档中的各单词的概率相乘即可。

     Pr(Category)是随机选择一篇文档属于该分类的概率,因此就是属于该分类的文档数除以文档的总数。计算方法根据样本中统计的某一个分类的数量/ 所有分类出现的概率。

    Pr(Document) :某个文档出现的概率,我们可以认为任何一篇文档出现概率是相等的,也就是说这个值都是一样的,因为我们最终是算概率的最大值,所以从所以计算中消去这项值,其对结果所产生的影响也完全是一样的,因此我们完全可以忽略这一项。实际的公式计算变成:Pr(Category | Document) = Pr(Document | Category) x Pr(Category)

 

实际工程中可能遇到的问题:

    如何进行提取特征

    刚刚提到 我们一般要用 一个 documentfeature 来代表这个 文档。所以需要一个函数Feature =fdocument),最简单就是用非字母非数字类字符作为分隔符对单词进行拆分。复杂一点可能需要解析这个document,比如如果是html 需要解析成DOM 树 , 再取一个关键树节点,比如title url

    为了便于理解,我们把公式重新写成:Document 由特征函数提取为feature

Pr(Category | Document) = Pr(Document | Category) x Pr(Category) /Pr(Document)

Pr(Category | feature) = Pr(feature | Category) x Pr(Category) /Pr(feature)

    训练初始化和概率加权

    在训练用的样本数据中,单词“money”只在一篇文档中出现过,并且由于这是一则涉及赌博的广告,因此文档被划归为了“bad”类。由于单词“money”在一篇“bad”类的文档中出现过,而任何“good”类的文档中都没有该单词,所以此时利用fprob计算所得的单词“money”在“good”分类中出现的概率为0。这样做有一些偏激,因为“money”可能完全是一个中性词,只是恰好先出现在了一篇 “bad”类的文档中而已。伴随着单词越来越多地出现在同属于一个分类的文档中,其对应的概率值也逐渐接近于0,恐怕这样才会更合理一些。

    为了解决上述问题,在我们手头掌握的有关当前特征的信息极为有限时,我们还须要根据一个假设的概率来作出判断。一个推荐的初始值是0.5。我们还须要确定为假设的概率赋以多大的权重——权重为1代表假设概率的权重与一个单词相当。经过加权的概率值返回的是一个由getprobability与假设概率组成的加权平均。

    在单词“money”的例子中,针对“money”的加权概率对于所有分类而言均是从0.5开始的。待到在classifier训练期间接受了一篇 “bad”分类的文档,并且发现“money”适合于“bad”分类时,其针对“bad”分类的概率就会变为0.75。这是因为:此处最简单的方法,是计算被考查内容在每个不同分类中的概率,然后选择概率最大的分类

    分类阈值

    在许多应用中,我们无法将各个分类同等看待,而且在一些应用中,对于分类器而言,承认不知道答案,要好过判断答案就是概率值稍大一些的分类。

    在垃圾信息过滤的例子中,避免将普通邮件错当成垃圾邮件要比截获每一封垃圾邮件更为重要。收件箱中偶尔收到几封垃圾邮件还是可以容忍的,但是一封重要的邮件则有可能会因为自动过滤到废件箱而被完全忽视。假如我们必须在废件箱中找回自己的重要邮件,那就真的没必要再使用垃圾信息过滤器了。

    为了解决这一问题,我们可以为每个分类定义一个最小阈值。对于一封将要被划归到某个分类的新邮件而言,其概率与针对所有其他分类的概率相比,必须大于某个指定的数值才行。这一指定的数值就是阈值。以垃圾邮件过滤为例,假如过滤到“bad”分类的阈值为3,则针对“bad”分类的概率就必须至少3倍于针对 “good”分类的概率才行。假如针对“good”分类的阈值为1,则对于任何邮件,只要概率确实大于针对“bad”分类的概率,它就是属于“good” 分类的。任何更有可能属于“bad”分类,但概率并没有超过3倍以上的邮件,都将被划归到“未知”分类中。

综述

    贝叶斯分类器都是监督型学习方法(supervised learning methods)的例子,这是一种利用正确结果接受训练并逐步作出更准确预测的方法。

    贝叶斯分类器之所以经常被用于文档分类的原因是,与其他方法相比它所要求的计算资源更少。一封电子邮件可能包含数百甚至数千个单词,与训练相应规模大小的神经网络相比,简单地更新一下计数值所需占用的内存资源和处理器时钟周期会更少。而且正如你所看到的,这些工作完全可以在一个数据库中完成。神经网络是否会成为一种可行的替代方案,取决于训练和查询所要求的速度,以及实际运行的环境。神经网络的复杂性导致了其在理解上的困难。在本章中,我们可以清楚地看到单词的概率,以及它们对最终分值的实际贡献有多大,而对于网络中两个神经元之间的连接强度而言,则并不存在同样简单的解释。

另一方面,分类器相比,神经网络和支持向量机有一个很大的优势:它们可以捕捉到输入特征之间更为复杂的关系。在贝叶斯分类器中,每个特征都有一个针对各分类的概率值,将这些概率组合起来之后就得到了一个整体上概率值。在神经网络中,某个特征的概率可能会依据其他特征的存在或缺失而改变。也许你正在试图阻止有关在线赌博的垃圾信息,但是又对跑马很感兴趣,在这种情况下,只有当电子邮件中的其他地方没有出现单词“horse”时,单词 “casino”才被认为是“bad”的。朴素贝叶斯分类器无法捕获这样的相互依赖性,而神经网络却是可以的。

实例 :

训练函数

 def sampletrain(cl):

cl.train('Nobody owns the water.','good')

cl.train('the quick rabbit jumps fences','good')

cl.train('buy pharmaceuticals now','bad')

cl.train('make quick money at the online casino','bad')

cl.train('the quick brown fox jumps','good')

 

>>> reload(docclass)

<module 'docclass' from 'docclass.py'>

>>> cl=docclass.classifier(docclass.getwords)

>>> docclass.sampletrain(cl)

>>> cl.fprob('quick','good')

0.66666666666666663

出现quick文档的属于good这个分类的概率0.66666666666666663

 

注:以上例子来自 《Programming Collective Intelligence》附源代码。


 

 

 

你可能感兴趣的:(算法,工作,网络,python,文档,methods)