GBDT模型
提升树|BDT
提升树是以分类树或回归树为基本分类器的提升方法。
提升树模型可以表示为决策树的加法模型:
fM(x)=m=1∑MT(x;Θm)对分类问题是二叉分类树,对回归问题是二叉回归树。
提升树算法:前向分布算法
首先确定初始提升树
f0(x)=0,第m步的模型是
fm(x)=fm−1(x)+T(x;Θm)通过经验风险极小化确定下一颗决策树的参数
Θ^m=argΘmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。
不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。
指数损失下的分类提升树
只需将AdaBoost算法中的基本分类器限制为二叉分类树即可。此时的提升树算法是AdaBoost算法的特殊情况。
平方损失下的回归提升树
已知训练数据集
T={(x1,y1),(x2,y2),…,(xN,yN)},其中实例
xi∈X⊆Rn,标记
yi∈Y={−1,+1}。如果将输入空间
X划分为J个互不相交的区域
R1,R2,⋯,RJ,并且在每个区域上确定输出的常量
cj,那么树可以表示为
T(x;Θ)=j=1∑JcjI(x∈Rj)使用前向分步算法:
f0(x)=0fm(x)=fm−1(x)+T(x;Θm),m=1,2⋯,Mf(x)=m=1∑MT(x;Θm)当采用平方损失函数
L(y,f(x))=(y−f(x))2时
L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]2Θ^m=argΘmmini=1∑N[ri−T(xi;Θm)]2这里
r=y−fm−1(x)即当前模型拟合数据的残差。
因此对于回归问题的提升树算法来说,只需简单地拟和当前模型的残差。
一般损失函数的一般决策问题
当损失函数是指数函数和平方损失函数时,每一步的优化是非常简单的。但对一般损失函数而言,往往优化并不那么容易,则需要通过梯度提升算法优化。
梯度提升树|GBDT
GBDT=梯度提升算法+CART回归树- GBDT是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或回归的算法。
- GBDT的核心:利用损失函数的负梯度在当前模型的值−[∂f(xi)∂L(yi,f(xi)]f(x)=fm−1(x)作为回归提升树算法中的残差的近似值,拟合一个回归树。这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解后者全局最优解。
- GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的负梯度(如果损失函数是平方损失函数,则负梯度就是残差值)的基础上进行训练。
- 对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。弱分类器一般会选择为CART TREE(也就是分类回归树),由于低方差和高偏差(即模型简单)的要求每个分类回归树的深度不会很深。
GBDT回归算法
输入:训练数据集
T={(x1,y1),(x2,y2),…,(xN,yN)},
xi∈X⊆Rn,
yi∈Y⊆R;损失函数
L(y,f(x));
输出:回归树
f^(x)。
- 初始化
f0(x)=argcmini=1∑NL(yi,c)
- 对m=1,2⋯,M
- 对i=1,2⋯,N,计算负梯度
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
- 对{(xi,rmi)}N拟合一个回归树,得到第m棵树的叶节点区域Rmj,j=1,2⋯,J
- 对j=1,2⋯,J计算
cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
- 更新fm(x)=fm−1(x)+j=1∑JmcmjI(x∈Rmj)
- 得到回归树
f(x)=fM(x)=f0(x)+m=1∑Mj=1∑JmcmjI(x∈Rmj)
GBDT回归树的例子
年龄预测:简单起见训练集只有4个人,A、B、C、D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C、D分别是应届毕业生和工作两年的员工。
如果用一颗传统的回归决策树来训练,会得到如图1所示的结果。
现在使用GBDT,由于数据太少,我们限定叶子节点最多有两个,即每棵树都只有一个分支,并且限定只学两棵树。我们得到如图2所示的结果。
既然图1和图2最终效果相同,为何还需要GBDT呢?
答案是为了防止过拟合。
图1为了达到100%精度使用了3个feature(上网时长、时段、网购金额),其中分支"上网时长>1.1h"很显然已经过拟合了,这个数据集上A、B也许恰好A每天上网1.09h,B上网1.15小时,但用上网时长是不是>1.1小时来判断所有人的年龄很显然是很有悖常识的;
图2的boosting虽然用了两棵树,但其实只用了2个feature就搞定了。Boosting的最大好处在于,每一步的残差计算其实变相的增大了分错样本的权重,而已经分对的样本则都趋于0。这样后面的树就能越来越专注那些前面被分错的样本。
GBDT分类算法
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差,因此GBDT分类也是使用的CART回归树。
与回归算法区别在于损失函数的选择:
- 指数损失函数:此时GBDT退化为Adaboost算法
- LR对数似然损失函数:也就是用类别的预测概率值和真实概率值的差来拟合损失
需要说明的是,LR的预测值是分类为1的概率
pi,而
GBDT的输出为分类为1的对数几率f(xi),
f(xi)=log(odds)=log1−pipi
GBDT二分类
二元GBDT的损失函数和负梯度
第一种形式:
Losspirmi=−i=1∑N(yilog(pi)+(1−yi)log(1−pi)),yi∈{0,1}=1+exp(−f(xi))1=−[∂f(xi)∂L(yi,f(xi)))]f(x)=fm−1(x)=yi−1+e−fm−1(xi)1=yi−pi,m−1观察该损失函数,有
L(yi,f(xi))={log(1+exp(−f(xi)),log(1+exp(f(xi)),yi=1yi=0故二元GBDT的损失函数也可以使用以下形式:
Lossrmi=i=1∑N(log(1+exp(−yif(xi)))),yi∈{−1,1}=(1+exp(yifm−1(xi)))yi={1−pi,m−1−pi,m−1,,yi=1yi=−1注意,两者损失函数是等价的,形式不同的原因在于负例是用0表示还是用-1表示。
对于生成的决策树,计算各个叶子结点的最佳残差拟合值:
cmj=cargminxi∈Rmj∑L(yi,fm−1(xi)+c)由于上式没有封闭解,故一般用近似值替代。
二元GBDT叶子结点的近似残差拟合值
yi∈{0,1}下的残差拟合值公式为
cmj=∑xi∈Rmj(yi−rmi)(1−yi+rmi)∑xi∈Rmjrmi等价为
cmj=∑xi∈Rmj∣rmi∣(1−∣rmi∣)∑xi∈Rmjrmi该公式在
yi∈{0,1}或
yi∈{−1,1}时都适用。
两者形式等价
(yi−rmi)(1−yi+rmi)={(−rmi)(1+rmi)(1−rmi)rmi, yi=0,rmi=0−pi,m−1<0, yi=1,rmi=1−pi,m−1>0=∣rmi∣(1−∣rmi∣) 近似值推导
假设仅有一个样本
(xi,yi),求
cargminL(yi,f(xi)+c) L(yi,f(xi))=−[yilogpi+(1−yi)log(1−pi)]pi=1+exp(−f(xi))1求得
∂f(xi)∂pi=pi(1−pi)- L(yi,f(xi))关于f(xi)的一阶导
∂f(xi)∂L(yi,f(xi))=∂pi∂L(yi,f(xi))⋅∂f(xi)∂pi=−(piyi−1−pi1−yi)⋅(pi⋅(1−pi))=pi−yi
- L(yi,f(xi))关于f(xi)的二阶导
∂f(xi)2∂2L(yi,f(xi))=∂pipi−yi⋅∂f(xi)∂pi=pi(1−pi)
- 对L(yi,fm−1(xi)+c)进行二阶泰勒展开
L(yi,fm−1(xi)+c)≈L(yi,fm−1(xi))+∂fm−1(xi)∂L(yi,fm−1(xi))⋅c+21∂fm−1(xi)2∂2L(yi,fm−1(xi))c2L(yi,fm−1(xi)+c)取极值时,
cmi=−2(21∂fm−1(xi)2∂2L(yi,fm−1(xi)))∂fm−1(xi)∂L(yi,fm−1(xi))=pi,m−1(1−pi,m−1)yi−pi,m−1
由于残差
rmi=yi−pi,m−1,则
cmi=(yi−rmi)(1−yi+rmi)rmi对于含多个样本的叶子结点j,按照如上过程容易得出
xi∈Rmj∑L(yi,f(xi)+c)≈xi∈Rmj∑L(yi,f(xi))+xi∈Rmj∑(pi,m−1−yi)⋅c+21xi∈Rmj∑pi,m−1(1−pi,m−1)c2则最佳拟合值为
cmi=∑xi∈Rmj pi,m−1(1−pi,m−1)∑xi∈Rmj(yi−pi,m−1)=∑xi∈Rmj(yi−rmi)(1−yi+rmi)∑xi∈Rmjrmi
GBDT二分类算法- 初始化第一个弱学习器
f0(x)=log1−P(y=1∣x)P(y=1∣x)其中
P(y=1∣x)是样本中 y=1 的比例,利用先验信息来初始化弱学习器。
- 对m=1,2,⋯,M
- 对每个样本计算伪残差
rmi=yi−1+e−fm−1(xi)1,i=1,2⋯,N
- 利用CART回归树拟合数据{(xi,rmi)}N,得到第m棵回归树,其对应的叶子结点区域为Rmj,j=1,2,⋯,Jm,Jm为第m颗回归树叶子结点的个数。
- 计算每个叶子结点的输出
cmj=∑xi∈Rmj∣rmi∣(1−∣rmi∣)∑xi∈Rmjrmi
- 更新强学习器
fm(x)=fm−1(x)+j=1∑JmcmjI(x∈Rmj)
- 最终强学习器
fM(x)=f0(x)+m=1∑Mj=1∑JmcmjI(x∈Rmj)
- 最终分类模型为
P(y=1∣x)=1+e−fM(x)1
GBDT多分类
多元GBDT的损失函数和负梯度
Losspikrmik=−i=1∑Nk=1∑Kyiklogpik=∑k=1Kexp(fk(xi))exp(fk(xi))=−[∂f(xi)∂L(yi,f(xi)))]fk(x)=fk,m−1(x)=yik−pk,m−1(xi)其中如果样本
i的类别为k,则
yik=1,yij=0,j=k 多元GBDT叶子结点的近似残差拟合值
cmjk=KK−1∑xi∈Rmj∣rmik∣(1−∣rmik∣)∑xi∈Rmjrmik
GBDT损失函数总结
对于分类算法,常用损失函数函数为以下两种:
- 指数损失函数:L(y,f(x))=exp(−yf(x))
- 对数损失函数
二分类:
L(yi,f(xi))=log(1+exp(−yif(xi))),yi∈{−1,1}或者
L(yi,f(xi))=−(yilogpi+(1−yi)log(1−pi)),y∈{0,1}pi=1+e−f(xi)1多分类:
L(yi,f1…K(xi))=k=1∑Kyiklogpikpik=∑k=1Kexp(fk(xi))exp(fk(xi))
对于回归算法,常用损失函数有以下四种:
- 均方差损失函数
L(yi,f(xi))=(yi−f(xi))2
- 绝对损失函数
L(yi,f(xi))=∣yi−f(xi)∣
- Huber损失函数
它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。
L(yi,f(xi))={21(yi−f(xi))2δ(∣yi−f(xi)∣−2δ)∣yi−f(xi)∣≤δ∣yi−f(xi)∣>δ对应的负梯度残差为
r(yi,f(xi))={yi−f(xi)δsign(yi−f(xi))∣yi−f(xi)∣≤δ∣yi−f(xi)∣>δ
- 分位数损失函数
它对应的是分位数回归的损失函数
L(yi,f(xi))=yi≥f(xi)∑θ∣yi−f(xi)∣+y<f(xi)∑(1−θ)∣yi−f(xi)∣其中θ为分位数,需要在回归前指定。
对应的负梯度残差为
r(yi,f(xi))={θθ−1yi≥f(xi)yi<f(xi)
其中Huber损失和分位数损失主要用于健壮回归,也就是减少异常点对损失函数的影响。
GBDT正则化
GBDT的正则化主要有三种方式:
- 同AdaBoost正则化一样设置步长ν
没有正则化的弱学习器的迭代
fm(x)=fm−1(x)+Tm(x)加入正则化(学习率)的弱学习器的迭代
fm(x)=fm−1(x)+νTm(x)学习率的取值范围为
0<ν≤1,较小的
ν意味着需要更多的弱学习器的迭代次数。
常用步长和迭代最大次数一起来决定算法的拟合效果。
- 自采样SGBT,比例取值为(0,1]。
注意这里的自采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差。因此取值不能太低,推荐在[0.5, 0.8]之间。
- CART回归树正则化剪枝
AdaBoost和GBDT的区别
- 学习器的选择
AdaBoost可以选择任何学习器;
GBDT无论是分类、回归、排序都用的回归树;
- 分类任务的输出
AdaBoost弱分类器的输出和集成方法的输出是一致的;
GBDT用于分类时,叶子结点的输出是对数几率,要输出对应类别的概率,需要通过sigmoid或softmax函数求得。
- 损失函数
AdaBoost损失函数用的是指数损失函数;
GBDT的损失函数可以是任意可微函数;
- 原理
AdaBoost通过改变样本数据的权重来影响后续分类器的建立;
GBDT通过将损失函数的负梯度(即伪残差)作为后续弱分类器的拟合目标。
GBDT的优缺点
GBDT主要的优点有:
- 高准确性:GBDT具有很高的预测准确性,在各种机器学习竞赛和实际应用中都表现出色。
- 鲁棒性:GBDT对于缺失值和异常值具有一定的鲁棒性,不容易被极端值影响,能够处理高维稀疏数据。
- 特征选择:GBDT可以通过特征重要性评估,选择对预测结果影响较大的特征,提高模型的解释能力和泛化能力。
- 模型可解释性:GBDT中的每个决策树都是基于可解释的特征进行构建的,因此GBDT具有很好的可解释性,能够帮助我们理解数据和预测结果之间的关系。
GBDT的主要缺点有:
- 训练时间较长:由于GBDT是一种基于序列的集成算法,难以并行化计算。每次迭代都需要建立一个新的决策树模型,并且每个决策树都需要通过梯度下降算法进行优化,因此训练时间较长。
- 容易过拟合:GBDT具有较强的拟合能力,在训练数据上的表现很好,但容易过拟合。为了避免过拟合,需要设置较小的学习率和较少的树的数量。
- 需要调整参数:GBDT需要调整多个参数,包括树的数量、树的深度、学习率等,这需要一定的经验和调参技巧。
- 对异常值敏感:由于GBDT是基于序列的算法,每次迭代都是在上一次的预测结果基础上进行调整,因此对于异常值比较敏感。
参考链接: