Python数据分析-垃圾邮件分类

时间:2024-10-12 06:57:00

一、研究背景

随着电子通信技术的飞速发展,电子邮件已经成为人们日常工作和生活中不可或缺的一部分。然而,伴随着这一趋势,垃圾邮件(Spam)的数量也在急剧增加。垃圾邮件不仅会占用用户的邮箱空间,还可能含有恶意软件、钓鱼攻击、广告欺诈等威胁,严重影响用户体验和网络安全。为了解决这一问题,研究有效的垃圾邮件检测算法成为了学术界和工业界的热点。

传统的垃圾邮件过滤方法多依赖于关键字匹配和规则定义,这些方法容易被垃圾邮件发送者利用,从而无法适应不断变化的垃圾邮件模式。随着机器学习和自然语言处理技术的发展,基于数据驱动的垃圾邮件分类模型逐渐成为主流。通过对大量邮件数据的特征提取和模型训练,机器学习方法可以更好地捕捉垃圾邮件和正常邮件之间的细微差异,提升检测的准确性。

本研究的背景基于这一现实需求,探索通过AdaBoost算法结合决策树分类器来进行垃圾邮件分类。通过对电子邮件内容的特征分析以及模型训练,我们期望提高垃圾邮件过滤的效果,并分析邮件长度、词频等特征在垃圾邮件分类中的作用。

二、研究意义

  • 提升邮件安全性:垃圾邮件可能带来潜在的安全威胁,如传播病毒、钓鱼攻击等。准确识别和过滤垃圾邮件可以有效减少这些安全隐患,提高用户的网络安全水平。

  • 改进垃圾邮件过滤算法:通过引入先进的机器学习算法,如AdaBoost和决策树分类器,可以进一步提高垃圾邮件检测的准确率。这为现有的邮件过滤系统提供了改进方案,有助于应对日益复杂的垃圾邮件形式。

  • 自动化邮件管理:自动化垃圾邮件检测系统可以大幅减少用户手动筛选邮件的时间成本,提升办公效率。同时,企业邮箱服务提供商可以通过部署这些模型,为用户提供更优质的服务。

  • 为文本分类研究提供依据:本研究通过对垃圾邮件和非垃圾邮件的文本内容进行特征分析和分类建模,为文本分类问题提供了实践案例。类似的文本分类方法还可以扩展到其他领域,如社交媒体评论分类、商品评论分析等。

三、实证分析

导入库

数据和代码

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号
import seaborn as sns 
import plotly.express as px 
from wordcloud import WordCloud
from collections import Counter
import plotly.graph_objects as go
import warnings
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier 
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import LabelEncoder 
from sklearn.metrics import accuracy_score , classification_report

warnings.filterwarnings('ignore')

读取数据集

data = pd.read_csv("spam_dataset.csv") 

 

 查看数据集具体信息

data.isnull().sum()

 

data.duplicated()

 

数据集可视化

df = pd.DataFrame(data)
plt.figure(figsize=(8,6),dpi=200)
sns.countplot(x='is_spam', data=df)
plt.title('垃圾邮件与非垃圾邮件计数')
plt.xlabel('Is Spam')
plt.ylabel('Count')
plt.show()

 

df['message_length'] = df['message_content'].apply(len)
plt.figure(figsize=(8,6),dpi=200)
sns.histplot(df['message_length'], kde = True , bins = 15)
plt.title('消息长度分布')
plt.xlabel('Message Length')
plt.ylabel('Frequency')
plt.show()

 

plt.figure(figsize=(8,6),dpi=200)
sns.boxplot(x='is_spam', y='message_length', data=df)
plt.title('垃圾邮件与非垃圾邮件的邮件长度')
plt.xlabel('Is Spam')
plt.ylabel('Message Length')
plt.show()

 接下来画词云图

# 垃圾邮件的词云
spam_words = ' '.join(df[df['is_spam'] == 1]['message_content'])

# 生成词云
spam_wordcloud = WordCloud(width=800, height=400, background_color='white').generate(spam_words)

