GBDT+XGBOOST算法原理深入解析

​ 首先对GBDT算法原理进行介绍,从机器学习的关键元素出发,一步一步推导出GBDT算法背后的理论基础,我们可以从这个过程中了解到GBDT算法的来龙去脉。对于该算法的工程实现,本文也有较好的指导意义,实际上对机器学习关键概念元素的区分对应了软件工程中的“开放封闭原则”的思想,基于此思想的实现将会具有很好的模块独立性和扩展性。

1、GBDT和Boosting

  • 梯度提升(Gradient boosting)是一种用于回归、分类和排序任务的机器学习技术,属于Boosting算法族的一部分。

    • Boosting是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。Boosting方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。
    • 通俗地说,就是“三个臭皮匠顶个诸葛亮”的道理。梯度提升同其他boosting方法一样,通过集成(ensemble)多个弱学习器,通常是决策树,来构建最终的预测模型。
  • Boosting、bagging和stacking是集成学习的三种主要方法。不同于bagging方法、boosting方法通过分步迭代(stage-wise)的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。
    • Boosting族算法的著名代表是AdaBoost,AdaBoost算法通过给已有模型预测错误的样本更高的权重,使得先前的学习器做错的训练样本在后续受到更多的关注的方式来弥补已有模型的不足。
    • 与AdaBoost算法不同,梯度提升方法在迭代的每一步构建一个能够沿着梯度最陡的方向降低损失(steepest-descent)的学习器来弥补已有模型的不足。经典的AdaBoost算法只能处理采用指数损失函数的二分类学习任务,而梯度提升方法通过设置不同的可微损失函数可以处理各类学习任务(多分类、回归、Ranking等),应用范围大大扩展。
    • 另一方面,AdaBoost算法对异常点(outlier)比较敏感,而梯度提升算法通过引入bagging思想、加入正则项(正则项我怎么没有看到呢?)等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性。这也是为什么梯度提升算法(尤其是采用决策树作为弱学习器的GBDT算法)如此流行的原因,有种观点认为GBDT是性能最好的机器学习算法,这当然有点过于激进又固步自封的味道,但通常各类机器学习算法比赛的赢家们都非常青睐GBDT算法,由此可见该算法的实力不可小觑。
  • 基于梯度提升算法的学习器叫做GBM(Gradient Boosting Machine)。
    • 理论上,GBM可以选择各种不同的学习算法作为基学习器。现实中,用得最多的基学习器是决策树。

      • 为什么梯度提升方法倾向于选择决策树(通常是CART树)作为基学习器呢?这与决策树算法自身的优点有很大的关系。

        • 决策树可以认为是if-then规则的集合,易于理解,可解释性强,预测速度快。
        • 同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等。
        • 决策树能够自动组合多个特征,它可以毫无压力地处理特征间的交互关系并且是非参数化的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)。
        • 不过,单独使用决策树算法时,有容易过拟合缺点。所幸的是,通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。
        • 由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
        • 至于抑制单颗决策树的复杂度的方法有很多
          • 比如限制树的最大深度
          • 限制叶子节点的最少样本数量
          • 限制节点分裂时的最少样本数量
          • 吸收bagging的思想对训练样本采样(subsample)
          • 在学习单颗决策树时只使用一部分训练样本
          • 借鉴随机森林的思路在学习单颗决策树时只采样一部分特征
          • 在目标函数中添加正则项惩罚复杂的树结构等。现在主流的GBDT算法实现中这些方法基本上都有实现,因此GBDT算法的超参数还是比较多的,应用过程中需要精心调参,并用交叉验证的方法选择最佳参数。

