gradient boosting梯度提升决策树

本文深入探讨了提升树和GBDT(Gradient Boosting Decision Tree)的概念与算法流程,介绍了如何通过前向分步算法来优化加法模型,并详细解析了GBDT在不同损失函数下的应用,包括回归问题的平方误差损失函数、分类问题的指数损失函数以及一般决策问题的一般损失函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:
1. 转自《统计学习方法》

gradient boosting

提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步的优化都很简单。但对于一般损失函数而言,往往每一步的优化并不那么容易。针对这一问题,Freidman提出了gradient boosting算法。这是利用最速下降法,其关键是利用损失函数的负梯度在当前模型的值:

[L(yi,f(xi))f(xi)]f(x)=fm1(x)−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)

作为回归问题提升树算法中的残差的近似值,训练一个回归树。

平方损失和指数损失下的提升树

针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。

损失函数算法
平方误差损失boosting tree
指数损失函数Adaboost
一般损失函数gradient boosting desicion tree

Adaboost

前向分步算法是AdaBoost的另一种解释。
定理
AdaBoost算法是前向分步加法算法的特例。这时,模型是有基本分类器组成的加法模型,损失函数是指数函数。
证明
前向分步算法是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器:

f(x)=m=1MαmGm(x)f(x)=∑m=1MαmGm(x)

了解前向分步算法的可以跳过下面两小节

前向分步算法

考虑加法模型(additive model)

f(x)=m=1Mβmb(x;γm)f(x)=∑m=1Mβmb(x;γm)
其中,b(x;γm)b(x;γm)是基函数。

在给定训练数据及损失函数L(y,f(x))L(y,f(x))的条件下,学习加法模型f(x)f(x)成为经验风险极小化即损失函数极小化问题:

minβm,γmi=1NL(yi,m=1Mβmb(x;γm))minβm,γm∑i=1NL(yi,∑m=1Mβmb(x;γm))

通常这是一个复杂的优化问题。前向分步算法(forward stagewise algorithm)求解这一优化问题的想法是:因为学习的是加法模型,如果能从前往后,每一步只学习一个基函数及其系数,逐步逼近优化目标,那么就能简化优化的复杂度。具体地,每步只需要优化如下损失函数:

minβm,γmi=1NL(yi,βmb(x;γm))minβm,γm∑i=1NL(yi,βmb(x;γm))

算法流程:

  1. 初始化决策函数f0(x)=0f0(x)=0
  2. 对所有的基函数,m=1,2,3,...m=1,2,3,...
    1. 极小化损失函数
      βm,γm=argminβm,γmi=1NL(yi,fm1βmb(x;γm))βm,γm=argminβm,γm∑i=1NL(yi,fm−1−βmb(x;γm))
      即,每一步都要计算下一步的参数值,或者说每一个m-1基函数的参数计算完成,都要基于所有1,2,...,m11,2,...,m−1基函数计算m基函数。
    2. 更新决策函数fm(x)=fm1(x)+βmb(x;γm)fm(x)=fm−1(x)+βmb(x;γm)
  3. 最后得到加法模型:
    f(x)=fM(x)=m=1Mβmb(x;γm)f(x)=fM(x)=∑m=1Mβmb(x;γm)

这样,前向分步算法将同时求解 从m=1m=1MM 所有参数 βm,γm 的优化问题简化为逐次求解各个βm,γmβm,γm的优化问题。

在前向分步算法中损失函数表示为L(y,f(x))L(y,f(x)),首先可以想到如何得到损失函数到底是什么。

AdaBoost的损失函数是指数函数

前向分步算法逐一学习基函数,这一过程与AdaBoost算法注意学习基本分类器的过程一致。下面证明前向分步算法的损失函数是指数损失函数(exponential loss function): L(x,f(x))=exp[yf(x)]L(x,f(x))=exp[−yf(x)]时,其学习的具体操作等价于AdaBoost算法学习的具体算法。

假设经过m1m−1轮迭代,前向分步算法已经到fm1(x)fm−1(x)

fm1(x)=fm2(x)+αm1Gm1(x)=α1G1(x)+α2G2(x)+...+αm1Gm1(x)fm−1(x)=fm−2(x)+αm−1Gm−1(x)=α1G1(x)+α2G2(x)+...+αm−1Gm−1(x)

在第mm轮迭代得到αm,Gm(x),fm(x)

fm(x)=fm1(x)+αmGm(x)fm(x)=fm−1(x)+αmGm(x)

下面是前向分步算法极小化损失函数的步骤:

