集成学习更深入的内容可以参考周志华老师的《集成学习:基础与算法 》,限于笔者的能力和精力,过于深入的东西笔者还没有理解
许是开始就没学会,也或者是因为时间太长忘光光了,重新学习集成学习这章。
概述
集成学习(Ensemble Learning)是将多个学习器结合,构建一个有较强性能的机器学习器的方法。
集成学习的一般结构: 一组个体学习器+结合策略。一般来说集成的学习器都是弱学习器(弱学习器继承效果相对较好)
根据集成学习的各基估计器类型是否相同,可以分为同质和异质两种方法。
分类
根据每个基学习器是否同属一个种类。可以将集成学习分为同质和异质两种类型。
同质集成学习
同质表示集成的个体学习器属于同种类型,这时的个体学习器又称为基学习器。
目前来说,同质个体学习器的应用最为广泛。一般的集成学习均指同质个体学习器。而同质个体学习器使用最多的模型是 CART 决策树和神经网络。
周志华老师的《机器学习》一书中证明过若基分类器的错误率相互独立,根据 Hoeffding 不等式可得当个体分类器数目 T 增大时集成的错误率将指数级下降。
异质集成学习
异质指是所有的个体学习器不全是一个种类的,这时的个体学习器一般不称作基学习器,常称为“组件学习器”。例如对分类问题,对训练集采用支持向量机个体学习器、逻辑回归个体学习器和朴素贝叶斯个体学习器来学习,再通过某种结合策略来确定最终的分类强学习器。
好而不同
要想获得比较好的集成效果,我们想要的是不同个体学习器应“好而不同”,自身的准确性最起码优于随机猜测,而且个体学习器之间应该尽可能的不同(多样性),但事实上是这两种特性是无法兼得的,增加多样性要牺牲准确性,如何产生“好而不同”的个体学习器恰恰是集成学习研究的核心。
集成学习个体学习器产生常用的方法有两种:
- 第一种是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法有 Bagging 和随机森林(Random Forest)系列算法。
- 第二类是个体学习器之间存在强依赖关系,一般来说当前的个体学习器的输入要依赖于上一个个体学习器的输出,一系列个体学习器基本都需要串行生成,代表算法是 Boosting 系列算法。
使用不同的算法或者使用不同的数据集理论上也可以得到不同的个体学习器,但是需要大量额外的工作,例如本文提到的增强数据多样性的方法。
Bagging–并行
前边说到完全独立的基学习器在现实中无法做到,因此想要构建差异较大的基学习器可以从训练集出发,对训练样本进行采样获得不同的训练自己,每一个训练子集的一个基学习器,这样可以获得具有较大差异的基学习器(前提是个体学习器不能太差),另外为了避免采样数据不完整可能会导致训练过拟合(子数据集比较小,未必能真实反应训练样本特征),因而可以考虑使用有交叠的采样子集。(bootstrap sampling)
这就是 Bagging(Bootstrap Aggregating)算法的核心思想——在原始训练集的随机子集上构建一类黑盒估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。
该方法通过在构建模型的过程中引入随机性,来减少基估计器的方差。
好处:
- 训练简单,集成高效
- 减小过拟合,通常在强分类器和复杂模型上使用时表现的很好。
算法步骤:给定一个大小为 n 的训练集,Bagging 算法从中均匀、有放回地(即使用自助抽样法)选出 m 个大小为 n’的子集,作为新的训练集。在这 m 个训练集上使用分类、回归等算法,则可得到 m 个模型,再通过取平均值、取多数票等方法,即可得到 Bagging 的结果。
如果抽取的数据集的随机子集是特征的随机子集,叫做随机子空间 (Random Subspaces).
如果基估计器构建在对于样本和特征抽取的子集之上时,叫做随机补丁(Random Patches).
从偏差-方差分解的角度看,bagging 主要关注降低方差, 因此它在不剪枝决策树、神经网络等易受样本扰动的学习期上效果更为明显。
RF
随机森林是 bagging 集成的一个很好的例子,具体介绍请查看随机森林
Boosting–串行
Boosting 算法是一类将弱学习器(分类正确率略大于或小于 50%,否则可能导致分类器权重变成负数如 AdaBoost)提升为强学习器的集成学习方法,通过改变训练样本的权值,学习多个分类器,并将这些分类器进行线性组合,提高泛化性能。
大多数 Boost 方法会改变数据的概率分布(数据权值),具体而言就是提高前一个学习器错分类的数据的权值,降低正确分类数据的权值,使得被错误分类的数据在下轮的训练中更受关注 (串行);
然后根据不同分布调用弱学习算法得到一系列弱学习器实现,再将这些学习器线性组合。
强化之好处
关注降低偏差进而能产生较好的集成效果
AdaBoost–数据挖掘十大算法之一
Adaboost 的核心观点是在生成基学习器的过程中重点关注前边模型学习错的数据,这一步主要通过不断改变原数据的分布(分类错的数据占的权重变大),每一个基分类器按照最小化指数风险函数的策略来确定其权重,最后选择 sign 函数作为激活函数来得到最后的模型。
AdaBoost 算法可以看成是加法模型(基分类器的线性组合)、损失函数为指数函数()、学习算法为前向分步算法时的二类分类模型(从另一个角度看,AdaBoost 是一个有内涵的机器学习方式)
- 学习器的学习策略是最小化指数风险函数(理想的将在下最小化分类误差)
- 学习过程中强调被分类错误的数据:
- 提高误差率小的弱分类器的权值(加权多数表决)(最小化分类器指数风险函数得到(见周志华机器学习)),该值的大小反映了学习器的重要程度,所有权值之和并不为 1
- 提高分类器分类错误的样本数据的权重()
- 误差率的解释:由于数据的样本有权重,所以在在计算模型的分类误差率时要把分类错误的样本数据占的权值来进行计数。即训练器上的分类误差率等于各个分类错误样本的权值之和。(风险损失函数应该是求和)
- 分类错误的样本权值被扩大(分类器分类正确的几率 odds).
- H(x)的自变量的正负确定输出的类的类型,绝对值决定分类的置信度
需要注意的是 Boosting 每一轮都要检查当前生成的基学习器是否满足基本条件,不满足会被直接抛弃掉,这时如果学习器不能采用重采样方法就会直接结束训练,可能达不到预设的训练轮数,集成效果也会大大下降。采用重采样方法的话可获得重启动的机会避免
前向分步算法
对于一个加法模型(additive model):
在给定风险损失函数和训练数据的条件下,经验风险极小化问题变成了:
上述损失函数的优化问题比较复杂,前向分步算法解决这一问题的思路是:从前向后每一步只学习一个基函数和系数然后逐步逼近优化目标,具体来说,每一步只需优化损失函数:
算法步骤(摘自李航大佬的《统计学习方法》):
训练误差分析
AdaBoost 最基本的性质是它能在学习过程中不断减少训练误差。
损失函数的整合更加简洁,保证,就能保证学习过程中能降低损失函数。
取等条件即是我们更新权重的方法
优缺点
想到 AdaBoost 一定要想到会在每一轮更新两个权重来把重点放在错误的数据上,这样优缺点就很明显了,集中在错误的数据上,能够实现很强的继承,但是如果错误数据本身是有问题的比如一些异常的数据,会极大影响模型的表现。
加性模型的 Adaboost 推导方法被认为是以类似牛顿迭代法来优化指数损失函数(统计视角[1],受此启发,通过将迭代优化过程替换为其他优化算法,产生了梯度提升算法以及 LPBoost 等变体算法。
牛顿迭代法和前向步分算法的相似点我认为是在于二者都在试图把复杂的优化问题简单化,通过一步步逼近来解决问题
树提升算法(boosting tree)
以决策树为基函数的提升方法叫做提升树,和 AdaBoost 一样都是采用加法模型和前向分步算法,提升树被认为是统计学习中性能最好的方法之一。
Model
注意这里的决策树所有的权重是一样的,这与 AdaBoost 有明显的的不同,或者来说会更简单一些,加性模型的前向步分算法是一个比较通用的求解算法,不同的树提升算法只是使用不同的损失函数,不过最后在学习过程都变成了通过经验风险最小化来寻找决策树对应的参数:
回归问题使用平方误差的损失函数,分类问题使用指数损失函数,一般决策问题则使用一般损失函数。
树的线性组合可以很好地拟合训练数据集,即使数据中的输入和输出之间的关系很复杂也是如此,因此提升树是一个高功能的学习算法。
分类决策树的强化算法与 AdaBoost 算法类似,只需按照前向分步算法最小化损失函数即可。
回归决策书主要是基学习器变成了回归树,之后的步骤和分类树是一样的,并且因为是平方损失函数,所以后边的参数寻优其实变成了对残差的学习(具体步骤可参考李航老师的《统计学习方法》)
Gradient Boosting
对于一般的损失函数,损失函数的优化问题变得困难,针对这一问题 Freidman 提出了梯度提升的寻优方法,该方法是最速下降法的一个近似方法,关键在于利用损失函数的负梯度在当前模型的值来作为回归问题提升树算法中残差的近似值来拟合回归树:
回归树的提升算法可以视作一个特例来辅助对算法的理解
梯度提升与梯度下降有相似之处,不过梯度下降是求得参数的梯度,而梯度提升求解的是函数的梯度,然后按照一定的步长()来更新函数,这样就可以不断地逼近最优解。
一般风险函数之下的残差有所变化,得到的是残差的近似值。
Gradient Boosting 只是一种寻优算法,以该算法为基础衍生出了许多 boot 模型。
采用决策树作为弱分类器的 Gradient Boosting 算法被称为 GBDT,有时又被称为 MART(Multiple Additive Regression Tree)。GBDT 中使用的决策树通常为 CART。GBDT 使用梯度提升(Gradient Boosting)作为训练方法。
RegionBoost
AdaBoost 方法固定权重意味着输入样本并不会改变基学习器的权重,这样的话有的时候分类可能是有问题的,下边介绍一种随着输入值改变的动态权重算法
两种分类器,一种划分种类,一种用来鉴别分类的可信度(以输入点与临近五个样本点之间的距离来衡量,KNN)
训练误差可能不会很高,但测试误差会相对更低。
XGBoost
XGBoost 是一个优化的分布式梯度增强库,设计为高效、灵活和可移植。在梯度增强框架下实现了机器学习算法。XGBoost 提供了一个并行的树增强,可以快速、准确地解决许多数据科学问题。
XGBoost 也使用决策树作为基估计器。适用于大数据集的学习。
但在 XGBoost 中,每棵树是一个一个往里面加的,每加一个都是希望效果能够提升。
一开始树是 0,然后往里面加树,相当于多了一个函数,再加第二棵树,相当于又多了一个函数,以此类推。
要保证加入新的函数能够提升整体表达效果。提升表达效果的意思就是说加上新的树之后,目标函数(就是损失)的值会下降。
通过在目标函数加上一个惩罚项来减少叶子节点的个数以防止过拟合。
优化目标函数:
结合策略
平均法
用于数值型输出,将各个个体学习群的输出进行平均或加权平均,作为集成学习的结果。
- 对于大规模数据集的集成,学习的权重较多,加权平均法易导致过拟合
一般来说,个体学习器性能差距大应该使用加权平均,相近则使用简单平均
投票法
一般用于分类任务,将各个个体学习器的输出进行投票,将投票结果作为集成学习的输出。
- 绝对多数投票法(超过半数)
- 相对多数投票法
- 加权投票法(与加权平均法类似)
根据基学习器的输出可以分为硬投票和软投票
- 输出为类标签–硬投票
- 输出为类概率–软投票
虽然分类器估计的类概率值一般不太准确,但是基于类概率的结合往往比直接基于类标签性能更好
基学习器的类型不同对应的类概率值不能直接进行比较,通常将类概率转化为类标记再进行投票
学习法
将基学习器(这时也称作初级学习器)的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器(这是也叫次级学习器)来得到结合的权重。
这种方法的一个典型代表是 Stacking
Stacking
注意:
- 为了防止过拟合一般会用交叉法或者留一法来训练初级学习器,用剩余数据训练次级学习器
周志华老师提到的另外两种可以用做次级学习器的模型:Multi-response Linear Regression & Bayesian Model Averaging。
多样性增强
可以采用输入样本扰动、输入特征扰动、输出表示扰动等方法来增加输入数据样本多样性。
输入样本扰动
根据原始数据产生多个不同种类的数据子集,然后利用不同的数据子集训练个体学习器。
- 重采样法,有放回采样得到固定样本容量的数据子集;
- 序列采样法,根据前一轮的学习结果进行采样;
- 混合采样方法。
输入样本扰动对决策树神经网络等这类不“稳定基学习器”很有用
输入特征扰动
从初始特征集中抽取出若干特征性子集,再基于每个特征子集训练基学习器。
不仅能产生差异性大的个体,还会因属性数的减少而大幅节省计算时间。
- 随机子空间算法
- 随机森林算法
- 特征及拆分:将原始特征集拆分为多个不相交的特征子集分别训练个体学习器。在高维特征的学习任务重,特征集拆分具有良好的表现效果。
冗余属性较少或者属性数目较少时不宜采用这种方法。
输出参数扰动
对输出表示进行操纵以增强多样性,可对训练样本的类标进行变动.
- 翻转法,随机改变一些训练样本的标记;
- 输出调制法,将分类输出转化为回归输出后构建个体学习器;
- 将原始任务拆解为多个可同时求解的子任务,或将多分类拆解为一系列的二分类问题。
算法参数
使用不同的参数集产生不同的个体学习器。
即使每个个体学习器都使用相同的训练集,由于使用的超参数不同,输出会随参数改变而变化。
example:在神经网络中,通过改变网络中的节点数,或者将不同的初始权重分配给网络,或者使用不同的网络拓扑结构来提高网络多样性。
参数较少的算法则可以通过改变学习过程的环节来达到扰动的目的。
多样性度量
多样性(度量涉及到的是个体学习器预测结果的差异性,一般会进行两两比较,主要通过预测结果列联表(contingency table)来实现:
不同的多样性度量方试都是基于上表进行的(m=a+b+c+d)
集成的好处
集成简单来说就是将基学习器组合起来,既然集合在一块,往往会有一种回归均值的作用,起到取长补短的作用
- 训练集上同等表现的模型在面对较为巨大的假设空间时,集成能得到更好的表现结果(统计)
- 集成能降低单个学习器局部收敛的风险,避免局部最小点泛化能力弱的情况(计算)
- 对于假设空间以外的假设,集成能够扩大所对应的假设空间(表示)
这三点摘自周志华老师书上的内容,看的不是那么明白,先埋个坑 😭