集成学习的前世今生(一)

本文将讨论一些众所周知的概念,如自助法、自助聚合(bagging)、随机森林、提升法(boosting)、堆叠法(stacking)以及许多其它的基础集成学习模型。

为了使所有这些方法之间的联系尽可能清晰,我们将尝试在一个更广阔和逻辑性更强的框架中呈现它们,希望这样会便于读者理解和记忆。

何为集成方法?

集成学习是一种机器学习范式。在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。

在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。

集成方法的思想是通过将这些弱学习器的偏置和/或方差结合起来,从而创建一个「强学习器」(或「集成模型」),从而获得更好的性能。

组合弱学习器

为了建立一个集成学习方法,我们首先要选择待聚合的基础模型。在大多数情况下(包括在众所周知的 bagging 和 boosting 方法中),我们会使用单一的基础学习算法,这样一来我们就有了以不同方式训练的同质弱学习器。

这样得到的集成模型被称为「同质的」。然而,也有一些方法使用不同种类的基础学习算法:将一些异质的弱学习器组合成「异质集成模型」。

很重要的一点是:

我们对弱学习器的选择应该和我们聚合这些模型的方式相一致。如果我们选择具有低偏置高方差的基础模型,我们应该使用一种倾向于减小方差的聚合方法;而如果我们选择具有低方差高偏置的基础模型,我们应该使用一种倾向于减小偏置的聚合方法

这就引出了如何组合这些模型的问题。我们可以用三种主要的旨在组合弱学习器的「元算法」:

  • bagging,该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。
  • boosting,该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。
  • stacking,该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。



非常粗略地说,我们可以说 bagging 的重点在于获得一个方差比其组成部分更小的集成模型,而 boosting 和 stacking 则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)。

在接下来的章节中,我们将具体介绍 bagging 和 boosting 方法(它们比 stacking 方法使用更广泛,并且让我们可以讨论一些集成学习的关键概念),然后简要概述 stacking 方法。

关于 Bagging

在「并行化的方法」中,我们单独拟合不同的学习器,因此可以同时训练它们。最著名的方法是「bagging」(代表「自助聚合」),它的目标是生成比单个模型更鲁棒的集成模型。

自助法

这种统计技术先随机抽取出作为替代的 B 个观测值,然后根据一个规模为 N 的初始数据集生成大小为 B 的样本(称为自助样本)。

在某些假设条件下,这些样本具有非常好的统计特性:在一级近似中,它们可以被视为是直接从真实的底层(并且往往是未知的)数据分布中抽取出来的,并且彼此之间相互独立。因此,它们被认为是真实数据分布的代表性和独立样本(几乎是独立同分布的样本)。

为了使这种近似成立,必须验证两个方面的假设。

首先初始数据集的大小 N 应该足够大,以捕获底层分布的大部分复杂性。这样,从数据集中抽样就是从真实分布中抽样的良好近似(代表性)。

其次,与自助样本的大小 B 相比,数据集的规模 N 应该足够大,这样样本之间就不会有太大的相关性(独立性)。注意,接下来我可能还会提到自助样本的这些特性(代表性和独立性),但读者应该始终牢记:「这只是一种近似」。

举例而言,自助样本通常用于评估统计估计量的方差或置信区间。根据定义,统计估计量是某些观测值的函数。因此,随机变量的方差是根据这些观测值计算得到的。

为了评估这种估计量的方差,我们需要对从感兴趣分布中抽取出来的几个独立样本进行估计。在大多数情况下,相较于实际可用的数据量来说,考虑真正独立的样本所需要的数据量可能太大了。

然而,我们可以使用自助法生成一些自助样本,它们可被视为「最具代表性」以及「最具独立性」(几乎是独立同分布的样本)的样本。这些自助样本使我们可以通过估计每个样本的值,近似得到估计量的方差。

 Bagging

当训练一个模型时,无论我们处理的是分类还是回归问题,我们都会得到一个函数,它接受一个输入,返回一个输出,并根据训练数据集进行定义。由于训练数据集的理论方差(我们要提醒大家,数据集是来自真实未知底层分布的观测样本),拟合模型也受到可变性的影响:如果观察到另一个数据集,我们将得到一个不同的模型。

