天天看点

集成学习算法之:Boosting方法与AdaBoost、GBDT

在机器学习领域,深度学习( Deep Learning \text {Deep Learning} Deep Learning)一直被神经网络统治着,而浅层学习( Shallow Learning \text {Shallow Learning} Shallow Learning)任然属于树模型的领地。一方面,尽管深度学习在大规模学习上表现强大,但它在小规模学习上的表现却差强人意;另一方面,集成树模型( RF \text {RF} RF、 GBDT \text {GBDT} GBDT、 XGBoost \text {XGBoost} XGBoost等)因其模型解释度高、调参难度小、运行速度快、几乎不需要特征工程等优点,在中小规模数据集上完全碾压深度学习,而且对于“异质类数据”(比如风控场景中的年龄、收入、城市这类数据),即便在大规模数据集上,集成树模型也比深度学习表现更好。在实际应用中,Facebook、阿里巴巴等大企业都在使用结合LR的 GBDT \text {GBDT} GBDT作为点击率预估、广告推荐等重要业务的技术支撑,而 XGBoost \text {XGBoost} XGBoost更是在近些年的Kaggle算法大赛中屡屡绽放异彩。

本文介绍集成学习中的 Boosting \text {Boosting} Boosting方法,以及它的家族成员 AdaBoost \text {AdaBoost} AdaBoost、 GBDT \text {GBDT} GBDT,如果你对基础的决策树算法还不太了解,可以参阅我另一篇博文:

决策树模型: ID3 \text {ID3} ID3、 C4.5 \text {C4.5} C4.5、 CART \text {CART} CART算法介绍

集成学习

  • 传统机器学习的目标都是训练得到一个预测准确率尽可能高的“强学习器”(决策树、神经网络等),而实际情况中要找到一个最优的“强学习器”很难,于是“集成学习”被提出。“集成学习”认为,对多个预测准确率较低的“弱学习器”(只要求预测准确率略高于随机猜测),如果以某种恰当的方式将这多个“弱学习器”组合,那么就能提升为“强学习器”,获得更高的预测准确率。基于这种思想,1990年, Schapire最先构造出一种多项式级的算法,对该问题做了肯定的证明,这就是最初的 Boosting算法,后来发展到现在,“集成学习”已经成为一种非常成熟且应用广泛的机器学习方法,它的家族成员包括RF、GBDT、XGboost等众多优秀算法。
  • 如今集成学习主要包括三种类型: Bagging \text {Bagging} Bagging(袋装法)、 Boosting \text {Boosting} Boosting(提升法)、 Stacking \text {Stacking} Stacking(堆叠法),本文讲解 Boosting \text {Boosting} Boosting方法及相关算法( AdaBoost \text {AdaBoost} AdaBoost、 GBDT \text {GBDT} GBDT)。

Boosting \text {Boosting} Boosting方法

  • 不同于 Bagging \text {Bagging} Bagging的并行, Boosting \text {Boosting} Boosting是阶梯状的串行,它从第一个基学习器开始,后面每个基学习器都会根据上个基学习器对各个样本的预测正误而调整样本的权值分布,同时根据基学习器自身的预测准确率而调整自身的权重值,得到一系列权重值不同的基学习器,然后将这多个学习器进行加权组合,得到最终的学习器。具体步骤如下:
    1. 它首先令每个样本拥有相同的权重值(1/n,用来计算误差率或准确率,一些分类算法中这个权值不会改变),构建一个弱分类器。
    1. 改变样本的权值分布:增大该分类器分错误的样本的权值,减小该分类器分正确的样本的权值;改变该分类器的权重值:计算该分类器的正确率,正确率越高,越加大它的权重值;
    1. 根据改变权值分布后的样本数据构建一个新的弱分类器。
    1. 重复2、3步骤,直到到达预定的学习器数量或预定的预测精度。
集成学习算法之:Boosting方法与AdaBoost、GBDT
  • 直观理解:
    • Boosting \text {Boosting} Boosting的每一步总是更关注于分类错误的样本,使它们再下一步更容易被分正确;
    • Boosting \text {Boosting} Boosting中正确率越高的分类器的权值越大,使得最后线性组合以后更优的分类器拥有更大的发言权,而不像 Bagging \text {Bagging} Bagging方法中每个分类器是相同的权重。

AdaBoost \text {AdaBoost} AdaBoost(自适应增强)

  • AdaBoost(Adaptive Boosting) \text {AdaBoost(Adaptive Boosting)} AdaBoost(Adaptive Boosting)是 Boosting \text {Boosting} Boosting方法中的入门级算法。原始的 Adaboost 算法用于解决二分类问题,因此对于一个训练集
  • T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{n}, y_{n}\right)\right\} T={(x1​,y1​),(x2​,y2​),…,(xn​,yn​)}
  • 其中 x i ∈ X ⊆ R n , y i ∈ Y = { − 1 , + 1 } x_{i} \in \mathcal{X} \subseteq \mathbb{R}^{n}, y_{i} \in \mathcal{Y}=\{-1,+1\} xi​∈X⊆Rn,yi​∈Y={−1,+1}, 首先初始化训练集的权重
  • D 1 = ( w 11 , w 12 , … , w 1 n ) w 1 i = 1 n , i = 1 , 2 , … , n \begin{aligned} D_{1} &=\left(w_{11}, w_{12}, \ldots, w_{1 n}\right) \\ w_{1 i} &=\frac{1}{n}, i=1,2, \ldots, n \end{aligned} D1​w1i​​=(w11​,w12​,…,w1n​)=n1​,i=1,2,…,n​
  • 根据每一轮训练集的权重 D m D_{m} Dm​, 对训练集数据进行抽样得到 T m T_{m} Tm​, 再根据 T m T_{m} Tm​ 训练得到每 一轮的基学习器 h m h_{m } hm​ 。通过计算可以得出基学习器 h m h_{m} hm​ 的误差为 ϵ m \epsilon_{m} ϵm​, 根据基学习器的误 差计算得出该基学习器在最终学习器中的权重系数
  • α m = 1 2 ln ⁡ 1 − ϵ m ϵ m \alpha_{m}=\frac{1}{2} \ln \frac{1-\epsilon_{m}}{\epsilon_{m}} αm​=21​lnϵm​1−ϵm​​
  • 更新训练集的权重

