机器学习算法系列(二十)-梯度提升决策树算法(Gradient Boosted Decision Trees / GBDT)

本文详细介绍了梯度提升算法(包括AdaBoost和GBDT)的基本概念、模型、算法步骤,以及在回归、二分类和多分类问题上的应用。通过实例展示了如何使用Python实现梯度提升树回归和分类,并探讨了正则化方法,包括学习速率、子采样和决策树剪枝。此外,文章还提供了scikit-learn库的使用示例。

阅读本文需要的背景知识点:自适应增强算法、泰勒公式、One-Hot编码、一丢丢编程知识

一、引言

  前面一节我们学习了自适应增强算法(Adaptive Boosting / AdaBoost Algorithm),是一种提升算法 (Boosting Algorithm),而该算法家族中还有另一种重要的算法——梯度提升决策树1 (Gradient Boosted Decision Trees / GBDT),GBDT 及其变体算法在传统机器学习中有着广泛的应用,了解其背后的思想与原理对于以后的学习有很大的帮助。

二、模型介绍

  梯度提升决策树同自适应增强算法一样是一种提升算法,也可以解释为一种加法模型,第 k 轮后的强估计器为第 k - 1 轮后的强估计器加上带系数的弱估计器 h(x):

H k ( x ) = H k − 1 ( x ) + α k h k ( x ) H_k(x) = H_{k - 1}(x) + \alpha_k h_k(x) Hk(x)=Hk1(x)+αkhk(x)

式2-1

  假设第 k - 1 轮对应的代价函数为 C o s t ( y , H k − 1 ( X ) ) Cost(y, H_{k - 1}(X)) Cost(y,Hk1(X)), 第 k 轮对应的代价函数为 C o s t ( y , H k ( X ) ) Cost(y, H_k(X)) Cost(y,Hk(X)),我们的目的是使得每次迭代后,其代价函数都会逐渐变小。
  由于每个不同的代价函数对应的优化方式不同,Jerome H. Friedman 在其原始算法的论文2 中给出了一个统一处理的方法,可以使用代价函数的负梯度来拟合该轮迭代代价函数的减小,这也是最速下降法的一种近似,其本质是使用一阶泰勒公式近似其代价函数。当基础估计器使用的是决策回归树时,该算法被称为梯度提升决策树(GBDT)。
y ^ k , i = − [ ∂ C o s t ( y i , H ( X i ) ) ∂ H ( X i ) ] H ( x ) = H k − 1 ( x ) \hat{y}_{k, i} = -\left[\frac{\partial Cost(y_i, H(X_i))}{\partial H(X_i)} \right]_{H(x) = H_{k-1}(x)} y^k,i=[H(Xi)Cost(yi,H(Xi))]H(x)=Hk1(x)

式2-2

  下面还是同 AdaBoost 算法一样,分别考虑回归、二分类、多分类这三个问题,一一介绍每个问题对应的算法。由于 GBDT 算法回归比分类简单,所以这次将回归问题放在前面介绍。

回归

  对于回归问题的代价函数,我们先使用平方误差来作为代价函数:
C o s t ( y , H ( x ) ) = ( y − H ( x ) ) 2 Cost(y, H(x)) = (y - H(x))^2 Cost(y,H(x))=(yH(x))2

式2-3

  第 k 轮的代价函数:
(1)带入式 2-1
(2)带入平方误差的代价函数
(3)改变括号
(4)将 y 与第 k - 1 轮的结果之差记为 y ^ k \hat{y}_k y^k
C o s t ( y , H k ( x ) ) = C o s t ( y , H k − 1 ( x ) + α k h k ( x ) ) ( 1 ) = ( y − ( H k − 1 ( x ) + α k h k ( x ) ) ) 2 ( 2 ) = ( ( y − H k − 1 ( x ) ) − α k h k ( x ) ) 2 ( 3 ) = ( y ^ k − α k h k ( x ) ) 2 ( 4 ) \begin{aligned} Cost(y, H_{k}(x)) & = Cost(y, H_{k - 1}(x) + \alpha_kh_k(x)) & (1) \\ & = (y - (H_{k - 1}(x) + \alpha_kh_k(x) ))^2 & (2) \\ &= ((y - H_{k - 1}(x)) - \alpha_kh_k(x))^2 & (3) \\ &= (\hat{y}_k - \alpha_kh_k(x))^2 & (4) \end{aligned} Cost(y,Hk(x))=Cost(y,Hk1(x)+αkhk(x))=(y(Hk1(x)+αkhk(x)))2=((yHk1(x))αkhk(x))2=(y^kαkhk(x))2(1)(2)(3)(4)

