机器学习基础之朴素贝叶斯(2)

标题:

文本分类问题

垃圾邮件分类器

词汇表

模型建立

极大似然估计函数

构造分类器

测试

本章主要讲解关于朴素贝叶斯模型的简单实现,以及如何利用这个模型完成一个简单的英文垃圾邮件分类器。

文中一部分代码的样式风格出现差异是因为大部分代码我直接摘自自己的博客,但因为有一部分代码在博客上如果摘过来会因为公众号编辑器的问题超出显示范围,因此需要用编辑器重新排版后再截过来

1. 文本分类问题

假设,我们要做一个垃圾邮件分类器。

我们知道,我们收到的邮件可以粗略地分为两类,“垃圾”(spam)或者“非垃圾”(ham),而体现一个邮件是否垃圾的特征不像是我们逻辑回归所遇见的那样,只有少量的特征值。事实上,邮件中的每一个词都会是这封邮件的特征(当然我们可以排除掉一些没有实际内涵的词),如果我们还是使用逻辑回归,那么我们可能就需要非常非常多的参数,这会导致计算机的开销过大。因此,对于这种特殊的文本分类问题,我们需要有比逻辑回归模型更合适的分类器。

2. 垃圾邮件分类器

朴素贝叶斯算法便是用于文本分类的一个比较好的模型,不同于判别学习算法(像是逻辑回归)它是一种生成学习算法,它的原理是先分别对possitive class和negative class建立模型,然后再通过这两个模型对测试集中的未知邮件进行判断。

这次我们使用的数据集依然是来自Peter Harrington《机器学习实战》Ch04中提供的数据,里面包含了数封英文邮件,并被分类到两个文件夹中,其中名为“spam”的文件夹里面存储的是垃圾邮件,“ham”文件夹里面存储的是非垃圾邮件,之所以使用英文邮件而不是中文邮件作训练,是因为英文邮件中的词更容易提取,因为词与词之间有空格,而中文的话,还需要对文段进行分词,这些不相干的麻烦不利于我们进行学习。

a. 词汇表

首先,我们需要创建一个词典,它的内容是这些所有邮件可能包含的词汇,有时候我们可以从网上或者别的什么地方获得,但最常见的方法是遍历训练集然后将训练集中的每一个词加入词典:

打印返回的结果我们可以得到词典的内容:

我们这里遍历了每个样本采集词汇,然后通过正则去除掉词语中的特殊字符,例如“,”或者“.”,因为很显然这些词语没有什么用,并且会干扰到我们收集的词汇。举个例子,像是”school?”和”school”,我们如果不用正则合理匹配,那么他们就会被当成两个不同的词放在词汇表中,这是相当不合理的。并且,每个词汇都在词汇表中都必须保证是唯一有序的,因此我们加了判断条件并用list类保存。

形象的说,词典就是一个包含所有邮件中可能出现的词汇的有序序列。

b. 模型建立

模型建立的第一步是读取数据:

操作与取词汇表类似,但是我们不能将这个函数和前面那个取词函数整合,因为在读取训练集样本时我们还要让每一个样本内的词汇与词汇集中的词比对,因此在拥有词汇表之前我们是无法读取数据的。

c. 极大似然估计函数

然后我们可以根据得到的两个表建立计算参数极大似然估计的模型:

计算参数的公式如下:

不过我们可以看到,与这个公式相比,我们做了一点小小的改动:在分子加上1,分母加上2。这是因为我们还应用了拉普拉斯平滑(可以在我记录的关于朴素贝叶斯的同一章笔记中找到关于拉普拉斯平滑的内容,这里就不再赘述),因此,改动后的极大似然估计应为:

d. 构造分类器

藉由这个函数得到参数之后,我们就可以进一步构造分类器,分类器的公式:

因此我们有:

参数接受一个’file’类对象,这个对象便可以是任意的一个测试邮件。

e. 测试

分类器构造完成后,我们可以让它在我们自己的训练集中遍历一遍,测试误差:

不过当然了,在自己的训练集上如果误差都很大,那肯定是编写时出问题了,因此一般来说在自己的训练集上训练的模型误差都不会过大,所以我们还可以简单地加入一些测试数据来进行测试,看看模型的泛化性能。

这是我自己的邮箱中的一封邮件,他没有包含在训练集中:

我们把它放入’test.txt’文件中,然后用代码测试:

当然,有兴趣的话还可以用其它的邮件试一试,不过这里当然是仅限英文邮件,若是中文邮件我们还需要应用对中文分词的功能,那又会有一些区别了。

不过你在看了训练集中的一些邮件之后,或许会觉得这个模型的计算还是不够严谨,这是自然的。毕竟这只是一个较为简单粗糙的模型,而且训练集的内容也很少(事实上,我们用的训练集可能不到实际可能会用的训练集的大小的百分之一),有很多词汇词汇表也都是不包含的(像上述例子就有“github”,“jekyll”等等词汇),还有对一些特殊句子的处理(像是url链接),这些都会对我们的模型造成很严重的影响。

资料来源参考:

人民邮电出版社 Peter Harrington《机器学习实战》第四章

数据集来源 Github:Peter Harrington (https://github.com/pbharrin/machinelearninginaction)

本章数据集来源:Ch4

AI遇见机器学习

mltoai

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180118G0VWDT00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区