D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , … , w m + 1 , n ) w m + 1 , i = w m , i Z m exp ⁡ ( − α m y i h m ( x i ) ) \begin{aligned} D_{m+1} &=\left(w_{m+1,1}, w_{m+1,2}, \ldots, w_{m+1, n}\right) \\ w_{m+1, i} &=\frac{w_{m, i}}{Z_{m}} \exp \left(-\alpha_{m} y_{i} h_{m}\left(x_{i}\right)\right) \end{aligned} Dm+1​wm+1,i​​=(wm+1,1​,wm+1,2​,…,wm+1,n​)=Zm​wm,i​​exp(−αm​yi​hm​(xi​))​

  • 其中 Z m Z_{m} Zm​ 为规范化因子
  • Z m = ∑ i = 1 n w m , i exp ⁡ ( − α m y i h m ( x i ) ) Z_{m}=\sum_{i=1}^{n} w_{m, i} \exp \left(-\alpha_{m} y_{i} h_{m}\left(x_{i}\right)\right) Zm​=i=1∑n​wm,i​exp(−αm​yi​hm​(xi​))
  • 从而保证 D m + 1 D_{m+1} Dm+1​ 为一个概率分布。最终根据构建的 M M M 个基学习器得到最终的学习器:

h f ( x ) = sign ⁡ ( ∑ m = 1 M α m h m ( x ) ) h_{f}(x)=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} h_{m}(x)\right) hf​(x)=sign(m=1∑M​αm​hm​(x))

  • 下面以图例来直观理解 AdaBoost \text {AdaBoost} AdaBoost:
    1. 左图,一开始,所有的数据点有相同的权重(正号、负号的大小都一样),第一个基学习器将数据样本分成了两部分。可以看出,三个正号标记的数据点分类错误,因此我们将这三个点赋予更大的权重。同时,根据分类正确率的高低来给这个学习器赋予一个权重值。
    1. 中间图,第二个基学习器,可以看到上个学习器未正确分类的3个(+)号的点的权重已经增大,此时第二个基学习器根据改变权值分布后的数据进行训练,得到第二个分类模型,由于它的分类将三个(-)号标记的点识别错误,因此在下一次分类中,这三个(-)号标记的点被赋予更大的权重。同时,根据分类正确率的高低来给这个学习器赋予一个权重值。
    1. 右图,第三个基学习器,重复相同步骤。
      集成学习算法之:Boosting方法与AdaBoost、GBDT
    1. 最终,将前面三个基学习器进行加权线性组合,作为最终的强学习器,它将会比前面任何一个弱分类器表现的都要好。
      集成学习算法之:Boosting方法与AdaBoost、GBDT

GBDT \text {GBDT} GBDT(梯度提升树)

