集成学习通过构建并结合多个学习器来完成学习任务,然后把结果整合起来进行整体预测。也称为multi-classifier system、committee-based learning。
对于训练集数据,训练若干个个体学习器,并通过一定的结合策略,最终形成一个强学习器。集成学习常可获得比单一学习器显著优越的泛化性能。集成学习要求个体学习器(individual learner)要有一定的准确性及多样性。
集成只包含同种类型的个体学习器,如“决策树”集成中全是决策树,称为“同质”的(homogeneous)。同质集成中的个体学习器又称基学习器(base learner)或弱学习器(weak learner)。
集成也可包含不同类型的学习器,如同时包含决策树和神经网络,称为“异质”的(heterogenous).异质集成中的个体学习器又称组件学习器(component learner)。
根据个体学习器的生成方式,集成学习算法分为两类:
Boosting:个体学习器之间存在强依赖关系,必须串行生成的序列化方法。
关注降低偏差,参数选择一般较低 e.g.决策树深度6
对离群点和噪声数据敏感
典型算法:AdaBoost/GradientBoostingDecisionTree
Bagging:个体学习器间不存在强依赖关系、可同时生成的并行化方法。
关注降低方差,参数选择一般较高 e.g.决策树深度10
对离群点和噪声数据不敏感
典型算法:Bagging/Random Forest
对于Boosting,每一步都会在上一轮的基础上更加拟合原数据,可以降低偏差(bias);因此对于每个基分类器来说,关键在于如何选择variance更小的分类器,即更简单的分类器,所以选择深度很浅的决策树。
对于Bagging,由于会并行地训练很多不同的(相互独立)分类器,可以降低方差(variance) ,因此对于每个基分类器来说,关键就是如何降低偏差(bias),即更准确的分类器,所以选择深度很深甚至不剪枝的决策树。
1. Boosting
Boosting 是一族将弱学习器提升为强学习器的算法,关注降低偏差,每个分类器采用的样本分布都和上一轮的学习结果有关,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。工作机制如下:
从训练集训(使用初始权重)训练出一个基学习器
根据基学习器的表现(学习误差率),对训练样本分布进行调整,使先前基学习器做错的样本后续受到更多关注(权重变高)
基于调整后的样本分布来训练下一个基学习器,重复直到基学习器数目到底指定的T值
将这T个基学习器进行加权结合
Boosting中的三个要素:
基学习器,如决策树
误差函数,如分类用cross entropy,回归用 mean squared error
加权模型
其中,如何计算学习误差率(损失函数)决定了算法的名字与效果,Boosting系列算法主要有AdaBoost算法和提升树(boosting tree)系列算法,详见下表:
1.1 AdaBoost
AdaBoost(Adaptive Boosting)算法由Freund and Schapire在1996年提出(A decision-theoretic generalization of on-line learning and an application to boosting)。AdaBoost基于加性模型(additive model),即基学习器的线性组合,来最小化指数损失函数(exponential loss function),过程如下:
1.2 GBDT
GBDT(Gradient Boosting Decison Tree)有很多简称GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),都是指同一种算法,本文统一简称GBDT。
GBDT是一种迭代的决策树算法,该算法由多棵决策树(GBDT中的树是回归树)组成,所有树的结论累加起来做最终答案。主要的思想是,每一次建立单个学习器时,是在之前建立的模型的损失函数的梯度下降方向。
下面两个图分别表示 DT 和 GB(由100棵树组合成)在树的深度为 0,3,6 时的效果。0 时就是要拟合的函数的图像,可以看到 GB 可以在有限的深度就能得到比较光滑的的拟合:
提升树是迭代多棵回归树来共同决策,利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。提升树即是整个迭代过程生成的回归树的累加。过程如下:
Xgboost(eXtreme Gradient Boosting) 是 GB 算法的C++高效实现,最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。
2. Bagging
为了得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,设法使基学习器尽可能具有较大差异。
Bagging是并行式集成学习方法的最著名代表,基于bootstrap sampling采用出T个含m个训练样本的采样集,然后基于每个采样训练出一个基学习器,再将基学习器进行结合。输出预测时,对分类任务使用简单投票,对回归任务使用简单平均法。
随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回(GBDT的子采样是无放回采样)。Bagging算法,一般随机采集和训练集样本数m一样个数的样本,得到的采样集和训练集样本的个数相同,但是样本内容不同。对有m个样本训练集做T次的随机采样,则由于随机性,T个采样集各不相同。
对于一个样本,每次被采集到的概率是 ,不被采集到的概率为 。如果m次采样都没有被采集中的概率是
即在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集采集中,称之为袋外数据(Out Of Bag, 简称OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。
由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。
3. Random Forest
随机森林(RF,Random Forest),在以决策树(CART)为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选。
对基决策树的每个节点,先从该节点的n nn个属性集合中随机选择一个包含k ( k < n )个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,进一步增强了模型的泛化能力
4. Stacking
Stacking使用“学习法”,通过该次级学习器(元学习器,meta-learner)来结合多个初级学习器。
Stacking先从初始数据集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器,在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。
数据集输入->若干学习器-->若干学习器输出(输出作为次级学习器的输入)-->次级学习器-->学习器2输出(预测输出)
以下是stacking中一个模型的完整流程,stacking中同一层通常包含多个模型,可重复相关步骤。
首先用一个初级学习器(Model1)进行5折交叉验证,包含两个过程,
基于其中80%数据训练模型(Learn);
使用训练生成的模型对剩余20%数据进行预测(Predict)。
在5折交叉验证完成后,会形成整个Training Data的预测值(Predications)。这些预测值作为新的Training Data,输入下一层的模型,进行训练。
在5折交叉验证完成的同时,还要整个Test Data进行预测,并对5次预测值取加权平均,形成新的Test Data,输入下一层模型,进行预测。