集成学习 bagging,boosting和stacking

集成学习是通过训练弱干个弱学习器,并通过一定的结合策略,从而形成一个强学习器。有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)等。

集成学习先产生一组“个体学习器”(individual learner),再用某种策略将它们结合起来。通常来说,很多现有的学习算法都足以从训练数据中产生一个个体学习器。一般来说,我们会将这种由个体学习器集成的算法分为两类:

image-20230202220404695

1.同质(homogeneous)的,即集成中仅包含同种类型的一个体学习器,像“决策树集成”中就仅包含决策树,“神经网络集成”中就全是神经网络。同质集成中的个体学习器又称为基学习器(base learner),相应的学习算法也被称为基学习算法(base learning algorithm)。

2.异质(heterogenous)的,相对同质,异质集成中的个体学习其就是由不同的学习算法生成的,这是,个体学习器就被称为组件学习器(component learner)。

其中用的比较多的是同质学习器同质学习器按照个体学习器之间是否存在依赖关系可以分为两类:

  • 第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法
  • 第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林(Random Forest)系列算法。

随机森林

  1. 样本随机:从数据集中用bagging方式随机选取n个样本
  2. 特征随机:从所有特征d中随机选择k个属性(k<d),然后从k个属性中选取最佳分割属性作为节点建立CART决策树
  3. 重复1.2步m次建立m棵CART树
  4. 这m棵CART树形成随机森林,通过投票表决决定输入属于哪一类。

所以说:RF = 决策树 + bagging + 随机特征选取

image-20230202220603587

目前,有三种常见的集成学习框架:bagging,boosting和stacking

1. Bagging

bagging: 从训练集从进行子抽样组成每个基模型所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果。

  • 如果是回归任务,bagging 输出是各个弱评估器输出的平均值;
  • 如果是分类任务,bagging 输出是各个弱评估器输出的结果的少数服从多数voting。

    image-20230202221715049

2. Boosting

boosting

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

image-20230203160514616

bagging vs boosting:

装袋法 Bagging 提升法 Boosting
弱评估器 相互独立并行构建 相互关联,按顺序依次构建。
先建弱分类器的预测效果影响后续模型的建立
建树前的抽样方式 样本有放回抽样
特征无放回抽样
样本有放回抽样(后面步骤抽样权重不一样)
特征无放回抽样
先建弱分类器的预测效果可能影响抽样细节
集成的结果 回归平均
分类投票
每个算法具有自己独特的规则,一般来说:
(1)表现为某种分数的加权平均
(2)使用输出函数
目标 降低方差
提高模型整体的稳定性来提升泛化能力
本质是从“平均”这一数学行为中获利
降低偏差
提高模型整体的精确度来提升泛化能力
从众多弱分类器叠加后可以等同于强学习器
单个评估器容易过拟合的时候 具有一定的抗过拟合能力 具有一定的抗过拟合能力
单个评估器的效果比较弱的时候 可能失效 大概率会提升模型表现
代表算法 随机森林 梯度提升树GBDT,Adaboost
Boosting 代表算法 Adaboost

Adaboost算法流程如下(来自于周志华《机器学习》P174)。

ml12-19

这里定义的是简单的二分类数据任务,其中:

  1. : 表示数据集,后面的表示第轮重新划分后的数据集。
  2. : 表示第轮基模型
  3. : 表示第轮错误率
  4. : 可理解为真实值
  5. :权重,是最后用来对各个基学习器加权的权重
  6. : 表示第轮归一化因子

有了以上定义,我们来看看整个算法的流程:给定的训练集,使用基学习算法,训练轮。图示步骤解释,给个具体计算例子

  1. 对于第一轮,基于每个样本一个相等的权重
  2. 从第1轮到到第T轮做步骤3-7
  3. 用基学习算法,如决策树,对第轮数据集进行学习得到
  4. 计算第轮获得的对样本错误率
  5. 如果错误率大于0.5,直接break(二分类)
  6. 计算权重,因为,而。所以中ln内部是大于等于1的,那么。并且对于升高,下降的
  7. 这里,如果分类正确,那么错误率高,而是下降的,用来计算相对是下降的。反之亦然。这样符合错误分类样本权重增加,正确分类样本权重下降的原则。

一般表达:

  1. 首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。
  2. 然后,训练弱分类器。具体训练过程中是:如果某个训练样本点,被弱分类器准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  3. 最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
  4. 换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

利用sklearn实现简单的adaboost代码:

1
2
3
4
5
6
7
8
9
from sklearn.ensemble import AdaBoostClassifier # For Classification
from sklearn.ensemble import AdaBoostRegressor # For Regression
from skleran.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier()
clf = AdaBoostClassifier(n_estimators=100, base_estimator=dt, learning_rate=1)
# Above I have used decision tree as a base estimator,
#you can use any ML learner as base estimator if it accepts sample weight
clf.fit(x_train, y_train)
  • learning_rate: 控制在最后的组合中每个弱分类器的权重,需要在learning_rate和n_estimators间有个权衡。

至于GBDT算法,可以看GBDT部分.

3.Stacking

stacking:先从初始训练集中训练一个初级学习器,然后将样本输入得到,将构建新的数据集,继续训练得到新的学习器。但这样直接用初级学习器的训练集作为输入,得到新的训练集很容易过拟合。因此一般用Kfold划分初始训练集,用留出法得到留出的那一个fold数据集来得到下一级训练集。

具体算法流程如下,西瓜书P184。

image-20230203184722866

步骤1-3 是训练出来个体学习器,也就是初级学习器。

步骤5-9是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。

步骤11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。

如果想要预测一个数据的输出,只需要把这条数据用初级学习器预测,然后将预测后的结果用次级学习器预测便可。

Inference

  1. 机器学习算法之Boosting
  2. 深入浅出ML之Boosting家族
  3. Bagging Boosting Stacking
  4. 详解 bagging、boosting 以及他们的 4 点区别
  5. Bagging与Boosting算法原理小结
  6. 随机森林
  7. boosting-algorithm-in-python
  8. Python 机器学习实战 第五章 AdaBoost
  9. 集成学习中的 stacking 以及python实现