单个学习器要么容易欠拟合要么容易过拟合,为了得到泛化性能优良的学习器,能够训练多个个体学习器,经过必定的结合策略,最终造成一个强学习器。这种集成多个个体学习器的方法称为集成学习(ensemble learning)。算法
集成学习经过组合多种模型来改善机器学习的结果,与单一的模型相比,这种方法容许产生更好的预测性能。网络
集成学习属于元算法,即结合数个“好而不一样”的机器学习技术,造成一个预测模型,以此来降方差(bagging),减误差(boosting),提高预测准确性(stacking)。机器学习
个体学习器(又称为“基学习器”)的选择有两种方式:性能
目前同质集成 的应用最普遍,而基学习器使用最多的模型是CART决策树和神经网络。学习
按照个体学习器之间是否存在依赖关系能够分为两类:测试
boosting的算法原理以下所示:spa
Boosting算法的工做机制是:3d
(1)先从初始训练集训练出一个基学习器;blog
(2)再根据基学习器的表现对样本权重进行调整,增长基学习器误分类样本的权重(又称重采样);博客
(3)基于调整后的样本分布来训练下一个基学习器;
(4)如此重复进行,直至基学习器数目达到事先指定的个数 ,将这
个基学习器经过集合策略进行整合,获得最终的强学习器。
Boosting系列算法里最著名算法主要有AdaBoost算法和提高树(boosting tree)系列算法。提高树系列算法里面应用最普遍的是梯度提高树(Gradient Boosting Tree)<GDBT>。
“强学习”和“弱学习”的概念:一个分类,若是存在一个多项式算法可以学习他,并获得很高的正确率,那么这个算法称为强学习器,反之若是正确率只是稍大于随机猜想(50%),则称为弱学习器。
在实际状况中,咱们每每会发现弱学习器比强学习器更容易得到,因此就有了可否把弱学习器提高(boosting)为强学习器的疑问。
因而提高类方法应运而生,它表明了一类从弱学习器出发,反复训练,获得一系列弱学习器,而后组合这些弱学习器,构成一个强学习器的算法。
大多数boost方法会改变数据的几率分布(改变数据权值),具体而言就是提升前一轮训练中被错分类的数据的权值,下降正确分类数据的权值,使得被错误分类的数据在下轮的训练中更受关注;
而后根据不一样分布调用弱学习算法获得一系列弱学习器实现的,再将这些学习器线性组合,具体组合方法是偏差率小的学习器会被增大权值,偏差率大的学习器会被减少权值,典型表明adaboost算法。
Bagging的算法原理以下:
bagging算法的工做机制为:
(1)对训练集利用自助采样法进行次随机采样,每次采样获得
个样本的采样集;
(2)对于这 个采样集,咱们能够分别独立的训练出
个基学习器;
(3)再对这 个基学习器经过集合策略来获得最终的强学习器。
值得注意的是这里的随机采样采用的是自助采样法(Bootstrap sampling),自助采样法是一种有放回的采样。
即对于 个样本的原始训练集,咱们每次先随机采集一个样本放入采样集,接着把该样本放回,这样采集
次,最终能够获得
个样本的采样集,因为是随机采样,这样每次的采样集是和原始训练集不一样的,和其余采样集也是不一样的。
对于一个样本,它每次被采集到的几率是 。不被采集到的几率为
。若是
次采样都没有被采集中的几率是
。则
,
即当抽样的样本量足够大时,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采集中。对于这部分大约36.8%的没有被采样到的数据,
咱们经常称之为袋外数据(Out Of Bag, 简称OOB)。这些数据未参与训练集模型的拟合,能够用来检测模型的泛化能力。
bagging对于弱学习器最经常使用的通常也是决策树和神经网络。bagging的集合策略也比较简单,对于分类问题,一般使用相对多数投票法。对于回归问题,一般使用算术平均法。
上面几节主要关注于学习器,下面就对集成学习之结合策略作一个总结。咱们假定我获得的T个弱学习器是
平均法一般用于回归问题。
最简单的平均是算术平均,即:
也能够是每一个个体学习器的加权平均,即 :
其中 是个体学习器
的权重,
。
对于分类问题一般使用投票法。
假设咱们的预测类别是 ,对于任意一个预测样本
,咱们的
个弱学习器的预测结果分别是
。主要有如下三种:
平均法和投票法仅是对弱学习器的结果作简单的逻辑处理,而stacking是再加上一层权重学习器(Meta Learner),基学习器(Base learner)的结果做为该权重学习器的输入,获得最终结果。
以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出做为训练集进行再训练,从而获得完整的stacking模型。
以下图所示为Stacking的工做原理:
其中基学习器(Base learner)称为初级学习器,用于结合的学习器(Meta Learner)称为次级学习器。对于测试集,咱们首先用初级学习器预测一次,将其输入次级学习器预测,获得最终的预测结果。
以5折划分为例,咱们将原始训练集分为5折,分别记为fold一、fold二、fold三、fold4和fold5。此时咱们使用fold2-fold5的数据来训练基模型1,并对fold1进行预测,该预测值即做为基模型1对fold1生成的元特征;
一样地,使用fold一、fold3-fold5的数据来训练基模型1,并对fold2进行预测,该预测值即做为基模型1对fold2生成的元特征;以此类推,获得基模型1对整个原始训练集生成的元特征。
一样地,对其余基模型也采用相同的方法生成元特征,从而构成用于第二层模型(下记为元模型,meta model)训练的完整元特征集。对于测试集,咱们能够在每次基模型训练好时预测,再将预测值作均值处理;
也能够将基模型拟合所有的训练集以后再对测试集进行预测。
须要注意的是,在生成第二层特征的时候,各个基模型要采用相同的Kfold,这样获得的元特征的每一折(对应于以前的K折划分)都将不会泄露进该折数据的目标值信息 ,
从而尽量的下降过拟合的风险。虽然如此,实际上咱们获得的元特征仍是存在必定程度上的信息泄露,好比咱们在预测第二折的时候,是利用了第一折的目标值信息用于训练基模型的,
也就是说第一折的目标值信息杂糅在对第二折进行预测的基模型里。可是,实践中,这种程度的信息泄露所形成的过拟合程度很小。
可能仍是比较抽象,那咱们用案例描述一下:
上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost做为基础模型Model1,5折交叉验证就是先拿出四折做为training data,另一折做为testing data。
注意:在stacking中此部分数据会用到整个traing set。如:假设咱们整个training set包含10000行数据,testing set包含2500行数据,那么每一次交叉验证其实就是对training set进行划分,在每一次的交叉验证中training data将会是8000行,testing data是2000行。
每一次的交叉验证包含两个过程,1. 基于training data训练模型;2. 基于training data训练生成的模型对testing data进行预测。
在整个第一次的交叉验证完成以后咱们将会获得关于当前testing data的预测值,这将会是一个一维2000行的数据,记为a1。
注意!在这部分操做完成后,咱们还要对数据集原来的整个testing set进行预测,这个过程会生成2500个预测值,
这部分预测值将会做为下一层模型testing data的一部分,记为b1。
由于咱们进行的是5折交叉验证,因此以上说起的过程将会进行五次,最终会生成针对trainning set数据预测的5列2000行的数据a1,a2,a3,a4,a5,对testing set的预测会是5列2500行数据b1,b2,b3,b4,b5。
在完成对Model1的整个步骤以后,咱们能够发现a1,a2,a3,a4,a5其实就是对原来整个training set的预测值,将他们拼凑起来,会造成一个10000行一列的矩阵,记为A1。
而对于b1,b2,b3,b4,b5这部分数据,咱们将各部分相加取平均值,获得一个2500行一列的矩阵,记为B1。
以上就是stacking中一个模型的完整流程,stacking中同一层一般包含多个模型,假设还有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,
对于这四个模型,咱们能够重复以上的步骤,在整个流程结束以后,咱们能够获得新的A2,A3,A4,A5,B2,B3,B4,B5矩阵。
在此以后,咱们把A1,A2,A3,A4,A5并列合并获得一个10000行五列的矩阵做为training data,B1,B2,B3,B4,B5并列合并获得一个2500行五列的矩阵做为testing data。让下一层的模型,基于他们进一步训练。
其实西瓜书里讲的比较粗,我也不清楚究竟是上面的博客讲错了,仍是西瓜没有讲细节,吐血三升。
西瓜书内容以下: