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

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.总结

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

  • 3
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
垃圾邮件检测朴素贝叶斯分类器的经典应用之一。下面是使用朴素贝叶斯算法进行垃圾邮件检测的基本流程: 1. 数据预处理:将邮件文本转化为数字特征向量,以便于机器学习算法处理。通常采用词袋模型将文本转化为向量。 2. 数据分割:将数据集按照一定比例分为训练集和测试集。 3. 训练模型:使用训练集训练朴素贝叶斯分类器,计算每个类别的先验概率和每个特征在各个类别中的条件概率。 4. 测试模型:使用测试集对模型进行测试,计算分类准确率、精确率、召回率和 F1 值等评估指标。 5. 调整参数:根据测试结果对模型参数进行调整,提高模型性能。 下面是使用 Python 实现朴素贝叶斯垃圾邮件检测的示例代码: ```python import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score from sklearn.feature_extraction.text import CountVectorizer # 加载数据集 def load_data(): data = [] labels = [] with open('spam.txt', 'r') as f: for line in f.readlines(): line = line.strip() if line.startswith('ham'): labels.append(0) data.append(line[4:]) elif line.startswith('spam'): labels.append(1) data.append(line[5:]) return data, labels # 将文本转化为数值特征向量 def text_to_vector(data): vectorizer = CountVectorizer() vectorizer.fit_transform(data) return vectorizer # 训练模型 def train_model(data, labels, vectorizer): # 将文本转化为特征向量 X = vectorizer.transform(data) # 训练朴素贝叶斯分类器 clf = MultinomialNB() clf.fit(X, labels) return clf # 测试模型 def test_model(clf, data, labels, vectorizer): # 将文本转化为特征向量 X = vectorizer.transform(data) # 预测标签 y_pred = clf.predict(X) # 计算模型性能指标 acc = accuracy_score(labels, y_pred) pre = precision_score(labels, y_pred) rec = recall_score(labels, y_pred) f1 = f1_score(labels, y_pred) print('Accuracy: %.4f' % acc) print('Precision: %.4f' % pre) print('Recall: %.4f' % rec) print('F1-score: %.4f' % f1) if __name__ == '__main__': # 加载数据集 data, labels = load_data() # 将文本转化为特征向量 vectorizer = text_to_vector(data) # 训练模型 clf = train_model(data, labels, vectorizer) # 测试模型 test_model(clf, data, labels, vectorizer) ``` 其中,spam.txt 是包含垃圾邮件和正常邮件的文本文件,每行格式为“标签 内容”,标签为 ham 表示正常邮件,spam 表示垃圾邮件。该程序将数据集按照 7:3 的比例分为训练集和测试集,使用 CountVectorizer 将文本转化为特征向量,然后使用 MultinomialNB 训练朴素贝叶斯分类器,最后计算模型性能指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

登峰造Geek

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

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

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

打赏作者

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

抵扣说明:

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

余额充值