目录

一、什么是随机森林?

1. 从决策树到集成学习:为什么需要 "森林"?

2.什么是集成学习

二、随机森林的工作原理

三、随机森林构造过程

四、随机森林api介绍

五、随机森林的优缺点

六、垃圾邮件判断案例

1.数据集介绍

​编辑

2.代码解析

(1) 导入必要的库

(2) 数据读取与准备

(3) 划分训练集和测试集

(4)创建并训练随机森林模型

(5) 模型预测与评估

(6) 特征重要性分析

(7)特征重要性可视化

完整代码如下

一、什么是随机森林?

提到随机森林,很多人会直观地想:"不就是很多决策树凑在一起吗?" 这句话对了一半,但忽略了其核心的 "随机性" 设计。要理解随机森林,我们需要先从它的 "积木"—— 决策树和 "组装方式"—— 集成学习说起。

1. 从决策树到集成学习:为什么需要 "森林"?

决策树是一种直观的机器学习模型,它像一棵倒置的树,通过对特征的逐步判断(如 "年龄是否大于 30?"" 收入是否超过 5 万?")来实现分类或回归。单棵决策树的优点是简单易懂、训练速度快,但缺点也很明显:容易过拟合(对训练数据拟合过好,泛化能力差),且预测结果受数据微小变化影响较大(稳定性差)。
为了解决单棵决策树的缺陷,集成学习(Ensemble Learning) 应运而生。集成学习的核心思想是:"三个臭皮匠顶个诸葛亮"—— 通过组合多个 "弱学习器"(性能略优于随机猜测的模型)的预测结果,得到一个更强大的 "强学习器"。随机森林就是集成学习中最成功的代表之一,它的 "弱学习器" 正是决策树。

2.什么是集成学习

• 集成学习:通过组合多个基础学习器(如决策树、逻辑回归等)提升模型性能,典型方法包括:
• Bagging(如随机森林)
• Boosting(如AdaBoost、XGBoost)
• 堆叠模型(Stacking)

二、随机森林的工作原理

随机森林的核心在于 "随机" 二字,主要体现在两个方面:
1. 数据随机:使用 Bootstrap 抽样法从原始数据中随机抽取样本,为每棵树创建不同的训练集
2. 特征随机:在构建每棵树的每个节点时,随机选择部分特征进行分裂

3.森林结构:由多棵决策树组成,最终结果通过投票(分类)或平均(回归)决定。
其具体工作流程如下:
1. 从原始数据集中随机有放回地抽取 N 个样本,形成新的训练集
2. 对于每个样本集,随机选择部分特征,构建一棵决策树
3. 重复上述过程,构建多棵决策树
4. 对于分类问题,通过投票决定最终类别;对于回归问题,取平均值作为结果

三、随机森林构造过程

在机器学习中,随机森林是⼀个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数⽽定。
随机森林    =    Bagging    +    决策树

例如,    如果你训练了5个树,    其中有4个树的结果是True,    1个树的结果是False,    那么最终投票结果就是True
随机森林够造过程中的关键步骤(M表示特征数⽬):
1)⼀次随机选出⼀个样本,有放回的抽样,重复N次(有可能出现重复的样本)
 2)    随机去选出m个特征,    m    <<M,建⽴决策树

四、随机森林api介绍

以下是随机森林的源码参数:

sklearn.ensemble.RandomForestClassifier(n_estimators=10,    criterion=’gini’,    max_depth=None,    bootstrap=True,random_state=None,    min_samples_split=2)
 n_estimators:integer,optional(default    =    10)森林⾥的树⽊数量120,200,300,500,800,1200
在利⽤最⼤投票数或平均值来预测之前,你想要建⽴⼦树的数量。
Criterion:string,可选(default    =“gini”)
分割特征的测量⽅法
max_depth:integer或None,可选(默认=⽆)
树的最⼤深度    5,8,15,25,30
 max_features="auto”,每个决策树的最⼤特征数量