前向分步算法与梯度提升

  • GBDT(Gradient Boosting Decision Tree) \text {GBDT(Gradient Boosting Decision Tree)} GBDT(Gradient Boosting Decision Tree)以及其他类型的提升树模型都是基于“前向分步算法”。 而前向分步算法可以这样来理解:假设我们要使用决策树来预测一个人的年龄, 刚开始的时候模型初始化会直接给出一个预测值 f 0 ( x ) f_{0}(x) f0​(x), 注意这个预测值不需要训练决策树来得到, 而且不一定精确(比如刚开始模型初始预测为0岁,或者根据人群年龄分布给出一个相对合理的值)。接着在模型上一步所给出的预测基础上来训练第一棵决策树, 此时模型的输出便是模型初始化的预测值加上第一棵决策树的输出值, 然后我们继续添加第二棵决策树, 使得第二棵决策树能够在前面所构造的模型基础之上, 让总体损失最小, 不断的进行这一过程直到构建的决策树棵数满足要求或者总体损失小于一个阈值。
  • 当前向分步算法进行到第 m m m 步时, 预测函数可以表示为:

    f m ( x ) = f m − 1 ( x ) + β m T ( x ; Θ m ) f_{m}(x)=f_{m-1}(x)+\beta_{m} T\left(x ; \Theta_{m}\right) fm​(x)=fm−1​(x)+βm​T(x;Θm​)

  • 其中 f m − 1 ( x ) f_{m-1}(x) fm−1​(x) 是第 m − 1 m-1 m−1 步的预测函数, 而 T ( x ; Θ m ) T\left(x ; \Theta_{m}\right) T(x;Θm​) 是我们当前需要构造的第 m m m 棵决策树, β m \beta_{m} βm​ 表示学习率(也称步长)。由于前面的 m − 1 m-1 m−1 棵决策树已经训练好了, 参数都已经固定了, 对于固定的 β m \beta_{m} βm​ , 那么在第 m m m 步, 我们仅需要训练第 m m m 棵树的参数 Θ m \Theta_{m} Θm​ 来最小化当前总体损失:
  • Θ ^ m = arg ⁡ min ⁡ Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β m T ( x i ; Θ m ) ) \hat{\Theta}_{m}=\underset{\Theta_{m}}{\arg \min } \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta_{m} T\left(x_{i} ; \Theta_{m}\right)\right) Θ^m​=Θm​argmin​i=1∑N​L(yi​,fm−1​(xi​)+βm​T(xi​;Θm​))
  • 其中 N N N 代表样本的总个数, L L L 代表损失函数。在前向分步算法搞清楚之后, 我们再来回顾一下机器学习中是如何最小化损失函数的。
  • 假设现有一损失函数 J ( θ ) J(\theta) J(θ), 当我们需要对这个参数为 θ \theta θ 的损失函数求最小值时, 只要按照损失函数的负梯度方向调整参数 θ \theta θ 即可, 因为梯度方向是使得函数增长最快的方向, 沿着梯度的反方向也就是负梯度方向会使得函数减小最快, 当学习率为 ρ \rho ρ 时, θ \theta θ 的更新方法如下:
  • θ i : = θ i − ρ ∂ J ∂ θ i \theta_{i}:=\theta_{i}-\rho \frac{\partial J}{\partial \theta_{i}} θi​:=θi​−ρ∂θi​∂J​
  • 那么同理, 前向分步算法中要使得损失总体损失 J = ∑ i L ( y i , f m − 1 ( x i ) ) J=\sum_{i} L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right) J=∑i​L(yi​,fm−1​(xi​)) 更小, 需要对 f m − 1 ( x ) f_{m-1}(x) fm−1​(x) 求导, 而 f m − 1 ( x ) f_{m-1}(x) fm−1​(x) 是针对 N N N 个样本的, 所以对每个样本预测值求偏导数:
  • f m ( x i ) : = − ρ ∂ J ∂ f m − 1 ( x i ) f_{m}\left(x_{i}\right):=-\rho \frac{\partial J}{\partial f_{m-1}\left(x_{i}\right)} fm​(xi​):=−ρ∂fm−1​(xi​)∂J​
  • 这里的 ρ \rho ρ 和刚才所提到的 β m \beta_{m} βm​ 的作用是相同的,次数令 ρ = 1 \rho=1 ρ=1 。对于第 m m m 棵决策树而言, 其拟合的不再是原有数据 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi​,yi​) 的结果值 y i y_{i} yi​, 而是负梯度, 因为这样就能使得总体损失函数下降最快。于是对于第 m m m棵决策树,它要拟合的样本数据集更新为:
  • { ( x 1 , − ∂ J ∂ f m − 1 ( x 1 ) ) , ( x 2 , − ∂ J ∂ f m − 1 ( x 2 ) ) , ⋯   , ( x n , − ∂ J ∂ f m − 1 ( x n ) ) } , m = 1 , 2 , ⋯   , M \left\{\left(x_{1},-\frac{\partial J}{\partial f_{m-1}\left(x_{1}\right)}\right),\left(x_{2},-\frac{\partial J}{\partial f_{m-1}\left(x_{2}\right)}\right), \cdots,\left(x_{n},-\frac{\partial J}{\partial f_{m-1}\left(x_{n}\right)}\right)\right\}, m=1,2, \cdots, M {(x1​,−∂fm−1​(x1​)∂J​),(x2​,−∂fm−1​(x2​)∂J​),⋯,(xn​,−∂fm−1​(xn​)∂J​)},m=1,2,⋯,M
  • 这样迭代到一定步骤,损失函数达到足够小,最后 GBDT \text {GBDT} GBDT输出的预测值就是前面所有树的和,它会非常接近 y y y值。

GBDT \text {GBDT} GBDT回归算法

  • 对于回归问题来说, 我们以平方误差损失函数为例, 来介绍GBDT的处理方法。平方误差损失函数:
  • L ( y , f ( x ) ) = 1 2 ⋅ ( y − f ( x ) ) 2 L(y, f(x))=\frac{1}{2} \cdot(y-f(x))^{2} L(y,f(x))=21​⋅(y−f(x))2
  • 对于第 m − 1 m-1 m−1棵决策树,每个样本 i i i的损失函数为: J = L ( y i , f m − 1 ( x i ) ) J=L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right) J=L(yi​,fm−1​(xi​)),其关于预测值 f m − 1 ( x i ) f_{m-1}\left(x_{i}\right) fm−1​(xi​)的梯度(偏导数)为:
  • ∂ J ∂ f m − 1 ( x i ) = ∂ ∑ i L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) = ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) = f m − 1 ( x i ) − y i \frac{\partial J}{\partial f_{m-1}\left(x_{i}\right)}=\frac{\partial \sum_{i} L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right)}{\partial f_{m-1}\left(x_{i}\right)}=\frac{\partial L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right)}{\partial f_{m-1}\left(x_{i}\right)}=f_{m-1}\left(x_{i}\right)-y_{i} ∂fm−1​(xi​)∂J​=∂fm−1​(xi​)∂∑i​L(yi​,fm−1​(xi​))​=∂fm−1​(xi​)∂L(yi​,fm−1​(xi​))​=fm−1​(xi​)−yi​
  • 那么对应的负梯度:

