集成学习与常见算法

1.基本介绍

主要思想 : 通过将多个学习器进行结合,获得比单一学习器更好的泛化能力。

对个体学习器的要求:“好而不同”
(1)个体学习器要有一定的准确性:单个学习器的准确度越高,集成学习器才可能越好。个体学习器不能太差,至少不能差于弱学习器。(弱学习器是指泛化性能略优于随机猜想的学习器)
(2)个体学习器的多样性(差异性):学习器之间要有差异。

常见集成学习器:
下面的三种方法中,boosting各个学习器之间存在强依赖关系,各个学习器是串行方式生成的。bagging和random forest的各个学习器之间不存在强依赖关系,可以单独去训练(并行生成)。

  1. Boosting
  2. Bagging
  3. Rondom Forest

学习器的结合策略

结合的好处:(1)提升泛化性能 (2)降低陷入局部极小点的风险

方法:

  1. 平均法:对数值型输出,可以采用平均法。
    (a)简单平均法;
    (b)加权平均法两种。
  2. 投票法:对于分类任务常常可以采用投票法
    (a)绝对多数投票法:只有当某标记票数过半才预测为该标记,否则拒绝预测;
    (b)相对多数投票法:将票数最多的标记作为预测值;
    (c)加权投票法:对不同学习器采取加权方法投票;
  3. 学习法:通过一个学习器来训练,使各个学习器结合起来。例如stacking算法
    stacking算法:以初学习器的输出作为输入,训练学习器。

2.Bagging与Rondom Forest

一个基础想法:
想要得到泛化能力强的集成,那么集成中使用的个体学习器应该尽可能的相互独立。一种可能的做法是对训练数据集进行采样,产生出若干个不同的子集,再从每个子数据集中训练出一个基学习器。由于这些基学习器的训练数据不同,获得的学习器之间的差异自然会比较大,通过组合这些学习器来实现较好的泛化能力。
但是这样的做法对数据的利用不好,每个学习器只用到了很少的一部分数据,个体学习器的性能也会不好。

2.1 Bagging

Bagging方法是一种在原始数据集上通过有放回抽样训练分类器的方法。

算法步骤

假设训练集包含m个样本

  1. 从m个样本中随机选取一个样本放入采用集中,再把该样本放回到初始数据集中,再次采用。重复m次采用,得到一个包含m个样本的采样集。
  2. 重复步骤一T次,得到T个含m个样本的采样集,最终训练得到T个模型 H 1 , H 2 ,   , H t H_1,H_2,\cdots,H_t
  3. 将这T个学习器结合,得到集成学习器。

结合方法 : Bagging通常对分类任务,采用简单投票法。对回归任务,采用简单平均法。

: Bagging的这种自助采用方法,每个采用数据集大概用到了63.2%的样本,有36.8%的样本没有被采集到。这一部分数据可以用做验证集。

2.2Random Forest

随机森林是Bagging的一个扩展变体,随机森林是以决策树为基学习器来构建Bagging的一种方法。

算法步骤

假设训练集包含m个样本

  1. 从m个样本中随机选取一个样本放入采用集中,再把该样本放回到初始数据集中,再次采用。重复m次采用,得到一个包含m个样本的采样集。用这个采样集来训练一个决策树。
  2. 决策树划分属性时,先从当前结点的属性集合(假设包含d个属性)中随机选择K个属性,形成一个包含K个属性的集合,再从这k个属性中选出一个最优的属性用于划分。
  3. 决策树形成的每个结点都按照步骤2来划分,直到该结点的所有训练样例都是同一类。

: 这里不需要进行剪枝,因为两个随机过程保证了随机性,过拟合风险很小。

优点:

(1)随机森林思路简单,实现容易,计算开销小。
(2)随机森林的往往很容易得到较好的预测结果,泛化能力好。
(3)过拟合风险小

3.Boosting

在分类问题中,通过改变训练样本的权重,串行地学习多个分类器,并组合提高分类性能。

3.1AdaBoost算法

是一种迭代算法,每轮迭代过程中会在训练数据集上产生一个新的分类器。在训练过程中,通过改变权值,重视那些上一轮被错分的样本。这样越难区分的样本在训练过程中会变得越来越重要。

假设共有N个样本,假设训练M个分类器

3.2训练过程