# 词云图
plt.figure(figsize=(10, 5),dpi=200)
plt.imshow(spam_wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('用于垃圾邮件的 Word Cloud')
plt.show()

 

# 非垃圾邮件的词云
non_spam_words = ' '.join(df[df['is_spam'] == 0]['message_content'])

# 生成词云
non_spam_wordcloud = WordCloud(width=800, height=400, background_color='white').generate(non_spam_words)

# 词云图
plt.figure(figsize=(10, 5),dpi=200)
plt.imshow(non_spam_wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('用于非垃圾邮件的 Word Cloud')
plt.show()

 获取垃圾邮件中最常见的词语

spam_words_list = ' '.join(df[df['is_spam'] == 1]['message_content']).split()
spam_word_counts = Counter(spam_words_list).most_common(10)
# 创建字数统计的 DataFrame
spam_words_df = pd.DataFrame(spam_word_counts, columns=['word', 'count'])

# 最常用词的条形图
plt.figure(figsize=(10, 6),dpi=200)
sns.barplot(x='count', y='word', data=spam_words_df, palette='Blues_r')
plt.title('垃圾邮件中最常见的 10 个词')
plt.xlabel('Word Count')
plt.ylabel('Words')
plt.show()

可视化邮件长度和垃圾邮件分类之间的关联热图

plt.figure(figsize=(6,5),dpi=200)
corr = df[['message_length', 'is_spam']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('邮件长度和垃圾邮件分类之间的关联热图')
plt.show()

 

plt.figure(figsize=(8,6),dpi=200)
sns.violinplot(x='is_spam', y='message_length', data=df, palette='Set2')
plt.title('按垃圾邮件状态划分的邮件长度小提琴图')
plt.xlabel('Is Spam')
plt.ylabel('Message Length')
plt.show()

 

模型建立数据预处理

le = LabelEncoder()
data['message_content'] = le.fit_transform(data['message_content'])
data.head(3) 

 

###划分训练集测试集
data.columns
x = data[['message_content']]
y = data['is_spam']

###建立模型
# initialize the base learner 
base_learner = DecisionTreeClassifier(max_depth=1)

model = AdaBoostClassifier(base_estimator = base_learner , n_estimators=50 , learning_rate=1.0, random_state=42)

model.fit(x , y)
y_pred = model.predict(x)

y_pred[0:10]

 #模型评价

accuracy = accuracy_score(y,y_pred)
print(f"Accuracy is : {accuracy}")
class_report = classification_report(y,y_pred)
print(f"Classification Report Is : {class_report}")

四、研究结论

通过对垃圾邮件数据集的实证分析和机器学习建模,本研究得出以下结论:

  1. 垃圾邮件与非垃圾邮件的特征差异:通过词云分析和频率统计,发现垃圾邮件中的词汇通常集中于促销、广告等特定主题,具有明显的商业目的,而非垃圾邮件则更多围绕日常交流和信息共享。这一特征为垃圾邮件的内容过滤提供了重要依据。

  2. 邮件长度的影响:数据分析显示,垃圾邮件和非垃圾邮件在邮件长度上有显著差异。垃圾邮件的平均长度通常较长,但也存在部分短小的信息。通过可视化分析(如箱线图、小提琴图等),我们进一步验证了邮件长度在分类中的重要作用。

  3. AdaBoost模型的优越性:通过使用AdaBoost结合决策树分类器,模型取得了较高的分类准确率,能够有效区分垃圾邮件和非垃圾邮件。模型的精度达到了较高水平(准确率接近100%),并且在分类报告中表现出较高的精确度和召回率,表明模型在处理不平衡数据时也有较好的效果。

  4. 特征关联的可视化:通过热力图分析邮件长度与垃圾邮件分类之间的相关性,发现邮件长度确实在一定程度上能够反映垃圾邮件的倾向性。同时,通过小提琴图等可视化手段,进一步展现了垃圾邮件与正常邮件在特征上的显著差异。

  5. 未来研究方向:虽然本研究模型表现较好,但在实际应用中,垃圾邮件的形式和策略不断演变。未来研究可以结合自然语言处理技术,进一步优化垃圾邮件的文本特征提取,同时引入深度学习算法(如LSTM、BERT等),提升模型对复杂垃圾邮件的识别能力。

总的来说,本研究为垃圾邮件分类提供了一种有效的解决方案,不仅验证了机器学习算法在文本分类中的优势,还为未来的邮件过滤系统设计提供了参考依据。