集成学习(Ensemble Learning)综述

集成学习简单理解就是指采用多个分类器对数据集进行预测,从而提高整体分类器的泛化能力。
集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合

1. Bagging

Bagging算法(Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种集成学习算法。

算法思想:
  1. For t = 1, 2, …, T Do
  2. 从数据集S中取样(放回选样)
  3. 训练得到模型 Ht H t
  4. 对未知样本 X X 分类时,每个模型 Ht H t 都得出一个分类,得票最高的即为未知样本 X X 的分类;
    对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干和弱学习器的输出进行平均得到最终的预测输出。

1.1随机森林

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法

算法思想:
  1. N N 来表示训练用例(样本)的个数, M M 表示特征数目。
  2. 输入特征数目 m m ,用于确定决策树上一个节点的决策结果;其中 m m 应远小于 M M
  3. N N 个训练用例(样本)中以有放回抽样的方式,取样 N N 次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
  4. 对于每一个节点,随机选择 m m 个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这 m m 个特征,计算其最佳的分裂方式。
  5. 每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)

2.Boosting

2.1 Adaboost

AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写。AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。AdaBoost方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。
AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上

步骤:

假设有 n n 个样本, D:{(x1,y1),(x2,y2),...,(xn,yn)} D : { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } , x x 是特征向量, y{1,1} y ∈ { − 1 , 1 } 是标签
1. 初始化样本 D:{(x1,y1),(x2,y2),...,(xn,yn)} D : { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } , x x kmax k m a x (最大循环次数),样本分布 Wk(i)=1/ni=1,...,n W k ( i ) = 1 / n , i = 1 , . . . , n
2. k=0 k = 0
3. do d o kk+1 k ← k + 1
4. 训练使用按照 Wk(i) W k ( i ) 采样的 D D 的弱分类器 Ck C k
5. Ek E k ←计算弱分类器 Ck C k 的训练误差, 如果 Ek>0.5 E k > 0.5 , 则continue
6. αk12ln1EkEk α k ← 1 2 ln ⁡ 1 − E k E k , 这里 αk α k 就是该分类器的权重
7. 改变样本的分布,提高错分样本的概率,降低正确分类样本的概率 Wk+1(i)Wk(i)Zk×{eαk,eαk,if hk(xi)=yiif hk(xi)yi W k + 1 ( i ) ← W k ( i ) Z k × { e − α k , if  h k ( x i ) = y i e α k , if  h k ( x i ) ≠ y i
8. until u n t i l k=kmax k = k m a x
9. return r e t u r n Ck C k αk α k k=1...kmax k = 1 , . . . , k m a x (带权值分类器的总体)
10. end e n d

2.2 Gradient Boosting

2.2.1 Boosting Tree

首先,提升树模型其实就是决策树的加法模型,表现为


fM(x)=Mm=1T(x;θm) f M ( x ) = ∑ m = 1 M T ( x ; θ m )
其中, T(x;θm) T ( x ; θ m ) 表示决策树, θm θ m 为树的参数, M M 为 树 的 个 数

回归提升树的分布算法如下

f0(x)=0 f 0 ( x ) = 0
fm(x)=fm1(x)+T(x;θm),m=1,2,3,...,M f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) , m = 1 , 2 , 3 , . . . , M
fM(x)=Mm=1T(x;θm) f M ( x ) = ∑ m = 1 M T ( x ; θ m )

给定当前模型 fm1(x) f m − 1 ( x ) ,需要求解第 m m 颗树的参数:


θ̂ m=argminθmNi=1L(yi,fm1(xi)+T(xi;θm)) θ ^ m = a r g m i n θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; θ m ) )

N N 代表总共有 N N 个样本。 通过上式,从而得到 θ̂ m θ ^ m , 即第 m m 颗树的参数
如果使用平方误差损失函数 L(y,f(x))=(yf(x))2 L ( y , f ( x ) ) = ( y − f ( x ) ) 2 ,其损失变为