(1)为每个样本初始化权值为 w m , i = 1 N w_{m,i}=\frac{1}{N}
(2)训练第m ( m = 1 , 2 ,   , M ) (m=1,2,\cdots,M) 个分类器,计算当前分类器 G m ( x ) G_m(x) 的加权误差 e m e_m
(3)计算基分类器 G m ( x ) G_m(x) 的系数, α m = 1 2 l o g 1 e m e m \alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} ( 误差 e m e_m 越大,系数越小)
(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}
—分类错误: w m + 1 , i = w m , i Z m e α m w_{m+1,i}=\frac{w_{m,i}}{Z_m}e^{\alpha_m}
其中, Z m Z_m 为规范话因子, 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)}

最终得到分类器组合: f ( x ) = m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_mG_m(x) ,最终分类器 G ( x ) = s i g n ( f ( x ) ) G(x)=sign(f(x))

注:

  1. 所有 α m \alpha_m 的和不为1;
  2. 在训练过程中,如果上一轮分类正确,那么对应的样本的权值缩小。如果分类错误,那么训练的权值曾加。

3.3优缺点

优点:

(1)是一种有很高精度的分类器
(2)简单,不用做特征筛选
(3)不容易发生overfitting

缺点:

(1)AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
(2)数据不平衡导致分类精度下降。
(3)训练比较耗时,每次重新选择当前分类器最好切分点。

4.加法模型和前向分步算法

加法模型(Additive Model)

对一个加法模型
f ( x ) = m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^{M}\beta_mb(x;\gamma_m)
其中, b ( x ; γ m ) b(x;\gamma_m) 为基函数, β m \beta_m 基函数系数, γ m \gamma_m 为基函数参数。直接优化所有的基函数的参数和系数是一个非常复杂的优化问题。

前向分步加法模型(Forward Stagewise Additive Model )

使用前向分布算法,每次只优化一个基分类器的参数和它的加权系数,这样优化问题将会简单很多。

算法:

(1)初始化 f 0 ( x ) f_0(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))
 b)更新 f m ( x ) = f m 1 ( x ) + β m b ( x , β m ) f_m(x)=f_{m-1}(x)+\beta_mb(x,\beta_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)
注:

若是采用平方误差,那么实际上,优化的是当前模型在样本上的损失,优化的是损失,即寻找最好的 β b ( x , γ ) \beta b(x,\gamma) 使得损失最小。
当采用指数损失函数的时候,前向分步算法和AdaBoot算法是等价的。

5.提升树

提升树是统计学习方法中性能最好的方法之一。提升方法实际应用采用加法模型和前向分步算法,采用决策树作为基函数的提升方法称为提升树
提升树模型是决策树的加法模型 :
f M ( x ) = m = 1 M T ( x ; Θ m ) f_M(x)=\sum_{m=1}^{M}T(x;\Theta_m)
算法
提升树算法就是采用前向分步算法,和上面的前向分步算法的步骤基本一致
f ( x ) = f m 1 ( x ) + T ( x ; Θ m ) f(x)=f_{m-1}(x)+T(x;\Theta_m)

6.梯度提升树(GBDT)

当采用平方损失和指数损失的时候,每一步的优化是很简单的。但是对于一般的损失函数而言,每一步的优化并不容易。针对这个问题,解决办法就是采用梯度下降的方法来优化。


Adaboost和梯度提升的区别:

  1. Adaboost是基于样本权值更新
  2. Gradient Boost 是基于残差减小的梯度方向进行更新

GBDT算法

在GBDT中,假设我们前一轮得到的学习器是 f m 1 ( x ) f_{m-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)}

  1. 初始化:初始化一个仅含根节点的树(即只需要确定一个切分点,根据误差最小来确定),历遍所有样本,确定切分点c

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)

  1. 对迭代轮数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)}
    b)对 r m i r_{mi} 拟合一颗回归树,得到第m棵树的叶结点区域 R m j j = 1 , 2 , . . . J R_{mj}, j=1,2,...J 即一棵由J个叶子节点组成的树。
    c)对 j = 1 , 2 ,   , J j=1,2,\cdots,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)
    更新得到 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})

  2. 得到回归树

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})

优点

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。
    3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

缺点
1)由于弱学习器之间存在依赖关系,难以并行训练数据。

参考:
|梯度提升树(GBDT)原理小结

猜你喜欢

转载自blog.csdn.net/yuanliang861/article/details/85012734