基于机器学习(朴素贝叶斯)的垃圾邮件检测

1.概念介绍。

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

2.背景介绍

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

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

3.功能实现

1.语料库选择

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

选择中文

基于机器学习(朴素贝叶斯)的垃圾邮件检测

索引信息

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

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

2.基础环境

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

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

3.代码实现流程

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

 

基于机器学习(朴素贝叶斯)的垃圾邮件检测

代理实现流程

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

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

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

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

  • 读取邮件信息

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

读取邮件索引信息

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

详细代码见下图:

基于机器学习(朴素贝叶斯)的垃圾邮件检测

读取邮件索引信息代码

读取邮件内容信息

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

邮件内容遍历

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

读取邮件内容

  • 数据预处理

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

调用参数:

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

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

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

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

返回内容:

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

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

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

y_test:划分出的测试集标签

基于机器学习(朴素贝叶斯)的垃圾邮件检测

train_test_split函数

  • 文本特征向量化

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

特征向量化

  • 开始训练

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

开始训练

  • 输出结果

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

基于机器学习(朴素贝叶斯)的垃圾邮件检测

输出设置

基于机器学习(朴素贝叶斯)的垃圾邮件检测

输出结果

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

4.总结

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

1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 基于机器学习贝叶斯算法实现垃圾邮件分类python源码+项目说明+数据集.zip Python3 - pandas - 用于保存自定义测试集下训练邮件内的单词 - pyecharts>=1.0.0 - 个人喜欢用pyecharts来做图,如果你希望使用其他作图工具,可以自动修改draw_result()函数,如果您不希望作图,可以手动注释掉bayesian.draw_result()这条语句,位于751行。注意的是,pyecharts最后保存出来的是html文件 - snapshot_selenium - 将pyecharts保存的html文件生成图片,您需要使用到chromedriver,请手动下载,如果不下载的话,您可以注释掉所有make_snapshot()语句,或者忽略终端报出来的错误 - skleran - 贝叶斯分类器是自己实现的,但SVM调用的是现成的库函数 - nltk - 用于去停用词和词性还原,需要下载一些包,您可以去官网下载,或者在百度云里下载:链接:https://pan.baidu.com/s/1_eU5sTe2bMWMJaqxA7IO8w 提取码:0pc9 ,您可以不用下载所有的包,只需要下载corpora中的stopwords和wordnet、stemmers中的porter_test和rslp、taggers中的averaged_perceptron_tagger。然后将这些文件放于C:\Users\xxxxx\AppData\Roaming\nltk_data即可) 参数解释: ``` --model:模型的选择,默认为5 - 单使用伯努利模型为1 - 单使用多项式模型为2 - 单使用SVM为3 - 三个模型同时测试,并且你已经将邮件的测试集和训练集准备好的,为4 - 三个模型同时测试,并且邮件的训练集和测试集为随机生成,为5 --train_path:训练集(或总文件)的路径,默认为'train' --test_path:测试集路径,默认为'test' --test_times:测试的次数,每次测试随机生成的测试集均不一样,默认为1 --test_file_num:每一类进行测试的邮件数目,默认为5 注意,train和test文件夹下,各自建立子文件夹spam和ham来分别存放垃圾邮件和正常邮件 ``` - 使用方法为: ``` python bayes.py --model 5 --test_times 70 ``` ```python python bayes.py --model 5 --train_path 'train' --test_times 70 --test_file_num 5 ``` ```python python bayes.py --model 5 --train_path 'train' --test_path 'test' --test_file_num 5 ``` - 结果: 如果你使用第一条命令来进行训练和测试,那么你将会得到三个模型测试后的正确率、错误邮件个数,以及三个模型对应的识别错误的邮件分布情况,如下所示: ![正确率](README.assets/正确率.png) ![错误邮件个数](README.assets/错误邮件个数.png) ![SVM-邮件错误识别](README.assets/SVM-邮件错误识别.png) ![伯努利模型-邮件错误识别](README.assets/伯努利模型-邮件错误识别.png) ![多项式模型-邮件错误识别](README.assets/多项式模型-邮件错误识别.png) 除此之外,在终端上,你可以看到用来作出这些图片的数据。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登峰造Geek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值