2、机器学习的关键元素

  • 先复习下监督学习的关键概念:模型(model)、参数(parameters)、目标函数(objective function)

    • 模型就是所要学习的条件概率分布或者决策函数,它决定了在给定特征向量x时如何预测出目标y。

      • 定义任意x(属于R)为训练集中的第i个训练样本,则线性模型(linear mode)可以表示为:

      y^i=∑jwjxij\hat{y}_i=\sum_jw_jx_{ij} y^​i​=j∑​wj​xij​

      • 模型预测的分数y^i在不同的任务中有不同的解释。例如在逻辑回归任务中,1/(1+exp(−y^i))1/(1+exp(−\hat{y}_i))1/(1+exp(−y^​i​))表示模型预测为正例的概率;而在排序学习任务中,y^i\hat{y}_iy^​i​表示排序分。
    • 参数就是我们要从数据中学习得到的内容。模型通常是由一个参数向量决定的函数。

      • 例如:线性模型的参数可以表示为:

      • Θ={∣j=1,⋯,d}Θ=\lbrace|j=1,⋯,d\} Θ={∣j=1,⋯,d}

      • 目标函数通常定义为如下形式:

      • Obj(Θ)=L(Θ)+Ω(Θ)Obj(Θ)=L(Θ)+Ω(Θ) Obj(Θ)=L(Θ)+Ω(Θ)

      • 其中,L(Θ)L(Θ)L(Θ)是损失函数,用来衡量模型拟合训练数据的好坏程度;Ω(Θ)Ω(Θ)Ω(Θ)称之为正则项,用来衡量学习到的模型的复杂度。训练集上的损失(Loss)定义为:

      • L=∑i=1nl(yi,y^i)L=\sum^n_{i=1}l(y_i,\hat{y}_i) L=i=1∑n​l(yi​,y^​i​)

      • 常用的损失函数有平方损失(square loss):
        l(yi,y^i)=(yi−y^i)2l(y_i,\hat{y}_i)=(y_i−\hat{y}_i)^2 l(yi​,y^​i​)=(yi​−y^​i​)2

      • logistic 损失:

      l(yi,y^i)=yiln(1+eyi)+(1−yi)ln(1+ey^i)l(y_i,\hat{y}_i)=y_iln(1+e^{yi})+(1−y_i)ln(1+e^{\hat{y}_i}) l(yi​,y^​i​)=yi​ln(1+eyi)+(1−yi​)ln(1+ey^​i​)

      • 常用的正则项有L1范数:

      • Ω(w)=λ∥w∥1Ω(w)=λ∥w∥_1 Ω(w)=λ∥w∥1​

      • 常用的正则项有L2范数:

      • Ω(w)=λ∥w∥2Ω(w)=λ∥w∥_2 Ω(w)=λ∥w∥2​

      • Ridge regression就是指使用平方损失和L2范数正则项的线性回归模型;

      • Lasso regression就是指使用平方损失和L1范数正则项的线性回归模型;

      • 逻辑回归(Logistic regression)指使用logistic损失和L2范数或L1范数正则项的线性模型

    • 目标函数之所以定义为损失函数(L(Θ)L(Θ)L(Θ))和正则项(Ω(Θ)Ω(Θ)Ω(Θ))两部分,是为了尽可能平衡模型的偏差()和方差(Bias Variance Trade-off)

      • 偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据,如下图第二行所示。

        方差:描述的是预测值的变化范围,离散程度,也就是离其平均期望值的距离。方差越大,数据的分布越分散,如下图右列所示。


- 最小化目标函数意味着同时最小化损失函数和正则项,损失函数最小化表明模型能够较好的拟合训练数据,一般也预示着模型能够较好地拟合真实数据(groud true)

- 另一方面,对正则项的优化鼓励算法学习到较简单的模型,简单模型一般在测试样本上的预测结果比较稳定、方差较小(奥坎姆剃刀原则)。也就是说,**优化损失函数尽量使模型走出欠拟合的状态,优化正则项尽量使模型避免过拟合。**
  • 从概念上区分模型、参数和目标函数给学习算法的工程实现带来了益处,使得机器学习的各个组成部分之间耦合尽量松散。