式2-4

  观察式 2-4 中的(4)式会发现这就是前面章节中介绍的决策回归树的代价函数,只是该回归树不再是使用训练集中的 y,而是去拟合上式中的 y ^ \hat{y} y^,也可以称为残差。得到回归树后更新 H(x) ,然后进行新的迭代。
  这样就得到了最简单的最小二乘回归的 GBDT 算法实现,具体步骤可以参考第三节的算法步骤中的回归部分,可以看到其中的系数 α \alpha α 可以理解为融入到了回归树内部。
  在论文中作者还介绍了其他的几种代价函数,分别是最小绝对偏差(LDA)、Huber 损失3 等,感兴趣的读者可以阅读论文中对应的章节。

  由于 GBDT 需要计算负梯度是个连续值,所以对于分类问题, 其基础估计器没有使用分类树,而是依然使用的回归树。

二分类

  对于分类问题的代价函数,可以使用指数函数与对数函数。当使用指数函数时,GBDT 将等同于前面一节中介绍的 AdaBoost 算法,这里我们使用对数函数作为代价函数:
C o s t ( y , H ( x ) ) = log ⁡ ( 1 + e − 2 y H ( x ) ) Cost(y, H(x)) = \log (1 + e^{-2yH(x)}) Cost(y,H(x))=log(1+e2yH(x))

式2-5

  按照前面模型介绍的计算负梯度的方法,带入代价函数计算出 y ^ \hat{y} y^
y ^ k , i = − [ ∂ C o s t ( y i , H ( X i ) ) ∂ H ( X i ) ] H ( x ) = H k − 1 ( x ) ( 1 ) = 2 y i 1 + e 2 y i H k − 1 ( X i ) ( 2 ) \begin{aligned} \hat{y}_{k, i} &= -\left[\frac{\partial Cost(y_i, H(X_i))}{\partial H(X_i)} \right]_{H(x) = H_{k-1}(x)} & (1)\\ &= \frac{2y_i}{1 + e^{2y_iH_{k-1}(X_i)}} & (2) \end{aligned} y^k,i=[H(Xi)Cost(yi,H(Xi))]H(x)=Hk1(x)=1+e2yiHk1(Xi)2yi(1)(2)

式2-6

  计算出 y ^ \hat{y} y^ 后我们可以拟合出一颗回归树估计器 h(x) ,这时我们要求的是每轮迭代后的估计器的系数 α \alpha α
α k = a r g m i n α ∑ i = 1 N log ⁡ ( 1 + e − 2 y i ( H k − 1 ( X i ) + α h k ( X i ) ) ) \alpha_k = \underset{\alpha}{argmin} \sum_{i = 1}^{N} \log (1 + e^{-2y_i(H_{k - 1}(X_i) + \alpha h_k(X_i))}) αk=αargmini=1Nlog(1+e2yi(Hk1(Xi)+αhk(Xi)))

式2-7

  我们先来看下这个回归树估计器 h(x) ,其表达式可以写成下式,其中回归树一共有 J 个叶子结点, R j R_j Rj β j \beta_j βj分别代表回归树第 j 个叶子结点包含的训练集合和取值, I ( x ) I(x) I(x) 为前面章节中提到过的指示函数:
h ( x ) = ∑ j = 1 J β j I ( x ∈ R j ) h(x) = \sum_{j = 1}^{J} \beta_j I(x \in R_j) h(x)=j=1JβjI(xRj)

式2-8

  这时将式 2-8 带入式 2-7 中改写一下,这时就不再是求估计器的系数 alpha,转而直接求 γ \gamma γ,其中 γ k , j = α k ∗ β k , j \gamma_{k,j} = \alpha_k * \beta _{k,j} γk,j=αkβk,j
