【机器学习】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,代表模型优秀。


总结

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

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

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

相关推荐
jerryinwuhan1 小时前
marker BiBERTo解释
java·前端·人工智能
学习3人组1 小时前
机器学习KNeighborsClassifier实现手写数字识别
人工智能·机器学习
掘金安东尼1 小时前
如果你真能 7×24 小时运行最顶级的大模型,你会想用它来干嘛
人工智能
翼龙云_cloud1 小时前
云服务器代理商:2026 年云计算趋势 AI 算力需求激增下的云服务器选择
服务器·人工智能·云计算·ai智能体
数智工坊1 小时前
周志华《Machine Learning》学习笔记--第四章--决策树
笔记·学习·机器学习
m沐沐1 小时前
【机器学习】NLP---用 Python+TF-IDF 给《红楼梦》自动提取关键词
人工智能·python·机器学习·自然语言处理·nlp·中文分词·tf-idf
小脑斧1231 小时前
自媒体内容工业化:基于AI Skills低代码实现穿搭账号矩阵自动化量产
人工智能·低代码·媒体·skills·openclaw·hermes·marvis
填满你的记忆1 小时前
《为什么 MySQL 不适合做 AI 检索?》
数据库·人工智能·mysql·ai·向量数据库
Fleshy数模1 小时前
深度学习核心:神经网络
python
威尔逊·柏斯科·希伯理1 小时前
机器学习第二天(KNN)
人工智能·机器学习