L(yi,fm1(xi)+T(xi;θm)) L ( y i , f m − 1 ( x i ) + T ( x i ; θ m ) )
=(yifm1(xi)T(xi;θm))2 = ( y i − f m − 1 ( x i ) − T ( x i ; θ m ) ) 2
=(rT(xi,θm))2 = ( r − T ( x i , θ m ) ) 2

其中, r=yfm1(x) r = y − f m − 1 ( x ) , 即残差,可以理解为是当前模型 fm1(x) f m − 1 ( x ) 和 真 是 样 本 之 间 的 误 差
所以,对于回归问题的Boosting Tree来说,每一步只需要拟合当前模型的残差即可。

2.2.2 GBDT(Gradient Boosting Decision Tree)

boosting Tree 提升树利用加法模型实现优化过程时,当损失函数是平方损失函数时,每一步的优化很简单。但对于一般损失函数而言,往往每一步的优化没那么简单,所以引入了梯度提升(Gradient Boosting)算法。

GBDT的目标函数

对于普通的机器学习模型而言,其目标函数可以定义为如下:


obj:ni=1l(yi,ŷ i)+Kk=1Ω(fk) o b j : ∑ i = 1 n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k )

其中 n n 代表有 n n 个样本。前面一项是loss函数, 后面一项是正则项。
综合上述加法模型的计算过程,在第 t t 步,其目标函数是:


obj(t):ni=1l(yi,ŷ ti)+ti=1Ω(fi) o b j ( t ) : ∑ i = 1 n l ( y i , y ^ i t ) + ∑ i = 1 t Ω ( f i )
=ni=1l(yi,ŷ t1i+ft(xi))+Ω(ft)+constant = ∑ i = 1 n l ( y i , y ^ i t − 1 + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t

此时,优化该目标函数,就能得到 ft(xi) f t ( x i )

负梯度的理论支撑

前面第提到Gradient Boosting时,提及Gradient Boosting以负梯度代替残差来求解基函数,实际上,负梯度的理论支撑则是泰勒公式的一阶展开。即


f(x+Δx)=f(x)+f(x)Δx f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x

对于在第 t t 步的目标函数,对 l(yi,ŷ t1i+ft(xi)) l ( y i , y ^ i t − 1 + f t ( x i ) ) 做一阶泰勒展开,其中\hat{y}_i^{t-1}相当于泰勒上述公式的 x x , 而 ft(xi) f t ( x i ) 相当于是 Δx Δ x ,我们展开得到:


l(yi,ŷ t1i+ft(xi))=l(yi,ŷ t1i)+gift(xi) l ( y i , y ^ i t − 1 + f t ( x i ) ) = l ( y i , y ^ i t − 1 ) + g i f t ( x i )

其中, gi g i l(yi,ŷ t1i) l ( y i , y ^ i t − 1 ) 关于 ŷ t1i y ^ i t − 1 的一阶导数
此时,目标函数(不考虑正则项)变成:


obj(t):ni=1l(yi,ŷ ti)=ni=1l(yi,ŷ t1i)+gift(xi) o b j ( t ) : ∑ i = 1 n l ( y i , y ^ i t ) = ∑ i = 1 n l ( y i , y ^ i t − 1 ) + g i f t ( x i )
obj(t1):ni=1l(yi,ŷ t1i) o b j ( t − 1 ) : ∑ i = 1 n l ( y i , y ^ i t − 1 )

我们肯定希望目标函数每步的loss都减小的,即 Obj(t)<Obj(t1) O b j ( t ) < O b j ( t − 1 ) ,那么关键就在于 gift(xi) g i f t ( x i ) 这一项了。因为我们不知道到底是正还是负,那么只需让 ft(xi)=αigi f t ( x i ) = − α i g i α α 是我们任取的一个正系数)就能 gift(xi) g i f t ( x i ) 让一直恒为负了。

3. Stacking

这里写图片描述

参考文献

  1. https://zh.wikipedia.org/zh-cn/AdaBoost
  2. https://en.wikipedia.org/wiki/Gradient_boosting
  3. https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97
  4. https://www.zybuluo.com/Dounm/note/1031900#33-gradientboosting%E6%A2%AF%E5%BA%A6%E6%8F%90%E5%8D%87

你可能感兴趣的:(机器学习)