γ k , j = a r g m i n γ ∑ X i ∈ R k , j log ⁡ ( 1 + e − 2 y i ( H k − 1 ( X i ) + γ ) ) \gamma_{k, j} = \underset{\gamma}{argmin} \sum_{X_i \in R_{k, j}}^{} \log (1 + e^{-2y_i(H_{k - 1}(X_i) + \gamma )}) γk,j=γargminXiRk,jlog(1+e2yi(Hk1(Xi)+γ))

式2-9

  由于式 2-9 中包含了对数指数函数,导致其没有闭式解,这时可以使用二阶泰勒公式对其进行近似处理得到如下结果:
γ k , j = ∑ X i ∈ R k , j y ^ k , i ∑ X i ∈ R k , j ∣ y ^ k , i ∣ ( 2 − ∣ y ^ k , i ∣ ) \gamma_{k,j} = \frac{\sum_{X_i \in R_{k,j}} \hat{y}_{k,i}}{\sum_{X_i \in R_{k,j}} |\hat{y}_{k,i}| (2 - |\hat{y}_{k,i}|)} γk,j=XiRk,jy^k,i(2y^k,i)XiRk,jy^k,i

式2-10

  得到 gamma 后更新 H(x) ,然后进行新的迭代。
  这样就得到了二分类的 GBDT 算法实现,具体步骤可以参考第三节的算法步骤中的二分类部分,具体的公式的来由可以参考第四节的原理证明。

多分类

  多分类相对二分类更复杂一些,同样是使用对数函数作为其代价函数,还用到了前面多分类对数几率回归算法中介绍的 Softmax 函数,同时还需对输入的标签值 y 进行 One-Hot 编码4 操作,其代价函数如下:
C o s t ( y , H ( x ) ) = ∑ m = 1 M y m log ⁡ p m ( x ) ( 1 ) p m ( x ) = e H m ( x ) ∑ l = 1 M e H l ( x ) ( 2 ) \begin{aligned} Cost(y, H(x)) &= \sum_{m = 1}^M y_m \log p_m(x) & (1) \\ p_{m}(x) &= \frac{e^{H_{m}(x)}}{\sum_{l=1}^M e^{H_{l}(x)}} & (2) \\ \end{aligned} Cost(y,H(x))pm(x)=m=1Mymlogpm(x)=l=1MeHl(x)eHm(x)(1)(2)

式2-11

  同样按照前面模型介绍的计算负梯度的方法,带入代价函数计算出 y ^ \hat{y} y^
y ^ k , m , i = − [ ∂ C o s t ( y i , H ( X i ) ) ∂ H ( X i ) ] H ( x ) = H k − 1 ( x ) ( 1 ) = y m , i − p k − 1 , m ( X i ) ( 2 ) \begin{aligned} \hat{y}_{k, m, i} &= -\left[\frac{\partial Cost(y_i, H(X_i))}{\partial H(X_i)} \right]_{H(x) = H_{k-1}(x)} & (1)\\ &= y_{m, i} - p_{k-1, m}(X_i) & (2) \\ \end{aligned} y^k,m,i=[H(Xi)Cost(yi,H(Xi))]H(x)=Hk1(x)=ym,ipk1,m(Xi)(1)(2)

式2-12

  同二分类一样,拟合回归树,同时将其转化为求对应的 γ \gamma γ,不同的是需要对每一个分类都拟合一个回归树,所以多分类一共需要拟合 K * M 个决策回归树:
γ k , m , j = a r g m i n γ ∑ i = 1 N ∑ m = 1 M C o s t ( y m , i , H k − 1 , m ( X i ) + ∑ j = 1 J γ I ( X i ∈ R k , m , j ) ) \gamma_{k, m, j} = \underset{\gamma}{argmin} \sum_{i = 1}^{N} \sum_{m = 1}^{M} Cost\left(y_{m,i}, H_{k - 1, m}(X_i) + \sum_{j = 1}^{J} \gamma I(X_i \in R_{k, m, j})\right) γk,m,j=γargmini=1N

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值