《机器学习》——随机森林
文章目录
- 什么是随机森林?
- 随机森林的原理
- 随机森林的优缺点
- 优点
- 缺点
- 随机森林模型
- API
- 主要参数
- 实例
- 实例步骤
- 导入数据
- 处理数据,切分数据
- 构建模型
- 训练模型
- 测试数据并输出分类报告和混淆矩阵
- 画出模型的前十重要性的特征
- 扩展
什么是随机森林?
-随机森林(Random Forest)是一种集成学习算法,它通过构建多个决策树,并将这些决策树的结果进行综合(比如投票或者求平均)来做出最终的预测。这些决策树是在训练过程中通过对训练数据集进行有放回抽样(Bootstrap Sampling)构建的。
如对决策树不了解可看《机器学习》——决策树
随机森林的原理
- 1、数据抽样
- 采用自助采样法(Bootstrap Sampling)。例如,假设有一个包含 n 个样本的原始训练数据集 D,每次从 D 中有放回地抽取 n 个样本,生成一个新的训练数据集 D_i 用于训练一棵决策树。由于是有放回抽样,所以 D_i 中会有一些样本被多次抽取,也会有一些样本没有被抽到。那些没有被抽到的样本就可以作为测试集(称为袋外数据,Out - Of - Bag,简称 OOB)来评估这棵决策树的性能。
- 2、特征选择
- 在构建每棵决策树的节点时,并不是使用所有的特征来寻找最佳划分。而是从全部特征中随机选择一个子集(假设特征总数为 m,通常选择 m 的平方根个特征),然后在这个子集中寻找最佳划分特征。这样做的目的是为了降低决策树之间的相关性,使得每棵决策树都具有一定的独立性,从而提高整个模型的泛化能力。
- 3、决策树构建与集成
- 利用抽样得到的数据和选定的特征子集,构建一棵决策树。这个过程和普通决策树的构建过程类似,通过选择最佳的划分特征,不断地将数据集划分成更小的子集,直到满足停止条件(如叶子节点中的样本数小于某个阈值,或者树的深度达到了设定的最大值等)
- 当构建了多个(假设为 k 个)这样的决策树后,对于一个新的输入样本,将其输入到这 k 棵决策树中,每棵决策树都会输出一个预测结果。如果是分类问题,通常采用投票的方式(多数表决)来确定最终的类别;如果是回归问题,则对这 k 个结果求平均值作为最终的预测值。

随机森林的优缺点
优点
- 准确性高
- 由于它是集成了多个决策树的结果,通过综合多个 “弱学习器” 的预测,可以有效地减少模型的方差,从而提高预测的准确性。例如,在一个复杂的疾病诊断分类问题中,随机森林可以比单一的决策树更准确地判断患者是否患病。
- 能够处理高维数据
- 可以处理大量的特征。通过随机选择特征子集的方式,它可以筛选出对预测有重要贡献的特征,而不会因为特征过多而出现过拟合现象。比如在基因数据分析中,可能有成千上万个基因特征,随机森林可以有效地从中挖掘出与疾病相关的关键基因特征组合。
- 抗过拟合能力强
- 一方面是因为有放回抽样使得每棵决策树的数据都有一定的差异,另一方面是随机选择特征子集也降低了决策树之间的相关性。这两个因素使得模型不容易对训练数据过度拟合,从而在面对新的数据时也能有较好的表现。
- 可以评估特征重要性
- 能够计算每个特征在模型中的重要性程度。例如,在预测房屋价格的模型中,可以通过随机森林来确定房屋面积、房龄、周边配套设施等各个因素对价格影响的重要性排序。
缺点
- 计算成本高
- 由于需要构建多个决策树,当数据量非常大或者特征非常多时,训练时间会比较长。例如,在处理大规模的图像数据或者海量的文本数据时,构建随机森林可能需要大量的计算资源和时间。
- 模型解释性相对较差
- 虽然可以评估特征重要性,但是相对于简单的决策树来说,随机森林是一个由多个决策树组成的黑盒模型。要理解它具体是如何做出预测的比较困难,尤其是当决策树数量较多时。
- 对噪声数据敏感
- 如果训练数据中存在大量的噪声(错误的标注或者异常值),那么随机森林可能会受到影响,因为它会学习到这些噪声信息并反映在决策树的构建中。
随机森林模型
API

