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

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
    评论
垃圾邮件检测是一个非常重要的问题,因为垃圾邮件会占据我们的收件箱,给我们带来很多麻烦。本文将介绍如何使用Python和随机森林算法来训练垃圾邮件检测模型。 随机森林算法是一种流行的机器学习算法,它可以用于分类和回归问题。它通过使用多个决策树来进行分类或回归,然后将它们的结果进行集成,以提高预测的准确性。在垃圾邮件检测中,我们可以使用随机森林算法来训练一个模型,该模型可以将邮件分类为垃圾邮件或非垃圾邮件。 下面是一个使用Python和随机森林算法来训练垃圾邮件检测模型的示例代码: ``` # 导入所需的库 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # 加载数据 data = pd.read_csv("spam.csv") # 删除无用的列 data = data.drop(["Unnamed: 2", "Unnamed: 3", "Unnamed: 4"], axis=1) # 重命名列 data = data.rename(columns={"v1": "label", "v2": "text"}) # 将标签转换为数字 data["label"] = data["label"].map({"ham": 0, "spam": 1}) # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(data["text"], data["label"], test_size=0.2, random_state=42) # 特征工程 from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer() X_train = cv.fit_transform(X_train) X_test = cv.transform(X_test) # 训练模型 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) # 预测 y_pred = rf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 在上面的代码中,我们首先使用Pandas库加载数据。然后,我们删除无用的列,并将标签从字符串转换为数字。接下来,我们使用train_test_split函数将数据集分成训练集和测试集。然后,我们使用CountVectorizer将文本转换为数字特征。最后,我们使用RandomForestClassifier训练一个随机森林模型,并使用测试集进行预测。最后,我们计算模型的准确率并输出结果。 在运行上述代码后,你将会得到一个基于随机森林算法的垃圾邮件检测模型。该模型可以用于检测新的邮件是否为垃圾邮件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

登峰造Geek

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

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

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

打赏作者

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

抵扣说明:

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

余额充值