套袋的想法很简单:我们想要拟合几个独立的模型,并平均它们的预测,以获得一个方差更低的模型。然而,在实践中,我们不能适合完全独立的模型,因为它需要太多的数据。因此,我们依靠自举样本良好的近似性质(代表性和独立性)来拟合几乎独立的模型。

首先,我们创建多个引导样例,这样每个新的引导样例将充当从真实分布中提取的另一个(几乎)独立的数据集。然后,我们可以为每个样本匹配一个弱学习器,最后将它们聚合起来,这样我们就可以对它们的输出进行平均,从而得到一个方差较小的集成模型。粗略地说,由于bootstrap样本近似独立且恒等分布(i.i.d),所以学习的基本模型也是如此。然后,平均弱学习者的输出不会改变预期答案,而是减少其方差(就像平均i.i.d.随机变量保持期望值,但减少方差)。

因此,假设我们有L个大小为B的引导样本(L个独立数据集的近似)

我们可以拟合L个几乎独立的弱学习者(每个数据集一个)


然后将它们聚合成某种平均过程从而得到一个方差更小的集成模型。例如,我们可以这样定义我们的强模型

有几种可能的方法来聚合并行拟合的多个模型。对于回归问题,可以对单个模型的输出求平均值,从而得到集成模型的输出。对于分类问题,每个模型输出的类都可以看作是一个投票,得到大多数投票的类由集成模型返回(这称为硬投票)。同样对于一个分类问题,我们也可以考虑所有模型返回的每个类的概率,将这些概率平均,保持av最高的类.

最后,我们可以提到装袋的一大优点是它可以并行化。由于不同的模型是彼此独立拟合的,因此如果需要,可以使用密集的并行化技术。

Bagging包括在不同的bootstrap样本上拟合几个基本模型,并建立一个集成模型来“平均”这些弱学习者的结果

Random forests

学习树是集成方法中非常流行的基本模型。由多棵树组成的强学习者可以称为“森林”。组成森林的树木可以被选择为浅的(很少的深度)或深的(很多深度,如果没有完全生长)。浅层树的方差较小,但偏差较大,因此将是以后我们将描述的序列方法的更好选择。另一方面,深树偏差小,方差大,因此,以减少方差为主要目的的套袋方法是相关的选择。

随机森林方法是一种袋装方法,其中深树,安装在引导样品上,组合产生具有较低方差的输出。但是,随机林还使用另一个技巧使多个拟合的树彼此关联得小一些:在种植每个树时,而不是只对数据集中的观测值进行采样以生成引导样本,我们还对功能,并仅保留其中的随机子集以生成树。

对特征进行采样实际上会产生这样的效果,即所有树不查看完全相同的信息来做出决策,因此,它减少了不同返回的输出之间的相关性。对特征进行采样的另一个优点是,它使决策过程对缺失数据更加可靠:包含缺失数据的观测值(是否来自训练数据集)仍可以根据采用的树进行回归或分类只考虑不丢失数据的功能。因此,随机林算法结合了袋装和随机要素子空间选择的概念,以创建更强大的模型。

随机森林法是一种以树木为弱学习对象的套袋法。每棵树都被安装在一个引导样本上,只考虑随机选择的变量子集

 

关于 Boosting


在「顺序化的方法中」,组合起来的不同弱模型之间不再相互独立地拟合。其思想是「迭代地」拟合模型,使模型在给定步骤上的训练依赖于之前的步骤上拟合的模型。「Boosting」是这些方法中最著名的一种,它生成的集成模型通常比组成该模型的弱学习器偏置更小。


提升方法

Boosting 方法和bagging 方法的工作思路是一样的:我们构建一系列模型,将它们聚合起来得到一个性能更好的强学习器。然而,与重点在于减小方差的 bagging 不同,boosting 着眼于以一种适应性很强的方式顺序拟合多个弱学习器:序列中每个模型在拟合的过程中,会更加重视那些序列中之前的模型处理地很糟糕的观测数据。

