集成学习与随机森林(Random Forest)详述

集成学习与随机森林(Random Forest)

个体与集成

集成学习(ensemble learning)的一般结构:先产生一组“个体学习器”(individual learner),再用某种策略将他们结合起来,如下图所示,

个体学习器通常由一个现有的学习算法从训练数据产生:

  • 只包含同种类型的个体学习器,这样的集成是“同质”的(homogeneous)。同质集成中的个体学习器亦称为”基学习器“(base learning),相应的学习算法称为”基学习算法“(base learning algorithm)。

  • 集成也可包含不同类型的个体学习器,这样集成是”异质“的(heterogeneous)。相应的个体学习器,常称为”组件学习器“(component learning)或直接称为个体学习器。

在一般的经验中,如果把好坏不等的东西掺到一起,那么通常结果会是比坏的好一些,比好的要坏一些。集成学习把多个学习器结合起来,如何能获得比最好的单一学习器更好的性能呢?

弱学习器:弱学习器常指泛化性能略优于随机猜测的学习期;例如在二分类问题上精度略高于50%的分类器。

要获得好的集成个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”(diversity),即学习器间具有差异。

个体学习器应该至少不差于弱学习器

目前集成学习的方法大致可以分为两种:

  1. 个体学习器之间存在强依赖关系、必须串行生成的序列化方法。(Boosting)
  2. 个体学习器之间不存在强依赖关系、可同时生成的并行化方法。(Bagging和RF)

Boosting

Boosting是一族将弱学习器提升为强学习器的算法。工作机制如下:

先从初始训练集中训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得先前基学习器做的的训练样本在后继受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器的数目达到实现指定的值T,最终将这T个学习器进行加权结合。

具体概念可参考本博客中关于AdaBoost, GBDT与XGBoost区别章节

AdaBoost

Boosting 族算法最著名的代表是AdaBoost。该算法有多重推导方式,比较容易理解的是“加性模型”,即基学习器的线性组合来最小化指数损失函数。

算法基本流程如下:

  1. 初始化样本权值分布
  2. 基于分布 D t 从数据集中训练出分类器 h t
  3. 估计 h t 的误差,若误差>0.5则重新下一轮训练
  4. 确定分类器ht的权重
  5. 更新样本分布
  6. 若未达到预制的训练轮数,则继续进行训练

Boosting算法要求基学习器能对特定的数据分布进行学习,这可以通过“重赋权”实施,即在训练的每一轮中,根据样本为每个训练样本重新赋予一个权重。

对于无法接受带权样本的基学习算法,可以通过“重采样”来处理,再用重采样的样本集对基学习器进行训练。一般而言这两种算法没有优劣差别。

需要注意的是Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(检查基分类器是否比随机猜测好),一旦条件不满足,当前基学习器被抛弃掉,学习过程停止。

在这种情形下,初始设置的学习轮数T也许还远远未达到,可能导致最终集成中只包含很少的基学习器而导致性能不佳。

若采用“重采样”,则可以获得“重启动”机会避免过早停止。即在抛弃不满足条件的当前基学习器之后,根据当前的分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预制的T轮。

从“偏差-方差”分解的角度看,Boosting主要关注降低偏差,因此基于泛化性能相当弱学习器能构建出很强的集成。

关于AdaBoost的详细推导可参考本博客中
AdaBoost算法详述

Bagging与随机森林:

为了训练出独立的学习器,我们可以考虑用不同的样本的子集分别产生学习器,然而这样每个基学习器值用到了一小部分的训练样本,甚至不足以有效学习,无法确保产生较好的基学习器,为解决这个问题,我们考虑使用互相有交叠的采样子集。

Bagging

Bagging是“并行式”集成学习方法中最著名的代表,基于我们之前介绍的自主采样法。

  1. 给定包含m个样本的数据集,随机取出一个样本放入采样机,再将样本放回初始数据集,使得下次采样仍有可能被选中,经过m次随机采样,得到m个样本的数据集,初始数据集中约63.2%出现在采样集中。
  2. 我们采样出T个含m个( T m )训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
  3. 在对预测输出进行结合的时候,Bagging通常对分类任务采用简单投票法,回归任务采用简单平均法,若遇到相同票数则随机选择一个或者根据投票置信度来选择。

训练一个Bagging集成与直接使用基学习算法训练一个学习器复杂度同阶,说明是一个高效的集成算法,与标准AdaBoost只适用于二分类任务不同,Bagging可以不经修改的用于多分类、回归等任务。

注:标准的AdaBoost只能处理二分类,现在已有变体能处理多分类或者回归任务。

自助采样的优点

  1. 由于只用了原始训练集的63.2%样本进行训练,剩下的36.8%可以用作验证集来对泛化性能进行“包外估计”。

  2. 包外估计还可以辅助决策树进行剪枝,或者估计决策树中各节点的后验概率用于辅助对零训练样本节点的处理;还可以辅助神经网络早期停止减小过拟合风险。

  3. 从“偏差-方差”分解的角度看,Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等易受样本扰动的学习器上效用更为明显。