− ∂ J ∂ f m − 1 ( x i ) = y i − f m − 1 ( x i ) -\frac{\partial J}{\partial f_{m-1}\left(x_{i}\right)}=y_{i}-f_{m-1}\left(x_{i}\right) −∂fm−1​(xi​)∂J​=yi​−fm−1​(xi​)

  • y i − f m − 1 ( x i ) y_{i}-f_{m-1}\left(x_{i}\right) yi​−fm−1​(xi​) 便是当前一棵决策树需要拟合的残差(Residual),因此对于回归问题的提升树模型而言,每棵决策树只需要去拟合前面遗留的残差即可。

    注意: f m − 1 ( x ) f_{m-1}\left(x\right) fm−1​(x)并不是第 m − 1 m-1 m−1棵决策树,而是在第 m − 1 m-1 m−1棵决策树这一步的预测函数,同理 f m − 1 ( x i ) f_{m-1}\left(x_{i}\right) fm−1​(xi​)表示预测函数在样本 x i x_i xi​上的预测值。第 m − 1 m-1 m−1棵决策树仅仅拟合负梯度,而预测函数 f m − 1 ( x ) f_{m-1}\left(x\right) fm−1​(x)是拟合的负梯度加上前面树的预测值。

  • 回归问题的GBDT方法流程:
    • 输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{\mathrm{n}}, \mathbf{y}_{\mathbf{i}} \in \mathcal{Y} \subseteq \mathbf{R} \quad T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)},xi​∈X⊆Rn,yi​∈Y⊆R, 以及学习率 β m \beta_{m} βm​(也称步长)。
    • 输出:提升树 f M ( x ) f_{M}(x) fM​(x) 。
    • 第1步:初始化 f 0 ( x ) = 1 N ∑ i N y i f_{0}(x)=\frac{1}{N} \sum_{i}^{N} y_{i} f0​(x)=N1​∑iN​yi​
    • 第2步:对决策树 m = 1 , 2 , ⋯   , M m=1,2, \cdots, M m=1,2,⋯,M
      • 1). 计算每个样本 i i i的残差:

        r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯   , N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), i=1,2, \cdots, N rmi​=yi​−fm−1​(xi​),i=1,2,⋯,N

      • 2). 拟合残差 r m i r_{m i} rmi​ 学习一个回归树, 得到第 m m m 棵树的叶结点区域 R m j , j = 1 , 2 , ⋯   , J R_{m j}, j=1,2, \cdots, J Rmj​,j=1,2,⋯,J 。注意:决策树( CART \text {CART} CART回归树)内部也是以平方误差作为损失函数进行分裂的。
      • 3). 对叶结点 j = 1 , 2 , ⋯   , J j=1,2, \cdots, J j=1,2,⋯,J, 计算最优输出值:

        c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{m j}=\arg \min _{c} \sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj​=argcmin​xi​∈Rmj​∑​L(yi​,fm−1​(xi​)+c)

        这一步是为了计算怎么对叶结点区域内的样本进行赋值, 使得模型损失最小, 因此这一步是需要根据当前决策树的损失函数来计算的, 而 CART \text {CART} CART回归树的损失函数是平方误差损失,所以这一步计算结果为:

        c m j = 1 N m j ∑ x i ∈ R m j r m i c_{m j}=\frac{1}{N_{m j}} \sum_{x_{i} \in R_{m j}} r_{m i} cmj​=Nmj​1​xi​∈Rmj​∑​rmi​

        即每个叶结点区域残差的均值。

      • 4). 更新决策树 f m ( x ) = f m − 1 ( x ) + β m ∑ j = 1 J c m j I ( x ∈ R m j ) f_{m}(x)=f_{m-1}(x)+\beta_{m} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fm​(x)=fm−1​(x)+βm​∑j=1J​cmj​I(x∈Rmj​) 。
    • 第3步:最终得到针对回归问题的梯度提升树:

      f M ( x ) = ∑ m = 1 M β m ∑ j = 1 J c m j I ( x ∈ R m j ) f_{M}(x)=\sum_{m=1}^{M} \beta_{m} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fM​(x)=m=1∑M​βm​j=1∑J​cmj​I(x∈Rmj​)

      注意: β m \beta_{m} βm​ 的范围是 ( 0 , 1 ) (0,1) (0,1),它的作用和梯度下降算法中的学习率(也称步长)是一样的, 能够使得损失函数收敛到更小的值, 因此可以调小 β m \beta_{m} βm​, 而一个较小的学习率会使得模型趋向于训练更多的决策树, 使得模型更加稳定, 不至于过拟合,因此在GBDT中 β m \beta_{m} βm​也可以作为正则化参数。

