集成学习之bagging、boosting、stacking

集成学习

以下内容仅作为自己的学习记录。
集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。

集成学习中的个体学习器通常由一个现有的算法从训练数据集产生,比如决策树算法、神经网络算法。集成学习主要有两种方式:同质集成(个体学习器都是一个类型的,比如都是神经网络算法)和异质集成。

要获得好的集成,个体学习器应“好而不同”,即个体学习器的准确率要高,同时个体学习器之间的差异要高,即要有多样性。

集成学习方法主要分为两大类:

  1. 个体学习器间存在强依赖关系、必须串行生成的序列化方法,代表算法有Boosting;
  2. 个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表算法有Bagging和Random Forest;

Boosting

boosting算法是一族可以将弱学习器提升为强学习器的算法。boosting族算法最著名的是AdaBoost算法。AdaBoost算法可以这样理解:属于加性模型,学习算法为前向分步算法;具体地,对于AdaBoost二分类算法而言,损失函数为指数损失函数,对于AdaBoost回归而言,损失函数为均方差损失函数。

从偏差-方差均衡的角度看,boosting算法主要关注降低偏差,因此boosting算法能基于泛化性能相当弱的学习器构建出很强的集成。

Bagging与随机森林

Bagging

Bagging在采样生成具体的训练样本集的时候使用的是bootstrap sampling。在对预测输出进行结合时,bagging对分类任务使用简单投票法;对回归任务使用简单平均法。

训练一个bagging集成 与直接使用基学习器训练一个学习器的复杂度同阶,说明bagging是一个非常高效的集成学习算法;与标准的adaboost算法只能适用于二分类不同,bagging算法可以不经修改地适用于分类和回归任务。

bagging所采用的自助采样法给bagging带来了另外一个优点:由于每个基学习器只使用了初始训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对泛化性能进行“包外估计”(out-of-bag estimation)。(和K折交叉验证的作用很像)

包外样本还要很多其他用途。比如当基学习器是决策树时,可以利用包外样本来辅助剪枝;当基学习器是神经网络时,可以使用包外样本来进行early stopping以减少过拟合的风险。

从偏差-方差均衡角度来看,bagging更关注于减少方差,因此bagging在不剪枝的决策树、神经网络等易受样本扰动的学习器上效果更为显著。

随机森林

是Bagging的扩展变体。RF的基学习器同样是决策树,但是和bagging不同的地方在于RF在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时,是在当前节点的属性集合中选择一个最优属性(对于CART而言,选择标准为平方误差最小或者基尼指数最小);但是在RF中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含 k k k个属性的子集,然后在这个子集中选择一个最优属性用于划分。这里的 k k k值控制了随机性的引入程度,一般而言 k = log ⁡ 2 b k=\log_2b k=log2b(b表示总的属性个数)。

bagging中基学习器的不同(即多样性)来自于对样本的扰动(通过对初始训练集进行自助采样),而RF的不同还来自于对属性的扰动,这使得RF的集成泛化性能能够通过基学习器的多样性的增加而提升。

结合策略

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

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

平均法

主要针对回归问题而言;主要有两种:

  1. 简单平均法;
  2. 加权平均法;

投票法

主要针对分类问题而言,主要有三种:

  1. 绝对多数投票法;
  2. 相对多数投票法;
  3. 加权投票法。

学习法

当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合,Stacking是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或者元学习器。

Stacking先从初始数据集训练处初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新的数据集中,初级学习器的输出被当做次级学习器的输入,初始样本的标记仍被当做样例标记。在次级学习器的训练阶段,用的是初级学习器产生的新的数据集,如果直接用初始训练集来训练次级学习器,会产生比较大的过拟合风险。

多样性增强

