数据挖掘实例:朴素贝叶斯分类器进行垃圾邮件过滤

更多精彩推荐,请关注公众号:tjxj666

概述

朴素贝叶斯是基于贝叶斯,定理与特征条件独立假设的分类方法。最为广泛的两种分类模型是决策树模型和朴素贝叶斯模型。

和决策树模型相比,朴素贝叶斯分类器(Naive Bayesian Classifier, NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比,具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这个NBC模型的正确分类带来了一定影响。

优点:在数据较少的情况下任然有效,可以处理多类别问题

缺点:对于输入数据的准备方式较为敏感

使用数据类型:标称型数据

贝叶斯决策理论的核心思想是,选择具有最高概率的决策。

算法流程

收集数据:可以使用任何方法。

准备数据:需要数值型或者布尔型数据

分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好

训练算法:计算不同的独立特征的条件概率

测试算法:计算错误率

使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本

文本分类

准备数据:从文本中构建词向量

将文本看成单词向量或词条向量,也就是说把句子转换为向量。

函数验证

训练算法:从词向量计算概率

贝叶斯准则:

p(

ci

|w)=

p(w|

ci

)p(

ci

)p(w)

p(ci|w)=p(w|ci)p(ci)p(w)

w

w表示这是一个向量,即它由多个数值组成。

w

w中元素众多,使用Numpy数组快速计算这些值。

函数测试

对样本数据集进行朴素贝叶斯分类,得到出现侮辱性语言的概率为0.5。

从样本数据中可以看到,总共有6句话,有三句是侮辱性语句,因此概率0.5是正确的。

查看侮辱性言论中各单词出现的概率。

找出侮辱性言论中单词出现概率最大的值和其对应的索引

单词列表中找到对应索引的单词,发现该单词为’stupid’。这意味着’stupid’是最能表征侮辱性言论类别的单词

测试算法:根据现实情况修改分类器

利用贝叶斯分类器对文档进行分类时,要计算多个概率的乘积以获得文档属于某个类别的概率,即计算

p(

w

|1)p(

w1

|1)p(

w2

|1)

p(w|1)p(w1|1)p(w2|1)。如果其中一个概率为0,那么最后的乘积也为0。

为了降低这种影响,可以将所有词出现数初始化为1,并将分母初始化为2。

另一个问题是下溢出,这是由于太多很小的数相乘造成的。由于大部分因子都非常小,所以程序会下溢出或者得不到正确答案。

一种解决办法是对乘积取自然对数。在代数中有

ln(a∗b)=ln(a)+ln(b)

ln(a∗b)=ln(a)+ln(b),于是通过求对数可以避免下溢出或者浮点数舍入导致的错误。同时,采用自然对数进行处理不会有任何损失。

编写朴素贝叶斯分类函数

执行测试

准备数据:文档词袋模型

上面将每个单词在文本中出现与否作为一个特征,这可以被描述为词集模型(set-of-words model)。

如果一个词在文档中出现不止一次,这可能意味着该词是否出现在文档中不能表达的某种信息,这种方法被称为词袋模型(bag-of-words model)。

词袋中每个单词可以出现多次,而词集中每个单词只能出现一次。

示例:电子邮件垃圾过滤

收集数据:提供文本文件

准备数据:将文本文件解析成词条向量

分析数据;检查词条确保解析的正确性

训练算法:使用之前建立的trainNB0()函数

测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率

使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上

准备数据:切分文本

使用正则表达式切分,其中分隔符是除单词、数字外的任意字符

切分邮件

测试算法:使用朴素贝叶斯进行交叉验证

由于SpamTest()构造的测试集和训练集是随机的,所以每次运行的分类结果可能不一样。如果发生错误,函数会输出错分文档的词表,这样就可以了解到底哪篇文档发生了错误。

这里出现的错误是将垃圾邮件误判为了正常邮件。

示例:使用朴素贝叶斯分类器从个人广告中获取区域倾向

分别从美国的两个城市中选取一些人,通过这些人发布的征婚广告信息,来比较这两个城市的人们在广告用词上是否不同。如果结论确实不同,那么各自的常用词有哪些?从人们的用词当中,我们能否对不同城市的人所关心的内容有所了解?

收集数据:从RSS源收集内容

准备数据:将文本解析成词条向量

分析数据:检查词条以确保词条的正确性

训练算法:使用之前建立的traingNB0()函数

测试算法:观察错误率,确保分类器可用。可以修改切片程序,以降低错误率,提高分类结果

使用算法:构建一个完整的程序,封装所有内容。给定两个RSS源,该程序会显示常用的公共词

收集数据:导入RSS源

验证RSS分类器

分析数据:显示地域相关的用词

验证函数

从结果可以看出两者之间的常用词差距还是比较明显

·END·

统计学家

统计学·机器学习·人工智能

微信号:tjxj666

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180701A12P8500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券