GBDT \text {GBDT} GBDT二分类算法

  • 由于 GBDT \text {GBDT} GBDT的基决策树采用的是以平方误差为分裂准则的CART回归树,其叶节点的输出是整个实数范围, 因此要做分类时,我们可以参考逻辑回归算法在线性回归表达式基础上嵌套 S i g m o i d Sigmoid Sigmoid函数(逻辑回归函数)的方法, 来使得 GBDT能够应对分类问题。下面我们先来讨论 GBDT \text {GBDT} GBDT的二分类处理。
  • 我们可以把二分类GBDT的损失函数定义为:
  • L ( y , f ( x ) ) = − y log ⁡ y ^ − ( 1 − y ) log ⁡ ( 1 − y ^ ) y ^ = 1 1 + e − f ( x ) L(y, f(x))=-y \log \hat{y}-(1-y) \log (1-\hat{y}) \\ \hat{y}=\frac{1}{1+e^{-f(x)}} L(y,f(x))=−ylogy^​−(1−y)log(1−y^​)y^​=1+e−f(x)1​
  • 其中 y ^ \hat{y} y^​ 是一个 S i g m o i d Sigmoid Sigmoid函数,我们用它来表示决策树将样本类别预测为1的概率 P ( y = 1 ∣ x ) P(y=1 \mid x) P(y=1∣x) ; y y y为样本类别的实际值(0和1)。
  • 那么对于第 m − 1 m-1 m−1棵决策树,损失函数 J = ∑ i L ( y i , f m − 1 ( x i ) ) J=\sum_{i} L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right) J=∑i​L(yi​,fm−1​(xi​)),其关于样本预测值的梯度计算为 :
  • ∂ J ∂ f m − 1 ( x i ) = ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) = ∂ [ − y i log ⁡ 1 1 + e − f m − 1 ( x i ) − ( 1 − y i ) log ⁡ ( 1 − 1 1 + e − f m − 1 ( x i ) ) ) ∂ f m − 1 ( x i ) = ∂ [ y i log ⁡ ( 1 + e − f m − 1 ( x i ) ) + ( 1 − y i ) [ f m − 1 ( x i ) + log ⁡ ( 1 + e − f m − 1 ( x i ) ) ] ] ∂ f m − 1 ( x i ) = ∂ [ ( 1 − y i ) f m − 1 ( x i ) + log ⁡ ( 1 + e − f m − 1 ( x i ) ) ] ∂ f m − 1 ( x i ) = 1 1 + e − f m − 1 ( x i ) − y i = y i ^ − y i \begin{aligned} \frac{\partial J}{\partial f_{m-1}\left(x_{i}\right)} &=\frac{\partial L\left(y_{i}, f_{m-1}\left(x_{i}\right)\right)}{\partial f_{m-1}\left(x_{i}\right)} \\ &=\frac{\partial\left[-y_{i} \log \frac{1}{1+e^{-f_{m-1}\left(x_{i}\right)}}-\left(1-y_{i}\right) \log \left(1-\frac{1}{\left.1+e^{-f_{m-1}\left(x_{i}\right)}\right)}\right)\right.}{\partial f_{m-1}\left(x_{i}\right)} \\ &=\frac{\partial\left[y_{i} \log \left(1+e^{-f_{m-1}\left(x_{i}\right)}\right)+\left(1-y_{i}\right)\left[f_{m-1}\left(x_{i}\right)+\log \left(1+e^{-f_{m-1}\left(x_{i}\right)}\right)\right]\right]}{\partial f_{m-1}\left(x_{i}\right)} \\ &=\frac{\partial\left[\left(1-y_{i}\right) f_{m-1}\left(x_{i}\right)+\log \left(1+e^{-f_{m-1}\left(x_{i}\right)}\right)\right]}{\partial f_{m-1}\left(x_{i}\right)} \\ &=\frac{1}{1+e^{-f_{m-1}\left(x_{i}\right)}}-y_{i} \\ &=\hat{y_{i}}-y_{i} \end{aligned} ∂fm−1​(xi​)∂J​​=∂fm−1​(xi​)∂L(yi​,fm−1​(xi​))​=∂fm−1​(xi​)∂[−yi​log1+e−fm−1​(xi​)1​−(1−yi​)log(1−1+e−fm−1​(xi​))1​)​=∂fm−1​(xi​)∂[yi​log(1+e−fm−1​(xi​))+(1−yi​)[fm−1​(xi​)+log(1+e−fm−1​(xi​))]]​=∂fm−1​(xi​)∂[(1−yi​)fm−1​(xi​)+log(1+e−fm−1​(xi​))]​=1+e−fm−1​(xi​)1​−yi​=yi​^​−yi​​
  • 计算得到的结果就是该决策树的类别预测概率值与类别实际值之间的差值, 那么负梯度为:
  • − ∂ J ∂ f m − 1 ( x i ) = y i − y ^ i -\frac{\partial J}{\partial f_{m-1}\left(x_{i}\right)}=y_{i}-\hat{y}_{i} −∂fm−1​(xi​)∂J​=yi​−y^​i​
  • 因此对于处理二分类问题的GBDT来说,其每棵决策树拟合的是类别实际值与类别概率预测值的差值。二分类问题的GBDT方法流程为:
    • 输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ { 0 , 1 } \quad T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{\mathrm{n}}, \mathbf{y}_{\mathbf{i}} \in\{\mathbf{0}, \mathbf{1}\} \quad T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)},xi​∈X⊆Rn,yi​∈{0,1}, 以及学习率 β m \beta_{m} βm​ 。
    • 输出:提升树 f M ( x ) f_{M}(x) fM​(x) 。
    • 第1步:初始化 f 0 ( x ) = log ⁡ p 1 1 − p 1 f_{0}(x)=\log \frac{p_{1}}{1-p_{1}} f0​(x)=log1−p1​p1​​, 其中 p 1 p_{1} p1​ 代表的是样本中 y = 1 y=1 y=1 的比例。
    • 第2步:对 m = 1 , 2 , ⋯   , M m=1,2, \cdots, M m=1,2,⋯,M
      • 1).对每个样本 i i i计算负梯度:

        r m i = y i − y ^ i , i = 1 , 2 , ⋯   , N r_{m i}=y_{i}-\hat{y}_{i}, i=1,2, \cdots, N rmi​=yi​−y^​i​,i=1,2,⋯,N

        其中 y ^ i = 1 1 + e − f m − 1 ( x i ) \hat{y}_{i}=\frac{1}{1+e^{-f_{m-1}\left(x_{i}\right)}} y^​i​=1+e−fm−1​(xi​)1​ ,代表 y i = 1 y_{i}=1 yi​=1 的概率。

      • 2). 拟合负梯度 r m i r_{m i} rmi​ 学习一个回归树, 得到第 m m m 棵树的叶结点区域 R m j , j = 1 , 2 , ⋯   , J R_{m j}, j=1,2, \cdots, J Rmj​,j=1,2,⋯,J 。注意这一步也是按照平方误差损失进行分裂节点的。
      • 3).对叶结点 j = 1 , 2 , ⋯   , J j=1,2, \cdots, J j=1,2,⋯,J, 计算:

        c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{m j}=\arg \min _{c} \sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj​=argcmin​xi​∈Rmj​∑​L(yi​,fm−1​(xi​)+c)

      • 4).更新 f m ( x ) = f m − 1 ( x ) + β m ∑ j = 1 J c m j I ( x ∈ R m j ) f_{m}(x)=f_{m-1}(x)+\beta_{m} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fm​(x)=fm−1​(x)+βm​∑j=1J​cmj​I(x∈Rmj​) 。
    • 第3步:最终得到二分类梯度提升树:

f M ( x ) = ∑ m = 1 M β m ∑ j = 1 J c m j I ( x ∈ R m j ) f_{M}(x)=\sum_{m=1}^{M} \beta_{m} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fM​(x)=m=1∑M​βm​j=1∑J​cmj​I(x∈Rmj​)

GBDT \text {GBDT} GBDT多分类算法

  • GBDT \text {GBDT} GBDT在二分类问题上采用了对原始回归树模型嵌套一个“逻辑回归函数”的方法,而 GBDT \text {GBDT} GBDT在多分类问题上采用的是“多项逻辑回归”( Softmax Regression \text {Softmax Regression} Softmax Regression)的方法,下面先简单介绍一下多项逻辑回归。
  • “多项逻辑回归”( Softmax Regression \text {Softmax Regression} Softmax Regression)可以看作是逻辑回归( Logistic Regression \text {Logistic Regression} Logistic Regression)的一般形式,反之,也可以将逻辑回归看作是多项逻辑回归的一个特例。在 Logistic Regression \text {Logistic Regression} Logistic Regression中需要求解的是两个概率: P ( y = 1 ∣ x ; θ ) P(y=1 \mid x ; \theta) P(y=1∣x;θ) 和 P ( y = 0 ∣ x ; θ ) P(y=0 \mid x ; \theta) P(y=0∣x;θ);而在 Softmax Regression \text {Softmax Regression} Softmax Regression中将不再是两个概率,而是 k k k 个概率, k k k 表示类别数。 Softmax Regression \text {Softmax Regression} Softmax Regression的预测函数:

    h θ ( x ) = P ( Y = y i ∣ x ) = [ P ( Y = 1 ∣ x ; θ ) P ( Y = 2 ∣ x ; θ ) ⋅ ⋅ ⋅ P ( Y = k ∣ x ; θ ) ] = 1 ∑ j = 1 k e θ j T x [ e θ 1 T x e θ 2 T x ⋅ ⋅ ⋅ e θ k T x ] \begin{array}{c} h_{\theta}(x) =P\left(Y=y_{i} \mid x\right)= {\left[\begin{array}{c} P(Y=1 \mid x ; \theta) \\ P(Y=2 \mid x ; \theta) \\ \cdot \\ \cdot \\ \cdot \\ P(Y=k \mid x ; \theta) \end{array}\right]} =\frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x}}\left[\begin{array}{c} e^{\theta_{1}^{T} x} \\ e^{\theta_{2}^{T} x} \\ \cdot \\ \cdot \\ \cdot \\ e^{\theta_{k}^{T} x} \end{array}\right] \end{array} hθ​(x)=P(Y=yi​∣x)=⎣⎢⎢⎢⎢⎢⎢⎡​P(Y=1∣x;θ)P(Y=2∣x;θ)⋅⋅⋅P(Y=k∣x;θ)​⎦⎥⎥⎥⎥⎥⎥⎤​=∑j=1k​eθjT​x1​⎣⎢⎢⎢⎢⎢⎢⎡​eθ1T​xeθ2T​x⋅⋅⋅eθkT​x​⎦⎥⎥⎥⎥⎥⎥⎤​​

  • 其中, θ 1 T , θ 2 T , … , θ k T \theta_{1}^T, \theta_{2}^T, \ldots, \theta_{k}^T θ1T​,θ2T​,…,θkT​ 为 k k k个模型分别的参数(向量),最后乘以 1 ∑ j = 1 k e θ j T x i \frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x_{i}}} ∑j=1k​eθjT​xi​1​ 是为了让每个类别的概率处于 [ 0 , 1 ] [0,1] [0,1]区间并且概率之和为1。 Softmax Regression \text {Softmax Regression} Softmax Regression将输入数据 x i x_{i} xi​ 归属于类别 j j j 的概率为:

    p ( y i = j ∣ x i ; θ ) = e θ j T x i ∑ l = 1 k e θ l T x i p\left(y_{i}=j \mid x_{i} ; \theta\right)=\frac{e^{\theta_{j}^{T} x_{i}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x_{i}}} p(yi​=j∣xi​;θ)=∑l=1k​eθlT​xi​eθjT​xi​​

  • 上面公式可以用下图来形象化地解析:
    集成学习算法之:Boosting方法与AdaBoost、GBDT
  • 一般来说, Softmax Regression \text {Softmax Regression} Softmax Regression具有参数冗余的特点, 即将 θ 1 T , θ 2 T , … , θ k T \theta_{1}^T, \theta_{2}^T, \ldots, \theta_{k}^T θ1T​,θ2T​,…,θkT​ 同时加减一个向量后预测结果不变, 因为 P ( Y = 1 ∣ x ) + P ( Y = 2 ∣ x ) + … + P ( Y = k ∣ x ) = 1 P(Y=1 \mid x)+P(Y=2 \mid x)+\ldots+P(Y=k \mid x)=1 P(Y=1∣x)+P(Y=2∣x)+…+P(Y=k∣x)=1 ,所以 P ( Y = 1 ∣ x ) = 1 − P ( Y = 2 ∣ x ) − … − P ( Y = k ∣ x ) P(Y=1 \mid x)=1-P(Y=2 \mid x)-\ldots-P(Y=k \mid x) P(Y=1∣x)=1−P(Y=2∣x)−…−P(Y=k∣x)。假设从参数向量 θ j T \theta_{j}^{T} θjT​ 中减去向量 ψ \psi ψ, 这时每一个 θ j T \theta_{j}^{T} θjT​ 都变成了 θ j T − ψ ( j = 1 , 2 , … , k ) \theta_{j}^{T}-\psi(j=1,2, \ldots, k) θjT​−ψ(j=1,2,…,k) 。此时预测函数变成了:

    P ( Y = y j ∣ x ; θ ) = e θ j T x ∑ i = 1 k e i T i x = e ( θ j T − ψ ) x ∑ i = 1 k e ( θ i T − ψ ) x = e θ j T x × e − ψ x ∑ i = 1 k e θ i T x × e − ψ x = e θ j T x ∑ i = 1 k e θ i T x \begin{aligned} P\left(Y=y_{j} \mid x ; \theta\right) &=\frac{e^{\theta_{j}^{T} x}}{\sum_{i=1}^{k} e_{i}^{T_{i} x}} \\ &=\frac{e^{\left(\theta_{j}^{T}-\psi\right) x}}{\sum_{i=1}^{k} e^{\left(\theta_{i}^{T}-\psi\right) x}} \\ &=\frac{e^{\theta_{j}^{T} x} \times e^{-\psi x}}{\sum_{i=1}^{k} e^{\theta_{i}^{T} x} \times e^{-\psi x}} \\ &=\frac{e^{\theta_{j}^{T} x}}{\sum_{i=1}^{k} e^{\theta_{i}^{T} x}} \end{aligned} P(Y=yj​∣x;θ)​=∑i=1k​eiTi​x​eθjT​x​=∑i=1k​e(θiT​−ψ)xe(θjT​−ψ)x​=∑i=1k​eθiT​x×e−ψxeθjT​x×e−ψx​=∑i=1k​eθiT​xeθjT​x​​

  • 从上式可以看出, 从 θ j T \theta_{j}^{T} θjT​ 中减去 ψ \psi ψ 完全不影响假设函数的预测结果。特别地,当类别数 k k k为2时:

    h θ ( x ) = 1 e θ 1 T x + e θ 2 T x [ e θ 1 T x e θ 2 T x ] h_{\theta}(x)=\frac{1}{e^{\theta_{1}^{T} x}+e^{\theta_{2}^{T} x}}\left[\begin{array}{l} e^{\theta_{1}^{T} x} \\ e^{\theta_{2}^{T} x} \end{array}\right] hθ​(x)=eθ1T​x+eθ2T​x1​[eθ1T​xeθ2T​x​]

  • 利用参数冗余的特点, 我们将上式所有的参数减去 θ 1 \theta_{1} θ1​,上式变为:

h θ ( x ) = 1 e 0 ⋅ x + e ( θ 2 T − θ 1 T ) x [ e 0 ⋅ x e ( θ 2 T − θ 1 T ) x ] = [ 1 1 + e T T x 1 − 1 1 + e θ T x ] \begin{aligned} h_{\theta}(x) &=\frac{1}{e^{0 \cdot x}+e^{\left(\theta_{2}^{T}-\theta_{1}^{T}\right) x}}\left[\begin{array}{c} e^{0 \cdot x} \\ e^{\left(\theta_{2}^{T}-\theta_{1}^{T}\right) x} \end{array}\right] \\ &=\left[\begin{array}{c} \frac{1}{1+e^{T^{T} x}} \\ 1-\frac{1}{1+e^{\theta T} x} \end{array}\right] \end{aligned} hθ​(x)​=e0⋅x+e(θ2T​−θ1T​)x1​[e0⋅xe(θ2T​−θ1T​)x​]=[1+eTTx1​1−1+eθTx1​​]​

  • 其中 θ = θ 2 − θ 1 \theta=\theta_{2}-\theta_{1} θ=θ2​−θ1​ 。可以看出,整理后的式子与逻辑回归完全一致,因此,二分类的逻辑回归其实可以看作是多项逻辑回归在 k = 2 k=2 k=2时的一种特例。
  • 接下来我们看 GBDT \text {GBDT} GBDT多分类的具体方法:
    • 将GBDT应用于二分类问题时需要考虑逻辑回归模型,同理,对于GBDT多分类问题则需要考虑以下 Softmax模型:
    P ( y = 1 ∣ x ) = e F 1 ( x ) ∑ i = 1 k e F i ( x ) P ( y = 2 ∣ x ) = e F 2 ( x ) ∑ i = 1 k e F i ( x ) … … P ( y = k ∣ x ) = e F k ( x ) ∑ i = 1 k e F i ( x ) \begin{array}{c} P(y=1 \mid x)=\frac{e^{F_{1}(x)}}{\sum_{i=1}^{k} e^{F_{i}(x)}} \\ P(y=2 \mid x)=\frac{e^{F_{2}(x)}}{\sum_{i=1}^{k} e^{F_{i}(x)}} \\ \ldots \ldots \\ P(y=k \mid x)=\frac{e^{F_{k}(x)}}{\sum_{i=1}^{k} e^{F_{i}(x)}} \end{array} P(y=1∣x)=∑i=1k​eFi​(x)eF1​(x)​P(y=2∣x)=∑i=1k​eFi​(x)eF2​(x)​……P(y=k∣x)=∑i=1k​eFi​(x)eFk​(x)​​
    • 其中 F 1 … F k F_{1} \ldots F_{k} F1​…Fk​ 是 k k k 个不同的CART回归树集成。每一轮的训练实际上是训练了 k k k 棵树去拟合 softmax的每一个分支模型的负梯度。softmax模型的单样本损失函数为:
     loss  = − ∑ i = 1 k y i log ⁡ P ( y i ∣ x ) = − ∑ i = 1 k y i log ⁡ e F i ( x ) ∑ j = 1 k e F j ( x ) \text { loss }=-\sum_{i=1}^{k} y_{i} \log P\left(y_{i} \mid x\right)=-\sum_{i=1}^{k} y_{i} \log \frac{e^{F_{i}(x)}}{\sum_{j=1}^{k} e^{F_{j}(x)}}  loss =−i=1∑k​yi​logP(yi​∣x)=−i=1∑k​yi​log∑j=1k​eFj​(x)eFi​(x)​
    • 这里的 y i ( i = 1 … k ) y_{i}(i=1 \ldots k) yi​(i=1…k) 是样本原始结果标签在k个类别上作one-hot编码之后的取值, 在 k k k个类别上属于 i i i类就 y i = 1 y_i=1 yi​=1其余都为0。由以上表达式不难推导:
    − ∂ l o s s ∂ F i = y i − e F i ( x ) ∑ j = 1 k e F j ( x ) = y i − p ( y i ∣ x ) -\frac{\partial l o s s}{\partial F_{i}}=y_{i}-\frac{e^{F_{i}(x)}}{\sum_{j=1}^{k} e^{F_{j}(x)}}=y_{i}-p\left(y_{i} \mid x\right) −∂Fi​∂loss​=yi​−∑j=1k​eFj​(x)eFi​(x)​=yi​−p(yi​∣x)
    • 可见, 这 k k k 棵树同样是拟合了样本的真实标签与预测概率之差, 与 GBDT二分类的过程非常类似。

GBDT \text {GBDT} GBDT与 BDT \text {BDT} BDT

  • BDT(Boosting Decision Tree) \text {BDT(Boosting Decision Tree)} BDT(Boosting Decision Tree),提升树,尽管梯度提升树是提升树的改进版,但我们也可以把提升树看作是令梯度提升树中的损失函数取平方误差损失时的一个特例,因此提升树每次训练决策树只需要拟合上一步的残差即可。
  • 但是以残差作为损失函数其实有很大的劣势,一个比较明显的缺点就是对异常值过于敏感。我们来看一个例子:
    集成学习算法之:Boosting方法与AdaBoost、GBDT
  • 很明显后续的模型会对第4个值关注过多,这不是一种好的现象,所以一般回归类的损失函数会用绝对损失或者huber损失函数来代替平方损失函数:
    集成学习算法之:Boosting方法与AdaBoost、GBDT
  • 可以看出huber损失对于异常值的鲁棒性强很多。Huber损失是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。

有问题欢迎留言交流。

最后,如果你对Python、数据挖掘、机器学习等内容感兴趣,欢迎关注我的博客。

继续阅读