boosting-adaboost、GBDT、xgboost、lightGBM

来源:互联网 发布:时时彩系统彩源码 编辑:程序博客网 时间:2024/06/05 04:19

提升方法,是将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。
Kearns和Valiant提出了“强可学习”和“弱可学习”的概念
强可学习:在概率近似正确学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,这个概念被称为强可学习
弱可学习:一个概念,如果一个多项式学习算法能够学习它,学习的正确率仅比随机猜测略好
Schapore后来证明强可学习与弱可学习是等价的

对于分类问题而言,给定训练样本集,训练弱分类器比训练强分类器容易得多,提升方法就是从弱学习算法出发,得到一系列弱分类器(弱而不同)并组合成强分类器

1 adaboost

大多数提升方法都是改变训练数据的概率(权值)分布,针对不同的训练数据分布调用弱学习算法的一系列弱分类器

从而,两个问题需要解答:
(1),每一轮如何改变训练数据的权值分布?
adaboost将分类作物的样本权值提高,降低分类正确的样本权值,从而使分类错误的样本得到更大的关注
(2),如何将弱分类器组合成一个强分类器?
adaboost采用加权多数表决方法

1.1 adaboost算法描述

adaboost如何将这些想法自然且有效地实现在一种算法里
具体算法描述
给定二分类训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)}
其中每个样本点由实例和标记构成,实例xiχRn,标记yiy={1,+1}
χ是实例空间,y是标记集合
算法(Adaboost):
输入:训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)},其中xiχRnyiy={1,+1}
输出:最终分类器G(x)
(1)初始化训练数据的权值分布

D1=(ω11,ω12,...,ω1N),ω1i=1N,i=1,2,...,N(1.1)

