集成学习是指使用多种兼容的学习算法/模型来执行单个任务的技术,目的是为了得到更佳的预测表现。集成学习的主要方法可归类为三大类: 堆叠(Stacking)、提升(Boosting) 和 装袋(Bagging/bootstrapaggregating)。其中最流行的方法包括随机森林、梯度提升、AdaBoost、梯度提升决策树(GBDT)和XGBoost。
集成学习
集成学习是一种机器学习范式。在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。
在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。
集成方法的思想是通过将这些弱学习器的偏置和/或方差结合起来,从而创建一个「强学习器」(或「集成模型」),从而获得更好的性能。
当然这也有两个潜在前提:
- 基分类器要有一定的性能,至少不差于随机猜测的性能,即基分类器准确率不低于50%。
- 基学习器要具有多样性,即基学习器间要有差异性,完全一样的结果显然也无法合并出差异的结果。
集成学习的分类
为了建立一个集成学习方法,我们首先要选择待聚合的基础模型。在大多数情况下(包括在众所周知的 bagging 和 boosting 方法中),我们会使用单一的基础学习算法,这样一来我们就有了以不同方式训练的同质弱学习器。
这样得到的集成模型被称为「同质的」。然而,也有一些方法使用不同种类的基础学习算法:将一些异质的弱学习器组合成「异质集成模型」。
很重要的一点是:我们对弱学习器的选择应该和我们聚合这些模型的方式相一致。如果我们选择具有低偏置高方差的基础模型,我们应该使用一种倾向于减小方差的聚合方法;而如果我们选择具有低方差高偏置的基础模型,我们应该使用一种倾向于减小偏置的聚合方法。
这就引出了如何组合这些模型的问题。我们可以用三种主要的旨在组合弱学习器的「元算法」:
- bagging ,该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。
- boosting ,该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。
- stacking ,该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。
非常粗略地说,我们可以说 bagging 的重点在于获得一个方差比其组成部分更小的集成模型,而 boosting 和 stacking 则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)。
各类集成学习的特点
Bootstrap aggregating 简称为 Bagging。
Bagging (Boostrap Aggregating) 是由 Breiman 于 1996 年提出,基本思想如下:
- 每次采用有放回的抽样从训练集中取出 (n) 个训练样本组成新的训练集。
- 利用新的训练集,训练得到 (M) 个子模型 ({h_1, h_2, …, h_M})。
- 对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别;对于回归问题,采用简单的平均方法得到预测值。
Bagging 算法如下所示:
假设对于一个包含 (M) 个样本的数据集 (T),利用自助采样,则一个样本始终不被采用的概率是 (\left(1 - \frac{1}{M}\right)^M),取极限有:
$$ \lim_{x \to \infty} \left(1 - \dfrac{1}{M}\right)^M = \dfrac{1}{e} \approx 0.368 $$
即每个学习器仅用到了训练集中 (63.2\%) 的数据集,剩余的 (36.8\%) 的训练集样本可以用作验证集对于学习器的泛化能力进行包外估计 (out-of-bag estimate)。
Boosting
Boosting 是一种提升算法,可以将弱的学习算法提升 (boost) 为强的学习算法。基本思路如下:
- 利用初始训练样本集训练得到一个基学习器。
- 提高被基学习器误分的样本的权重,使得那些被错误分类的样本在下一轮训练中可以得到更大的关注,利用调整后的样本训练得到下一个基学习器。
- 重复上述步骤,直至得到 (M) 个学习器。
- 对于分类问题,采用有权重的投票方式;对于回归问题,采用加权平均得到预测值。
在「顺序化的方法中」,组合起来的不同弱模型之间不再相互独立地拟合。其思想是「迭代地」拟合模型,使模型在给定步骤上的训练依赖于之前的步骤上拟合的模型。「Boosting」是这些方法中最著名的一种,它生成的集成模型通常比组成该模型的弱学习器偏置更小。
Boosting 方法和bagging 方法的工作思路是一样的:我们构建一系列模型,将它们聚合起来得到一个性能更好的强学习器。然而,与重点在于减小方差的 bagging 不同,boosting 着眼于以一种适应性很强的方式顺序拟合多个弱学习器:序列中每个模型在拟合的过程中,会更加重视那些序列中之前的模型处理地很糟糕的观测数据。
直观地说,每个模型都把注意力集中在目前最难拟合的观测数据上。这样一来,在这个过程的最后,我们就获得了一个具有较低偏置的强学习器(我们会注意到,boosting 也有减小方差的效果)。和 bagging 一样,Boosting 也可以用于回归和分类问题。
由于其重点在于减小偏置,用于 boosting 的基础模型通常是那些低方差高偏置的模型。例如,如果想要使用树作为基础模型,我们将主要选择只有少许几层的较浅决策树。
而选择低方差高偏置模型作为 boosting 弱学习器的另一个重要原因是:这些模型拟合的计算开销较低(参数化时自由度较低)。
实际上,由于拟合不同模型的计算无法并行处理(与 bagging 不同),顺序地拟合若干复杂模型会导致计算开销变得非常高。
一旦选定了弱学习器,我们仍需要定义它们的拟合方式(在拟合当前模型时,要考虑之前模型的哪些信息?)和聚合方式(如何将当前的模型聚合到之前的模型中?)在接下来的两小节中,我们将讨论这些问题,尤其是介绍两个重要的 boosting 算法:自适应提升(adaboost )和梯度提升(gradient boosting)。这两种元算法在顺序化的过程中创建和聚合弱学习器的方式存在差异。自适应增强算法会更新附加给每个训练数据集中观测数据的权重,而梯度提升算法则会更新这些观测数据的值。这里产生差异的主要原因是:两种算法解决优化问题(寻找最佳模型——弱学习器的加权和)的方式不同。
1 | from sklearn.ensemble import GradientBoostingClassifier |
堆叠(Stacking)
Stacking 是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。
| Criteria 标准 | Bagging 套袋 | Boosting 提升 | Stacking 堆叠 |
|---|---|---|---|
| Approach 方法 | 并行集成学习技术 | 顺序集成学习技术 | 元集成学习技术 |
| Base Models 基础型号 | 独立训练的多个基础模型 | 按顺序训练的一系列基础模型 | 多种基础模型与元学习器相结合 |
| Training Method 训练方法 | 带替换的随机抽样(引导程序) | 训练实例的自适应重新加权 | 结合基础模型的预测 |
| Aggregation 聚合 | 平均(回归)或投票(分类) | 基于绩效的加权投票 | 通过元学习器进行组合 |
| Bias-Variance Trade-off 偏差-方差权衡 | 专注于减少方差 | 专注于减少偏见 | 可以减少偏差和方差 |
| Model Diversity 模型多样性 | 具有不同数据子集的相似基础模型 | 通过关注错误来迭代改进模型 | 捕捉不同方面的多种基础模型 |
| Interpretability 可解释性 | 一般可解释(例如,随机森林) | 可根据所使用的基本模型进行解释 | 可以保留基于元学习器的可解释性 |
| Complexity 复杂 | 通常复杂度较低的模型(例如决策树) | 可以适应复杂的模型(例如梯度提升) | 灵活,可以包括简单和复杂的模型 |
| Performance 表现 | 性能稳健,不易过度拟合 | 通常会产生更高的性能,但可能会过度拟合 | 性能高度依赖于基础模型和元学习器 |
常用的集成学习算法实现
bagging算法实现:
随机森林:随机森林 (Random Forests) 是一种基于决策树的算法,广泛应用于 Bagging 中。它涉及在训练数据和特征的不同子集上训练多个决策树,然后使用简单的平均或多数投票方法组合它们的输出。当底层模型容易过度拟合或对用于训练的特定特征敏感时,随机森林尤其有效。
Bagged Decision Trees: Bagged Decision Trees 是一种简单的 bagging 算法,涉及在训练数据的不同子集上训练多个决策树。然后使用简单的平均或多数投票方法组合决策树的输出。当底层模型不稳定或容易过度拟合时,Bagged Decision Trees会很有用。
Bagged K-Nearest Neighbors (KNN): Bagged KNN 是一种装袋算法,涉及在训练数据的不同子集上训练多个 KNN 模型。然后使用简单的平均或多数投票方法组合 KNN 模型的预测。当底层模型容易过度拟合或对用于训练的特定特征敏感时,Bagged KNN 会很有用。
Boosting算法实现:
Adaboost-boosting: 其工作原理是迭代地重新加权训练数据中的样本,以便在后续迭代中为错误分类的样本赋予更高的权重。 AdaBoost 在数据不平衡的情况下很有用,因为它有助于提高模型在少数类上的性能。 https://leovan.me/cn/2018/12/ensemble-learning/
GBDT: 基于回归树的梯度提升树模型框架。
XGBoost: XGBoost 是一种基于梯度提升的提升算法,但使用更正则化的模型公式来控制过度拟合。当底层模型容易过度拟合或对用于训练的特定特征敏感时,XGBoost 会特别有效。
LightGBM: GBDT 模型在查找最优分裂点时需要扫描所有的样本计算信息增益,因此其计算复杂度与样本的数量和特征的数量成正比,这使得在处理大数据量的问题时非常耗时。LightGBM 是针对这个问题的一种改进框架。
常见集成方式
不论我们使用那种集成模型,bagging和stacking都会基于不同的基学习器产生多个不同的分类结果,所以我们最终需要对所有分类器的结果进行集成,得到最终结果。针对多个子分类器进行集成的方法整体分为两类:
对于回归预测(数值预测)
- 简单平均(Simple Average),就是取各个分类器结果的平均值。
$$G(x) = \frac{1}{T}\sum\limits_{t = 1}^T {g_t(x)}$$ - 加权平均(Weighted Average)。
$$ G(x) = \frac{1}{T}\sum\limits_{t = 1}^T {\alpha _t \cdot {g_t}(x)} ,{\alpha _t} \ge 0 $$
对于分类(类别预测)
简单投票(Majority Voting):就是每个分类器的权重大小一样,少数服从多数,类别得票数超过一半的作为分类结果 。
$$ G(x) = sign\left( {\sum\limits_{t = 1}^T {1 \cdot {g_t}(x)} } \right) $$加权投票(Weighted Majority Voting):每个分类器权重不一。
$$ G(x) = sign\left( {\sum\limits_{t = 1}^T {\alpha _t \cdot {g_t}(x)} } \right),{\alpha _t} \ge 0 $$概率投票(Soft vote):有的分类器的输出是有概率信息的,因此可用概率投票。
应用
集成学习技术已成功应用于广泛的机器学习应用中。这些应用程序的一些示例包括:
- 图像识别:集成学习已被用来提高图像识别算法的准确性,特别是在图像复杂或有噪声的情况下。
- 自然语言处理:集成学习已被用来提高自然语言处理算法的准确性,特别是在语言复杂或模糊的情况下。
- 推荐系统:集成学习已被用来提高推荐系统的准确性,特别是在底层数据有噪声或不完整的情况下。
- 异常检测:集成学习已用于提高异常检测算法的准确性,特别是在基础数据高度可变或嘈杂的情况下。