在集成学习中需要有效地生成多样性大的个体学习器,那么如何增强多样性呢?一般的思路是在学习过程中引入随机性,常见做法是对数据样本输入属性输出表示算法参数进行扰动。

  1. 数据样本扰动。给定初始数据集,可以从中产生出不同的数据子集,再利用不同的数据子集训练出不同的个体学习器。数据样本扰动通常是基于采样法,例如在bagging中使用自助采样,在AdaBoost中使用序列采样(这个怎么处理的?)。数据样本扰动法对“不稳定基学习器”,比如决策树、神经网络等很有效;对于数据样本扰动不敏感的学习器,比如SVM、朴素贝叶斯、K近邻,效果不是那么显著;
  2. 输入属性扰动。训练样本通常由一组属性描述,不同的“子空间”提供了观察数据的不同视角。当训练数据集冗余属性多,可以采用这种方法;当数据属性少,或者冗余属性少,则不宜采用这种方法。
  3. 输出表示扰动。目前不是很懂,后续完善补充。
  4. 算法参数扰动。基学习器算法一般都有参数需要设置,例如神经网络的隐层神经元数量、权重值,通过设置不同的参数,可以产生差别比较大的个体学习器。实际上,在使用单一学习器的时候,我们通常利用交叉验证的方式来确定参数值,这事实上已经使用了不同参数来训练多个学习器,只是我们最后选择效果最好的那个学习器,而集成学习相当于把这些学习器都利用起来;由此可以看出,集成学习技术的实际计算开销并不比使用单一学习器大很多。

书中在最后提到一句:为什么Adaboost在训练误差达到零之后继续训练仍能提高泛化性能?但是如果一直训练下去,过拟合还是会出现。(没有给出理论的分析和解释)

后续再补充完善。

突然想到一点:在偏差一定的情况下,学习器的方差越大,是不是说明这个学习器越容易过拟合? 由于RF是bagging,关注于减少方差,并且我们知道RF是不容易过拟合的,即RF方差小,不容易过拟合;所以想到是不是方差大,学习器容易过拟合呢?即学习器的方差和学习器的过拟合间有没有什么联系呢?

过拟合的本质是学习器学到了数据集中的异常数据模式(噪声数据导致),导致模型复杂度高;而RF由于是bagging,引入了样本随机和属性随机,所以可能只有部分基学习器会遇到噪声数据(假设噪声数据比较少,那么在自助抽样的时候采样到噪声数据的可能性就比较少),导致该基学习器学习的是异常的数据模式,并且由于两个随机的引入,基学习器本身的学习能力就比较弱,所以可能学习不了异常的数据模式,即使学习到了异常的数据模式,导致基学习器过于复杂(决策树过深,叶子节点过多),但是也只有少数的基学习器会这样,由于bagging算法的特性,这些异常的基学习器对于最终的强学习器的影响比较弱(平均,投票),所以整体而言bagging算法的方差比较低,不容易过拟合。相对的,boosting算法就容易过拟合,因为boosting算法关注的是减少偏差,在串行训练基学习器的时候,都是用的整个训练数据集,一旦训练数据集中存在异常的数据模式,那么在每一轮的训练过程中,每个基学习器都会受到这些异常数据模式的影响,从而导致最终的强学习器容易过拟合,方差大。

还有一个问题:bagging中的树(比如RF)和boosting中的树(比如GBDT)平均而言谁更深?

个人理解:bagging中的树更深。我们知道bagging中的每棵树在生成的时候都是尽可能生长,尽可能的去拟合该棵树的训练数据集,尽可能减少单棵树的偏差,增强单棵树的学习能力;而boosting中的树如果都完全生长,则过拟合风险大大增加,所以相对而言boosting中的树会浅一些。既然bagging中的树更深,boosting中的树相对浅,那为什么说boosting是专注于减少偏差呢?虽然bagging中的树可能深一些,但是由于两个随机性的引入(RF),导致训练每棵树的样本和属性都只是部分的,但是boosting训练的时候用的是整个数据集,没有引入随机性,所以虽然相对浅一些,但偏差肯定更小,所以说boosting专注减少偏差。

参考

《机器学习》,周志华

你可能感兴趣的:(学习记录,算法,机器学习)