(2)对m=1,2,...,N
(a)适用具有权值分布的Dm的训练数据集学习,得到基本分类器Gm(x):χ{1,+1}
(b)计算Gm(x)在训练数据集上的分类误差率
em=P(Gm(xiyi)=i=1NωmiI(Gm(xiyi)(1.2)

(c)计算Gm(x) 的系数
αm=12ln1emem(1.3)

(d)更新训练数据集的权值分布
Dm+1=(ωm1,ωm2,...,ωmN)

ωm+1,i=ωmiZmexp(αmyiGm(x))(1.4)

其中Zm是规范化因子
Zm=i=1Nωmiexp(αmyiGm(x))

使得Dm+1成为一个概率分布
(3)构建分类器的线性组合
f(x)=m=1MαmGm(x)

得到最终分类器
G(x)=sign(f(x))=sign(m=1MαmGm(x))

1.2 adaboost算法说明

算法说明:
(1)假设训练数据机在初始情况下具有均匀的权值分布,在此基础上学习基本分类器G1(x)
(2)Adaboost反复学习基本分类器,在每一轮m=1,2,...,M顺次执行:
(a)适用当前分布Dm加权的训练数据集,学习基本分类器G_{m}(x)
(b)计算基本分类器Gm(x)在加权训练数据集上的分类误差率:

em=P(Gm(xiyi))=Gm(xiyiωmi

可以看出数据权值分布Dm与基本分类器Gm(x)的分类误差率的关系
(c)计算基本分类器Gm(x)的系数αm,αm表示Gm(x)在最终分类器中的重要性,
由式(1.3)可知,当em12时,αm0,并且αm随着em的减小而增大,所以分类误差率越小的基本分类器在最终分类器中的作用越大
(d)更新训练数据集的权值分布为下一轮训练做准备,式(1.4)可以改写成:
ωm+1,i={ωmiZmeαmωmiZmeαmGm(x)=yiGm(x)yi

由上式可知,被分类器Gm(x)误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小,两相比较,误分类样本的权值被放大e2αm=em1em倍,误分类样本在下一轮学习中会起更大的作用
(3)线性组合f(x)实现M个基本分类器的加权表决,系数αm表示了基本分类器Gm(x)的中言行,这里αm之和并不为1

1.3 adaboost算法的另一个解释

adaboost算法的另一个解释,可以认为该模型是加法模型,损失函数为指数函数,学习算法为前向分布算法的二分类学习算法
此处不再详细说明,具体可查阅相关资料

1.4 总结

总结:Adaboost的两个特点:
(1),不改变训练数据,而不断改变训练数据的权值分布,使得训练数据在基本分类器的学习中起不同的作用
(2),利用基本分类器的线性组合构建最终分类器,f(x) 的符号决定实例x的类,f(x)的绝对值表示分类的确信度。

2 GBDT

提升树是以分类树或者回归树作为基本分类器的提升方法,提升树被认为是统计学习中性能最好的方法之一
提升方法采用加法模型(基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法成为提升树,提升树模型可以表示为

fM(x)=m=1MT(x,Θm)

其中,T(x,Θ)表示决策树,Θm为决策树参数,M为树的个数
对于分类问题:决策树是二叉分类树,对于回归问题:决策树是二叉回归树

2.1 GBDT算法

对于训练数据集训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)}
(1)f0(x)=0(2.1)
(2)第m步的模型由以下得出
(a)fm(x)=fm1(x)+T(x;Θm)(2.2)
(b)Θ̂ m=argminΘmNi=1L(yi,fm1(x)+T(x;Θm)(2.3)
(3)fM(x)=Mm=1T(x;Θm)(2.4)
不同问题的GBDT算法在于损失函数不同

2.1.1 二类分类问题:指数损失函数

算法与1.3描述类似,只是将Adaboost算法的基本分类器限定为二类分类树即可,这时候的提升树是Adaboost的特例

2.1.2 回归问题:平方误差损失函数

训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)},其中xiχRnχ为输入空间,yiyRy为输出空间
在前向分布算法的第m步,给定fm1(x),需要求解
Θ̂ m=argminΘmNi=1L(yi,fm1(x)+T(;,Θm)
如果采用平方误差损失函数:

L(y,f(x))=(yf(x))2

损失变为:
L(yi,fm1(x)+T(xi;Θm)=[yifm1(x)T(xi,Θm]2=[rT(xi;Θm]2

其中r=yfm1(x)为当前模型和拟合数据的残差
从而回归问题的GBDT算法描述如下
输入:T={(x1,y1),(x2,y2),...,(xN,yN)},其中xiχRnχ为输入空间,yiyRy为输出空间
输出:提升树f_{M}(x)
(1)初始化f0(x)=0
(2)对m=1,2,...,M
(a)计算残差:rmi=yifm1(xi),i=1,2,...,N
(b)拟合残差学习得到一个回归树:T(x;Θm)
(c)更新fm(x)=fm1(x)+T(x;Θm)
(3)得到回归问题提升树fM(x)=Mm=1T(x;Θm)

2.1.3 一般损失函数的一般决策问题

损失函数为平方损失、指数损失时,每一步的优化都很简单,但对一般损失函数而言,每一步的优化并不简单,对此,Freaiman提出了梯度提升算法,本质时利用最速下降的近似方法,
核心是利用损失函数负梯度在当前模型的值

[L(y,f(xi))f(xi)]f(x)=fm1(x)

作为回归问题提升树算法中的残差的近似值,拟合回归树。

3 XGBOOST

XGBOOST同样采用加性模型与前向分布算法,XGBOOST采用的基本模型为回归决策树

3.1 损失函数

训练数据集D={(xi,yi)}(|D|=n,xiRm,yiR),表示样本数量为n,特征数量为m,加性模型预测样本xi

ŷ i=ϕ(xi)=k=1Kfk(xi),fkF(3.1)

其中F={f(x)=ωq(x)}(q:RmT,ωRT)表示回归树空间,q表示样本到叶子节点序号的映射,T表示树中叶子节点的个数,ω表示叶子节点权重,与分类树不同的是,回归树在每个叶子节点都有一个连续的score。
XGBBOST的目标损失函数为:
L(ϕ)=i(l(ŷ i,yi))+kΩ(fk)(3.2)

其中Ω(f)=γT+12λ||ω||2表示正则化项

3.2 梯度提升

按照加性模型思想,式(3.2)可以表示为

Lt=t=1nl(yi,ŷ t1i+ft(xi))+Ω(ft)(3.3)

按照taylor展开原理
L(t)i=1n[l(yi,ŷ t1i)+gift(xi)+12hif2t(xi)]+Ω(ft)(3.4)

其中
gi=l(yi,ŷ t1i)ŷ t1i

hi=2l(yi,ŷ t1i)ŷ t1i

由于希望损失函数最小,去除式(3.4)中的常数项
L̃ (t)=i=1n[gift(xi)+12hif2t(xi)]+Ω(ft)(3.5)

对于决策树ft(xi),定义Ij={i|q(xi)=j}表示叶子节点j中的样本集合,从而
L̃ (t)=i=1n[gift(xi)+12hif2t(xi)]+γT+12λj=1Tω2j=j=1T[(iIjgi)ωj+12(iIjhi+λ)w2j]+γT(3.6)

式(3.6)取最小时
ωj=iIjgiiIjhi+λ(3.7)

代入式(3.6)得到
L̃ (t)(q)=12j=1T(iIjgi)2iIjhi+λ+γT

上式可以衡量一颗树结构的损失函数,期望损失函数越小越好,但是,树的生长过程中,不可能遍历所有可能的树结构,所以一个贪心算法是从一个叶子节点开始不断添加分支(也就是节点分裂),期望不断降低损失函数
在某结点分裂的时候,损失函数的减小值可以表示为
Lsplit=12[(iILgi)2iILhi+λ+(iIRgi)2iIRhi+λ(iIgi)2iIhi+λ]γ(3.8)

其中,IL表示分裂后的左孩子结点的样本集合,IR表示分裂后的右孩子结点的样本集合,I=ILIR
式(3.8)经常用作确定分裂候选位置

3.3 分裂算法

3.3.1 精准的贪心分裂算法

输入:I表示当前结点的样本集合
输入:d表示特征维度
gain0
GiIgiHiIhi
for k=1 to m do
GL0,HL0
for j in sorted(I,by Xjk) do
GLGL+gj,HLHL+hj
GRGGL,HRHHL
scoremax(score,G2LHL+λ+G2RHR+λG2H+λ)
end
end
输出:在最大score处分裂
思想:暴力遍历m个特征的所有可能分裂点

3.3.2 近似算法

暴力法因为枚举了所有可能分裂的位置,所以非常有效,但是当数据量比较大时,效率并没有那么高,尤其所有数据不能全部存入内存时
从而,提出了一种近似方法,根据特征分布选择候选的样本分裂点,基于候选的样本分裂点寻找最有分裂位置,近似算法有两种变种类型,全局寻找候选点与局部寻找候选点,全局寻找表示在最开始的时候找出所有的候选位置,在每次学习时复用;局部寻找表示每次分裂时重新计算候选位置。如果寻找的位置点足够多,全局寻找的准确率会和局部寻找相当
对于候选分割点的选择算法,有近似直方图算法,具体可参阅相关文章

3.4 缺失值处理

在机器学习实际应用场景中,训练数据集中很多特征数据是稀疏的,xgboost对这类问题的处理,在结点分裂时缺失值按照默认方向处理
分裂时,具体做法,式(3.8)中考虑缺失值划入左孩子结点、右孩子结点两种情形下的损失函数,寻找最有的分割点

3.5 系统实现

(1)xgboost对每个特征进行排序,以块的结构存储在内存中,后续迭代可以重复使用
(2)在计算不同特征的最佳分割点时,可以采用多线程并行的方式进行
(3)当内存空间不够时,xgboost如何有效利用磁盘空间,主要利用块压缩、块分片技术

3.6 xgboost vs GBDT

(1)GBDT迭代时只考虑了一阶导数,xgboost迭代时考虑了一阶、二阶导数,xgboost可以自定义损失函数,只需要一阶、二阶可导;
(2)xgboost在损失函数中添加了正则化项,防止过拟合;
(3)传统GBDT以决策树为基本分类器,xgboost还支持其他线性分类器,这时候xgboost相当于带正则化项的LR回归、线性回归;
(4)xgboost还引入了衰减(shrinkage,相当于学习速率)、列抽样,降低过拟合可能性;
(5)xgboost对于缺失值可以自动学习出分裂方向;
(6)训练事先排好序并以block的形式存储,可以并行计算,寻找特征的最佳分割点;
(7)由于底层支持容错的分布式通信框架rabit,xgboost支持分布式计算,可以运行在MPI,YARN上

4 LIGHTGBM

<未完待续>

5 参考文献

(1)统计学习方法-李航
(2)XGBOOST:A Scalable Tree Boosting System, TianqiChen.(KDD 2016)