1.1.00_贝叶斯分类器 Bayesian Classifier

贝叶斯分类器是在第6章介绍的。在那一章中,我们已经学会了如何建立一个文档分类系统,将其用于垃圾邮件过滤,或是根据关键字的模糊搜索来对一组文档进行划分

尽管所有的例子都是关于文档处理的,但是第6章的贝叶斯分类器实际上也可以适用于任何其他形式的数据集,只要我们能将其转换成一组特征列表。

所谓特征,就是指一个给定项中存在或缺少的某种东西

在文档的例子中,特征就是文档中的单词,但它们也可以是某个不明对象的特有属性、一种疾病的症状,或是其他任何形式的东西,只要我们能够称其是"存在的"或"缺少的"即可。

训练 Training

所有监督算法一样,贝叶斯分类器是利用样本进行训练的

每个样本包含了一个特征列表和对应的分类

假定我们要对一个分类器进行训练,使其能够正确判断出:一篇包含单词"python"的文档究竟是关于编程语言的,还是关于蛇的。表12-1给出了一个样本训练集。
表12-1:针对一组文档的特征和分类

特征 | 分类
-- |
Python是以鸟和哺乳动物为食的大蟒 | 蛇
Python最初是作为一门脚本语言被开发出来的 | 语言
在印度尼西亚发现了一条14.935米(49英尺)长的Python | 蛇
Python具有动态类型系统 | 语言
拥有鲜艳表皮的Python | 蛇
开源项目 | 语言

分类器记录了它迄今为止见过的所有特征,以及这些特征与某个特定分类相关联的数字概率。

分类器逐一接受样本的训练。当经过某个样本的训练之后,分类器会更新该样本中特征与分类的概率,同时还会产生一个新的概率,即:在一篇属于某个分类的文档中,含有指定单词的概率。

例如,经过如表12-1所示的一组文档的训练之后,也许我们最终会得到如表12-2所示的一组概率。
表12-2:单词属于某个给定分类的概率

特征 | 语言 | 蛇
-- |
dynamic | 0.6 | 0.1
constrictor | 0.0 | 0.6
long | 0.1 | 0.2
source | 0.3 | 0.1
and | 0.95 | 0.95

从上表中我们可以看到,经过训练之后,特征与各种分类的关联性更加明确了。

单词"constrictor"属于蛇的分类概率更大,而单词"dynamic"属于编程语言的分类概率更大。

另一方面,有些特征的所属分类则并没有那么明确,比如:单词"and"出现在两个分类中的概率是差不多的(单词"and"几乎会出现在每一篇文档中,不管它属于哪一个分类)。

分类器在经过训练之后,只会保留一个附有相应概率的特征列表,与某些其他的分类方法不同,此处的原始数据在训练结束之后,就没有必要再加以保存了。

分类 Classifying

当一个贝叶斯分类器经过训练之后,我们就可以利用它来对新的项目进行自动分类了。

假定我们有一篇新的文档,包含了特征"long"、"dynamic"和"source"。表12-2列出了每个特征的概率,但这些概率只是针对于各个单词而言的。如果所有单词同属于一个分类的概率值更大,那么答案显然是很清楚的。

然而在本例中,"dynamic"属于语言分类的概率更大,而"long"属于蛇分类的概率更大。因此,为了真正对一篇文档进行有效地分类,我们需要一种方法能将所有特征的概率组合到一起,形成一个整体上的概率。

解决这一问题的一种方法是利用我们在第6章中介绍过的朴素贝叶斯分类器。它是通过下面的公式将概率组合起来的:

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

此处:

Pr (Document | Category) = Pr(Word1 | Category) * Pr(Word2 | Category) *…
  • Pr(Word | Category)的取值来自于上表,比如:Pr (dynamic | Language) = 0.6。
  • Pr(Category)的取值则等于某个分类出现的总体几率。因为"language"有一半的机会都会出现,所以Pr(Language)的值为0.5。