If    "auto",    then    max_features=sqrt(n_features)    .
 If    "sqrt",    then    max_features=sqrt(n_features)    (same    as    "auto").
 If    "log2",    then    max_features=log2(n_features)    .
 If    None,    then    max_features=n_features    .
 bootstrap:boolean,optional(default    =    True)
是否在构建树时使⽤放回抽样
min_samples_split    内部节点再划分所需最⼩样本数
这个值限制了⼦树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进⾏划分,默认是2。
如果样本量不⼤,不需要管这个值。如果样本量数量级⾮常⼤,则推荐增⼤这个值。
min_samples_leaf    叶⼦节点的最⼩样本数
这个值限制了叶⼦节点最少的样本数,如果某叶⼦节点数⽬⼩于样本数,则会和兄弟节点⼀起被剪枝,默认是1。
叶是决策树的末端节点。    较⼩的叶⼦使模型更容易捕捉训练数据中的噪声。
⼀般来说,我更偏向于将最⼩叶⼦节点数⽬设置为⼤于50。
min_impurity_split:    节点划分最⼩不纯度
这个值限制了决策树的增⻓,如果某节点的不纯度(基于基尼系数,均⽅差)⼩于这个阈值,则该节点不再⽣成⼦节点。即为叶⼦节点    。
⼀般不推荐改动默认值1e-7。
上⾯决策树参数中最重要的包括
最⼤特征数max_features,
最⼤深度max_depth,
内部节点再划分所需最⼩样本数min_samples_split
叶⼦节点最少样本数min_samples_leaf。

五、随机森林的优缺点

优点:

1.准确率高:通常优于单一决策树,甚至在很多情况下表现优于 SVM、神经网络等算法
2. 抗过拟合能力强:通过多棵树的集成,有效降低了过拟合风险
3. 处理高维数据能力强:不需要特征选择,可以自动处理高维数据
4. 能处理非线性数据:无需对数据进行复杂转换
5. 对缺失值不敏感:有较好的容错能力
6. 可以评估特征重要性:帮助理解数据

缺点:
计算成本高:训练时间和内存消耗较大(因多棵决策树)
解释性较弱:模型解释性较差(“黑盒”特性),虽然单棵决策树易解释,但 "森林" 的整体决策过程难以可视化(可通过特征重要性部分弥补);
对超高维稀疏数据(如文本)可能不如线性模型高效。

六、垃圾邮件判断案例

1.数据集介绍

我们使用的是经典的spambase.csv数据集,该数据集包含了 4601 条邮件记录,每条记录有 57 个特征和 1 个标签。这些特征主要包括:
邮件中某些特定单词出现的频率
某些特定字符出现的频率
邮件的平均长度、最长连续大写字母长度等
标签为 0(正常邮件)或 1(垃圾邮件),我们的目标是根据这些特征预测一封邮件是否为垃圾邮件。

2.代码解析

(1) 导入必要的库

from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

这部分代码导入了后续需要用到的库:
• RandomForestClassifier:随机森林分类器,是我们要使用的核心算法
• metrics:sklearn 中的评估指标模块,用于模型性能评估
• pandas:数据处理库,用于读取和处理数据
• matplotlib.pyplot:绘图库,用于可视化特征重要性
• train_test_split:用于将数据集分割为训练集和测试集

(2) 数据读取与准备

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

使用 pandas 的read_csv函数读取垃圾邮件数据集spambase.csv,将其存储在data变量中,这是一个 DataFrame 对象。

X = data.iloc[:, :-1]
y = data.iloc[:, -1]

X = data.iloc[:, :-1]:提取所有行,除最后一列外的所有列作为特征数据(特征矩阵)
y = data.iloc[:, -1]:提取所有行的最后一列作为标签数据(目标变量),其中 1 表示垃圾邮件,0 表示正常邮件

(3) 划分训练集和测试集

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

使用train_test_split函数将数据集划分为训练集和测试集
• test_size=0.2:表示测试集占总数据的 20%,训练集占 80%
• random_state=100:设置随机种子,确保每次运行代码时得到相同的划分结果,保证实验的可重复性
• 返回的四个变量分别是:训练特征、测试特征、训练标签、测试标签