3、加法模型(additive model)

  • GBDT算法可以看成是由K棵树组成的加法模型:

  • y^i=∑k=1Kfk(xi),fk∈F(0)\hat{y}_i=\sum_{k=1}^Kf_k(x_i),f_k∈F\qquad(0) y^​i​=k=1∑K​fk​(xi​),fk​∈F(0)

  • 其中FFF为所有树组成的函数空间,以回归任务为例,回归树可以看作为一个把特征向量映射为某个score的函数。该模型的参数为:Θ={f1,f2,⋯,fK}Θ={f1,f2,⋯,fK}Θ=\lbrace f_1,f_2,⋯,f_K\}\ Θ=\lbrace f_1,f_2,⋯,f_K\}Θ={f1​,f2​,⋯,fK​} Θ={f1​,f2​,⋯,fK​}。与一般的机器学习算法不同的是,加法模型不是学习d维空间中的权重,而是直接学习函数(决策树)集合。

  • 上述加法模型的目标函数定义为:

  • Obj=∑i=1nl(yi,y^i)+∑k=1KΩ(fk)Obj=\sum^n_{i=1}l(y_i,\hat{y}_i)+\sum^K_{k=1}Ω(f_k) Obj=i=1∑n​l(yi​,y^​i​)+k=1∑K​Ω(fk​)

    • 其中ΩΩΩ表示决策树的复杂度,那么该如何定义树的复杂度呢?比如,可以考虑树的节点数量、树的深度或者叶子节点所对应的分数的L2范数等等。
  • 如何来学习加法模型呢?

    • 解这一优化问题,可以用前向分布算法(forward stagewise algorithm)。因为学习的是加法模型,如果能够从前往后,每一步只学习一个基函数及其系数(结构),逐步逼近优化目标函数,那么就可以简化复杂度。这一学习过程称之为Boosting。**具体地,我们从一个常量预测开始,每次学习一个新的函数,过程如下:

      • y^i0=0\hat{y}^0_i=0y^​i0​=0
      • y^i1=f1(xi)=y^i0+f1(xi)\hat{y}^1_i=f_1(x_i)=\hat{y}^0_i+f_1(x_i)y^​i1​=f1​(xi​)=y^​i0​+f1​(xi​)
      • yi2^=f1(xi)+f2(xi)=y^i1+f2(xi)\hat{y^2_i}=f_1(x_i)+f_2(x_i)=\hat{y}^1_i+f_2(x_i)yi2​^​=f1​(xi​)+f2​(xi​)=y^​i1​+f2​(xi​)
      • …\ldots…
      • y^it=∑k=1tfk(xi)=y^it−1+ft(xi)\hat{y}^t_i=\sum_{k=1}^tf_k(x_i)=\hat{y}^{t−1}_i+f_t(x_i)y^​it​=∑k=1t​fk​(xi​)=y^​it−1​+ft​(xi​)
  • 那么,在每一步如何决定哪一个函数fff被加入呢?—指导原则还是最小化目标函数。

    • 在第ttt步,模型对xix_ixi​的预测为:y^it=y^it−1+ft(xi)\hat{y}^t_i=\hat{y}^{t−1}_i+f_t(x_i)y^​it​=y^​it−1​+ft​(xi​),其中ft(xi)f_t(x_i)ft​(xi​)为这一轮我们要学习的函数(决策树)。这个时候目标函数可以写为:constant代表的是常量

    • Obj(t)=∑i=1nl(yi,y^it)+∑i=itΩ(fi)Obj^{(t)}=\sum_{i=1}^nl(y_i,\hat{y}^t_i)+\sum_{i=i}^tΩ(f_i) Obj(t)=i=1∑n​l(yi​,y^​it​)+i=i∑t​Ω(fi​)

    • =∑i=1nl(yi,y^it−1+ft(xi))+Ω(ft)+constant(1)\quad\qquad\qquad\qquad\qquad\qquad\qquad=\sum_{i=1}^nl(y_i,\hat{y}^{t−1}_i+f_t(x_i))+Ω(f_t)+constant \qquad(1) =i=1∑n​l(yi​,y^​it−1​+ft​(xi​))+Ω(ft​)+constant(1)

    • 举例说明,假设损失函数为平方损失(square loss),则目标函数为:

    • Obj(t)=∑i=1n(yi−(y^it−1+ft(xi)))2+Ω(ft)+constantObj^{(t)}=\sum_{i=1}^n(y_i−(\hat{y}^{t−1}_i+f_t(x_i)))^2+Ω(f_t)+constant Obj(t)=i=1∑n​(yi​−(y^​it−1​+ft​(xi​)))2+Ω(ft​)+constant

    • =∑i=1n[2(y^it−1−yi)ft(xi)+ft(xi)2]+Ω(ft)+constant(2)\quad\qquad\qquad\qquad\qquad=\sum_{i=1}^n[2(\hat{y}^{t−1}_i−y_i)f_t(x_i)+f_t(x_i)^2]+Ω(f_t)+constant \qquad(2) =i=1∑n​[2(y^​it−1​−yi​)ft​(xi​)+ft​(xi​)2]+Ω(ft​)+constant(2)

    • 其中,(yi−y^it−1)(y_i-\hat{y}^{t−1}_i)(yi​−y^​it−1​)称之为残差(residual)。因此,使用平方损失函数时,GBDT算法的每一步在生成决策树时只需要拟合前面的模型的残差

    • 泰勒公式:设nnn是一个正整数,如果定义在一个包含aaa的区间上的函数fff在aaa点处n+1n+1n+1次可导,那么对于这个区间上的任意xxx都有:f(x)=∑n=0Nf(x)=∑_{n=0}^Nf(x)=∑n=0N​ f(n)(a)n!f^{(n)}(a)\over n!n!f(n)(a)​ (x−a)n+Rn(x)(x−a)^n+R_n(x)(x−a)n+Rn​(x),其中的多项式称为函数在aaa处的泰勒展开式,Rn(x)R_n(x)Rn​(x)是泰勒公式的余项且是(x−a)n(x−a)^n(x−a)n的高阶无穷小。

    • 根据泰勒公式把函数f(x+Δx)f(x+Δx)f(x+Δx)在点xxx处二阶展开,可得到如下等式:

    • f(x+Δx)≈f(x)+f′(x)Δx+12f′′(x)Δx2(3)f(x+Δx)≈f(x)+f′(x)Δx+ \frac{1}{2}f′′(x)Δx^2 \qquad(3) f(x+Δx)≈f(x)+f′(x)Δx+21​f′′(x)Δx2(3)

    • 由等式(1)可知,目标函数是关于变量y^it−1+ft(xi)\hat{y}^{t−1}_i+f_t(x_i)y^​it−1​+ft​(xi​)的函数,若把变量y^it−1\hat{y}^{t−1}_iy^​it−1​看成是等式(3)中的xxx,把变量ft(xi)f_t(x_i)ft​(xi​)看成是等l式(3)中的ΔxΔxΔx,则等式(1)可转化为:

    • Obj(t)≈∑i=1n[l(yi,y^it−1)+gift(xi)+12hift2(xi)]+Ω(ft)+constant(4)Obj^{(t)}\approx\sum_{i=1}^n[l(y_i,\hat{y}^{t−1}_i)+g_if_t(x_i)+\frac12h_if^2_t(x_i)]+Ω(f_t)+constant \qquad(4) Obj(t)≈i=1∑n​[l(yi​,y^​it−1​)+gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)+constant(4)

    • 其中,gig_igi​定义为损失函数的一阶导数,即gi=∂y^it−1l(yi,y^it−1)g_i=∂_{\hat{y}_{i}^{t−1}}l(y_i,\hat{y}_{i}^{t−1})gi​=∂y^​it−1​​l(yi​,y^​it−1​);hih_ihi​定义为损失函数的二阶导数,即hi=∂y^it−12l(yi,y^it−1)h_i=∂^2_{\hat{y}_{i}^{t−1}}l(y_i,\hat{y}_{i}^{t−1})hi​=∂y^​it−1​2​l(yi​,y^​it−1​)。 假设损失函数为平方损失函数,则gi=∂y^it−1(y^it−1−yi)2=2(y^it−1−yi)gi=∂_{\hat{y}_{i}^{t−1}}(\hat{y}_{i}^{t−1}−y_i)^2=2(\hat{y}_{i}^{t−1}−y_i)gi=∂y^​it−1​​(y^​it−1​−yi​)2=2(y^​it−1​−yi​),hi=∂y^it−12(y^it−1−yi)2=2hi=∂^2_{\hat{y}_{i}^{t−1}}(\hat{y}_{i}^{t−1}−y_i)^2=2hi=∂y^​it−1​2​(y^​it−1​−yi​)2=2,把gig_igi​和hih_ihi​代入等式(4)即得等式(2)。

    • 由于函数中的常量在函数最小化的过程中不起作用,因此我们可以从等式(4)中移除掉常量项,得:

    • Obj(t)≈∑i=1n[gift(xi)+12hift2(xi)]+Ω(ft)(5)Obj^{(t)}≈\sum_{i=1}^n[g_if_t(x_i)+\frac12h_if^2_t(x_i)]+Ω(f_t) \qquad\qquad(5) Obj(t)≈i=1∑n​[gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)(5)

    • 由于要学习的函数仅仅依赖于目标函数,从等式(5)可以看出只需为学习任务定义好损失函数,并为每个训练样本计算出损失函数的一阶导数和二阶导数,通过在训练样本集上最小化等式(5)即可求得每步要学习的函数f(x)f(x)f(x),从而根据加法模型等式(0)可得最终要学习的模型。

