在这一章,我们将建立一个垃圾邮件过滤分类模型。我们将使用一个包含垃圾邮件和非垃圾邮件的原始电子邮件数据集,并使用它来训练我们的ML模型。我们将开始遵循上一章讨论的开发ML模型的步骤。这将帮助我们理解工作流程。
在本章中,我们将讨论以下主题:
l 定义问题
l 准备数据
l 数据分析
l 构建数据的特征
l 逻辑回归与朴素贝叶斯的Email垃圾邮件过滤
l 验证分类模型
定义问题让我们从定义本章要解决的问题开始。我们可能已经对垃圾邮件很熟悉了;垃圾邮件过滤是众电子邮件服务的基本功能。垃圾邮件对用户来说可能是恼人的,但它们除此之外,也会带来更多的问题和风险。例如,可以设计垃圾邮件来获取信用卡号或银行帐户信息,这些信息可用于信用卡欺诈或洗钱。垃圾邮件也可以用来获取个人数据,然后可以用于身份盗窃和各种其他犯罪。垃圾邮件过滤技术是电子邮件服务避免用户遭受此类犯罪的重要一步。然而,有正确的垃圾邮件过滤解决方案是困难的。我们想过滤掉可疑的邮件,但同时,我们又不想过滤太多,以至于非垃圾邮件进入垃圾邮件文件夹,永远不会被用户看到。为了解决这个问题,我们将让我们的ML模型从原始电子邮件数据集中学习,并使用主题行将可疑电子邮件归类为垃圾邮件。我们将着眼于两个性能指标来衡量我们的成功:准确度和召回率。我们将在以下几节中详细讨论这些指标。
总结我们的问题定义:
n 需要解决的问题时什么?我们需要一个垃圾邮件过滤解决方案,以防止我们的用户成为欺诈活动的受害者,同时改善用户体验。
n 为什么这是个问题?在过滤可疑邮件和不过滤太多邮件之间取得适当的平衡是很困难的,这样垃圾邮件仍然会进入收件箱。我们将依靠ML模型来学习如何对这些可疑邮件进行统计分类。
n 解决这个问题的方法有哪些?我们将建立一个分类模型,根据邮件的主题行,标记潜在的垃圾邮件。我们将使用准确性和召回率来平衡被过滤的邮件数量。
n 成功的标准是什么?我们想要高回复率(实际垃圾邮件检索的百分比占垃圾邮件的总数),而不牺牲太多的精确率(正确分类的垃圾邮件的百分比中预测为垃圾邮件)。
准备数据
现在,我们已经清楚地描述和定义了将要用ML解决的问题,接下来我们需要准备数据。通常,我们需要在数据准备步骤之前采取额外的步骤来收集我们需要的数据,但是现在,我们将使用一个预先编译并标记为公共可用的数据集。在本章中,我们将使用CSDMC2010垃圾数据集来训练和测试我们的模型。我们将看到一个名为SPAMTrain.label的文本文件。SPAMTrain.label文件对训练文件夹中的每封邮件都进行了编码,0代表垃圾邮件,1代表非垃圾邮件。我们将使用此文本文件和训练文件夹中的电子邮件数据来构建垃圾邮件分类模型。
我们现在拥有的是一个原始数据集,其中包含许多EML文件,其中包含关于单个电子邮件的信息,以及一个包含标记信息的文本文件。为了使这个原始数据集可用来构建垃圾邮件分类模型,我们需要做以下工作:
从EML文件中提取主题行:为将来的任务准备数据的第一步是从各个EML文件中提取主题和正文。我们将使用一个名为EAGetMail的包来加载和提取EML文件中的信息。使用EAGetMail包,我们可以轻松地从EML文件中加载和提取主题和正文内容。一旦从电子邮件中提取了主题和正文,就需要将每行数据作为一行附加到Deedle数据框架中。
将提取的数据与标签结合起来:在从各个EML文件中提取主题和正文内容之后,我们还需要做一件事。我们需要将经过编码的标签(垃圾邮件为0,而非垃圾邮件为1)映射到我们在前一步中创建的数据帧的每一行。如果我们打开垃圾邮件。标签文件与任何文本编辑器,您可以看到编码的标签在第一列和相应的电子邮件文件名在第二列,由一个空格分隔。使用Deedle frame的ReadCsv函数,我们可以通过指定一个空格作为分隔符来轻松地将这个标签数据加载到数据框架中。一旦我们将这个标记的数据加载到一个数据框架中,我们就可以简单地将这个数据框架的第一列添加到前面步骤中使用Deedle框架的AddColumn函数创建的其他数据框架中。