【机器学习】Python 实现垃圾邮件分类(随机森林 + 可视化 + 特征重要性)

文章目录


前言

在日常工作和生活中,垃圾邮件一直是困扰我们的问题,用机器学习自动分类垃圾邮件是非常经典且适合新手入门的实战项目。

今天我将带大家从零开始,用 Python 实现垃圾邮件二分类任务,全程使用简单易懂的代码,包含数据读取、模型训练、混淆矩阵可视化、分类报告、特征重要性分析,新手也能轻松跑通!


一、项目环境准备

我们需要用到几个核心库,提前安装好:

c 复制代码
pip install pandas scikit-learn matplotlib
  • pandas:用于读取和处理数据

  • scikit-learn:机器学习核心库,提供随机森林、数据集划分、评估指标

  • matplotlib:用于可视化混淆矩阵和特征重要性

二、数据集说明

我们使用的是spambase.csv垃圾邮件数据集,这是公开的经典二分类数据集:

它具有以下几个特点

  1. 每行代表一封邮件

  2. 最后一列是标签:1= 垃圾邮件,0= 正常邮件

  3. 前面所有列是邮件的特征(如单词频率、字符频率等)

    直接将数据集文件和代码放在同一文件夹即可读取。

    数据集预览:

三、完整代码实现

c 复制代码
import pandas as pd

def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    cm =confusion_matrix(y,yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

df = pd.read_csv('spambase.csv')
from sklearn.model_selection import train_test_split
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
xtrain,xtest,ytrain,ytest = \
    train_test_split(X,y,test_size = 0.2,random_state=100   )
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=100,
    max_features = 0.8,
    random_state = 0
)
rf.fit(xtrain,ytrain)

train_predicted = rf.predict(xtrain)
from sklearn import metrics
print(metrics.classification_report(ytrain,train_predicted,digits=9))
cm_plot(ytrain,train_predicted).show()

test_predicted = rf.predict(xtest)
print(metrics.classification_report(ytest,test_predicted))
cm_plot(ytest,test_predicted).show()

import matplotlib.pyplot as plt

importances = rf.feature_importances_
im = pd.DataFrame(importances,columns=["importances"])
clos = df.columns
clos_1 = clos.values
clos_2 = clos_1.tolist()
clos = clos_2[0:-1]
im['clos']=clos

im = im.sort_values(by=['importances'],ascending=False)[:10]
index = range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im['importances'])
plt.show()

逐行讲解

  1. 导入库 + 定义混淆矩阵可视化函数
c 复制代码
import pandas as pd

def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    cm =confusion_matrix(y,yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

定义混淆矩阵可视化函数(通用版,直接复制用),同时实现绘制矩阵图的功能。

  1. 读取数据 + 划分训练集 / 测试集
    这一步是机器学习标准流程:把数据分为训练集(训练模型)和测试集(评估模型)。
c 复制代码
df = pd.read_csv('spambase.csv')
from sklearn.model_selection import train_test_split
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
xtrain,xtest,ytrain,ytest = \
    train_test_split(X,y,test_size = 0.2,random_state=100   )
from sklearn.ensemble import RandomForestClassifier

读取垃圾邮件数据集和划分训练集(80%)和测试集(20%),训练集和测试集的比率可自行调整。

  1. 训练随机森林模型
c 复制代码
rf = RandomForestClassifier(
    n_estimators=100,
    max_features = 0.8,
    random_state = 0
)
rf.fit(xtrain,ytrain)
复制代码
n_estimators=100,  # 树的数量
max_features=0.8,  # 特征使用比例
random_state=0     # 固定随机种子,结果可复现
  1. 模型评估

查看模型在训练数据和测试数据上的表现,包含精确率、召回率、F1 分数。

测试集效果才是模型真正的泛化能力,这是我们最关心的结果。

c 复制代码
train_predicted = rf.predict(xtrain)
from sklearn import metrics
print(metrics.classification_report(ytrain,train_predicted,digits=9))
cm_plot(ytrain,train_predicted).show()

test_predicted = rf.predict(xtest)
print(metrics.classification_report(ytest,test_predicted))
cm_plot(ytest,test_predicted).show()
  1. 特征重要性分析
    随机森林可以输出特征重要性,告诉我们哪些指标对判断垃圾邮件最关键。
c 复制代码
import matplotlib.pyplot as plt

importances = rf.feature_importances_
im = pd.DataFrame(importances,columns=["importances"])
clos = df.columns
clos_1 = clos.values
clos_2 = clos_1.tolist()
clos = clos_2[0:-1]
im['clos']=clos

im = im.sort_values(by=['importances'],ascending=False)[:10]
index = range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im['importances'])
plt.show()

