二、集成学习:Bagging之随机森林算法(RandomForest Algorithm)

2023-10-14 08:59

本文主要是介绍二、集成学习:Bagging之随机森林算法(RandomForest Algorithm),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随机森林(RandomForest)

      • 一、随机森林(RandomForest)基本原理
      • 二、Out-Of-Bag Estimate 袋外数据估计泛化误差
      • 三、随机森林如何评估特征重要性。
      • 四、随机森林如何处理缺失值
      • 五、其它常见问题
        • 5.1、为什么Bagging算法的效果比单个评估器更好?
        • 5.2、为什么Bagging可以降低方差?<br>
        • 5.3、Bagging有效的基本条件有哪些?Bagging的效果总是强于弱评估器吗?
        • 5.4、Bagging方法可以集成决策树之外的算法吗?<br>
        • 5.5、怎样增强Bagging中弱评估器的独立性?
        • 5.6、除了随机森林,你还知道其他Bagging算法吗?<br>

推荐阅读通俗解释随机森林算法

一、随机森林(RandomForest)基本原理

  随机森林是机器学习领域最常用的算法之一,其算法构筑过程非常简单:随机森林利用了随机采样, 对数据样本和特征进行抽样,训练出多个树分类器(决策树,通常为CART),避免了每树对所有样本及所有特征的学习,从而增加了随机性,避免了过拟合,并按照Bagging的规则对单棵决策树的结果进行集成(回归则平均,分类则少数服从多数)。

在这里插入图片描述

在这里插入图片描述

  • 对训练样本数据进行有放回的抽样,生成K棵分类回归树;
  • 假设特征空间有n个特征,每棵树的节点处随机抽取m个特征(m < n);
  • 使每棵树最大限度生长,不做任何剪枝;
  • 通过多棵树组成森林,分类结果按树分类器投票多少决定;

随机森林的优缺点

优点

  • 不同决策树可以由不同主机并行训练生成,效率很高;
  • 随机森林算法继承了C&RT的优点;
  • 将所有的决策树通过bagging的形式结合起来,避免了单个决策树造成过拟合的问题;
  • 判断特征的重要程度、判断出不同特征之间的相互影响;
  • 处理高维数据,处理特征遗失数据,处理不平衡数据;

缺点

  • 不适合小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。
  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合;
  • ,取值划分较多的属性会对随机森林产生更大的影响,随机森林在这种数据上产出的属性权值是不可信的;

二、Out-Of-Bag Estimate 袋外数据估计泛化误差

  • 什么是 OOB?随机森林中 OOB 是如何计算的,它有什么优缺点?

  Bagging 方法中 Bootstrap 每次约有37%的样本不会出现在 Bootstrap 所采集的样本集合中,当然也就没有参加决策树的建立,把这的数据称为袋外数据 OOB(out of bag),它可以用于取代测试集误差估计方法。所以我们或许可以不做交叉验证、不分割数据集,而只依赖于袋外数据来测试我们的模型即可。当然,这也不是绝对的,当树的数量n_estimators不足,或者max_samples太小时,很可能就没有数据掉落在袋外,自然也有无法使用oob数据来作为验证集了。

  实际上,这些袋外样本还有别的用途,例如个体学习器是决策树时,可以用这些袋外样本来辅助剪枝;当个体学习器是神经网络时,可以使用袋外样本来辅助早期停止以减少过拟合风险。

三、随机森林如何评估特征重要性。

  衡量变量重要性的方法有两种,Decrease GINI 和 Decrease Accuracy:

  • Decrease GINI

      考察样本经过节点后不纯度减少的值的大小,值越大则特征越重要。
  1. 对于分类问题,也就是离散变量问题,CART使⽤Gini指数作为评判标准,选择那个使得划分后基尼指数最小的属性作为划分属性。

  2. 对于回归问题,直接使用 argmax(Var-VarLeft-VarRight)作为评判标准,即当前节点训练集的方差 Var 减去左节点的方差 VarLeft 和右节点的方VarRight。

  • Decrease Accuracy

  通过包外数据(out of bag)计算特征加入噪声前后对模型预测准确率的影响,影响越大则特征越重要。

  好比对于一棵树 Tb(x),我们用 OOB 样本可以得到测试误差 1;然后随机改变 OOB 样本的第 j 列:保持其他列不变,对第 j 列进行随机的上下置换,得到误差 2。至此,我们可以用误差 1-误差 2 来刻画变量 j 的重要性。基本思想就是,如果一个变量 j 足够重要,那么改变它会极大的增加测试误差;反之,如果改变它测试误差没有增大,则说明该变量不是那么的重要。

四、随机森林如何处理缺失值

  方法一(na.roughfix)简单粗暴,对于训练集,同一个 class 下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。

  方法二:相似度矩阵填补:先用na.roughfix ⾏粗粒度填充,然后使⽤上述填补后的训练集来训练随机森林模型,并统计相似度矩阵(proximity matrix),再回头看缺失值,如果是分类变量,则⽤没有缺失的观测实例的相似度中的权重进⾏投票;如果是连续性变量,则⽤相似度矩阵进⾏加权求均值,然后迭代 4-6 次。

proximity matrix相似度矩阵

  • 相似度矩阵就是任意两个观察实例间的相似度矩阵,原理是如果两个观侧实例落在同一颗树的相同节点次数越多,则这两个观侧实例的相似度越高。

五、其它常见问题

5.1、为什么Bagging算法的效果比单个评估器更好?

  泛化误差是模型在未知数据集上的误差,更低的泛化误差是所有机器学习/深度学习建模的根本目标。在机器学习当中,泛化误差一般被认为由偏差、方差和噪音构成。其中偏差是预测值与真实值之间的差异,衡量模型的精度。方差是模型在不同数据集上输出的结果的方差,衡量模型稳定性。噪音是数据收集过程当中不可避免的、与数据真实分布无关的信息。

  当算法是回归算法、且模型衡量指标是MSE时,模型的泛化误差可以有如下定义:

泛化误差 = 偏 差 2 + 方差 + 噪 音 2 = b i a s 2 + v a r i a n c e + n o i s e 2 \begin{aligned} 泛化误差 &= 偏差^2 + 方差 + 噪音^2 \\ &= bias^2 + variance + noise^2 \end{aligned} 泛化误差=2+方差+2=bias2+variance+noise2

(该公式可以通过泛化误差、偏差、方差与噪音的定义推导而得)

  Bagging的基本思想是借助弱评估器之间的“独立性”来降低方差,从而降低整体的泛化误差。这个思想可以被推广到任意并行使用弱分类器的算法或融合方式上,极大程度地左右了并行融合方式的实际使用结果。其中,“降低方差”指的是bagging算法输出结果的方差一定小于弱评估器输出结果的方差,因此在相同数据上,随机森林往往比单棵决策树更加稳定,也因此随机森林的泛化能力往往比单棵决策树更强。

5.2、为什么Bagging可以降低方差?

  我们很难从直觉上来理解“Bagging降低方差”这个抽象的结论,更难探究其背后的原因,但我们可以通过数学的方式来理解它。

  以随机森林为例,假设现在随机森林中含有 n n n个弱评估器( n n n棵树),任意弱评估器上的输出结果是 X i X_i X

这篇关于二、集成学习:Bagging之随机森林算法(RandomForest Algorithm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209479

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时