概述
集成学习,是将几个泛化能力差的模型相结合,组成泛化能力强的模型。
常见的做法就是分别训练几个模型,然后再将多个模型的输出组合,形成最终输出,也称为模型平均的效果。类似的策略都称为集成方法。
模型平均,有如俗语:三个臭皮匠,顶过诸葛亮,发挥群体决策的力量取长补短,从而达到更好的泛化效果。
集成学习的方法主要包括Bagging、Boosting、Stacking等
Bagging
Bagging全称是bootstrap aggregating,其实现是通过对样本数据集进行有放回的重复采样,生成多个采样子集,并行地训练出多个模型,测试阶段集成多个模型的泛化输出,常常采样直接平均的做法
从偏差-方差分解的角度看,Bagging主要关注降低方差,其有效性是有严格的数学推导的
假如有
k
k
k个回归模型,对每个输出数据,模型输出为
Y
i
Y_i
Yi,其中
i
∈
[
1
,
⋯
,
k
]
i\in[1,\cdots,k]
i∈[1,⋯,k],该输出真值为
Y
Y
Y,则对于第
i
i
i个子模型,其偏差为
b
i
=
Y
i
−
Y
b_i=Y_i-Y
bi=Yi−Y
由于这里的
k
k
k个回归模型都是基于同样的数据集进行采样来训练模型,所以其模型输出的数学期望和方差都基本一致,因此,可认为
E
[
Y
i
]
=
μ
E[Y_i]=\mu
E[Yi]=μ,
D
[
Y
i
]
=
σ
2
D[Y_i]=\sigma^2
D[Yi]=σ2
对于集成模型来说,其期望和方差为:
E
[
1
k
∑
i
Y
i
]
=
1
k
∑
i
E
[
Y
i
]
=
μ
E\left[\frac{1}{k}\sum_iY_i\right]=\frac{1}{k}\sum_iE\left[Y_i\right]=\mu
E[k1i∑Yi]=k1i∑E[Yi]=μ
D
[
1
k
∑
i
Y
i
]
=
1
k
2
∑
i
D
[
Y
i
]
=
σ
2
k
D\left[\frac{1}{k}\sum_iY_i\right]=\frac{1}{k^2}\sum_iD\left[Y_i\right]=\frac{\sigma^2}{k}
D[k1i∑Yi]=k21i∑D[Yi]=kσ2
由此可见,Bagging的集成模型输出可以有效降低方差。然而,实际上训练出来的子模型之间不是完全相互独立的,所以方差的范围是介于
σ
2
/
k
\sigma^2/{k}
σ2/k和
σ
2
\sigma^2
σ2之间
Boosting
Boosting也是典型的集成学习方法,其思想是采用串行训练过程来训练模型
同样是利用数据集来训练多个模型,但是Boosting的最大特征是后训练的模型会考虑前训练模型的误差,具体做法就是对于前训练模型中出错的样本加大权重,称为赋权法
赋权法的应用使得每个样本对于训练模型的误差起到的作用是不同的,而后训练模型会采用贪心算法去不断适应训练集,力争将每个训练样本的误差都尽量降低
Boosting的输出也是集成多个子模型的输出得到的
从偏差-方差分解的角度看,Boosting主要关注降低偏差,因此Boosting能基于泛化能力相当弱的学习器构建出很强的集成
Boosting典型的方法就是Adaboost,GBDT和Xgboost
- 原始的AdaBoost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“重点关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。
- GBDT(Gradient Boosting Decison Tree)每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少。Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系
- xgboost是Gradient Boosting的一种高效系统实现,并不是一种单一算法。xgboost里面的基学习器除了用tree(gbtree),也可用线性分类器(gblinear)。而GBDT则特指梯度提升决策树算法。xgboost相对于普通gbm的实现,可能具有以下的一些优势:
-1. 显式地将树模型的复杂度作为正则项加在优化目标公式
-2. 推导里用到了二阶导数信息,而普通的GBDT只用到一阶允许使用column(feature) sampling来防止过拟合
-3. 借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现
-4.实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗
-5.节点分裂算法能自动利用特征的稀疏性
-6.data事先排好序并以block的形式存储,利于并行计算
-7.cache-aware, out-of-core computation
-8.支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit
注:XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。
Stacking
Stacking的基本思路与Bagging类似,区别有几点:
- 集成的子模型可以不同
- 训练时采用全部数据
- 完成子模型训练之后再训练一个meta-classifier(元模型),其输入是各个子模型的输出,其目的就是调节各个子模型在最终集成模型所起到的作用(类似于赋权的思想)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)