《机器学习》——随机森林
文章目录
- 什么是随机森林?
- 随机森林的原理
- 随机森林的优缺点
- 优点
- 缺点
- 随机森林模型
- 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…...

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用
一、引言 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…...
yaffs2目录搜索上下文数据结构struct yaffsfs_dirsearchcontext yaffsfs_dsc[] 详细解析
1. 目录搜索上下文(Directory Search Context) struct yaffsfs_dirsearchcontext 是 YAFFS2 文件系统中用于 目录遍历操作 的核心数据结构,专门管理 readdir() 等目录操作的状态。 结构体定义(典型实现) struct yaf…...

分享两个日常办公软件:uTools、PixPin
1. uTools 网址:https://u.tools/ 这是一个高效智能的在线工具平台。 特点: 专为提升用户的工作效率跟生活便利性设计。 优点: 1:由国内团队开发。 2:通过插件化的方式为用户提供多样化的功能支持。 3…...

FreeCAD:开源世界的三维建模利器
FreeCAD 开发模式 FreeCAD的开发采用多语言协作模式,其核心框架与高性能模块主要使用C构建,而用户界面与扩展功能则通过Python脚本实现灵活定制。具体来说: C核心层:作为基础架构,C负责实现与Open CASCADE Technology…...

C++学习-入门到精通【16】自定义模板的介绍
C学习-入门到精通【16】自定义模板的介绍 目录) C学习-入门到精通【16】自定义模板的介绍前言一、类模板创建一个自定义类模板:Stack\<T\> 二、使用函数模板来操作类模板特化的对象三、非类型形参四、模板类型形参的默认实参五、重载函数模板 前言…...
unix/linux,sudo,其内部结构机制
我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…...
创客匠人:如何通过精准定位实现创始人IP打造与知识变现
在当今知识经济时代,越来越多的专业人士希望通过个人品牌实现知识变现,但许多人面临一个共同困境:明明很努力,却收效甚微。创客匠人作为深耕知识付费赛道9年的专业机构,揭示了这一现象背后的关键原因——90%的IP失败源…...
DDPM优化目标公式推导
DDPM优化目标公式推导 DDPM优化目标公式推导**1. 问题定义****2. 优化目标:最大化对数似然****3. 变分下界的分解****4. 关键步骤:简化 KL 散度项****(a) 后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) q(xt…...

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型
在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…...
MongoDB检查慢查询db.system.profile.find 分析各参数的作用
db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...