首先获取特征重要性,然后整理成DataFrame,方便我们遍历获取,最后取TOP10为最重要的特征,绘制水平柱状图,便于我们可视化哪些指标对判断垃圾邮件最关键。

四、代码运行结果展现

训练集混沌矩阵:

测试集混沌矩阵:

结果水平柱状图:

代码输出结果:

c 复制代码
              precision    recall  f1-score   support

           0  1.000000000 0.999109528 0.999554566      2246
           1  0.998604327 1.000000000 0.999301676      1431

    accuracy                      0.999456078      3677
   macro avg  0.999302163 0.999554764 0.999428121      3677
weighted avg  0.999456837 0.999456078 0.999456147      3677

              precision    recall  f1-score   support

           0       0.94      0.96      0.95       539
           1       0.94      0.92      0.93       381

    accuracy                           0.94       920
   macro avg       0.94      0.94      0.94       920
weighted avg       0.94      0.94      0.94       920

混淆矩阵

  • 左上角:真实为正常邮件,预测为正常邮件(正确)

  • 右下角:真实为垃圾邮件,预测为垃圾邮件(正确)

  • 另外两个格子:分类错误的样本,颜色越深、对角数字越大,代表模型效果越好。

分类报告核心指标

  • precision(精确率):预测为某类的样本中,真正是该类的比例

  • recall(召回率):真实为某类的样本中,被正确预测的比例

  • f1-score:精确率和召回率的平衡值,越接近 1 效果越好

  • accuracy(准确率):整体预测正确的比例

我们看模型训练的好不好,主要看召回率,召回率越接近1,代表模型优秀。


总结

本项目用随机森林完成垃圾邮件二分类,简单高效,实现了数据集划分、模型训练、评估指标、可视化全套流程。

混淆矩阵和特征重要性让模型结果更直观、可解释。

代码可直接复用,替换数据集就能做其他二分类任务(如欺诈检测、疾病预测等)

相关推荐
今天AI了吗8 分钟前
AI反作弊的数据存储方案:实时特征计算与离线模型训练的数据管道设计
人工智能
C++、Java和Python的菜鸟11 分钟前
第15章 项目部署(Docker)
python
Jay-r15 分钟前
极简博客搭建(精简版):textlog + GitHub Pages
python·github·教程·集成学习·博客网站·技术教程·自我成长
Albart57515 分钟前
【已解决】IndexError_ list index out of range 列表索引越界 全套根治方案
python·indexerror·列表索引越界·python 报错解决·python 排错
OpenMiniServer16 分钟前
时空电磁统一理论——从电磁振荡、粒子结构到宇宙演化的统一框架
人工智能
科技新资讯38 分钟前
国内AI影视制作服务商哪家口碑好
运维·人工智能·devops
2501_9416018640 分钟前
标注员标注徐州话时声调调值标的完全不一样
人工智能·语音识别
weixin_4462608541 分钟前
超越Top-K:用可解释智能体操作替代黑盒检索
大数据·人工智能·机器学习
东离与糖宝1 小时前
语音Agent全双工误区:WebRTC双向不等于真全双工
人工智能
卷心菜的学习路1 小时前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题