集成学习定义
集成学习(Ensemble Learning)就是通过某种策略将多个模型集成起来,通过群体决策来提高决策准确率。集成学习首要的问题是选择什么样的学习器以及如何集成多个基学习器即集成策略。
集成学习分类
一个有效的集成除了要让各个基学习器的学习效果好之外还需要各个基学习器的差异尽可能大(差异性:各个基学习器的预测结果不完全相同)。集成学习往往和方差大的模型组合时效果显著。
为了增加模型之间的差异性,可以采取Bagging和Boosting这两类方法。Boosting类方法中基学习器之间存在强依赖关系,必须串行执行,Bagging类方法中基学习器之间不存在强依赖关系,可并行执行。
Bagging类方法
Bagging类方法是通过随机构造训练样本、随机选择特征等方法来提高每个基模型的独立性。由于训练数据的不同,获得的学习器会存在差异性,但是若采样的每个子集都完全不同,则每个基学习器都只能训练一小部分数据,无法进行有效的学习。因此考虑使用相互交叠的采样子集。代表性方法有Bagging和随机森林等。
- Bagging(Bootstrap Aggregating)是通过不同模型的训练数据集的独立性来提高不同模型之间的独立性。我们在原始训练集上进行有放回的随机采样,初始训练集中有的样本在采样集合中出现多次,有的则从未出现过。经过M次随机采样得到含𝑀个样本的训练集。可以采样T个含有m个样本的数据集并行训练得到T个模型,然后将这些基学习模型进行结合。对于基学习器的集成方法,Bagging通常对分类任务使用简单投票法,对回归任务使用平均法。若预测的结果中有含有相同票数的两个类,可以使用随机选择或者考察学习器投票的置信度来确定。
- 随机森林(Random Forest)是在Bagging的基础上再引入了随机特征,进一步提高每个基模型之间的独立性。在随机森林中,每个基模型都是一棵决策树,与传统决策树不同的是,在RF中,对每个基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后从这个子集中选择一个最优属性由于划分,而传统的决策树是直接在当前节点的属性集合中选择一个最优属性来划分集合。
Boosting类方法
Boosting类方法是按照一定的顺序来先后训练不同的基模型,每个模型都针对先前模型的错误进行专门训练。根据先前模型的结果,来调整训练样本的权重,从而增加不同基模型之间的差异性。Boosting的过程很类似于人类学习的过程,我们学习新知识的过程往往是迭代式的。第一遍学习的时候,我们会记住一部分知识,但往往也会犯一些错误,对于这些错误,我们的印象会很深。第二遍学习的时候,就会针对犯过错误的知识加强学习,以减少类似的错误发生。不断循环往复,直到犯错误的次数减少到很低的程度。
Boosting 类方法是一种非常强大的集成方法,只要基模型的准确率比随机猜测高,就可以通过集成方法来显著地提高集成模型的准确率。Boosting类方法的代表性方法有AdaBoost,GBDT等.
AdaBoost算法
Adaptive Boosting是Boosting类方法的一种,过程类似。先从初始训练集训练出一个基学习器,在根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续收到关注,然后基于调整后的样本分布来训练下一个基学习器,如此反复,直到训练错误率为0或者基学习器的数目达到事先指定的值为止。
AdaBoost 算法是一种迭代式的训练算法,通过改变数据分布来提高弱分类器的差异。在每一轮训练中,增加分错样本的权重,减少分对样本的权重,从而得到一个新的数据分布。这样增加每个弱分类器的差异,最终提升集成分类器的准确率。
AdaBoost算法的训练过程
开始对训练数据中每个样本赋予一个权重,这些权重构成向量D,初始时,各个样本权重是等值的。首先在训练数据集中训练一个弱分类器并计算该分类器的错误率e,然后在同一数据集上再次训练分类器,只是在本次训练过程中需要调节各个样本的权重,上次分类对的样本权重会降低,分类错的样本权重会提升。根据每个学习器的错误率可以计算一个权重alpha,这些权重alpha用于最终结果的预测,并且在每次训练新的分类器时会根据上一时刻的D和对应的alpha来更新D。
西瓜书上的算法:
其中Zt可是向量D的和即sum(D)。当样本正确分类时,即h(x)=f(x)
Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(检查当前基分类器是否是比随机猜测要好),一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止。在此情形下,初始设置的学习次数T可能并未达到就结束训练了,参与集成的学习器太少而整体效果不佳。解决此问题可采用重采样方法,即在抛弃不满足条件的学习器之后可根据当前分布重新对训练样本进行采样,在基于新的采样结果重新训练基学习器,达到初始设定的训练次数。
基分类器的错误,是偏差和方差两种错误之和。偏差(预测值与真实值之间的差)主要是由于分类器的表达能力有限导致的系统性错误,表现为训练误差不收敛。方差(预测值的分散程度)是由于分类器对于样本分布过于敏感,导致在训练样本数较少时,产生过拟合。
Bagging能够提高弱分类器性能的原因是降低了方差,Boosting能够提升弱分类器性能的原因是降低了偏差。
Boosting方法是通过逐步聚焦于基分类器分错的样本,减小集成分类器的偏差;Bagging方法则是采取分而治之的策略,通过对训练样本多次采样,并分别训练出多个不同模型,然后做综合,来减小集成分类器的方差。
梯度提升决策树GBDT
采用决策树作为弱学习器,使用梯度提升作为训练算法的算法模型被称为梯度提升决策树(Gradient Boosting Decision Tree,GBDT),有时又被称为MART(Multiple Additive Regression Tree)。GBDT中使用的决策树通常为CART。 GBDT是Boosting算法中非常流行的模型,非常好地体现了“从错误中学习”的理念,通过基于决策树预测的残差进行迭代的学习。
梯度提升Gradient Boosting
在梯度下降算法中是通过找到一个参数a,使损失函数最小,来找到一个最优的拟合函数。梯度提升是借鉴梯度下降的思想,在函数空间中寻找最优的函数。此时梯度变量是一个函数,是在函数空间上求解。通过当前函数的负梯度方向更新函数来修正模型,使模型更优,最后累加的模型为近似最优函数。而以前梯度下降算法是在多维参数空间中的负梯度方向更新,变量是参数。模型是以参数化形式表示,从而模型的更新等价于参数的更新。
通过梯度提升算法和梯度下降算法的对比分析,两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
梯度提升算法的过程是通过对一个不完善的强学习器F(x)进行优化,在新的一轮迭代中找到一个弱学习器f(x),在不改变原先的模型的基础上,通过增加一个f来提高模型的预测效果,也就是说,每一次迭代找到的决策树,要让样本的损失尽量变得更小。即Fnew = Fold + f≈y(y为真实的函数)。等价于f≈y–Fold,而y–Fold即为数据的残差。那么梯度提升就由在函数空间中找最优的函数Fnew转化为求将f与y–Fold进行拟合。
梯度提升算法的基本思想是根据当前模型损失函数的负梯度信息(可转化为残差)来训练新加入的弱学习器,然后将训练好的弱学习器以累加的形式结合到现有模型中,最终实现对模型的更新。
GBDT采用决策树作为弱学习器,使用梯度提升作为训练算法。其思想可以用一个通俗的例子解释,假如有个人30岁,第一棵树预测为20岁,发现损失有10岁,这时我们在第二棵树中把此人年龄设为10岁预测,发现差距还有4岁,第三轮我们用4岁拟合剩下的差距,每一轮迭代,拟合的岁数误差都会减小。若某棵树正确预测了年龄,就把该树及其以前的所有树的结果做加和即为整个模型的结果。
GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。回归树的每一个节点都会得一个预测值。由于GBDT是利用残差训练的,在预测的过程中,我们需要把所有树的预测值加起来,得到最终的预测结果,模型训练的结束条件是数据(每个特征)的残差为0。
该图来自https://www.jianshu.com/p/005a4e6ac775
优点
(1)预测阶段的计算速度快,树与树之间可并行化计算。
(2)在分布稠密的数据集上,泛化能力和表达能力都很好。
(3)采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性, 能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。
局限性
(1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
(2)GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
(3)训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。
Reference
1.《百面机器学习》,诸葛越主编、葫芦娃著
2.《机器学习实战》,Peter Harrington著
3.《机器学习》,周志华著
4. https://zhuanlan.zhihu.com/p/86354141
5. https://www.cnblogs.com/pinard/p/6140514.html
6.https://www.jianshu.com/p/005a4e6ac775
7.https://blog.csdn.net/suranxu007/article/details/49910323