4、XGBOOST算法

  • 一颗生成好的决策树,假设其叶子节点个数为TTT,该决策树是由所有叶子节点对应的值组成的向量w∈RTw∈R^Tw∈RT,以及一个把特征向量(特征向量∈Rd,Rd\in R^d,R^d∈Rd,Rd是d维欧式空间)映射到叶子节点索引(Index)的函数q:Rd→{1,2,⋯,T}q:R^d→\{1,2,⋯,T\}q:Rd→{1,2,⋯,T}组成的。因此,决策树可以定义为:ft(x)=wq(x)f_t(x)=w_{q(x)}ft​(x)=wq(x)​
  • 决策树的复杂度可以由正则项Ω(ft)=γT+12λ∑j=1Twj2Ω(f_t)=\gamma T+\frac12\lambda\sum^T_{j=1}w^2_jΩ(ft​)=γT+21​λ∑j=1T​wj2​来定义,即决策树模型的复杂度由生成的树的叶子节点数量和叶子节点对应的值向量(wjw_jwj​)的L2范数决定。
  • 定义集合Ij={i∣q(xi)=j}I_j=\{i|q(x_i)=j\}Ij​={i∣q(xi​)=j}为所有被划分到叶子节点j的训练样本的集合。等式(5)可以根据树的叶子节点重新组织为T个独立的二次函数的和:

Obj(t)≈∑i=1n[gift(xi)+12hift2(xi)]+Ω(ft)=∑i=1n[giwq(xi)+12hiwq(xi)2]+γT+12λ∑j=1Twj2(6)Obj^{(t)}≈\sum_{i=1}^n[g_if_t(x_i)+\frac12h_if^2_t(x_i)]+Ω(f_t)=\sum_{i=1}^n[g_iw_{q(x_i)}+\frac12h_iw^2_{q(x_i)}]+γT+\frac12λ\sum_{j=1}^Tw^2_j \qquad(6) Obj(t)≈i=1∑n​[gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)=i=1∑n​[gi​wq(xi​)​+21​hi​wq(xi​)2​]+γT+21​λj=1∑T​wj2​(6)

=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2]+γT=\sum_{j=1}^T[(\sum_{i∈I_j}g_i)w_j+\frac12(\sum_{i∈I_j}h_i+λ)w^2_j]+γT =j=1∑T​[(i∈Ij​∑​gi​)wj​+21​(i∈Ij​∑​hi​+λ)wj2​]+γT

  • 定义Gj=∑i∈IjgiG_j=∑_{i∈I_j}g_iGj​=∑i∈Ij​​gi​,Hj=∑i∈IjhiH_j=∑_{i∈I_j}h_iHj​=∑i∈Ij​​hi​,则等式(6)可写为:

  • Obj(t)=∑j=1T[Gjwj+12(Hj+λ)wj2]+γTObj^{(t)}=∑_{j=1}^T[G_jw_j+\frac12(H_j+λ)w^2_j]+γT Obj(t)=j=1∑T​[Gj​wj​+21​(Hj​+λ)wj2​]+γT

  • 假设树的结构是固定的,即函数q(x)q(x)q(x)确定,令函数Obj(t)Obj^{(t)}Obj(t)的一阶导数等于0(凸函数的话求极小值),即可求得叶子节点jjj对应的值为:

  • wj∗=−GjHj+λ(7)w^∗_j=\frac{−G_j}{H_j+λ}\qquad\qquad\qquad(7) wj∗​=Hj​+λ−Gj​​(7)

  • 此时,目标函数的值为:

  • Obj=−12∑j=1TGj2Hj+λ+γT(8)Obj=−\frac12∑_{j=1}^T\frac{G^2_j}{H_j+λ}+γT \qquad\qquad\qquad(8) Obj=−21​j=1∑T​Hj​+λGj2​​+γT(8)

  • 综上,为了便于理解,单颗决策树的学习过程可以大致描述为:

    • 1.枚举所有可能的树结构qqq
    • 2.用等式(8)为每个qqq计算其对应的分数ObjObjObj,分数越小说明对应的树结构越好
    • 3.根据上一步的结果,找到最佳的树结构,用等式(7)为树的每个叶子节点计算预测值
  • 然而,可能的树结构数量是无穷的,所以实际上我们不可能枚举所有可能的树结构。通常情况下,我们采用**贪心策略来生成决策树的每个节点.

    • 1.从深度为0的树开始,对每个内部节点枚举所有的可用特征
    • 2.针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(采用最佳分裂点时的收益)
    • 3.选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集
    • 4.回到第1步,递归执行到满足特定条件为止
  • 在上述算法的第二步,样本排序的时间复杂度为O(nlogn)O(nlogn)O(nlogn),假设共有K个特征,那么生成一颗深度为K的树的时间复杂度为O(dKnlogn)O(dKnlogn)O(dKnlogn)。具体实现可以进一步优化计算复杂度,比如可以缓存每个特征的排序结果等。

  • 如何计算每次分裂的收益呢?

    • 假设当前节点记为CCC,分裂之后左孩子节点记为LLL,右孩子节点记为RRR,则该分裂获得的收益定义为当前节点的目标函数值减去左右两个孩子节点的目标函数值之和:Gain=ObjC−ObjL−ObjRGain=Obj_C−Obj_L−Obj_RGain=ObjC​−ObjL​−ObjR​,具体地,根据等式(8)可得:
  • Gain=12[GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ]−γGain=\frac12[\frac{G^2_L}{H_L+λ}+\frac{G^2_R}{H_R+λ}−\frac{(GL+GR)^2}{H_L+H_R+λ}]−γ Gain=21​[HL​+λGL2​​+HR​+λGR2​​−HL​+HR​+λ(GL+GR)2​]−γ

    • 其中,−γ−γ−γ项表示因为增加了树的复杂性(该分裂增加了一个叶子节点)带来的惩罚。
  • 最后,总结一下GBDT的学习算法:

    • 1.算法每次迭代生成一颗新的决策树
    • 2.在每次迭代开始之前,计算损失函数在每个训练样本点的一阶导数gig_igi​和二阶导数hih_ihi​
    • 3.通过贪心策略生成新的决策树,通过等式(7)计算每个叶节点对应的预测值
    • 4.把新生成的决策树ft(x)f_t(x)ft​(x)添加到模型中:y^it=y^it−1+ft(xi)\hat{y}^t_i=\hat{y}^{t−1}_i+f_t(x_i)y^​it​=y^​it−1​+ft​(xi​)
      • 通常在第四步,我们把模型更新公式替换为:y^it=y^it−1+ϵft(xi)\hat{y}^t_i=\hat{y}^{t−1}_i+ϵf_t(x_i)y^​it​=y^​it−1​+ϵft​(xi​),其中ϵ\epsilonϵ称之为步长或者学习率。增加ϵϵϵ因子的目的是为了避免模型过拟合。

5、参考资料

  • [1] Gradient Boosting 的更多内容

    • https://en.wikipedia.org/wiki/Gradient_boosting
  • [2] XGBoost是一个优秀的GBDT开源软件库,有多种语言接口
    • http://xgboost.readthedocs.io/en/latest/
  • [3] Pyramid是一个基于Java语言的机器学习库,里面也有GBDT算法的介绍和实现
    • https://github.com/cheng-li/pyramid
  • [4] Friedman的论文《Greedy function approximation: a gradient boosting machine》是比较早的GBDT算法文献,但是比较晦涩难懂,不适合初学者,高阶选手可以进一步学习
  • [5] “A Gentle Introduction to Gradient Boosting“是关于Gradient Boosting的一个通俗易懂的解释,比较适合初学者或者是已经对GBDT算法原理印象不深的从业者
  • [6] 关于GBDT算法调参的经验和技巧可以参考这两篇博文:《GBM调参指南》、
    《XGBoost调参指南》,作者使用的算法实现工具来自于著名的Python机器学习工具scikit-learn
  • [7] GBDT算法在搜索引擎排序中的应用可以查看这篇论文《Web-Search Ranking with Initialized Gradient Boosted Regression Trees 》,这篇论文提出了一个非常有意思的方法,用一个已经训练好的随机森林模型作为GBDT算法的初始化,再用GBDT算法优化最终的模型,取得了很好的效果.

GBD+XGBOOST算法原理深入解析相关推荐

  1. XGBoost算法原理解释(转载)

    1.XGBoost算法原理 参考文章1 参考文章2 2.代码实战 train = pd.read_csv(r"./dataset/train.csv") train.head() ...

  2. XGBoost算法原理以及实现

    想问:在CSDN如何编辑数学公式呢? XGBoost算法是由GBDT算法演变出来的,GBDT算法在求解最优化问题的时候应用了一阶导技术,而XGBoost则使用损失函数的一阶导和二阶导,不但如此, 还可 ...

  3. Xgboost算法原理详解及python实现

    Xgboost算法(回归树) 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.XGB.GBDT.LR与RF 5.python代码实现 导入相关包 读取数据并预处理 训练 贝叶斯初步 ...

  4. xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理

    摘要: 最近与某厂完成基于FATE的联邦学习框架的一个项目,第一次实践了一把联邦学习在实际业务场景中的应用,从模型评估结果来看,效果还不错.因此,本文将完成对于其中实现的提升算法SecureBoost ...

  5. GBDT、随机森林、xgboost算法原理解析视频公开

    向AI转型的程序员都关注了这个号

  6. 手指和手势识别算法原理和解析

    最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! 1.问题陈述 我们将从视频序列中识别手势.为了从实时视频序列中 ...

  7. KNN 分类算法原理代码解析

    作者 | Charmve 来源 | 迈微AI研习社 k-最近邻算法是基于实例的学习方法中最基本的,先介绍基x`于实例学习的相关概念. 基于实例的学习 已知一系列的训练样例,很多学习方法为目标函数建立起 ...

  8. python中kmeans用的是什么距离_python Kmeans算法原理深入解析

    一. 概述 首先需要先介绍一下无监督学习,所谓无监督学习,就是训练样本中的标记信息是位置的,目标是通过对无标记训练样本的学习来揭示数据的内在性质以及规律.通俗得说,就是根据数据的一些内在性质,找出其内 ...

  9. 数据分析利器:XGBoost算法最佳解析

    作者:symonxiong,腾讯 CDG 应用研究员 XGBoost是一种经典的集成式提升算法框架,具有训练效率高.预测效果好.可控参数多.使用方便等特性,是大数据分析领域的一柄利器.在实际业务中,X ...

  10. xgboost算法_xgboost算法原理篇

    1, 概述部分 这篇文章,主要来介绍一下xgboost的理论部分,可能会不够详细,由于xgboost算法相比较前三篇文章中提到的算法更加复杂,这里主要讲解一下损失函数正则化,切分点查找算法及其优化,叶 ...

最新文章

  1. 3.3 栈的链式存储结构
  2. 配置GitLab 用smtp发邮件 (gitlab-6.7.3)
  3. HBase性能优化方法总结(1):配置优化
  4. Hibernate之Session解析
  5. 5G频谱相争“兵戎相见”各相部署风起云涌
  6. 服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...
  7. 前端 网络安全 前端优化 代码架构 笔记
  8. CSS Scrollbar (滚动条)
  9. 程序员抱怨:父母没文化没见识,当初努力学习远离看来是正确的
  10. mui 批量上传图片 php,MUI+Hbuilder之多图片,单图片上传(五)
  11. 模具设计进程中应注意哪些问题
  12. 华为路由器ip地址和mac地址绑定命令
  13. 爬取智联招聘(搜索含关键词职位)
  14. 吴军《态度》读后感(1):人生哲学
  15. 计算机sci检索,SCI/EI检索的国内计算机期刊
  16. 计算机网络技术基础教程,计算机网络技术基础教程材料.pdf
  17. Android DirectBoot模式
  18. 关于时区的环境变量TZ
  19. 联想小新一键恢复小孔_联想小新Air系列一键恢复及恢复后首次配置的步骤
  20. 食品品牌如何做好消费需求洞察直抵消费者心智

热门文章

  1. 三人行新解:前辈、平辈和后辈
  2. 基于Python网易云音乐歌词爬取
  3. Intelligent information retrieval(智能信息检索综述)
  4. #L190616楼市穿越与未来锚点
  5. (经典)tcp粘包分析
  6. Java前叉夹器_大器晚成 SRAM S-900直装夹器评测
  7. 徙步藏东南不是江南胜似江南
  8. Failed to compile with 1 errors
  9. meta http-equiv=“X-UA-Compatible“ content=““ 的作用
  10. [unix] Unix 是简单的,你不需要成为一个天才或是计算机专家也能理解它!