(αm,Gm(x))=argminαm,Gmi=1Nexp[yi(fm1(xi)+αmGm(xi)]=argminαm,Gmi=1Nexp[yi(fm1(xi)]exp[αmGm(xi)]=argminαm,Gmi=1Nw¯miexp[αmGm(xi)](αm,Gm(x))=argminαm,Gm∑i=1Nexp[−yi(fm−1(xi)+αmGm(xi)]=argminαm,Gm∑i=1Nexp[−yi(fm−1(xi)]⋅exp[αmGm(xi)]=argminαm,Gm∑i=1Nw¯mi⋅exp[αmGm(xi)]

其中,w¯mi=exp[yi(fm1(xi)]w¯mi=exp[−yi(fm−1(xi)],既不依赖于αmαm也不依赖于GmGm,所以与最小化无关。但是在最小化完成之后,需要更对它进行更新。

如果证得上式计算的αm,Gm,αm∗,Gm∗,就是Adaboost算法中的αm,Gmαm,Gm,则说明AdaBoost的损失函数就是指数函数。
此处省略证明过程,最终得到:

αm=12log1emem=αmαm∗=12log1−emem=αm

再由w¯mi=exp[yi(fm1(xi)]w¯mi=exp[−yi(fm−1(xi)]w¯m+1i=w¯miexp[yiαmGm(x)]w¯m+1,i=w¯mi⋅exp[−yiαmGm(x)].这与AdaBoost的样本权值更新相似,只差一个规范化因子。

Boosting Tree

提升树模型可以表示为决策树的加法模型:

fM(x)=m=1MT(x;θm)fM(x)=∑m=1MT(x;θm)

与Adaboost的加法模型不同的是,没有加权系数。

boosting Tree采用前向分步算法。首先确定初始提升树f0(x)=0f0(x)=0,第m步的模型是

fm(x)=fm1(x)+T(x;θm)fm(x)=fm−1(x)+T(x;θm)

每一步的损失函数是:
θ^m=argminθi=1NL(yi,fm1(x)+T(x;θm))θ^m=argminθ∑i=1NL(yi,fm−1(x)+T(x;θm))

针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同:
  1. 回归问题——平方误差损失函数
  2. 分类问题——指数损失函数
  3. 一般决策问题——一般损失函数

对于二分类问题,提升树算法是Adaboost的特例,此时的Adaboost的基本分类器是二分类树。对于回归问题,采用平方误差损失函数,学习算法是拟合残差项(类比前向分步算法)。

  1. 初始化决策函数f0(x)=0f0(x)=0
  2. 对所有的基函数,m=1,2,3,...m=1,2,3,...
    1. 计算残差
      rmi=yifm1(xi),i=1,2,...,Nrmi=yi−fm−1(xi),i=1,2,...,N
    2. 极小化残差项,学习一个回归树,得到T(x;θm)T(x;θm)
    3. 更新决策函数fm(x)=fm1(x)+T(x;θm)fm(x)=fm−1(x)+T(x;θm)
  3. 最后得到加法模型:
    f(x)=fM(x)=m=1MT(x;θm)f(x)=fM(x)=∑m=1MT(x;θm)

GBDT的算法流程

  1. 初始化决策函数f0(x)=argmincNi=1L(yi,c)f0(x)=argminc∑i=1NL(yi,c)
  2. 对所有的基函数,m=1,2,3,...m=1,2,3,...
    1. 计算梯度,用梯度近似残差项
      rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)
    2. rmirmi拟合一个回归树,得到第m棵树的叶节点区域RmjRmj
    3. 对所有的叶节点区域,极小化损失函数:
      cmj=argmincxiRmjL(yi,fm1(xi)+c)cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c)
    4. 更新决策函数fm(x)=fm1(x)+Jj=1cmjI(xRmj)fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
  3. 最后得到加法模型:
    f(x)=fM(x)=m=1Mj=1JcmjI(xRmj)f(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)

算法第一步初始化,估计使算是函数极小化的常数值,它是只有一个根节点的树。第2.1步计算损失函数的负梯度在当前模型的值,将它作为残差项的估计。第2.2步估计回归树叶结点区域,以拟合残差项的近似值。第2.3步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2.4步更新回归树。第3步得到输出的最终模型f^(x)f^(x)

Note: 真正的GBDT中,还有一个超参数是学习率lr,lr使得GBDT中每个子分类器在优化求解的过程中,只拟合部分误差。这种方法可以减少GBDT过拟合的风险。关于GBDT的细节暂不做展开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值