目录
1.提升方法的基本思想
基本思想:对于一个复杂任务,适当综合多个专家的判断后得到的结果,比其中任何一个专家单独的判断好。一句俗话总结,“三个臭皮匠,顶一个诸葛亮”。
弱可学习:一个很好理解的概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机瞎猜稍微好一点,那么这个概念就是弱可学习的。经过弱可学习算法训练得到的弱分类器就像一个臭皮匠。
强可学习:一个很好理解的概念,如果存在一个多项式的学习算法能够学习它,学习的正确率很高,那么这个概念就是强可学习的。经过强可学习算法训练得到的强分类器就像一个诸葛亮。
发现强学习算法总是比发现弱学习算法难的多,因为世间不是人人都可以当诸葛亮的。提升方法要做的就是,从弱学习算法出发,反复学习,得到一系列弱分类器,然后把这些弱分类器组合成一个强分类器。可以理解为好多臭皮匠凑在一起出主意,可以顶一个诸葛亮。
根据弱分类器的生成方式,提升方法大致可分为两类:
- 本次迭代生成一个弱分类器时,依赖上一轮的弱分类器,是串行生成的序列化方法,代表为Boosting族算法;
- 本次迭代生成一个弱分类器时,不依赖上一轮的弱分类器,是可以同时生成的并行化方法,代表为Bagging和随机森林;
对于提升方法来说,有两个问题需要解决:
3. 训练数据对弱分类器的影响会随着每一轮的训练而变化,如何映射这些变化和训练数据权值(或概率分布)的关系?
4. 如何把这些弱分类器按照某种规则组合成一个强分类器?
下面介绍提升方法最具代表性的提升算法AdaBoost如何解决这两个问题。
2.AdaBoost算法
AdaBoost是Boosting族算法中的代表,Ada是Adaptive“适应的”,Boost是“提升”,顾名思义,此算法即“适应的提升”。
AdaBoost解决这两个问题的基本思路:
- 在上一轮经过弱分类器分类后,提高错误分类的样本权值,降低正确分类的样本权值,这样下一轮弱分类器就会更加关注分错的那些样本。就像我们在刷题时,会更加关注在上一遍做错的题。需要注意的是,在每一轮的训练弱分类器中,用的是同一个训练数据集,不断变化的只是训练数据的权值而已。
- 采取加权多数表决方式,加大分类误差率小的弱分类器权值,减小分类误差率大的弱分类器权值,让误差率更小的弱分类器在表决中作用更大。也就是越准的弱分类器越可信。可以理解为十个普通学生在一起讨论一道题的答案,其中成绩较好的学生的话语权肯定要比成绩较差的话语权大一点。
AdaBoost算法的具体步骤如下:
-
输入训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)},y的取值为-1或+1;输入弱学习算法。
-
等概率初始化训练数据的权值分布D1:
D 1 = ( ω 11 , ω 12 , . . . , ω 1 N ) D_1=(\omega_{11},\omega_{12},...,\omega_{1N}) D1=(ω11,ω12,...,ω1N)
ω 1 i \omega_{1i} ω1i是第一轮得到的权值分布中的第i个数据的权值, ω 1 i = 1 N , ∑ i = 1 N ω 1 i = 1 \omega_{1i}=\frac{1}{N},\sum_{i=1}^{N}\omega_{1i}=1 ω1i=N1,∑i=1Nω1i=1。也就是说,刚开始时,所有数据都一视同仁,具有相同的权值,且在每一轮中所有数据权值和都为1。这时T成为了加权训练数据集。
可以理解为每个数据(x1,y1)相当于一张卷子(T)上的一道题,每道题有自己的分值( ω 1 i \omega_{1i} ω1i),第一次刷这份卷子时,所有题都占同样的分数,在第二遍刷时,错题占的分就会多些。 -
用具有D1权值分布的数据集T,和弱学习算法,学习弱分类器G1(x)。在每一轮中的弱学习算法都是相同的,每一轮学到的分类器都与上一轮有关,不是完全独立的。(如果这里的弱学习算法用的是决策树的话,最终得到的就是提升树。)
-
计算弱分类器G1(x)在加权训练数据集T上的分类误差率e1,也就是被G1(x)分错的样本的权值之和。可以理解为用这张卷子的错误率(e1)来判断一个人(G1(x))学习成绩好的程度:
e 1 = ∑ G 1 ( x i ) ≠ y i ω 1 i e_1=\sum_{G_1(x_i)\neq y_i}\omega_{1i} e1=G1(xi)=yi∑ω1i -
计算G1(x)的权重系数 α 1 \alpha_1 α1, α 1 \alpha_1 α1就是问题2加权多数表决法中的弱分类器的权值,决定了弱分类器G1(x)在最终表决时占的比重有多大:
α 1 = 1 2 l o g 1 − e 1 e 1 \alpha_1=\frac{1}{2}log\frac{1-e_1}{e_1} α1=21loge11−e1
分类误差率越大,说明这个弱分类器分的越不准,它的权值就越小,在最终表决时占的比重越小。
对于二分类问题来说,闭着眼瞎分,误差率最多也就是50%,当一个分类器的分类误差率 e m ≤ 1 2 e_m\le \frac{1}{2} em≤21时,说明该分类器的分类能力比随机瞎分强,说明它是有作用的,那么它的权值 α m ≥ 0 \alpha_m\ge 0 αm≥0,且误差率越小,权值越大。 -
引入规范化因子Z1,规范化因子用于后续更新权值,根据Z1可以得到权值分布D2:
Z 1 = { ∑ i = 1 N ω 1 i e − α 1 , G 1 ( x i ) = y i ∑ i = 1 N ω 1 i e α 1 , G 1 ( x i ) ≠ y i Z_1=\left\{ \begin{aligned} \sum_{i=1}^{N}\omega_{1i}e^{-\alpha_1}& , & G_1(x_i)= y_i \\ \sum_{i=1}^{N}\omega_{1i}e^{\alpha_1}& , & G_1(x_i)\neq y_i \\ \end{aligned} \right. Z1=⎩ ⎨ ⎧i=1∑Nω1ie−α1i=1∑Nω1ieα1,,G1(xi)=yiG1(xi)=yi
更新T的权值分布为 D 2 = ( ω 21 , ω 22 , . . . , ω 2 N ) D_2=(\omega_{21},\omega_{22},...,\omega_{2N}) D2=(ω21,ω22,...,ω2N),为下一轮做准备:
ω 2 i = { ω 1 i Z 1 e − α 1 , G 1 ( x i ) = y i ω 1 i Z 1 e α 1 , G 1 ( x i ) ≠ y i \omega_{2i}=\left\{ \begin{aligned} \frac{\omega_{1i}}{Z_1} e^{-\alpha_1}& , & G_1(x_i)= y_i \\ \frac{\omega_{1i}}{Z_1} e^{\alpha_1}& , & G_1(x_i)\neq y_i \\ \end{aligned} \right. ω2i=⎩ ⎨ ⎧Z1ω1ie−α1Z1ω1ieα1,,G1(xi)=yiG1(xi)=yi
更新规范化因子Z2:
Z 2 = { ∑ i = 1 N ω 2 i e − α 2 , G 2 ( x i ) = y i ∑ i = 1 N ω 2 i e α 2 , G 2 ( x i ) ≠ y i Z_2=\left\{ \begin{aligned} \sum_{i=1}^{N}\omega_{2i}e^{-\alpha_2}& , & G_2(x_i)= y_i \\ \sum_{i=1}^{N}\omega_{2i}e^{\alpha_2}& , & G_2(x_i)\neq y_i \\ \end{aligned} \right. Z2=⎩ ⎨ ⎧i=1∑Nω2ie−α2i=1∑Nω2ieα2,,G2(xi)=yiG2(xi)=yi
更新完权值分布后可以发现,被G1 (x)正确分类的样本的权值会变小,被G1(x)错误分类的样本的权值会变大,下一轮学习到的弱分类器G2(x)会更看重上一轮分错的那些样本。 -
循环步骤3,4,5,6 M轮后,由规范化因子Zm-1得到权值分布Dm,根据 具有权值分布Dm的 同一个训练数据集T,学习得到M个弱分类器,每个弱分类器Gm(x)都根据自己的分类误差率em得到了自己的权重系数 α m \alpha_m αm。
-
构建M个弱分类器的线性组合,实现M个弱分类器的加权表决:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_mG_m(x) f(x)=m=1∑MαmGm(x)
其中 α m \alpha_m αm是每个弱分类器的权重系数。 -
得到最终的强分类器:
G ( x ) = s i g n f ( x ) = { + 1 , f ( x ) ⩾ 0 − 1 , f ( x ) < 0 \begin{aligned} G(x)&=signf(x)\\ &=\left\{ \begin{aligned} +1 & , & f(x)\geqslant0 \\ -1 & , & f(x)<0 \end{aligned} \right. \end{aligned} G(x)=signf(x)={+1−1,,f(x)⩾0f(x)<0
f(x) 的符号决定了输入样本x的类,f(x) 的绝对值表示分类的确信度。
可以理解为,经过M轮刷卷子后,选出了M个学生,这些学生按照成绩好坏赋予了不同的决定权重,当拿到一个判断题后,M个学生做出了M个答案,成绩好的学生更可信,权重会大一点,最终M个学生一起决定出了一个数值,如果这个数值是正的,答案就是对,否则是错。
Boosting算法在训练的每一轮中都要检查当前生成的弱分类器是否满足基本条件(即分类效果是否比瞎猜要好,准确率是否>50%),若不符合,当前弱分类器会被抛弃,然后根据当前数据分布重新对训练样本进行采样,基于新的采样结果重新训练一个新的弱分类器,然后让算法持续下去。因此,Boosting算法要求弱分类器能对特定的数据分布进行学习。
3.前向分步算法
前向分步算法的核心思想是:每步只学习一个基函数及其系数,逐步极小化损失函数,简化优化的复杂度。
-
加法模型:
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 \gamma_m γm为基函数的参数, β m \beta_m βm为基函数的系数。 -
损失函数极小化:
给定训练数据和损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x)),学习加法模型f(x)转变成了损失函数极小化问题:
( β m , γ m ) = a r g m i n β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m,\gamma_m)=arg\underset {\beta,\gamma}{min}\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
其中, y i y_i yi是样本的真实值, f m − 1 ( x i ) f_{m-1}(x_i) fm−1(xi)是前m-1轮得到的最优基函数组合, b ( x i ; γ m ) b(x_i;\gamma_m) b(xi;γm)是第m轮得到的基函数, β m \beta_m βm是第m轮基函数的最优参数 β \beta β, γ m \gamma_m γm是第m轮基函数的最优参数 γ \gamma γ。通过逐次求解各轮的最优 γ m , β m \gamma_m,\beta_m γm,βm,得到最终的加法模型。
注意:AdaBoost算法是前向分步算法的特例!
可以认为AdaBoost算法是模型为加法模型,损失函数为指数损失函数,学习算法为前向分步算法的二分类学习方法。也就是说,前向分步算法学习的基函数为弱分类器时,最终得到的加法模型等价于AdaBoost最终得到的强分类器。
基函数 b ( x ; γ m ) b(x;\gamma_m) b(x;γm)相当于AdaBoost算法中的弱分类器 G m ( x i ) G_m(x_i) Gm(xi);基函数的系数 β m \beta_m βm相当于弱分类器的权重系数 α 1 \alpha_1 α1。
前向分步算法逐步学习基函数的过程,与AdaBoost逐步学习弱分类器的过程一致。
4.BT(Boosting Tree 提升树)
提升方法很具体的一个实例就是提升树,以决策树为基函数的提升方法叫做提升树。决策树相关知识传送门
回归问题的提升树算法步骤:
- 输入训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)},变量Y是连续的。
- 初始化提升树f0(x)=0。
- 用决策树算法求得第一颗决策树T1(x),得到第一颗提升树f1(x)=T1(x)。
- 计算f1(x)的目标函数值,可以用目标函数作为停止条件。
这里的目标函数包含两部分,第一是损失函数(常用均方误差和logistic损失两种),第二是正则项(为了避免过拟合)。 - 设残差rmi为原始数据yi与fm(xi)预测值的误差,即:
r m i = y i − f m ( x i ) , i = 1 , 2 , . . . , N r_{mi}=y_i-f_m(x_i),i=1,2,...,N rmi=yi−fm(xi),i=1,2,...,N
将学习的原始数据换成残差表r1,用学习数据为残差表r1的决策树算法求得第二颗决策树T2(x),得到第二颗提升树f2(x)=f1(x)+T2(x)。 - 用提升树f2(x)和原始数据的误差更新残差表r2,用学习数据为残差表r2的决策树算法求得第三颗决策树T3(x),得到第三颗提升树f3(x)=f2(x)+T3(x)。
- 经过M轮循环步骤4 5 6,损失函数满足误差要求或达到其他停止条件后,得到最终的提升树:
f M ( x ) = f M − 1 ( x ) + T M ( x ) = ∑ m = 1 M T m ( x ) \begin{aligned} f_M(x)&=f_{M-1}(x)+T_M(x)\\ &=\sum_{m=1}^{M}T_m(x) \end{aligned} fM(x)=fM−1(x)+TM(x)=m=1∑MTm(x)
在以上的计算中,如果损失函数为平方损失函数,优化会比较简单,损失函数的负梯度在当前模型的值就是通常所说的残差。
当损失函数为一般损失函数时,优化比较难,损失函数的负梯度在当前模型的值就是残差的估计值。这时的提升树可以称为梯度提升树GBDT。
5. Bagging
以上算法的弱分类器都是不独立的(不独立体现在每一次生成弱分类器都要依赖上一轮的弱分类器),而要想得到泛化能力强的集成,弱分类器应该尽量独立(在具体实现中体现为让弱分类器之间的差异尽量大)。
如何能让弱分类器之间的差异尽量大?一种做法为自助采样法:
给定包含m个样本的数据集D,每次随机从D中有放回地挑一个样本,重复m次后,得到包含m个样本的数据集D’。
很简单的实现,那自助采样法有什么用处呢?
- 在数据集较小,难划分训练集和测试集时很有用,多次使用自助法可以从初始数据集中产生多个不同的训练集。但要慎用,因为自助法产生的数据集改变了初始数据集的分布,需要引入估计偏差,所以数据足够时尽量不要用自助法;
- 给定一个数据集D,为了得到更好的模型,我们希望拿全部的D来训练,但对于留出法和交叉验证法,必须要从D中抠一部分出来当作测试集,这样就会导致因训练样本规模不同而导致的估计偏差。这种情况下可以用自助法生成与D相同大小的D’,经数学证明,D中的样本有36.8%不会在D’中出现,因此可以将D’作为训练集,将D-D’作为测试集,这样的测试结果称为“包外估计”。
Bagging基本流程:
- 用自助采样法得到T个数据集,每个数据集有m个样本;
- 基于每个数据集,并行训练得到T个弱分类器;
- 用最简单的投票法(若是回归任务用简单平均法)将T个弱分类器结合成一个强分类器。
6. RF(Random Forest 随机森林)
随机森林是Bagging的扩展,随机森林与Bagging的区别:
- 为保持多样性,得到泛化能力较好的模型,Bagging增加了样本扰动(自助采样法);
- 随机森林不光增加了样本扰动,还增加了属性扰动。
- 随机森林比Bagging效率高,因为Bagging每次都要考查整个集合,随机森林只需考查一个小子集。
属性扰动:
- 传统决策树在选择划分属性时,是从当前节点的所有属性集合(假设有d个属性)中选择一个最优的;
- 随机森林先从当前节点的所有属性集合中随机选择一个包含k个属性的子集,再从子集中选择一个最优的。参数k决定了随机性有多大,k越大,随机性越小,一般情况下k取 l o g 2 d log_2d log2d。
7. GBDT(梯度提升决策树)
GBDT全称为Gradient Boosting Decision Tree,是一种基于boosting的加法模型,训练时采用前向分布算法,每次迭代都学习一棵CART树来拟合之前的树的预测结果与训练样本真实值的残差。
GBDT是串行生成的,难实现并行化,当数据维度很高时,计算时间很长。
8. XGBoost(极致梯度提升)
XGBoost全称为eXtreme Gradient Boosting,是GBDT的扩展,XGBoost与GBDT的区别:
- GBDT的损失函数使用一阶导,XGBoost使用二阶导,更为精准;
- GBDT没有处理过拟合,XGBoost的目标函数加了正则项,避免了过拟合;
- GBDT只能串行生成,XGBoost支持Block存储,可以并行计算。
XGBoost公式推导+实例看这篇,从入门到实战,值得细究
XGBoost原论文PDF下载,良心建议先看上一个链接再看原论文
9. 总结
- 提升方法基本思想:“三个臭皮匠,顶一个诸葛亮”;
- 根据弱分类器生成时是否独立,提升方法可分为串行生成的序列化方法(Boosting族算法)和同时生成的并行化方法(Bagging和随机森林)。
- AdaBoost属于Boosting族算法,是串行生成的模型为加法模型,损失函数为指数损失函数,学习算法为前向分步算法的学习方法,只能用于二分类任务。
- Boosting族算法会用“重采样法”处理不符合基本条件的弱分类器(基本条件为分类效果比瞎猜好,分类准确率>50%);
- Boosting关注降低偏差,只能串行生成多个弱分类器,可以基于泛化能力非常弱的弱分类器构建出很强的强分类器;
- Bagging关注降低方差,可以并行生成多个弱分类器,且可以不经修改用于多分类、回归等任务;Bagging增加了样本扰动。
- 随机森林在Bagging基础上增加了属性扰动,最终得到的模型泛化能力更好,且效率比Bagging高;
- XGBoost比GBDT更精准,更快,还避免了过拟合。