解密垃圾邮件分类:基于SVM的数据挖掘项目

垃圾邮件(Spam)的泛滥成灾一直是电子邮件系统中的一个严峻问题。随着垃圾邮件技术的不断演变,传统的过滤方法逐渐显得力不从心。因此,本项目旨在利用支持向量机(SVM)这一强大的机器学习工具,实现对垃圾邮件的高效分类,为用户提供更清爽、高效的电子邮件体验。

一、项目目标

本项目的主要目标是构建一个基于SVM的垃圾邮件分类系统。通过对两个不同来源的数据集(trec 和 enron)进行综合分析和处理,我将展示整个数据挖掘项目的过程,包括数据的预处理、特征工程、模型训练与调优,并最终通过实验结果分析验证模型的性能。

二、数据集来源及介绍

我使用了两个不同来源的数据集,其中trec数据集已经经过处理,enron数据集需要进行清洗和整理:

  • trec(Emails for spam or ham classification (Trec 2007) (kaggle.com)
  • enron(MWiechmann/enron_spam_data: The Enron-Spam dataset preprocessed in a single, clean csv file. (github.com)

trec 数据集提供了多样的垃圾邮件和非垃圾邮件样本,而 enron 数据集则包含了来自 enron 公司的电子邮件数据。这两个数据集的结合将有助于提高模型的泛化能力。

三、数据处理与准备

在进行垃圾邮件分类项目之前,我们首先需要对数据进行准备和预处理。

3.1 trec数据集

3.1.1 数据导入与查看

pythonCopy code
trec = pd.read_csv(r"D:\\BUZZ\\\\数据挖掘\\垃圾邮件分类\\email_text.csv")
display(trec)

原因:数据一开始就是预处理过的,因此通过导入数据和查看前几行,我们可以验证数据的完整性,确保没有导入错误或缺失的信息。

3.1.2 缺失值和重复值处理

pythonCopy code
trec.isna().sum()
trec.duplicated().sum()

原因:尽管数据已经被预处理,但为了确保数据的完整性,我们仍然进行了缺失值和重复值的验证。使用isna()方法检查每一列是否存在缺失值,sum()方法得到缺失值的数量。使用duplicated()方法检查是否有重复行,sum()方法计算重复值的数量。

3.2 enron数据集

3.2.1 数据导入与查看

pythonCopy code
enron = pd.read_csv(r"D:\\BUZZ\\\\数据挖掘\\垃圾邮件分类\\enron_spam_data.csv")
display(enron)

原因: enron数据集的导入和查看步骤与trec相似。同样,通过导入数据和查看前几行,我们验证了数据的完整性。

3.2.2 缺失值和重复值处理

pythonCopy code
enron.isna().sum()
enron.duplicated().sum()
enron.dropna(inplace=True)
enron.drop_duplicates(inplace=True)

原因: 与trec不同,enron数据集是原始数据,未经过预处理。我们首先使用**isna()方法检查缺失值,sum()方法得到每列缺失值的数量。然后,使用duplicated()方法检查重复值,sum()方法计算重复值的数量。接着,使用dropna方法删除缺失值,drop_duplicates**方法删除重复值。

3.2.3 数据选择性分析与处理

pythonCopy code
pythonCopy code
# 只分析邮件正文内容,因此不需要其他列
enron.drop(['Message ID', "Subject", "Date"], axis=1, inplace=True)# 检查缺失值
enron.isna().sum()# 删除缺失值
enron.dropna(inplace=True)# 检查重复值
enron.duplicated().sum()# 删除重复值
enron.drop_duplicates(inplace=True)# 使用 LabelEncoder 将 "ham" 替换为 0,"spam" 替换为 1
label_encoder = preprocessing.LabelEncoder()
enron['label'] = label_encoder.fit_transform(enron['Spam/Ham'])
enron.drop('Spam/Ham', axis=1, inplace=True)
enron.rename(columns={'Message': 'text'}, inplace=True)

原因: 由于我们只对邮件正文内容进行分析,因此在这一步骤中,我们删除了与正文内容无关的列。然后,我们再次检查并处理缺失值和重复值。最后,使用**LabelEncoder**将"ham"标记为0,"spam"标记为1,为模型训练做准备。

3.3 数据合并、抽样及划分

在这一步中,我首先合并了trec和enron两个数据集,再次检查了合并后的数据集是否有重复值。然后,我进行了随机抽样,保留了原始数据集的10%。最后,我使用**train_test_split**方法将数据集划分为训练集和测试集,其中20%分给测试集,80%分给训练集。这样的划分有助于我们在训练模型时验证其性能。

3.3.1 数据合并与抽样

pythonCopy code
combined = pd.concat([trec, enron], ignore_index=True)
combined.duplicated().sum()
combined = combined.sample(frac=0.1, random_state=1)

原因: 将两个数据集合并为一个可以帮助我们更方便地进行后续的分析和建模。为了减小数据规模,提高模型训练效率,我们使用了**sample**方法对合并后的数据进行了随机抽样。这也有助于避免在处理大规模数据时过度占用计算资源。

3.3.2 数据集划分

pythonCopy code
pythonCopy code
# 合并数据集
combined = pd.concat([trec, enron], ignore_index=True)# 合并后检查重复值
combined.duplicated().sum()# 对 combined 数据集进行随机抽样,保留原始数据集的 10%
combined = combined.sample(frac=0.1, random_state=1)
combined# 分割数据集 (20%分给测试集,80%分给训练集)
x = combined['text']
y = combined['label']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)

将数据集划分为训练集和测试集,其中20%分给测试集,80%分给训练集。这样的划分有助于我们在训练模型时验证其性能。


注释解释:

  • 删除缺失值的原因: 电子邮件正文缺失对垃圾邮件分类任务没有直接贡献,且数目较少,因此选择直接删除缺失值。这有助于保持数据集的质量和可用性。
  • 删除重复值的原因:
    1. 过拟合风险: 数据集中存在重复的电子邮件可能导致模型在新数据上的泛化性能下降,因为模型会过度学习这些重复的模式。
    2. 样本偏好: 如果某些电子邮件出现多次,模型可能更倾向于这些样本,引入对特定电子邮件的偏好。删除重复值有助于保持数据集的平衡性。
    3. 简化数据集: 删除重复值可以简化数据集,使数据更干净、易于理解,并减少对计算资源的需求。

这样的处理步骤旨在确保数据的质量,为后续建模和分析提供可靠的基础。

四、 数据特征提取与向量化

在进行垃圾邮件分类的任务中,文本数据需要被转换为机器学习模型可以处理的数值型数据。这一过程通常包括文本的特征提取和向量化,而我们使用了TF-IDF(Term Frequency-Inverse Document Frequency)向量化方法。

4.1 TF-IDF向量化

pythonCopy code
vectorizer = TfidfVectorizer()
x_train_vectorized = vectorizer.fit_transform(x_train)
x_test_vectorized = vectorizer.transform(x_test)

原因: 对于支持向量机(SVM)等基于数值型数据的机器学习模型,文本数据通常需要经过适当的处理和特征提取才能用于训练和预测。TF-IDF向量化是一种常见的文本特征提取方法,它将文本数据转换为稀疏的数值向量,以便机器学习算法能够理解和处理。TF-IDF考虑了单词在文档中的重要性,降低了常见词汇的权重,增加了罕见词汇的权重。

五、 模型训练与调优

5.1 初始化SVM模型

pythonCopy code
svc = SVC()

原因: 在这个项目中,我们选择使用支持向量机(SVM)作为分类模型。通过初始化一个SVM分类器,我们为后续的超参数调优和模型训练做好了准备。

5.2 使用GridSearchCV查找最佳超参数组合

pythonCopy code
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf'], 'gamma': ['scale', 'auto']}
grid_search = GridSearchCV(svc, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(x_train_vectorized, y_train)

原因: 为了提高模型的性能,我们使用了网格搜索(Grid Search)来搜索最佳的超参数组合。通过定义超参数的范围,GridSearchCV尝试了不同的组合,并使用交叉验证来评估它们的性能。在这里,我们调整了SVM模型的惩罚参数C、核函数(linear或rbf)和gamma参数。

5.3 使用最佳超参数重新训练SVM模型

pythonCopy code
best_svm_gpu = grid_search.best_estimator_
best_svm_gpu.fit(x_train_vectorized, y_train)

原因: 确定了最佳超参数组合后,我们使用这些参数重新训练了SVM模型,以便获得更好的性能。

六、 实验结果分析与总结

6.1 在测试集上计算模型评估指标

为了评估模型的性能,我在测试集上计算了准确率、精确度召回率等指标。这些指标提供了对模型在新数据上表现的全面了解。在垃圾邮件分类任务中,准确率衡量了模型正确分类的比例,精确度度量了垃圾邮件被正确分类的比例,召回率则度量了模型找到所有垃圾邮件的能力。

pythonCopy code
predictions = best_svm_gpu.predict(x_test_vectorized)
accuracy = accuracy_score(y_test, predictions)
precision = precision_score(y_test, predictions)
recall = recall_score(y_test, predictions)print('准确率: ', accuracy)
print('精确度: ', precision)
print('召回率: ', recall)

结果:

  • 准确率(Accuracy):98.08%
  • 精确度(Precision):97.59%
  • 召回率(Recall):98.89%

6.2 使用自定义输入测试模型

通过输入一条新的邮件内容进行模型测试,查看模型对未见过的数据的分类预测。

pythonCopy code
new_email = '亲爱的朋友,我有一个很好的投资机会给你!'
new_email_vectorized = vectorizer.transform([new_email])
prediction = best_svm_gpu.predict(new_email_vectorized)
print('预测结果:', prediction)

结果: 模型预测结果为1,即该邮件被分类为垃圾邮件。

通过以上实验结果,我们可以得出结论:

  • 模型在测试集上表现良好,具有高准确率(98.08%)和高召回率(98.89%)。
  • 模型对新的、未见过的邮件数据也能做出有效的分类预测,体现了其泛化能力。
  • 该垃圾邮件分类系统可以在实际应用中发挥作用,帮助用户过滤垃圾邮件,提升邮件处理效率。

通过对实验结果的分析,验证了模型的有效性,也为垃圾邮件分类任务提供了可靠的解决方案。在实际应用中,该模型可以作为一个自动化工具,帮助用户识别和处理大量的电子邮件数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git、gitee、github、gitlab 区别以及功能

请直接看原文 原文链接:git、gitee、github、gitlab 区别以及功能_agit gitee-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- Git git 是一种版本控制系统,是…

Activemq存储KahaDb详解

引言 ActiveMQ在不提供持久化的情况下,数据保存在内存中,一旦应用崩溃或者重启之后,数据都将会丢失,这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB kahaDB是一个基于文件&#xf…

WPF+Halcon 培训项目实战(10):HS组件绘制图案

文章目录 前言相关链接项目专栏运行环境匹配图片模板匹配加载模板文件运行结果 绘制十字标 WPF HS组件绘制图像绘制和生成的区别 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只…

元旦特辑:Note6---选择排序

目录 前言❌ 1. 基本思想⚠️ 2. 直接选择排序🟢 2.1 思路分析✳️ 2.2 代码实现❎ 2.2.1 sort.h 2.2.2 sort.c 2.2.3 test.c 2.3 问题解决❇️ 2.3.1 sort.c修改 2.4 特性总结✅ 3. 堆排序🔵 3.1 代码实现🏧 3.2 特性总结&…

神经元科技发布AI agent—“萨蔓莎”

今天神经元科技发布AI agent—“萨蔓莎“(Samantha )! 取名“萨蔓莎”,是来自于一部讲述AI的电影《HER》。 电影讲述的是电影讲述男子西奥多汤布里(Theodore Twombly,饰)与拟人化萨曼莎&#…

mysql2pgsql

使用pgloader进行迁移 pgloader是一个强大的数据迁移工具,专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移,并提供了一种简单且灵活的方式来转移数据。 安装pgloader 使用pgloader迁移数据 1、命令行方式 2、脚…

【AI】注意力机制与深度学习模型

目录 一、注意力机制 二、了解发展历程 2.1 早期萌芽: 2.2 真正意义的注意力机制: 2.3 2015 年及以后: 2.4 自注意力与 Transformer: 2.5 BERT 与预训练模型: 三、基本框架 1. 打分函数(Score Fun…

Vue常见面试问答

vue响应式数据 vue2 Vue2 的对象数据是通过 Object.defineProperty 对每个属性进行监听,当对属性进行读取的时候,就会触发 getter,对属性进行设置的时候,就会触发 setter。 /** * 这里的函数 defineReactive 用来对 Object.def…

如何正确使用docker搭建redis服务器,安装gcc和make以及出现错误时的解决办法

搭建redis服务器 目录 搭建redis服务器 (1)开启docker,并查看是否开启成功 (2)启动上面创建的ssrf容器,并进入ssrf容器 (3)进入opt,然后下载redis-5.0.5.tar.gz &a…

GitHub Copilot 快速入门

一简介 GitHub Copilot是一个AI编程助手,它能够为开发者提供代码建议和自动完成功能。Copilot使用自然语言处理技术来理解代码的语义,并根据上下文提供智能化的代码建议。通过使用Copilot,开发者可以提高编码效率,减少错误率&…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…

宝塔部署flask添加ssl即https

在宝塔部署flask的步骤我已经写了一篇博客:宝塔部署flask项目-CSDN博客 之前说如果出现找不到application错误: spawned uWSGI http 1 (pid: 3116) --- no python application found, check your startup logs for errors --- [pid: 3114|app: -1|req: -1/1] 127.0.0.1 () {6…

java 什么是变量和字面量?

什么是变量&#xff0c;怎么理解的&#xff1f; 变量其实就是内存当中存储数据的最基本的单元。 一个存储数据的盒子&#xff0c;一个存储数据的单元。 什么是字面量&#xff0c;怎么理解&#xff1f; 整数型字面量&#xff0c;浮点型的字面量&#xff0c;布尔类型字面量&#…

sklearn学习的一个例子用pycharm jupyter

环境 运行在jupyter 进行开发。即一个WEB端的开发工具。能适时显示开发的输出。后缀用的是ipynb.pycharm也可以支持。但也要提示按装jupyter. 或直接用andcoda 这里我们用pycharm进行项目创建 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab pip ins…

API服务的快速搭建和测试

API服务的快速搭建和测试 使用Python的FastAPI迅速搭建一个简单API from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModel import uvicorn, json, datetime import torch# 设置CUDA设备信息 DEVICE "cuda" DEVICE_ID "0…

在vim中映射类似于Windows编辑器的快捷键

vim编辑器的历史比较久&#xff0c;继承于vi&#xff0c;这个编辑器就更早了。可能拜于年代所赐&#xff0c;里面的快捷键设计似乎不是那么“现代化”&#xff0c;和很多现在的编辑器的热键设计出入很大&#xff0c;里面的命令更不是一般人能记得住的。 我一直知道vim可以rema…

QT 利用开源7z 实现解压各种压缩包,包括进度条和文件名的显示(zip,7z,rar,iso等50多种格式)

想做一个winRAR一样的解压软件吗?很简单,利用开源的7z库就能实现。我看网上其他人说的方法不敢苟同,误人子弟。以前自己在项目中使用过7z,这次又有需要,就想记录下来。如果你研究过如何用7z的话,一定知道7z的每一个GUID都代表了一种格式,50多种GUID也就有50多个格式,最…

uniapp打包Android、Ios、微信小程序

首先我们需要在我们的代码中&#xff0c;把我们所要用到的配置信息配置好&#xff0c;在检查一下我们测试的内容是否有打开&#xff08;取消注释&#xff09;&#xff0c;在检查一下我们的版本信息是否正确&#xff0c;查看一下接口ip是否是正式线 这里的配置信息一定要配置好…

epoll并发编程

epoll并发编程 epoll并发编程背景知识epoll 的特点epoll 的工作原理epoll 和 select/poll 的区别 epoll并发服务器思路重点代码分析git地址参考书目 epoll并发编程背景知识 epoll 是 Linux 中用于处理大量文件描述符的 I/O 事件通知机制。在传统的 I/O 模型中&#xff0c;一般…