无论是哪个分类,只要其Pr(Category | Document)的值相对较高,它就是我们预期的分类。

代码使用说明 Using Your Code

为了利用第6章中构造的贝叶斯分类器对数据集进行分类,我们所要做的唯一一件事情就是定义一个特征提取函数,该函数的作用是将我们用以训练或分类的数据转化成一个特征列表

在第6章中我们处理的是文档,所以该函数将字符串拆分成了一个个单词,但是也可以采用任何其他形式的函数,只要它接受的是一个对象,并且返回一个列表:

>>> docclass.getwords('python is a dynamic language')
{'python': 1, 'dynamic': 1, 'language': 1}

上述函数可用于创建一个新的分类器,针对字符串进行训练:

>>> cl=docclass.naivebayes(docclass.getwords)
>>> cl.setdb('test.db')
>>> cl.train('pythons are constrictors','snake')
>>> cl.train('python has dynamic types','language')
>>> cl.train('python was developed as a scripting language','language')

然后进行分类:

>>> cl.classify('dynamic programming')
u'language'
>>> cl.classify('boa constrictors')
u'snake'

对于允许使用的分类数量,此处并没有任何的限制,但是为了使分类器有一个良好的表现,我们须要为每个分类提供大量的样本。

优点和缺点 Strengths and Weaknesses

  • 朴素贝叶斯分类器与其他方法相比最大的优势或许就在于,它在接受大数据量训练和查询时所具备的高速度。即使选用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是针对特征概率的数学运算而已。

    尤其当训练量逐渐递增时则更是如此--在不借助任何旧有训练数据的前提下,每一组新的训练数据都有可能会引起概率值的变化

    (你会注意到,贝叶斯分类器的算法实现代码允许我们每次只使用一个训练项,而其他方法,比如决策树和支持向量机,则须要我们一次性将整个数据集都传给它们。)对于一个如垃圾邮件过滤这样的应用程序而言,支持增量式训练的能力是非常重要的,因为过滤程序时常要对新到的邮件进行训练,然后必须即刻进行相应的调整;更何况,过滤程序也未必有权访问已经收到的所有邮件信息。

  • 朴素贝叶斯分类器的另一大优势是,对分类器实际学习状况的解释还是相对简单的。由于每个特征的概率值都被保存了起来,因此我们可以在任何时候查看数据库,找到最适合的特征来区分垃圾邮件与非垃圾邮件,或是编程语言与蛇。保存在数据库中的这些信息都很有价值,它们有可能会被用于其他的应用程序,或者作为构筑这些应用程序的一个良好基础。

  • 朴素贝叶斯分类器的最大缺陷就是,它无法处理基于特征组合所产生的变化结果。假设有如下这样一个场景,我们正在尝试从非垃圾邮件中鉴别出垃圾邮件来:假如我们构建的是一个Web应用程序,因而单词"online"时常会出现在你的工作邮件中。而你的好友则在一家药店工作,并且喜欢给你发一些他碰巧在工作中遇到的奇闻趣事。同时,和大多数不善于严密保护自己邮件地址的人一样,偶尔你也会收到一封包含单词"online pharmacy"的垃圾邮件。

    也许你已经看出了此处的难点--我们往往会告诉分类器"online"和"pharmacy"是出现在非垃圾邮件中的,因此这些单词相对于非垃圾邮件的概率会更高一些。当我们告诉分类器有一封包含单词"online pharmacy"的邮件属于垃圾邮件时,则这些单词的概率又会进行相应的调整,这就导致了一个经常性的矛盾。由于特征的概率都是单独给出的,因此分类器对于各种组合的情况一无所知。在文档分类中,这通常不是什么大问题,因为一封包含单词"online pharmacy"的邮件中可能还会有其他特征可以说明它是垃圾邮件,但是在面对其他问题时,理解特征的组合可能是至关重要的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容