直观地说,每个模型都把注意力集中在目前最难拟合的观测数据上。这样一来,在这个过程的最后,我们就获得了一个具有较低偏置的强学习器(我们会注意到,boosting 也有减小方差的效果)。和 bagging 一样,Boosting 也可以用于回归和分类问题。

由于其重点在于减小偏置,用于 boosting 的基础模型通常是那些低方差高偏置的模型。例如,如果想要使用树作为基础模型,我们将主要选择只有少许几层的较浅决策树。

而选择低方差高偏置模型作为 boosting 弱学习器的另一个重要原因是:这些模型拟合的计算开销较低(参数化时自由度较低)。

实际上,由于拟合不同模型的计算无法并行处理(与 bagging 不同),顺序地拟合若干复杂模型会导致计算开销变得非常高。

一旦选定了弱学习器,我们仍需要定义它们的拟合方式(在拟合当前模型时,要考虑之前模型的哪些信息?)和聚合方式(如何将当前的模型聚合到之前的模型中?)在接下来的两小节中,我们将讨论这些问题,尤其是介绍两个重要的 boosting 算法:自适应提升(adaboost )和梯度提升(gradient boosting)。

简而言之,这两种元算法在顺序化的过程中创建和聚合弱学习器的方式存在差异。自适应增强算法会更新附加给每个训练数据集中观测数据的权重,而梯度提升算法则会更新这些观测数据的值。这里产生差异的主要原因是:两种算法解决优化问题(寻找最佳模型——弱学习器的加权和)的方式不同。 
 

Boosting 会迭代地拟合一个弱学习器,将其聚合到集成模型中,并「更新」训练数据集,从而在拟合下一个基础模型时更好地考虑当前集成模型的优缺点。

自适应 boosting

在自适应 boosting(通常被称为「adaboost」)中,我们将集成模型定义为 L 个弱学习器的加权和:

上图其中C_l是权值,w_l是弱学习器

寻找这种最佳集成模型是一个「困难的优化问题」。因此,我们并没打算一次性地解决该问题(找到给出最佳整体加法模型的所有系数和弱学习器),而是使用了一种更易于处理的「迭代优化过程」(即使它有可能导致我们得到次优解)。

另外,我们将弱学习器逐个添加到当前的集成模型中,在每次迭代中寻找可能的最佳组合(系数、弱学习器)。换句话说,我们循环地将 s_l 定义如下: 

其中,选择c_l和w_l,使s_l是最适合训练数据的模型,因此,这是对s_(l-1)最好的可能改进。然后我们可以表示

其中E(.)为给定模型的拟合误差,E(.,.)为损失/误差函数。因此,我们不是对所有的L模型进行全局优化,而是通过“局部”优化来逼近最优,并将弱学习者一个接一个地添加到强模型中。

更特别的是,在考虑二分类问题时,我们可以将 adaboost 算法重新写入以下过程:首先,它将更新数据集中观测数据的权重,训练一个新的弱学习器,该学习器重点关注当前集成模型误分类的观测数据。其次,它会根据一个表示该弱模型性能的更新系数,将弱学习器添加到加权和中:弱学习器的性能越好,它对强学习器的贡献就越大。

因此,假设我们面对的是一个二分类问题:数据集中有 N 个观测数据,我们想在给定一组弱模型的情况下使用 adaboost 算法。在算法的起始阶段(序列中的第一个模型),所有的观测数据都拥有相同的权重「1/N」。然后,我们将下面的步骤重复 L 次(作用于序列中的 L 个学习器):
 

  • 用当前观测数据的权重拟合可能的最佳弱模型
  • 计算更新系数的值,更新系数是弱学习器的某种标量化评估指标,它表示相对集成模型来说,该弱学习器的分量如何
  • 通过添加新的弱学习器与其更新系数的乘积来更新强学习器计算新观测数据的权重,该权重表示我们想在下一轮迭代中关注哪些观测数据(聚和模型预测错误的观测数据的权重增加,而正确预测的观测数据的权重减小)



重复这些步骤,我们顺序地构建出 L 个模型,并将它们聚合成一个简单的线性组合,然后由表示每个学习器性能的系数加权。注意,初始 adaboost 算法有一些变体,比如 LogitBoost(分类)或 L2Boost(回归),它们的差异主要取决于损失函数的选择。 

 

 Adaboost在每次迭代中更新观测值的权重。分类良好的观测值的权重相对于分类错误的观测值有所下降。在最终的集成模型中,性能更好的模型具有更高的权重。

Gradient boosting

在梯度增强中,我们尝试建立的集成模型也是弱学习者的加权和

正如我们在adaboost中提到的,在这种形式下找到最优模型是非常困难的,需要迭代方法。与自适应增强的主要区别在于顺序优化过程的定义。实际上,梯度增强将问题转化为梯度下降问题:在每一次迭代中,我们将一个较弱的学习者与当前集成模型的当前拟合误差的梯度相反。让我们试着澄清最后一点。首先,可以写出集成模型上的理论梯度下降过程

 

其中E(.)为给定模型的拟合误差,c_l为步长对应的系数

与第l-1步整体模型拟合误差梯度相反。与梯度相对的这个函数(相当抽象)在实践中只能对训练数据集中的观察值进行评估(我们知道输入和输出):这些评估称为附加到每个观察值的伪残差。此外,即使我们知道这些伪残差的值,我们也不希望向集成模型添加任何类型的函数:我们只想添加一个新的弱模型实例。所以,最自然的事情就是去适应 

所以,假设我们想用梯度增强技术来处理一个给定的弱模型家族。在算法的一开始(序列的第一个模型),伪残差设置为观测值。然后,我们重复L次(对于序列的L模型),步骤如下:

  • 将尽可能强的弱模型与当前观测值权重拟合
  • 计算更新系数的值,该值是弱学员的某种标量评估指标,指示在集合模型中应考虑多少弱学员
  • 通过将新的弱学习者乘以其更新系数来更新强学员
  • 计算新的观测值权重,以表示我们希望在下一次迭代中关注哪些观测值(聚合模型增加错误预测的观测值权重和正确预测观测值的权重减少)

重复这些步骤,然后我们依次构建L模型,并按照梯度下降方法将它们聚合起来。请注意,虽然自适应增强尝试在每个迭代中精确地解决“局部”优化问题(找到最好的弱学习器及其系数以添加到强模型中),但梯度增强使用梯度下降方法,可以更容易地适应大量的损失函数。因此,梯度增强可以看作是adaboost对任意可微损失函数的推广。

梯度增强在每次迭代中更新观测值。弱学习者被训练去拟合伪残差,这些伪残差指示了纠正当前集成模型预测以降低误差的方向。 

Stacking 概述

Stacking 与 bagging 和 boosting 主要存在两方面的差异。首先,Stacking 通常考虑的是异质弱学习器(不同的学习算法被组合在一起),而bagging 和 boosting 主要考虑的是同质弱学习器。其次,stacking 学习用元模型组合基础模型,而bagging 和 boosting 则根据确定性算法组合弱学习器。

堆叠法(Stacking)

正如上文已经提到的,stacking 的概念是学习几个不同的弱学习器,并通过训练一个元模型来组合它们,然后基于这些弱模型返回的多个预测结果输出最终的预测结果。

因此,为了构建 stacking 模型,我们需要定义两个东西:想要拟合的 L 个学习器以及组合它们的元模型。

例如,对于分类问题来说,我们可以选择 KNN 分类器、logistic 回归和SVM 作为弱学习器,并决定学习神经网络作为元模型。然后,神经网络将会把三个弱学习器的输出作为输入,并返回基于该输入的最终预测。

所以,假设我们想要拟合由 L 个弱学习器组成的 stacking 集成模型。我们必须遵循以下步骤:
 

  • 将训练数据分为两组
  • 选择 L 个弱学习器,用它们拟合第一组数据
  • 使 L 个学习器中的每个学习器对第二组数据中的观测数据进行预测
  • 在第二组数据上拟合元模型,使用弱学习器做出的预测作为输入



