传统机器学习笔记5——随机森林

目录

  • 前沿
  • 一.集成学习
    • 1.1.集成学习
    • 1.2.个体学习器
    • 1.3.集成学习的核心问题
      • 1.3.1.使用什么样的个体学习器
      • 1.3.2.如何选择合适的结合策略构建强学习器
    • 1.4.Bagging
      • 1.4.1.Bootstrap Sampling
      • 1.4.2.Bagging
  • 二.随机森林
    • 2.1.随机森林
    • 2.2.随机森林的特点
    • 随机森林决策边界可视化
    • 2.3.随机森林算法的优缺点
    • 2.4.影响随机森林的参数与调优
      • 2.4.1. 影响参数
      • 2.4.1.参数调优

前沿

  上篇博文我们介绍了什么是决策树的算法原理,有不懂的小伙伴可以回到前面看看:传统机器学习笔记4——决策树,这篇博文我们继续来看下传统机器学习算法之随机森林。随机森林是一种由决策树构成的(并行)集成算法,属于Bagging类型,通过组合多个弱分类器,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确度和泛化性能,同时也有很好的稳定性,广泛应用在各种业务场景中。从字面上也能看到随机森林主要有两个特性:随机和森林,一个使它具有抗过拟合能力,一个使它更加精准。在介绍随机森林算法之前,我们先看下什么是集成学习。

一.集成学习

1.1.集成学习

  在训练数据的时候,我们通过训练多个个体学习器,在通过结合策略将他们集成起来,形成一个更强的学习器,就是集成学习。通俗的理解,比如一个班里面有个全能学霸,什么科目都擅长,但是呢又有几个偏科生,他们只擅长一门或者几门学科,那么在考试的时候呢我们就可以让这些偏科生分别做他们擅长的试卷,最终集合成一个完成的所有科目的答案,这就是集成学习的思想,即三个臭皮匠,顶个诸葛亮。

1.2.个体学习器

  上面我们提到个体学习器,他是相对于集成学习的一个概念,我们之前介绍的跟多模型都是个体学习器,比如决策树,逻辑回归,朴树贝叶斯等。个体学习器代表的是单个学习器,集成学习代表的是多个学习器的结合。

  • 若集成中只包含同种类型的个体学习器,叫做同质集成,个体学习器称作基学习器。例如随机森林中全是决策树集成。
  • 若集成中包含不同类型的个体学习器,叫做异质集成,个体学习器称作组件学习器。例如同时包含决策树和神经网络进行集成。

1.3.集成学习的核心问题

1.3.1.使用什么样的个体学习器

  • 个体学习器不能太弱,需要有一定的准确性。
  • 个体学习器之间要具有多样性,即存在差异性。

1.3.2.如何选择合适的结合策略构建强学习器

  • 并行组合方式,例如随机森林。
  • 传统组合方式,例如boosting树模型。

1.4.Bagging

1.4.1.Bootstrap Sampling

  随机森林是并行模型,Bagging是并行式集成学习方法最著名的代表。下面我们先介绍下Bagging。在介绍Bagging之前,我们还需要了解一个东西,叫做自助采样法,即我们常说的Bootstrap Sampling,什么是自助采样法呢?直接看下面的解释:

  • 给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中。
  • 上述过程重复m轮,我们得到m个样本的采样集,初始训练集中有的样本在采样集中多次出现,有的则从未出现,约63.2%的样本出现在采样集中,而未出现的约36.8%的样本可用作验证集来对后续的泛化性能进行包外估计

1.4.2.Bagging

  BaggingBootstrap aggregating的缩写,是在Boostrap Sampling基础上构建的,上述的采样过程我们可以重复T次,采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,然后将这些基学习器进行结合。在对预测输出进行结合时,Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法,这就是Bagging 的基本流程。如下图所示:
传统机器学习笔记5——随机森林_第1张图片
  从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等易受到样本扰动的学习器上效用更明显。

二.随机森林

  上面预备知识介绍完,我们正式进入随机森林算法的学习