从“偏差-方差”分解的角度看,即Bagging更适用于强分类器(如不剪枝的决策树、神经网络)集成,旨在降低方差;Boosting则更侧重于弱分类器集成,旨在降低偏差。(AdaBoost、GBDT可以算是两种不同实现类型的Boosting算法,而XGBoost可以理解为GBDT算法架构的一种扩展变体(目标函数loss function不同,加入了正则化以及贪婪法加入新的决策树等方式),具体可参考本博客中关于AdaBoost, GBDT与XGBoost区别章节,而随机森林则是Bagging的一个扩展变体)

随机森林(Random Forest, RF)

随机森林是Bagging的一个扩展变体。

RF在以决策树为基学习器,构建Bagging的基础上,进一步在决策树的训练过程中引入了随机属性选择。

具体来说,传统的决策树在选择划分属性的时候是在当前节点的属性集合中选择一个最优属性,而在RF中,对基决策树的每个节点,先从该节点的属性集中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。

这里的参数k控制了随机性的引入程度,若令k=d,则基决策树的构建与传统决策树相同;
若k=1,则随机选择一个属性进行划分;一般情况下推荐 k = l o g 2 d

可以看出,随机森林对Bagging只做了微小的改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自于样本扰动,还来自于属性扰动,这就使得最终集成的泛化性能可以通过个体学习器之间的差异度的增加而进一步提升。

Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样),而RF中基学习器的多样性不仅来自于样本扰动,还来自于属性扰动。

随机森林的收敛性与bagging相似,随机森林其实性能很差,随着个体学习器增加,会收敛到更低泛化性能。
随机森林训练效率通常优于bagging,因为在个体决策树的构建过程中,bagging使用的是“确定型”决策树,需要考虑全部属性,但是随机森林使用的是“随机型”只需要考虑一个属性集合。

随机森林的建立

基本就是两个步骤:随机采样与完全分裂。

(1)随机采样

首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。

对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个,这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本,同时使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。

对于列采样,从M个feature中,选择m个(m << M),即:当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。

(2)完全分裂

对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。分裂的办法是:采用上面说的列采样的过程从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。

决策树形成过程中每个节点都要按完全分裂的方式来分裂,一直到不能够再分裂为止(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。

我们用LearnUnprunedTree(X,Y)表示生成一棵未剪枝的决策树的过程,以下简写LUT (X,Y):

LearnUnprunedTree(X,Y)

输入:
      X是RxM的矩阵,Xij表示第i个样本的第j个特征。
      Y是Rx1的向量,Yi表示第i个样本的类别标签。
输出:
      一棵未剪枝的树

if X的所有样本值都相同,或Y的所有类别标签相同,或者R<2:
则产生一个叶结点,该结点的类别即是X中最多数的类别。
else:
从M个特征中随机挑选m个,这m个特征中,信息增益最大的记为p。(信息增益的计算方法见下文)
if 特征 p 的取值是非连续的(如性别:“男”,“女”):
则对 p 的任一取值v,用 X v 表示特征 p 取值为 v 的样本, Y v 为其对应类别 C h i l d v = L U T ( X v , Y v )
返回一个树结点,在特征 p 处分裂,孩子的数量与特征 p 的不同取值数量相同。第 v 个孩子即是 C h i l d v = L U T ( X v , Y v )
if 特征 p 的取值是连续的(如温度,长度等):
t 为最佳分裂阈值, X L O 表示特征 p 的值< t 的样本集合, Y L O 为其对应类别;
C h i l d L O = L U T ( X L O , Y L O )
X H I 表示特征 p 的值>=t的样本集合, Y H I 为其对应类别
C h i l d L O = L U T ( X H I , Y H I )
返回一个树结点,在特征p处分裂,有2个孩子,分别是 C h i l d L O = L U T ( X L O , Y L O ) C h i l d H O = L U T ( X H I , Y H I )

随机森林的生成过程相比于一般决策树生成过程多了:Bagging步骤的bootstrap sampling(自助采样)与属性集(M个)随机选择m个(由参数m控制,建议 m = l o g 2 M

一般决策树的生成过程可参考本博客决策树之ID3, C4.5与CART区别与联系

自助采样的优点

由于只用了原始训练集的63.2%样本进行训练,剩下的36.8%可以用作验证集来对泛化性能进行“包外估计”。

包外估计还可以辅助决策树进行剪枝,或者估计决策树中各节点的后验概率用于辅助对零训练样本节点的处理;还可以辅助神经网络早期停止减小过拟合风险。

因为是自助采用是Bagging训练基分类器的策略,而即分类器可以是决策树也可以是神经网络。

从“偏差-方差”分解的角度看,Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等易受样本扰动的学习器上效用更为明显。

随机森林的优点

  1. 在数据集上表现良好
  2. 在当前的很多数据集上,相对其他算法有着很大的优势
  3. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择
  4. 在训练完后,它能够给出哪些feature比较重要
  5. 在创建随机森林的时候,对generlization error使用的是无偏估计
  6. 训练速度快
  7. 在训练过程中,能够检测到feature间的互相影响
  8. 容易做成并行化方法
  9. 实现比较简单
  10. 能够处理带有缺失数据的样本

RF小结

随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

  1. 在建立每一棵决策树的过程中,有两点需要注意自助采样与完全分裂。

    • 首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。
    • 假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。
    • 然后进行列采样,从M个feature中,选择m个(m << M)。
    • 之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。
    • 一般很多的决策树算法都有一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
  2. 按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。

    • 我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。

结合策略

学习器结合可能会从三个方面带来好处。

  1. 统计方面
    由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能导致泛化性能不佳。结合多个学习器可以减少这一风险。
  2. 计算方面
    学习算法会陷入局部极小值,有的局部极小值对应的泛化性能可能很糟,多次运行可以降低陷入糟糕局部极小点的风险
  3. 表示方面
    某些学习任务的真实假设可能不在当前学习算法的假设空间中,此时若使用单学习器肯定无效,而应该通过多结合多个学习器,扩大假设空间才能获得更好近似。

平均法(数值型)

  1. 简单平均法
  2. 加权平均法
    由于加权平均法一般是从训练数据中学习而得,现实任务中训练样本通常不充分或者存在噪声,使得学出来的权值不可靠。同时学习的权重过多会导致过拟合,因此加权平均未必优于简单平均。
    一般性能相差大学习器加权平均,相近简单平均。

投票法(分类任务)

对分类任务来说,学习器 h i 将从类别标记集合 c 1 , c 2 , , c N 中预测出一个标记,最常见的结合策略是使用投票法(voting)。为了便于讨论,我们将 h i 在样本 x 上的预测输出表示为一个 N 维向量 h i 1 ( x ) ; h i 2 ( x ) ; ; h i N ( x ) ,其中 h i j ( x ) h i 在类别标记 c j 上的输出。

  1. 绝对多数投票法(majority voting)

    H ( x ) = { c j , i f   i = 1 T h i j ( x ) > 0.5 k = 1 N i = 1 T h i k ( x ) ; r e j e c t ,   o t h e r w i s e .

    即若某标记得票过半数,则预测为该标记;否则拒绝预测。

  2. 相对多数投票法(plurality voting)

H ( x ) = c a r g   m a x j i = 1 T h i j ( x )

即预测为得票最多的标记,若同时有多个暴击获最高票,则从中随机选取一个。

  1. 加权投票法(weighted voting)

H ( x ) = c a r g   m a x j i = 1 T w i h i j ( x )

与加权平均法类似, w i h i 的权重,通常 w i / g e q 0 , i = 1 T = 1

标准的绝对多数投票法提供了“拒绝预测”选项,这在可靠性要求较高的学习任务中是一个很好的机制。但若学习任务要求必须提供预测结果,则绝对多数投票法将退化为相对多数投票法。

详细论述可参考周志华 《机器学习》 P 1 83 页解释。

  1. 学习法
    初级学习器+次级学习器,引入stacking集成架构,这个需要再开一章节详细展开。

多样性

误差-分歧分解

欲构建泛化能力强的集成,个体学习器应“好而不同”,其中,“误差-分歧分解”(error-ambiguity decomposition)是一个简单的理论分析方法。但该推导过程只适用于回归学习,难以直接推广到分类学习任务中。

多样性度量

多样性度量(diversity measure)是用于度量集成中个体分类器的多样性,即估算个体学习器的多样化程度。常用的多样性度量包括:

不合度量(disagreement measure)
相关系数(correlation coefficient)
Q-统计量(Q-statistics)
k-统计量(k-statistics)

多样性增强

在集成学习中需有效地生成多样性大的个体学习器。与简单地直接用初始数据训练出个体学习器相比,一般思路是在学习过程中引入随机性,常见的做法主要有,

  • 数据样本扰动:数据样本扰动基于采样法。
  • 输入属性扰动:随机子空间算法。
  • 输出表示扰动:翻转法(随机改变一些训练样本的标记);输出调制法(将分类输出转化为回归输出后构建学习器)…
  • 算法参数扰动:负相关法;单一学习器通常需要交叉验证等来确定参数值。

注:常见的“不稳定基学习器”:决策树、神经网络,训练样本稍加变化就会导致学习器有显著变动,数据样本扰动法对这样的“不稳定基学习器”很有效;

常见的“稳定基学习器”:线性学习器、支持向量机、朴素贝叶斯、k近邻学习器,对此类基学习器进行集成往往需要使用输入属性扰动等其他几种。

猜你喜欢

转载自blog.csdn.net/Dby_freedom/article/details/82057303