在前面的步骤中,我们将数据集一分为二,因为对用于训练弱学习器的数据的预测与元模型的训练不相关。因此,将数据集分成两部分的一个明显缺点是,我们只有一半的数据用于训练基础模型,另一半数据用于训练元模型。

为了克服这种限制,我们可以使用某种「k-折交叉训练」方法(类似于 k-折交叉验证中的做法)。这样所有的观测数据都可以用来训练元模型:对于任意的观测数据,弱学习器的预测都是通过在 k-1 折数据(不包含已考虑的观测数据)上训练这些弱学习器的实例来完成的。

换句话说,它会在 k-1 折数据上进行训练,从而对剩下的一折数据进行预测。迭代地重复这个过程,就可以得到对任何一折观测数据的预测结果。这样一来,我们就可以为数据集中的每个观测数据生成相关的预测,然后使用所有这些预测结果训练元模型。

叠加是训练一个元模型,根据底层弱学习者返回的输出生成输出。

多层次叠加 

堆叠的一种可能的延伸是多层堆叠。它由多层叠加组成。作为一个例子,让我们考虑一个3层叠加。在第一级(层)中,我们选择了L个较弱的学习者。然后,在第二层,我们不是在弱模型预测上拟合单个元模型(如前一小节所述),而是拟合M个这样的元模型。最后,在第三层,我们拟合了最后一个元模型,该模型将前一层的M元模型返回的预测作为输入。

从实用的角度来看,请注意对于多层叠加集成模型的不同层次的每个元模型,我们必须选择一个几乎可以是我们想要的任何东西的学习算法(甚至是已经在较低层次使用的算法)。我们还可以提到,添加级别可能是数据昂贵(如果不使用k-fold like技术,那么需要更多数据)或时间昂贵(如果使用k-fold like技术,那么需要安装很多模型)。

多层叠加考虑多层叠加:一些元模型根据下层元模型返回的输出进行训练,以此类推。在这里我们表示了一个三层叠加模型。

Takeaways:

这篇文章的主要内容如下:

  • 集合学习是一种机器学习模式,其中多个模型(通常称为弱学习者或基础模型)接受培训,以解决相同的问题,并结合以获得更好的性能
  • 主要假设是,如果我们以正确的方式将弱型学习者结合起来,我们就能获得更准确和/或可靠的模型
  • 在装袋方法中,同一基本模型的多个实例在不同的引导样本上并行训练(彼此独立),然后在某种"平均"过程中聚合
  • 在装袋方法中(几乎)i.i.d 拟合模型上执行的均值操作类型主要允许我们获得差异低于其分量的集成模型:这就是为什么具有低偏置但高方差的基本模型非常适合装袋
  • 在提升方法中,同一基本模型的多个实例按顺序训练,因此,每次迭代中,训练当前弱学习者的方法取决于以前的弱学习者,尤其是他们如何对数据执行
  • 这种迭代式学习策略用于提升方法,它适应以前模型的弱点来训练当前模型,主要允许我们获得一个比其组件具有较低偏差的集成模型:这就是为什么差异低的弱学习者,但高偏置性非常适合提升
  • 在堆叠方法中,不同的弱学习者彼此独立安装,并在此基础上训练元模型,以基于基本模型返回的输出来预测输出

在这篇文章中,我们给出了一个基本的概述,整体学习,特别是,这个领域的一些主要概念:引导,袋装,随机森林,提升(阿达加,梯度提升)和堆叠。在被搁置的概念中,我们可以提及例如袋装的袋外评估技术,或者非常流行的"XGBoost"(代表 eXtrem 梯度提升),它是一个实现梯度提升方法的库,大量其他技巧,使学习更加高效(对于大型数据集,可进行处理)。

最后,我们要提醒大家,集成学习是结合一些基本模型,以获得具有更好性能/性能的合奏模型。因此,即使装袋、增压和堆叠是最常用的组合方法,变型也是可能的,并且可以更好地适应某些具体问题。这主要需要两件事:充分理解我们面临的问题...并发挥创造力!

感谢您的阅读!

 

本篇文章为外国博文,翻译过来供大家参考,原始网址为:

原文

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值