(4)创建并训练随机森林模型

rf = RandomForestClassifier(n_estimators=100, max_depth=10, min_samples_split=3)

创建随机森林分类器实例,并设置超参数:
• n_estimators=100:森林中包含 100 棵决策树
• max_depth=10:每棵树的最大深度限制为 10,防止树过度生长导致过拟合
• min_samples_split=3:节点分裂所需的最小样本数为 3,即当节点样本数少于 3 时不再分裂

rf.fit(x_train, y_train)

使用训练集对模型进行训练,fit方法会根据输入的训练数据调整模型参数,使模型能够学习到特征与标签之间的关系。

(5) 模型预测与评估

predict = rf.predict(x_train)
print(metrics.classification_report(predict, y_train))
  • 用训练好的模型对训练集进行预测,得到预测结果predict
  • 使用classification_report生成详细的分类评估报告,包括精确率(precision)、召回率(recall)、F1 分数(f1-score)和支持度(support)
  • 这一步主要是查看模型在训练数据上的表现,判断是否存在欠拟合
predict1 = rf.predict(x_test)
print(metrics.classification_report(predict1, y_test))

用模型对测试集进行预测,得到预测结果predict1
• 同样生成分类评估报告,这是评估模型泛化能力的关键步骤
• 比较训练集和测试集的评估结果,可以判断模型是否过拟合

(6) 特征重要性分析

feature_names = X.columns
feature_importance = pd.DataFrame({'特征名称': feature_names,'重要性得分': rf.feature_importances_
})

X.columns获取所有特征的名称
• 创建一个 DataFrame 来存储特征名称及其对应的重要性得分
• rf.feature_importances_获取随机森林计算出的各特征重要性得分,得分越高表示该特征对分类结果的影响越大

feature_importance = feature_importance.sort_values(by='重要性得分', ascending=False)
print(feature_importance.head(10))

按 "重要性得分" 降序排列特征
打印出前 10 个最重要的特征,帮助我们理解哪些特征对垃圾邮件分类最关键

(7)特征重要性可视化

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

设置 matplotlib 的字体参数,确保中文能正常显示,避免负号显示异常。

top_features = feature_importance.head(10)
plt.figure(figsize=(12, 8))
bars = plt.barh(top_features['特征名称'], top_features['重要性得分'], color='skyblue')
plt.title('随机森林模型中前10个重要特征的重要性得分', fontsize=14)
plt.xlabel('重要性得分', fontsize=12)
plt.ylabel('特征名称', fontsize=12)
plt.show()

提取前 10 个最重要的特征
创建一个大小为 12x8 的图形
使用水平条形图barh可视化这些特征的重要性得分
设置图表标题、x 轴标签和 y 轴标签
plt.show()显示图表

完整代码如下:

from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
data=pd.read_csv('spambase.csv')
X=data.iloc[:,:-1]
y=data.iloc[:,-1]
x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=100)
rf=RandomForestClassifier(n_estimators=100,max_depth=10,min_samples_split=3)
rf.fit(x_train,y_train)
predict=rf.predict(x_train)
print(metrics.classification_report(predict,y_train))
predict1=rf.predict(x_test)
print(metrics.classification_report(predict1,y_test))
feature_names = X.columns
feature_importance = pd.DataFrame({'特征名称': feature_names,'重要性得分': rf.feature_importances_
})
feature_importance = feature_importance.sort_values(by='重要性得分', ascending=False)
print(feature_importance.head(10))
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
top_features = feature_importance.head(10)
plt.figure(figsize=(12, 8))
bars = plt.barh(top_features['特征名称'], top_features['重要性得分'], color='skyblue')
plt.title('随机森林模型中前10个重要特征的重要性得分', fontsize=14)
plt.xlabel('重要性得分', fontsize=12)
plt.ylabel('特征名称', fontsize=12)
plt.show()

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

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

相关文章

云平台运维工具 —— 阿里云原生工具

一、简介阿里云作为国内领先的云服务提供商&#xff0c;拥有一套完整的原生运维工具体系&#xff0c;这些工具与阿里云的各类服务深度融合&#xff0c;能够满足用户在资源部署、监控告警、权限管理、自动化运维等方面的需求。无论是简单的应用托管还是复杂的企业级架构&#xf…

Linux-Day10.系统安全保护web服务管理

今日目标&#xff1a;- 日志管理- 系统安全保护 SELinux&#xff08;重点&#xff09;- 构建基本web服务&#xff08;重点&#xff09;环境准备还原快照网络配置完成&#xff0c;开启虚拟机A与虚拟机B用真机连通虚拟机去操作&#xff0c;准本好Xshell一、常用的网络工具ip命令1…

解决:开启魔法后vscode pip命令不能安装中科大python镜像问题

闲言少叙&#xff0c;最终实现效果就是在开启魔法情况下&#xff0c;vscode命令行任何能通过中科大python镜像安装第三方库&#xff0c;又快又不消耗魔法流量。简单来说就两步&#x1f447;&#xff1a; 第一步&#xff1a;配置 pip.ini 中的代理 找到或创建 pip.ini 文件&…

优化Google Pubsub到GCS的文件整合策略

引言 在使用Google Cloud Platform (GCP) 的Pubsub服务时,我们常常会遇到将消息存储到Google Cloud Storage (GCS) 作为Avro文件的问题。本文将深入探讨如何优化Google Pubsub到GCS的文件整合策略,以避免每个消息都单独生成一个Avro文件,达到将多个消息整合到一个文件的目的…

基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真

基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真前言一、电机开环传递函数1.1 电机开环传递函数的零极点1.2 求系统的参数和绘制波特图二、增加PI控制器后系统开环传递函数三、电机系统闭环传递函数四、simulink仿真五、幅值裕度、相位裕度、相位穿越频率和截止频率&…

P1044 [NOIP 2003 普及组] 栈

P1044 [NOIP 2003 普及组] 栈 - 洛谷 题解来自洛谷题解&#xff0c;做笔记用 假设用一个函数来表示&#xff1a; x表示当前还未入栈的数字个数 y表示当前栈中的数字个数 orz&#xff0c;大佬们真的是很厉害&#xff0c;想着递推但是只拿了60分 #include <bits/stdc.h&g…

linux mysql 8.X主从复制

准备两台linux服务器,注意要锁ip我这里如上图 主库 192.168.5.5/24 从库 192.168.5.10/24 接下来确定mysql是否启动成功并且能从外部连接 主库从库主服务器配置 vim编辑主服务器配置 vim /etc/my.cnf注意是下面那个添加配置代码 log-binmysql-bin # 配置二进制日志 server-id1…

豆包新模型矩阵+PromptPilot:AI开发效率革命的终极方案

> **一套让AI开发者告别“调参炼狱”的黄金组合,效率提升300%的实战指南** ## 一、AI开发的范式转移:从通用模型到**场景化矩阵** 2025年,AI应用开发面临核心矛盾:**业务场景高度细分**与**模型能力同质化**的冲突。火山引擎的破局之道是推出**豆包1.6模型矩阵**——三…

瑞利杂波背景下不同环境的虚警概率与目标检测概率仿真

仿真方案&#xff0c;研究在瑞利杂波背景下&#xff0c;均匀环境、多目标环境和杂波墙环境中的虚警概率(Pfa)和目标检测概率(Pd)。 理论基础 瑞利分布 瑞利分布常用于描述雷达杂波的幅度分布&#xff1a; p(x) (x/σ) * exp(-x/(2σ)), x ≥ 0其中σ是尺度参数&#xff0c;决定…

Spring Boot + Tesseract异步处理框架深度解析,OCR发票识别流水线

Spring Boot Tesseract异步处理框架深度解析&#xff0c;OCR发票识别流水线一、系统架构设计1.1 分布式流水线架构1.2 核心组件职责1.3 数据流设计二、Spring Boot异步框架实现2.1 线程池优化配置2.2 异步服务层设计2.3 异步流水线编排三、Tesseract深度优化3.1 发票专用训练模…