主要参数
- n_estimators
- 含义:森林中树的数量。
- 取值范围:默认为 100,通常可以尝试不同的值,如 10、50、200 等。
- 影响:增加树的数量一般会提高模型的性能,但同时也会增加计算成本和训练时间。当树的数量达到一定程度后,模型性能的提升会逐渐变缓。
- 示例:如果将n_estimators设置为 50,模型会构建 50 棵决策树用于分类。
- criterion
- 含义:衡量分裂质量的标准。
- 取值范围:可以是 “gini”(基尼不纯度)或者 “entropy”(信息熵)。
- 影响:“gini” 倾向于在节点内保持类别分布的均匀性;“entropy” 更关注信息增益,对于类别不平衡的数据可能更敏感。
- 示例:在一个二分类问题中,如果使用 “entropy” 作为criterion,模型在构建决策树时会更注重找到能够最大程度减少不确定性(即信息熵)的分裂特征。
- max_depth
- 含义:树的最大深度。
- 取值范围:默认值为None,表示树会一直生长,直到每个叶子节点都是纯的(只包含一个类别)或者包含的样本数小于min_samples_split。也可以设置为整数,如 5、10 等。
- 影响:限制树的深度可以防止过拟合,但如果设置得过小,可能会导致欠拟合。
- 示例:如果max_depth设置为 3,那么决策树的最大深度就是 3 层,从根节点开始,最多向下延伸 3 层。
- min_samples_split
- 含义:拆分内部节点(非叶子节点)所需的最小样本数。
- 取值范围:可以是整数(如 2)或者浮点数(如 0.1,表示样本数的比例)。
- 影响:如果值较大,树会更容易修剪,有助于防止过拟合;如果值较小,树会更复杂,可能导致过拟合。
- 示例:如果min_samples_split设置为 10,那么只有当一个节点包含至少 10 个样本时,才会考虑对其进行分裂。
- min_samples_leaf
- 含义:叶子节点所需的最小样本数。
- 取值范围:同样可以是整数或者浮点数。
- 影响:这个参数可以平滑模型,避免叶子节点包含太少的样本,从而防止过拟合。
- 示例:当min_samples_leaf设置为 5 时,每个叶子节点至少要有 5 个样本。
- max_features
- 含义:在寻找最佳分裂时考虑的特征数量。
- 取值范围:可以是整数(如 5,表示考虑 5 个特征)、浮点数(如 0.5,表示考虑一半的特征)、“auto”(自动考虑sqrt(n_features)个特征)、“sqrt”(同 “auto”)、“log2”(考虑log2(n_features)个特征)或者None(考虑所有特征)。
- 影响:减少这个参数的值可以降低模型的方差,但可能会增加偏差。
- 示例:如果max_features = 0.3,并且总共有 10 个特征,那么在每次分裂时,模型只会随机考虑 3 个特征来寻找最佳分裂点。
- bootstrap
- 含义:是否使用自助采样(有放回采样)来构建每棵树。
- 取值范围:默认为True。
- 影响:如果设置为True,可以引入随机性,有助于减少模型的方差;如果设置为False,每棵树会使用全部的训练数据,可能会导致模型过拟合。
- 示例:当bootstrap = True时,对于一个有 100 个样本的数据集,构建每棵树时可能会对这 100 个样本进行有放回采样,有些样本可能会被多次采样,而有些样本可能不会被采样到。
- oob_score
- 含义:是否使用袋外(Out - Of - Bag,OOB)样本来估计模型的泛化误差。
- 取值范围:默认为False。
- 影响:当bootstrap = True时,大约有 1/3 的样本不会被用于构建某一棵树,这些样本称为袋外样本。使用oob_score = True可以利用这些样本进行模型评估,提供一个额外的评估指标。
- 示例:如果设置oob_score = True,在模型训练完成后,可以通过model.oob_score_属性获取袋外样本的准确率估计值。
- random_state
- 含义:随机数生成器的种子。
- 取值范围:可以是整数或者None。
- 影响:当设置为整数时,可以保证每次运行代码时模型的结果是可复现的,因为相同的种子会产生相同的随机序列。
- 示例:如果random_state = 42,那么每次使用相同的数据集和参数运行模型时,都会得到相同的决策树结构和分类结果。
- class_weight
- 含义:类别权重。
- 取值范围:可以是 “balanced”(自动根据类别频率调整权重,使得每个类别有相同的权重)、字典(如{0:1, 1:2}表示类别 0 的权重为 1,类别 1 的权重为 2)或者None(所有类别权重相等)。
- 影响:在类别不平衡的情况下,调整类别权重可以使模型更关注少数类,从而提高少数类的分类准确率。
- 示例:在一个正负样本比例为 1:9 的数据集里,使用class_weight="balanced"可以让模型在训练过程中对正样本给予更多的关注,提高正样本的分类效果。
实例
我们将通过实例进行对随机森林的进一步了解。
本次实例是对垃圾邮件进行分类,共有4597条数据,其中有57个特征列和一个标签列。其中标签1为垃圾邮件,0不是垃圾邮件。
以下为少量数据:
实例步骤
- 导入数据
- 处理数据,切分数据
- 构建模型
- 训练模型
- 测试数据并输出分类报告和混淆矩阵
- 画出模型的前十重要性的特征
导入数据
# 读取 csv 文件数据
df = pd.read_csv('spambase.csv')
处理数据,切分数据
# 导入数据集划分的工具
from sklearn.model_selection import train_test_split
# 获取特征列
x = df.iloc[:, :-1]
# 获取标签列
y = df.iloc[:, -1]
# 将数据集划分为训练集和测试集,测试集占 20%,随机种子为 100
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=100)
构建模型
# 导入随机森林分类器
from sklearn.ensemble import RandomForestClassifier
# 实例化随机森林分类器,设置估计器数量为 100,最大特征比例为 0.8,随机种子为 0
rf = RandomForestClassifier(n_estimators=100,max_features=0.8,random_state=0
)
训练模型
# 在训练集上训练随机森林模型
rf.fit(xtrain, ytrain)
测试数据并输出分类报告和混淆矩阵
def cm_plot(y, yp):# 导入混淆矩阵计算和绘图所需的库from sklearn.metrics import confusion_matriximport 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')# 给 y 轴添加标签plt.ylabel('True label')# 给 x 轴添加标签plt.xlabel('Predicted label')# 返回绘图对象return plt# 对训练集进行预测
train_predicted = rf.predict(xtrain)from sklearn import metrics
# 输出训练集上的分类报告
print(metrics.classification_report(ytrain, train_predicted))
# 调用 cm_plot 函数绘制混淆矩阵并显示
cm_plot(ytrain, train_predicted).show()# 对测试集进行预测
test_predicted = rf.predict(xtest)
# 输出测试集上的分类报告
print(metrics.classification_report(ytest, test_predicted))
# 调用 cm_plot 函数绘制混淆矩阵并显示
cm_plot(ytest, test_predicted).show()
从分类报告和混淆矩阵来看准确率和召回率还是很高的,也没有产生过拟合和欠拟合。


