主要思想 : 通过将多个学习器进行结合,获得比单一学习器更好的泛化能力。
对个体学习器的要求:“好而不同”
(1)个体学习器要有一定的准确性:单个学习器的准确度越高,集成学习器才可能越好。个体学习器不能太差,至少不能差于弱学习器。(弱学习器是指泛化性能略优于随机猜想的学习器)
(2)个体学习器的多样性(差异性):学习器之间要有差异。
常见集成学习器:
下面的三种方法中,boosting各个学习器之间存在强依赖关系,各个学习器是串行方式生成的。bagging和random forest的各个学习器之间不存在强依赖关系,可以单独去训练(并行生成)。
学习器的结合策略
结合的好处:(1)提升泛化性能 (2)降低陷入局部极小点的风险
方法:
一个基础想法:
想要得到泛化能力强的集成,那么集成中使用的个体学习器应该尽可能的相互独立。一种可能的做法是对训练数据集进行采样,产生出若干个不同的子集,再从每个子数据集中训练出一个基学习器。由于这些基学习器的训练数据不同,获得的学习器之间的差异自然会比较大,通过组合这些学习器来实现较好的泛化能力。
但是这样的做法对数据的利用不好,每个学习器只用到了很少的一部分数据,个体学习器的性能也会不好。
Bagging方法是一种在原始数据集上通过有放回抽样训练分类器的方法。
假设训练集包含m个样本
结合方法 : Bagging通常对分类任务,采用简单投票法。对回归任务,采用简单平均法。
注 : Bagging的这种自助采用方法,每个采用数据集大概用到了63.2%的样本,有36.8%的样本没有被采集到。这一部分数据可以用做验证集。
随机森林是Bagging的一个扩展变体,随机森林是以决策树为基学习器来构建Bagging的一种方法。
假设训练集包含m个样本
注 : 这里不需要进行剪枝,因为两个随机过程保证了随机性,过拟合风险很小。
(1)随机森林思路简单,实现容易,计算开销小。
(2)随机森林的往往很容易得到较好的预测结果,泛化能力好。
(3)过拟合风险小
(4)抗噪声能力强
注:
随机森林初始性能往往相对较差,这一点容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所下降。
但是随着学习器数目的增加,随机森林通常会收敛到更低的泛化误差。(这么说的话,学习器的数量是需要足够多的)
在分类问题中,通过改变训练样本的权重,串行地学习多个分类器,并组合提高分类性能。
是一种迭代算法,每轮迭代过程中会在训练数据集上产生一个新的分类器。在训练过程中,通过改变权值,重视那些上一轮被错分的样本。这样越难区分的样本在训练过程中会变得越来越重要。
假设共有N个样本,假设训练M个分类器
(1)为每个样本初始化权值为 w m , i = 1 N w_{m,i}=\frac{1}{N} wm,i=N1
(2)训练第m ( m = 1 , 2 , ⋯   , M ) (m=1,2,\cdots,M) (m=1,2,⋯,M)个分类器,计算当前分类器 G m ( x ) G_m(x) Gm(x)的加权误差 e m e_m em
(3)计算基分类器 G m ( x ) G_m(x) Gm(x)的系数, α m = 1 2 l o g 1 − e m e m ( \alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} ( αm=21logem1−em(误差 e m e_m em越大,系数越小)
(4)更新训练样本的权重:
—分类正确: w m + 1 , i = w m , i Z m e − α m w_{m+1,i}=\frac{w_{m,i}}{Z_m}e^{-\alpha_m} wm+1,i=Zmwm,ie−αm
—分类错误: w m + 1 , i = w m , i Z m e α m w_{m+1,i}=\frac{w_{m,i}}{Z_m}e^{\alpha_m} wm+1,i=Zmwm,ieαm
其中, Z m Z_m Zm为规范话因子, Z m = ∑ i = 1 N w m , i e − α m y i G ( x i ) Z_m=\sum_{i=1}^{N}w_{m,i}e^{-\alpha_my_iG(x_i)} Zm=∑i=1Nwm,ie−αmyiG(xi)
最终得到分类器组合: f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_mG_m(x) f(x)=∑m=1MαmGm(x) ,最终分类器 G ( x ) = s i g n ( f ( x ) ) G(x)=sign(f(x)) G(x)=sign(f(x))
注:
优点:
(1)是一种有很高精度的分类器
(2)简单,不用做特征筛选
(3)不容易发生overfitting
缺点:
(1)AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
(2)数据不平衡导致分类精度下降。
(3)训练比较耗时,每次重新选择当前分类器最好切分点。
加法模型(Additive Model)
对一个加法模型
f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^{M}\beta_mb(x;\gamma_m) f(x)=m=1∑Mβmb(x;γm)
其中, b ( x ; γ m ) b(x;\gamma_m) b(x;γm)为基函数, β m \beta_m βm基函数系数, γ m \gamma_m γm为基函数参数。直接优化所有的基函数的参数和系数是一个非常复杂的优化问题。
前向分步加法模型(Forward Stagewise Additive Model )
使用前向分布算法,每次只优化一个基分类器的参数和它的加权系数,这样优化问题将会简单很多。
算法:
(1)初始化 f 0 ( x ) f_0(x) f0(x)
(2)从m=1到m=M:
a)计算极小化损失函数,更新参数
( β m , γ m ) = a r g m i n β , γ ∑ i = 1 N L ( y i , f m − 1 ( x ) + β m b ( x ; γ m ) ) (\beta_m,\gamma_m)=arg\mathop{min}\limits_{\beta,\gamma}\sum_{i=1}^{N}L(y_i,f_{m-1}(x)+\beta_mb(x;\gamma_m)) (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(x)+βmb(x;γm))
b)更新 f m ( x ) = f m − 1 ( x ) + β m b ( x , β m ) f_m(x)=f_{m-1}(x)+\beta_mb(x,\beta_m) fm(x)=fm−1(x)+βmb(x,βm)
(3)得到加法模型
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_M(x)=\sum_{m=1}^{M}\beta_mb(x;\gamma_m) f(x)=fM(x)=m=1∑Mβmb(x;γm)
注:
若是采用平方误差,那么实际上,优化的是当前模型在样本上的损失,优化的是损失,即寻找最好的 β b ( x , γ ) \beta b(x,\gamma) βb(x,γ)使得损失最小。
当采用指数损失函数的时候,前向分步算法和AdaBoot算法是等价的。
提升树是统计学习方法中性能最好的方法之一。提升方法实际应用采用加法模型和前向分步算法,采用决策树作为基函数的提升方法称为提升树
提升树模型是决策树的加法模型 :
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x)=\sum_{m=1}^{M}T(x;\Theta_m) fM(x)=m=1∑MT(x;Θm)
算法 :
提升树算法就是采用前向分步算法,和上面的前向分步算法的步骤基本一致
f ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f(x)=f_{m-1}(x)+T(x;\Theta_m) f(x)=fm−1(x)+T(x;Θm)
当采用平方损失和指数损失的时候,每一步的优化是很简单的。但是对于一般的损失函数而言,每一步的优化并不容易。针对这个问题,解决办法就是采用梯度下降的方法来优化。
注 :
Adaboost和梯度提升的区别:
在GBDT中,假设我们前一轮得到的学习器是 f m − 1 ( x ) f_{m-1}(x) fm−1(x),那么本轮迭代的目的就是找到一个树,让本轮的损失最小。(还是优化损失)
梯度提升回归算法 :
输入训练集样本: T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) T={(x_1,y_1),(x_2,y_2), \cdots,(x_N,y_N)} T=(x1,y1),(x2,y2),⋯,(xN,yN)
f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c ) f_0(x)=arg\mathop{min}\limits_{c}\sum_{i=1}^{N}L(y_i,c) f0(x)=argcmini=1∑NL(yi,c)
对迭代轮数m=1,2…M
a)对样本i=1,2…N,计算负梯度
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
b)对 r m i r_{mi} rmi拟合一颗回归树,得到第m棵树的叶结点区域 R m j , j = 1 , 2 , . . . J R_{mj}, j=1,2,...J Rmj,j=1,2,...J即一棵由J个叶子节点组成的树。
c)对 j = 1 , 2 , ⋯   , J j=1,2,\cdots,J j=1,2,⋯,J,计算
c m j = a r g m i n c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=arg\mathop{min}\limits_{c}\sum_{x_i \in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
更新得到 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x)=f_{m-1}(x)+\sum_{j=1}^{J}c_{mj}I(x\in R_{mj}) fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
得到回归树
f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) f_M(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c_{mj}I(x \in R_{mj}) fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
优点:
缺点:
1)由于弱学习器之间存在依赖关系,难以并行训练数据。
参考:
|梯度提升树(GBDT)原理小结