Arm Qt编译Qt例程出错 GLES3/gl3.h: No such file or directory

解决方法 PC&#xff1a;Ubuntu22.04.1 QtCreator&#xff1a; 4.11.1 交叉编译环境&#xff1a;YC6254 开发板提供的 5-编译工具链->qt交叉编译工具 在之前博客配置成功的交叉编译环境&#xff0c;编译Qt5.14.8自带部分Example时&#xff0c;出现 GLES3/gl3.h: No such …

HydroOJ:开源在线判题系统的创新与实践

HydroOJ&#xff1a;开源在线判题系统的创新与实践 在数字化与信息化深度融合的今天&#xff0c;编程教育已成为全球教育改革的重要方向&#xff0c;而在线判题系统&#xff08;Online Judge&#xff0c;简称 OJ&#xff09;作为编程学习、算法训练和竞赛组织的核心工具&#…

tcpdump问题记录

问题一: scapy发送vlan报文&#xff0c;tcpdump过滤抓包未抓到包的问题 发包 sendp([Ether(src"11:22:33:44:55:00")/Dot1Q(vlan1001)/IP()/UDP()/"Hello, VLAN!"], iface"ens9")vlan过滤抓包&#xff0c;不OK。 # tcpdump -i ens9 -nnvve -Q ou…

计算机视觉面试保温:CLIP(对比语言-图像预训练)和BERT技术概述

一、CLIP技术 CLIP&#xff0c;全称 Contrastive Language-Image Pre-training&#xff08;对比语言-图像预训练&#xff09;&#xff0c;是由 OpenAI 在 2021 年提出的一个里程碑式的模型。它的核心思想在于利用自然语言作为监督信号来学习强大的视觉表示&#xff0c;从而打破…

用户组权限及高级权限管理:从基础到企业级 sudo 提权实战

用户组权限及高级权限管理&#xff1a;从基础到企业级 sudo 提权实战 在 Linux/Unix 系统里&#xff0c;权限管理不是一个可有可无的小功能&#xff0c;而是系统安全的第一道防线。无论是个人电脑、企业服务器还是云环境&#xff0c;权限配置直接影响系统的稳定性和安全性。一、…

oracle-plsql理解和操作

1、plsql的概念PL/SQL(Procedural Language/SQL)是一种过程化语言&#xff0c;属于第三代语言&#xff0c;它与C、C、Java等语言一样关注于处理细节&#xff0c;可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语…

数据库恢复技术:保障数据安全的关键

文章目录前言数据库恢复技术一、事务的基本概念二、数据库恢复概述三、故障类型与恢复策略1. 故障分类2. 恢复策略与步骤四、恢复实现技术1. 数据转储&#xff08;备份&#xff09;2. 日志文件&#xff08;Logging&#xff09;3. 检查点技术&#xff08;Checkpoint&#xff09;…

C++归并排序

1 算法核心思想归并排序是一种高效的排序方式&#xff0c;需要用到递归来实现&#xff0c;我们先来看一下动图演示&#xff1a;算法核心思想如下&#xff1a;1.将数组尽量平均分成两段。2.将这两段都变得有序&#xff08;使用递归实现&#xff09;。3.将两段合并。2 代码实现首…

机器学习算法篇(四)决策树算法

目录 一、决策树概述 1.1 概述 1.2 基本数学原理 二、熵原理形象解读与计算 2.1 熵的概念 2.2 熵的计算示例 2.3 条件熵 三、决策树构造实例 3.1 数据集示例 3.2 计算信息增益 3.3 递归构建决策树 四、信息增益和信息增益率 4.1 信息增益的缺陷 4.2 信息增益率 4…

React 状态管理入门:从 useState 到复杂状态逻辑

作为前端新手&#xff0c;在学习 React 时&#xff0c;useState 往往是我们接触的第一个 Hook。很多人最初会觉得它只能处理简单的计数器之类的状态&#xff0c;但实际上&#xff0c;useState 配合其他 Hook&#xff08;尤其是 useEffect&#xff09;可以轻松管理各种复杂状态。…