2.1.随机森林

  随机森林简称RF(Random Forest),是一种基于树模型的Bagging的优化版本,核心思想还是Bagging,只是做了一些特有的改进,即RF使用CART决策树作为基学习器,随机森林算法实现过程如下:

  1. 输入为样本集 D = { ( x , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\left\{\left(x, y_1\right),\left(x_2, y_2\right), \ldots,\left(x_m, y_m\right)\right\} D={(x,y1),(x2,y2),,(xm,ym)}
  2. 对于 t = 1 , 2 , 3 , . . . T t=1,2,3,...T t=1,2,3,...T:
  • 对训练集进行第 t t t次随机采样,共采集 m m m次,得到包含 m m m个样本的采样集 D T D_{T} DT
  • 用采样集 D T D_{T} DT训练第 T T T个决策树模型 D T ( x ) D_{T}(x) DT(x),在训练决策树模型的节点的时候,在节点上所有的样本特征中选择一部分样本特征,在这些随机选择的部分样本特征中选择一个最优的特征来做决策树的左右子树划分。
  1. 分类场景,则 T T T个基模型(决策树)投出最多票数的类别为最终类别。

可用如下图所示:
传统机器学习笔记5——随机森林_第2张图片

2.2.随机森林的特点

  从他的字面意思也能看到,随机森林的两大特点:随机性+森林。随机性主要体现在以下两个方面:
样本扰动:

直接基于自助采样法(Bootstrap Sampling),使得初始训练集中约63.2%的样本出现在一个采样集中。并带来数据集的差异化。

属性扰动:

在随机森林中,对基决策树的每个结点,先在该结点的特征属性集合中随机选择 k k k个属性,然后再从这 k k k个属性中选择一个最优属性进行划分。这一重随机性也会带来基模型的差异性。

集成主要体现为:
  根据多个(差异化)采样集,训练得到多个(差异化)决策树,采用简单投票或者平均法来提高模型稳定性和泛化能力。

随机森林决策边界可视化

  下面是对于同一份数据集(iris数据集),我们使用决策树和不同树棵树的随机森林做分类的结果,我们对其决策边界做了可视化。传统机器学习笔记5——随机森林_第3张图片
  从上面的图中,可以清晰的看到,随着随机森林中决策树数量的增多,模型的泛化能力逐渐增强,决策边界越来越趋于平滑,即鲁棒性越强。

2.3.随机森林算法的优缺点

优点:

  • 对于高维(特征很多)稠密型的数据适用,不用降维,无需做特征选择。
  • 构建随机森林模型的过程,亦可帮助判断特征的重要程度。
  • 可以借助模型构建组合特征。
  • 并行集成,有效控制过拟合。
  • 工程实现并行简单,训练速度快。
  • 对于不平衡的数据集友好,可以平衡误差。
  • 对于特征确实鲁棒性强,可以维持不错的准确度。

缺点:

  • 在噪声过大的分类和回归数据集上还是可能会过拟合。
  • 相比单一决策树,因其随机性,模型解释会更复杂一些。

2.4.影响随机森林的参数与调优

  上面我们已经系统了解了随机森林的原理与机制,下面我们一起来看看工程应用实践中的一些重点,比如随机森林模型有众多可调参数,它们有什么影响,又如何调优。

2.4.1. 影响参数

生成单颗决策树时的特征数 max_features

  • 增加 max_features 一般能提高单个决策树模型的性能,但降低了树和树之间的差异性,且可能降低算法的速度。
  • 太小的 max_features 会影响单颗树的性能,进而影响整体的集成效果。
  • 需要适当地平衡和选择最佳的 max_features。

决策树的棵树 n_estimators

  • 较多的子树可以让模型有更好的稳定性和泛化能力,但同时让模型的学习速度变慢。
  • 我们会在计算资源能支撑的情况下,选择稍大的子树棵树。

树深 max_depth

  • 太大的树深,因为每颗子树都过度学习,可能会有过拟合问题。
  • 如果模型样本量多特征多,我们会限制最大树深,提高模型的泛化能力。

2.4.1.参数调优

RF划分时考虑的最大特征数 max_features:

  • 总数的百分比,常见的选择区间是[0.5,0.9]。

决策树的棵树 n_estimators:

  • 可能会设置为>50的取值,可根据计算资源调整。

决策树最大深度 max_depth:

  • 常见的选择在4-12之间。

内部节点再划分所需最小样本数 min_samples_split:

  • 如果样本量不大,不需要调整这个值。
  • 如果样本量数量级非常大,我们可能会设置这个值为16,32,64 等。

叶子节点最少样本数 min_samples_leaf:

  • 为了提高泛化能力,我们可能会设置这个值>1。

至此,关于随机森林的部分已经介绍完了,欢迎各位大佬批评指正。

你可能感兴趣的:(机器学习,机器学习,1024程序员节)