news 2026/8/5 7:35:49

随机森林算法详解——基于垃圾邮件分类案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
随机森林算法详解——基于垃圾邮件分类案例

一、从决策树到随机森林

在前面的决策树学习中,我们了解到决策树是一种比较直观的分类算法。

它通过不断寻找合适的特征,对数据进行划分,最终得到分类结果。

例如垃圾邮件识别问题:

一封邮件可能包含:

  • 单词出现次数
  • 特殊字符比例
  • 大写字母数量
  • 链接数量

决策树会根据这些特征建立判断规则。

但是在实际使用过程中,单棵决策树也存在一些问题。

例如:

如果树的深度过大,模型可能会把训练数据中的一些特殊情况也学习进去。

训练集效果很好:

准确率:98%

但是换一批新数据:

准确率:75%

这种情况就是过拟合。

为了提高模型稳定性,机器学习中提出了一种思想:

不使用一棵树进行判断,而是训练多棵树,让它们共同决定结果。

这就是随机森林。


二、随机森林基本思想

随机森林(Random Forest)是一种集成学习方法。

简单来说:

它由很多棵决策树组成。

每棵树都会独立进行训练,最后通过投票方式确定分类结果。

例如:

预测一封邮件是否为垃圾邮件:

决策树预测结果
树1垃圾邮件
树2垃圾邮件
树3正常邮件
树4垃圾邮件
树5正常邮件

其中3棵树认为是垃圾邮件。

最终结果:

垃圾邮件

相比单棵树,多个模型共同判断,可以减少偶然因素带来的影响。


三、随机森林为什么叫“随机”

随机森林中的随机主要体现在两个方面:

1. 数据随机

训练每棵树时,并不是直接使用全部数据。

而是通过Bootstrap方法随机抽取数据。

例如:

原始数据:

4600封邮件

生成:

数据集1 → 训练树1 数据集2 → 训练树2 数据集3 → 训练树3

由于每棵树看到的数据不同,所以最终形成的树结构也不同。


2. 特征随机

除了数据不同之外,每棵树使用的特征也不是完全一样。

例如:

邮件数据共有100个特征。

训练第一棵树:

随机选择50个特征。

训练第二棵树:

重新选择另外50个特征。

这样可以避免所有树都关注相同特征,提高模型差异性。


四、随机森林训练过程

随机森林训练主要分为以下几个步骤。

第一步:随机抽取训练数据

通过Bootstrap采样生成多个训练集。

例如:

原始数据 | 数据集A 数据集B 数据集C

第二步:训练决策树

每个数据集训练一棵决策树。

例如:

数据集A → 决策树1 数据集B → 决策树2 数据集C → 决策树3

第三步:随机选择特征

每棵树训练过程中,只使用部分特征。

这样可以增加不同树之间的差异。


第四步:综合预测结果

分类任务:

采用多数投票。

回归任务:

采用平均值。


五、垃圾邮件分类案例介绍

本实验使用:

spambase.csv

数据集完成垃圾邮件分类。

目标:

根据邮件特征判断:

0:正常邮件 1:垃圾邮件

邮件特征包括:

  • 单词出现频率
  • 字符出现频率
  • 大写字母长度
  • 特殊符号比例

例如:

垃圾邮件通常包含:

  • 大量促销词
  • 大量链接
  • 特殊字符

这些特征可以帮助模型进行判断。


六、数据读取与划分

读取数据:

df = pd.read_csv('spambase.csv')

划分特征:

x = df.iloc[:, :-1] y = df.iloc[:, -1]

其中:

x表示邮件特征。

例如:

单词频率 字符比例 数字数量

y表示类别标签:

是否垃圾邮件

划分训练集和测试集:

x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.2, random_state=100 )

数据比例:

训练集:80% 测试集:20%

训练集用于学习规律。

测试集用于验证模型效果。


七、随机森林模型建立

代码:

from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier( n_estimators=150, max_features=0.5, random_state=0 )

创建随机森林分类模型。


八、随机森林参数分析

1.n_estimators

表示森林中决策树数量。

代码:

n_estimators=150

表示建立150棵决策树。

树数量增加:

优点:

  • 模型更加稳定
  • 预测结果波动降低

缺点:

  • 训练时间增加
  • 内存占用提高

实际应用中需要根据数据规模调整。


2.max_features

表示每棵树随机选择的特征比例。

代码:

max_features=0.5

表示:

每棵树使用50%的特征。

例如:

100个特征:

每棵树随机选择50个。

这样可以提高树之间的差异。


3.max_depth

控制树的最大深度。

如果不限制:

树可能不断分裂。

导致:

模型复杂度过高,容易过拟合。

因此需要合理设置深度。


九、交叉验证评价模型

单次训练测试可能存在偶然性。

例如:

一次划分:

准确率:90%

换一次划分:

准确率:85%

因此采用交叉验证提高评价可靠性。

代码:

StratifiedKFold( n_splits=5 )

五折交叉验证过程:

第一次: 第1份测试,其余训练 第二次: 第2份测试,其余训练 ... 第五次: 第5份测试,其余训练

最后计算平均准确率。


十、随机森林参数优化

随机森林默认参数通常效果不错,但是不同数据集适合的参数不同。

因此使用:

GridSearchCV()

自动搜索最佳参数。

搜索参数:

'n_estimators' 'max_features' 'max_depth'

例如:

尝试:

50棵树 100棵树 150棵树 200棵树

然后比较模型效果。

最终选择表现最好的组合。


十一、模型评价

训练完成后:

使用:

classification_report()

评价模型。

主要指标:

Accuracy

表示整体预测正确比例。


Precision

表示预测为垃圾邮件的邮件中,真正垃圾邮件的比例。


Recall

表示所有垃圾邮件中,模型成功检测出来的比例。


F1-score

综合考虑Precision和Recall。


十二、混淆矩阵分析

代码:

cm_plot()

混淆矩阵:

预测正常预测垃圾
真实正常TNFP
真实垃圾FNTP

其中:

TP:

正确识别垃圾邮件。

TN:

正确识别正常邮件。

FP:

正常邮件被误判为垃圾邮件。

FN:

垃圾邮件没有检测出来。

在垃圾邮件检测中:

FN通常需要重点关注,因为漏掉垃圾邮件会影响用户体验。


十三、随机森林特征重要性分析

随机森林可以查看:

不同特征对于预测结果的影响程度。

代码:

rf.feature_importances_

例如:

可能发现:

特征重要程度
关键词频率0.30
特殊字符数量0.25
链接数量0.18

通过特征重要性分析,可以了解:

哪些因素更容易影响邮件分类结果。


十四、随机森林优缺点分析

优点

1.稳定性更高

多棵树共同决策,可以降低单个模型带来的误差。

2.降低过拟合

随机数据和随机特征减少模型对训练数据的依赖。

3.适合处理大量特征

面对高维数据时表现较好。


缺点

1.解释性较弱

单棵决策树可以直接查看规则。

但是随机森林包含大量树结构,不容易完全解释。

2.训练成本较高

树数量增加后:

训练时间和资源消耗都会增加。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 4:12:40

Spring Security自定义认证:从默认密码到UserDetailsService实现详解

1. 项目概述:从“默认密码”到自定义认证的必经之路刚接触Spring Security的朋友,十有八九都踩过同一个坑:项目一启动,控制台哗啦啦打印出一串日志,其中赫然躺着一个“Using generated security password: xxxx”。然后…

作者头像 李华
网站建设 2026/8/4 4:11:00

从微软XBOX裁员看技术组织架构优化:扁平化与高效协作实践

这次我们来看一个关于微软XBOX部门组织架构调整的深度分析。项目标题“大裁员3200人!地狱才18层,XBOX的管理层却有14层”并非指代一个具体的开源软件或技术工具,而是对近期微软游戏业务大规模重组与裁员事件的一种形象化、批判性的技术管理视…

作者头像 李华
网站建设 2026/8/4 4:07:05

Unity游戏开发实战:点乘与叉乘的五大核心应用场景解析

1. 项目概述:为什么向量运算是3D游戏开发的基石如果你刚开始接触3D游戏开发,可能会被各种数学概念搞得头大。但相信我,在所有数学工具里,空间向量的点乘和叉乘,绝对是你能最快上手、也最常使用的“瑞士军刀”。它们不是…

作者头像 李华
网站建设 2026/8/4 4:04:01

本地大模型部署实战:从CUDA环境搭建到SenseNova-U1部署全流程

1. 项目概述:一次完整的本地大模型部署实战最近在折腾一个挺有意思的事儿,把商汤的 SenseNova-U1 大模型给整到本地跑起来了。这事儿说起来简单,就是从网页版生成个模型,然后在自己电脑上部署,但真干起来,从…

作者头像 李华
网站建设 2026/8/4 4:01:50

构建AI隐私安全舱:三层纵深防御体系护航企业智能数据安全

1. 项目缘起:当AI成为数据处理的“新常态”,安全边界在哪里?最近几年,我接触了太多企业客户,他们都在做同一件事:把AI模型,无论是大语言模型还是图像识别模型,引入到自己的业务流程里…

作者头像 李华