画出模型的前十重要性的特征
import matplotlib.pyplot as plt
from pylab import mpl
# 获取随机森林模型的特征重要性
importances = rf.feature_importances_
# 将特征重要性转换为 DataFrame
im = pd.DataFrame(importances, columns=["importances"])
# 获取数据框的列名
clos = df.columns
# 将列名转换为 numpy 数组
clos_1 = clos.values
# 将 numpy 数组转换为列表
clos_2 = clos_1.tolist()
# 去掉最后一个元素(标签列)
clos = clos_2[0:-1]
# 将特征名添加到特征重要性 DataFrame 中
im['clos'] = clos
# 按特征重要性降序排序并取前 10 个
im = im.sort_values(by=['importances'], ascending=False)[:10]# 设置字体为微软雅黑,以支持中文显示
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决负号显示问题
mpl.rcParams['axes.unicode_minus'] = False
# 生成 y 轴刻度的范围
index = range(len(im))
# 设置 y 轴刻度标签为特征名
plt.yticks(index, im.clos)
# 绘制水平柱状图展示特征重要性
plt.barh(index, im['importances'])
# 显示图形
plt.show()

扩展
本实例还可以配合过采样对数据进行处理,再进行随机森林模型的训练,效果更好。
过采样算法可参考:《机器学习》——逻辑回归(过采样)
相关文章:
《机器学习》——随机森林
文章目录 什么是随机森林?随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据,切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林? -随…...
指代消解:自然语言处理中的核心任务与技术进展
目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解:跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型(EPASE) 4. 应用场景与前景展望4.1 关键…...
记录一下Unity webgl cannot read properties of undefined reading apply 错误
出现这个问题说明你Build 文件夹的内容和最新的打包内容冲突了 解决方法是把Build文件夹里面的东西全部删了 然后使用Unity重新生成这些文件 后续发现还是有这个问题 然后想了一下本地冲突应该在前端吧本地的文件删了重新拉取服务器的文件才行 以下是解决方法 <script t…...
【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1. 选择结构基本概念 2. 主要语句类型(if、if-else、switch) 3. 跃迁函数中变量的取值范围 4. 计算阶跃函数的值 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:输入x的值&#x…...
unity 播放 序列帧图片 动画
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、方法一:代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二:直接使用1.Image上添加…...
HTML - <a>
目录 1.简介 2.属性 2.1 href 2.2 hreflang 2.3 title 2.4 target 2.5 rel 2.6 referrerpolicy 2.7 ping 2.8 type 2.9 download 3.邮件链接 4.电话链接 1.简介 链接(hyperlink)是互联网的核心。它允许用户在页面上,从一个网址…...
Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 整体状态框架(简化) Player 是操作对象的类: 继承了 MonoBehaviour 用于定义游戏对象的行为,每个挂载在 Unity 游戏对象上的脚本都需要继承自 MonoBehaviour&#x…...
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
目录😋 任务描述 相关知识 1. 二叉树的基本概念与结构定义 2. 建立二叉树 3. 先序遍历 4. 中序遍历 5. 后序遍历 6. 层次遍历 测试说明 通关代码 测试结果 任务描述 本关任务:实现二叉树的遍历 相关知识 为了完成本关任务,你需要掌…...
Android Telephony | 协议测试针对 test SIM attach network 的问题解决(3GPP TS 36523-1-i60)
背景 除了运营商实网卡之外,在各种lab的协议测试中需要 follow 3GPP 协议定义(可以查询3gpp.org website 获取),那么 feature 需要支持覆盖的卡就不止运营商本身了。 本文介绍 IA APN流程,重点关注在协议/lab测试中,针对测试卡、非实网卡的的设置项,记录遇到的问题分…...
jenkins入门3 --执行一个小demo
1、新建视图 视图可以理解为是item的集合,这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型,常用的是第一个freestyle project 2)进行item相关配置,general 设置项目名字,描述,参数…...
STM32传感器系列:GPS定位模块
简介 我们在做一些项目的时候,可能需要使用到GPS模块,我们可以通过这个模块获得当前的位置以及时间,我这里就教大家如何去使用GPS定位模块,并且把示例代码开源到评论区下面,有需要自取即可,我我这里用到的…...
技术成长战略是什么?
文章目录 技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头…...
【前端】Vue3与Element Plus结合使用的超详细教程:从入门到精通
文章目录 Moss前沿AI一、教程概述1.1 目标读者1.2 学习目标 二、为什么选择Vue3与Element Plus2.1 Vue3的优势2.2 Element Plus的优势2.3 二者结合的优势 三、环境搭建3.1 创建Vue3项目3.2 安装Element Plus3.3 引入Element Plus 四、Element Plus常用组件使用详解4.1 按钮&…...
Linux 35.6 + JetPack v5.1.4之 pytorch升级
Linux 35.6 JetPack v5.1.4之 pytorch升级 1. 源由2. 升级步骤1:获取二进制版本步骤2:安装二进制版本步骤3:获取torchvision步骤4:安装torchvision步骤5:检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 支持…...
旷视科技C++面试题及参考答案
在 Linux 系统下常用的命令有哪些? 在 Linux 系统中有许多常用命令。首先是文件和目录操作相关的命令。“ls” 命令用于列出目录的内容,它有很多选项,比如 “ls -l” 可以以长格式显示文件和目录的详细信息,包括文件权限、所有者、大小、修改时间等;“ls -a” 则会显示所有…...
C 语言函数指针 (Pointers to Functions, Function Pointers)
C 语言函数指针 {Pointers to Functions, Function Pointers} 1. Pointers to Functions (函数指针)2. Function Pointers (函数指针)2.1. Declaring Function Pointers2.2. Assigning Function Pointers2.3. Calling Function Pointers 3. Jump Tables (转移表)References 1. …...
66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)
项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装律师事务所案件管理系统软件来发挥其高效地信息处理的作用…...
Docker容器中Elasticsearch内存不足问题排查与解决方案
在使用Docker运行Elasticsearch(ES)时,可能会遇到内存不足的问题,导致ES无法启动。以下是一次完整的排查和解决过程。 问题描述 在启动ES时,日志提示如下错误: # Native memory allocation (mmap) failed…...
Ubuntu 下测试 NVME SSD 的读写速度
在 Ubuntu 系统下,测试 NVME SSD 的读写速度,有好多种方法,常用的有如下几种: 1. Gnome-disks Gnome-disks(也称为“Disks”)是 GNOME 桌面环境中的磁盘管理工具,有图形界面,是测试…...
Neo4j的部署和操作
注:本博文展示部署哥操作步骤和命令,具体报告及运行截图可通过上方免费资源绑定下载 一.数据库的部署与配置 在单个节点上对进行数据库的单机部署 (1)上传neo4j-community-3.5.30-unix.tar.gz到hadoop1的/export/so…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
