Bagging Boosting Stacking
# 前言
很多人在竞赛(Kaggle,天池等)或工程实践中使用了集成学习(例如,RF、GTB等),确实也取得了不错的效果,在保证准确度的同时也提升了模型防止过拟合的能力。但是,我们真的用对了集成学习吗?
**sklearn** 提供了 **sklearn.ensemble** 库,支持众多集成学习算法和模型。恐怕大多数人使用这些工具时,要么使用默认参数,要么根据模型在测试集上的性能试探性地进行调参(当然,完全不懂的参数还是不动算了),要么将调参的工作丢给调参算法(网格搜索等)。这样并不能真正地称为“会”用 sklearn 进行集成学习。
学会调参是进行集成学习工作的前提。然而,第一次遇到这些算法和模型时,肯定会被其丰富的参数所吓到,要知道,教材上教的伪代码可没这么多参数。没关系,暂时,我们只要记住一句话,参数可分为两种:
1. **一种是影响模型在训练集上的准确度或影响防止过拟合能力的参数**
2. **另一种不影响这两者的其他参数。**
模型在样本总体上的准确率(后简称准确度)由其**在训练集上的准确度及其防止过拟合的能力所共同决定**,所以在调参时,我们主要对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐!
# 逻辑图
::: hljs-center
![yuque_diagram.jpg](https://cos.easydoc.net/17082933/files/ke885kqx.jpg)
:::
# Ensemble
集成学习是先产生一组个体学习器进行学习,再使用某种策略将它们结合起来,从而获得比单个学习器更好的**学习效果**的一种机器学习方法。
集成学习**ensemble learning**是通过构建并结合多个学习器来完成学习任务。其一般结构为:
1. **个体学习器**(individual learner):集成学习的一般结构都是先产生一组个体学习器,再用某种策略将他们结合起来,个体学习器通常由一个现有的学习算法从训练数据中产生。
2. **基学习器**(base learner):如果个体学习器都是从某一种学习算法从训练数据中产生,则称这样的集成学习是同质的(homogenerous),此时的个体学习器也称作基学习器,相应的学习算法称作基学习算法。
3. **组件学习器**(component learner):集成也可以是包含不同类型的个体学习器,例如决策树和神经网络,这样的集成是异质(heterogenous)的,异质集成中的个体学习器称为组件学习器或者直接称为个体学习器。
也可以从预测能力强弱上分为**强学习器**(strong learner)和**弱学习器**(weak learner)
通常选取个体学习器的准则是:
- 个体学习器要有一定的准确性,预测能力不能太差。
- 个体学习器之间要有多样性,即学习器之间要有差异。
通常基于实际考虑,往往使用强学习器。强学习器的一个显著的好处就是可以使用较少数量的个体学习器来集成就可以获得很好的效果。
从个体学习器的生成方式来看,目前的集成学习方法大概可以分作两类:
- 个体学习器之间存在强依赖关系、必须串行生成的序列化方法,每一轮迭代产生一个个体学习器。其中以Boosting 为代表。
- 个体学习器之间不存在强依赖关系、可同时生成的并行化方法。其中以 Bagging 和随机森林 Random Forest为代表,还有以个体学习器的输出作为新学习器输入的 Satacking。
---
目前,有三种常见的集成学习框架:**bagging,boosting** 和 **stacking**。国内,南京大学的周志华教授对集成学习有很深入的研究,其在09年发表的一篇概述性论文《Ensemble Learning》对这三种集成学习框架有了明确的定义,概括如下:
# Bagging
## 定义
从训练集中进行子抽样组成每个**基模型(个体学习器)** 所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果:
::: hljs-center
![image.png](https://cos.easydoc.net/17082933/files/ke88b16r.png)
:::
## 原理
1. **Bagging** 直接基于自助采样法 **bootstrap sampling**。自助采样法的步骤是:
- 给定包含 $N$ 个样本的**数据集,即训练集:**
- 先随机取出一个样本放入采样集中,再把该样本放回原始数据集。
- 这样经过 $N$ 次随机采样操作,得到包含 $N$ 个样本的**采样集,即子训练集**。
初始训练集中有的样本在采样集中多次出现,有的则从未出现。一个样本始终不在采样集中出现的概率是 $\left(1-\frac{1}{N}\right)^{N}$ 。 根据 $\lim _{N \rightarrow \infty}\left(1-\frac{1}{N}\right)^{N}=\frac{1}{e} \approx 0.368$ ,因此训练集中约有 63.2%的样本出现在子训练集中。
2. 自助采样法给**Bagging**算法带来了额外的优点:由于每个基学习器只用初始训练集中约 63.2% 的样本来训练,剩下的约 36.8% 的样本**可用作验证集来对泛化性能进行包外估计。**
3. **Bagging的基本流程:**
- 经过 $M$ 轮 bootstrap 采样,可以得到 $M$ 个包含 $N$ 个训练样本的子训练集。
- 然后基于每个子训练集训练出一个个体学习器。
- 最后将这 $M$ 个个体学习器进行组合,得到集成模型。
4. **在使用Bagging学习器进行预测时:**
- 分类任务采取简单投票法,取每个个体学习器的预测类别的众数。
- 回归任务使用简单平均法,取每个个体学习器的预测值的平均。
5. **从偏差-方差分解的角度来看:**
- **Bagging**主要关注降低方差,它能平滑强学习器的方差。因此它在非剪枝决策树、神经网络等容易受到样本扰动的学习器上效果更为明显。
- **Boosting** 主要关注降低偏差,它能将一些弱学习器提升为强学习器。因此它在SVM 、knn 等不容易受到样本扰动的学习器上效果更为明显。
## 示例:随机森林
随机森林**Random Forest:RF** 是**Bagging**的一个扩展变体。具体请参看此篇博文中的介绍。
# Boosting
## 定义
**boosting**训练过程为阶梯状,弱学习器按次序一一进行训练(实现上可以做到并行),弱学习器的训练集按照某种策略每次都进行一定的转化。对所有弱学习器预测的结果进行线性综合产生最终的预测结果。
::: hljs-center
![image.png](https://cos.easydoc.net/17082933/files/ke88qy7u.png)
:::
**提升方法**(**Boosting**),是一种可以用来减小监督学习中偏差的机器学习算法。面对的问题是迈可·肯斯(Michael Kearns)提出的:一组弱学习器的集合能否生成一个强学习器?
尽管提升方法在算法上不受限制,但是大多数提升算法都包括这样一个过程——迭代弱学习器并将其最终汇总为一个强学习器。加和的过程通常根据它们的分类准确率给予不同的权重。加和弱学习器之后,数据通常会被重新加权:错误分类的样本获得更高的权重,正确分类的样本权重降低。这样,之后的弱学习器就会更加聚焦于之前的弱学习器错误分类的那些样本。
一个经典的提升算法例子是AdaBoost。一些最近的例子包括LPBoost、TotalBoost、BrownBoost、MadaBoost及LogitBoost。许多提升方法可以在AnyBoost框架下解释为在函数空间利用一个凸的误差函数作梯度下降。
## 原理
提升方法(**boosting**) 是一种常用的统计学习方法。在分类问题中,它通过**改变训练样本的权重学习多个分类器,并将这些分类器们进行线性组合**来提高分类的能力。
1. 提升方法的基本思想是:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。类似于”三个臭皮匠顶一个诸葛亮“。
2. 提升方法的理论基础是:**强可学习与弱可学习是等价的**。在概率近似正确(probably approximately correct,PAC)学习的框架下:
• 强可学习(strongly learnable):一个概念(或一个类别),若存在一个多项式的学习算法能够学习它并且正确率很高,那么称这个概念是强可学习的。
• 弱可学习(weakly learnable):一个概念(或一个类别),若存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么称这个概念是弱可学习的。
3. 有趣的是,Schapire后来证明强可学习与弱可学习是等价,他使用构造的方法证明:**一个概念弱可学习的充要条件是这个概念强可学习**。
即:若在学习中发现了弱学习算法,则可以通过某些办法将它提升为强学习算法。
4. 对于**分类问题**而言,求一个比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)要容易得多。
5. **Boosting**就是一族可以将弱学习器提升为强学习器的算法。这族算法的工作原理类似:
- 先从初始训练集训练出一个基学习器。
- 再根据基学习器的表现对训练**样本分布**进行调整,使得先前基学习器做错的训练样本在后续受到更多关注。
- 然后基于调整后的样本分布来训练下一个基学习器。
- 如此重复,直到基学习器数量达到事先指定的值M 。
- 最终将这 $M$ 个基学习器进行加权组合。
## 算法实例
>**[AdaBoost](AdaBoost)** 算法
>(Boosting 族算法最著名的代表)
>**Gradient Boosting**
>=> GBDT => [XGBoost](XGBoost) + LightGBM
# Stacking
stacking将训练好的所有基模型对训练基进行预测,第 j 个基模型对第 i 个训练样本的预测值将作为新的训练集中第 i 个样本的第 j 个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测:
::: hljs-center
![image.png](https://cos.easydoc.net/17082933/files/ke892gem.png)
:::
---
转载:[Bagging Boosting Stacking](https://www.yuque.com/agoclover/ml/gf3a5i#cUKkx)