1.概念介绍。

机器学习我们一般可以分为两大类,模式识别和异常检测。从行为来看,模式识别和异常检测边界比较模糊。在模式识别中,我们试图发现隐藏在数据中的显式或潜在的特性,形成特征集进行分类判断。异常检测从另一个维度进行知识发掘,最后的目标是建立给定数据中大部分的正太性,不是学习某些数据子集存在的特定模式,从各种正常情况的偏离都是异常行为,这也就是异常检测,比如说离群点检测。

2.背景介绍

邮件已在日常工作中应用非常广泛,是我们日常办公必不可少的通讯工具之一,随着邮件的使用频率越来越高,垃圾邮件也随之而来。垃圾邮件的爆发,困扰着每一位深度邮件使用者,目前各大安全厂商提供非常多的反垃圾邮件系统,可相对有效保障我们在工作过程中不被垃圾邮件所侵扰,本篇利用朴素贝叶斯对垃圾邮件语料库进行训练分类,最终达到可期的垃圾邮件检测效果。

我尽可能将代码注释写详细,即使不懂代码也可大体了解其实现流程和原理。

3.功能实现

1.语料库选择

中文垃圾邮件语料下载地址:https://plg.uwaterloo.ca/~gvcormac/treccorpus06/

aaf219ed3b12767efb560d2bb1f0cdb6.png

选择中文

d51c57145ae02e8d540f3f8ef6e9a127.png

索引信息

spam:垃圾邮件;ham:非垃圾邮件(记得转换成UTF-8格式)

01254dd1483a8b4b325d2cfdfa851849.png

索引信息对应的垃圾邮件内容

2.基础环境

2.1本文基于python实现,所以读者需要具备python环境。

2.2 朴素贝叶斯采用的是sklearn.naive_bayes.multinomialNB提供的类。

3.代码实现流程

代码实现分为5个部分,即读取信息、数据预处理、特征向量化、开始训练、输出结果。

541aa33280c6cc2b334493d02d9a6b51.png

代理实现流程

读取信息:读取语料库信息。

数据预处理:对数据进行预处理,训练集和测试集分割。

特征向量:文本特征向量化,形成失量列。

即使看不懂具体代码,了解该实现方法的流程也是非常好的。

  • 读取邮件信息

读取邮件信息分为两部分,第一为读取邮件索引信息,第二为读取邮件内容信息。

读取邮件索引信息

索引表请见上图“索引信息对应的垃圾邮件内容”,通过如下代码将索引表信息读取后,放入labels中。具体效果如,labels[163/237]如果为ham(非垃圾邮件)则为1;如果为垃圾邮件(spam)为0。

详细代码见下图:

8e48ecb8a5e0affe4f445c0043ebcf62.png

读取邮件索引信息代码

读取邮件内容信息

读取代码分两部分,第一是通过获取的索引信息,根据内容(存放的为索引目录)遍历对应的邮件内容,调用extract_email_text读取对应的邮件内容,并存储X中,y存储对应标签信息。

84fe1c4648f04da914b67b3bed530fc0.png

邮件内容遍历

extract_email_text方法主要是通过open打开对应文件后,获取邮件正文内容(邮件头未获取),并返回。

5bb31f277c574617b143be28250fb811.png

读取邮件内容

  • 数据预处理

基础数据处理完毕后,对数据进行预处理操作,train_test_split函数用于将矩阵随机划分训练子集和测试子集,并返回划分好的训练集和测试集及标签。

调用参数:

train_data(第一个参数):所要划分的样本特征集;

train_target(第二个参数):所要划分的样本标签;

test_size(第三个参数):样本占比,测试集样本数目与原始数目之比;

random_state(第四个参数):是随机数的种子。

返回内容:

X_train:划分出的训练集数据;

X_test:划分出对的测试集数据;

y_train:划分出的训练集标签;

y_test:划分出的测试集标签

a00a12078ef77c9e4b61cbbd88993fc8.png

train_test_split函数

  • 文本特征向量化

通过transform方法将X_train与X_test文本进行特征向量化,供下一步训练使用。

68e26d61f8d5b08d7221ef83789c644e.png

特征向量化

  • 开始训练

文中使用的为默认的朴素贝叶斯,利用X_train与y_train对模型参数进行拟合。最后通过predict方法获取返回预测结果(标签值)。

b7098fd8810ee23b63a3d731f7811c3a.png

开始训练

  • 输出结果

本文输出两块内容,一个是预测结果信息,一个是评估信息

3153ef6f44a65c0fd697c50ac9d9a65d.png

输出设置

2d534ee928d39bcafda2886dd1e27bdd.png

输出结果

最终朴素贝叶斯分类器的精确度达到97.6%。该方法一般要比LSH方法提升5-10%

4.总结

现实世界中的垃圾邮件检测并不像我们举例这样简单,有许多不同类型的垃圾邮件,每封垃圾邮件都有不同的攻击向量和避免检测的办法,有时垃圾邮件会通过重定向或隐藏链接来规避垃圾邮件链接检测分类器,有时垃圾邮件会通过图片,来避免文字训练形成的分类器。业界多数是将多个分类器和算法组合形成一个集合对垃圾邮件进行检测分类。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