集成学习—GBDT原理理解

GBDT,全称为梯度提升决策树,即Gradient Boosting Decision Tree。上一篇博客:集成学习—GBDT(论文研读)中已经对GBDT原始论文——Jerome H. Friedman的《Greedy function approximation: A gradient boosting machine》进行了翻译和精读,这篇博客主要是对GBDT的原理再啃啃,梳理一下,原理理解主要在1-5中体现。

总结

对于回归问题,给定 N N 个带标签的训练集 { ( x 1 , y 1 ) , , ( x N , y N ) } \{(x_1,y_1),\dots,(x_N,y_N)\} ,这里先给出基于损失函数 L L 的不带正则化的GBDT算法:

  1. 初始化 F 0 ( x ) = arg min γ i = 1 N L ( y i , γ ) F_0(x)=\arg\min_\gamma\sum_{i=1}^NL(y_i,\gamma)
  2. m = 1 m=1 M M 循环:
    (1) 对 i = 1 , 2 , , N i=1,2,\dots,N ,计算: r m i = [ L ( y i , F ( x i ) ) F ( x i ) ] F = F m 1 r_{m}^i=-\bigg[{\partial L(y_i,F(x_i))\over \partial F(x_i)}\bigg]_{F=F_{m-1}} (2) 对 { x i , r m i } 1 N \{x_i,r_{m}^i\}_1^N 拟合一个回归树,得到第 m m 颗树的叶结点区域 R m j ,   j = 1 , 2 , , J m R_m^{j},\ j=1,2,\dots,J_m
    (3) 对 j = 1 , 2 , , J m j=1,2,\dots,J_m ,计算: γ m j = arg min γ x i R m j L ( y i , F m 1 ( x i ) + γ ) \gamma_m^{j}=\arg\min_\gamma\sum_{x_i\in R_m^{j}}L(y_i,F_{m-1}(x_i)+\gamma) (4)更新 F m ( x ) = F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^{j}I(x\in R_m^{j})
  3. 输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

这个算法也称为“多重加性回归树”(multiple additive regression trees),简称MART。之所以这样叫,我自己的理解是最后我们有这个算法得到的输出 F ^ ( x ) \hat F(x) ,实际上写开了就是 F ^ ( x ) = F M ( x ) = m = 1 M j = 1 J m γ m j I ( x R m j ) \hat F(x)=F_M(x)=\sum_{m=1}^M\sum_{j=1}^{J_m}\gamma_m^{j}I(x\in R_m^{j}) ,是一个多重的加性树的结果(一般说来,我们都把每棵树的大小设置为相同的即 J m = J J_m=J )。

总的来说,GBDT就是把决策树作为基学习器,首先初始化使得最小化损失函数(损失函数可以由多种选择,例如最小二乘、最小绝对偏差、负二项对数似然、Huber损失等),一般说来这种初始化都很粗糙;然后利用前向分步算法,在每次迭代的时候用一个基学习器去拟合整个函数的最速下降方向,再求最小化当前损失的线性搜索步长,得到的基学习器和步长放入加性模型中就得到这次迭代的模型;这样经过 M M 次迭代后最后求和出来的 M M 个基学习器的组合就是最后的模型。此外,为了抵抗过拟合,对每次迭代的项还增加了一个收缩系数作为正则化参数,它和迭代次数一起调节最终模型的性能。

由于GBDT也是boosting家族中重要的一员,它是串行生成的,它的理解不同于Adaboost的M个基学习器加权投票,GBDT就像是一个优化算法,从初始化的函数开始出发,每步朝着损失函数下降最快的方向——也就是梯度方向优化,即添加一个函数并走相应的步长,最后走了M步才走到最优点,也就是离目标函数最近的地方,从而得到目标函数的逼近

下面就按照这个思路,将GBDT一点点理解吃透。第1、2、3、4讲的是GBDT的前两个字母“GB”,后面第5、6讲的是后两个字母“DT”,第7讲的是过抵抗拟合的手段,第8讲利用GBDT可以得到特征的相对重要性,这个可以用来做特征选择或者解释整个模型,以及第9的GBDT的优缺点。

1. 最速下降

在理解GBDT之前,首先要理解下最速下降法(Steepest Descent),在欧式范数下,最速下降法和梯度下降法等价。最速下降法以负梯度的方向作为极小化算法的下降方向,是无约束最优化中最简单的方法。原理如下:

设函数 f ( x ) f(x) x k x_k 附近连续可微,且梯度 f ( x k ) 0 \nabla f(x_k)\neq0 ,由泰勒展式把 f ( x ) f(x) 展开到一阶 f ( x ) f ( x k ) + ( x x k ) T f ( x k ) f(x)\approx f(x_k)+(x-x_k)^T\nabla f(x_k) 可知,若记 x x k = α k d k x-x_k=\alpha_k d_k ,其中 d k d_k 为单位向量表示方向, α k > 0 \alpha_k>0 为矢量表示线性搜索步长,我们希望 f ( x ) f(x) 的值变小,则满足 d k T f ( x k ) < 0 d_k^T\nabla f(x_k)<0 的那个方向 d k d_k 就是下降方向。当 α k \alpha_k 取定后, d k T f ( x k ) d_k^T\nabla f(x_k) 的值越小,即 d k T f ( x k ) -d_k^T\nabla f(x_k) 的值越大,函数下降得越快。由Cauchy-Schwartz不等式 d k T f ( x k ) d k f ( x k ) |d_k^T\nabla f(x_k)|\leqslant \|d_k\| \|\nabla f(x_k)\| 故当且仅当 d k = f ( x k ) d_k=-\nabla f(x_k) d k T f ( x k ) d_k^T\nabla f(x_k) 的值越小,函数下降最快。因此,称负梯度方向为最速下降方向。
再求线性搜索步长 α k \alpha_k α k = arg min α f ( x k + α d k ) \alpha_k=\arg\min_\alpha f(x_k+\alpha d_k) 这样就得到了一次最速下降步的更新: x k + 1 = x k + α k d k = x k α k f ( x k ) x_{k+1}=x_k+\alpha_k d_k=x_k-\alpha_k \nabla f(x_k)

下面就将最速下降的思想应用到boosting上。

2. 加性模型

设我们的损失函数为 L L ,我们用一个加性模型 F M ( x ) = m = 1 M β m h ( x ; a m ) F_M(x)=\sum_{m=1}^M\beta_mh(x;a_m) 去逼近真实的目标函数,也就是求解 min F M ( x ) i = 1 N L ( y i , F M ( x i ) ) \min_{F_M(x)}\sum_{i=1}^NL\big(y_i,F_M(x_i)\big) 这里这样假设加性模型的形式 β m h ( x ; a m ) \beta_mh(x;a_m) 是因为它适用于决策树、神经网络、径向基函数、支持向量机等一系列方法。对于求解上式,采取前向分步算法,在每次迭代贪婪地选择 β m \beta_m a m a_m 来最小化当前损失,即对于 m = 1 , 2 , , M m=1,2,\dots,M ( β m , a m ) = arg min β , a i = 1 N L ( y i , F m 1 ( x i ) + β h ( x i ; a m ) ) (\beta_m,a_m)=\arg\min_{\beta,a}\sum_{i=1}^NL\big(y_i,F_{m-1}(x_i)+\beta h(x_i;a_m)\big)

β m h ( x ; a m ) \beta_mh(x;a_m) 记为 f m ( x ) f_m(x) ,则 F M ( x ) = m = 1 M f m ( x ) F_M(x)=\sum_{m=1}^Mf_m(x) 。利用最速下降法在第 m m 次迭代时可以求得 f m ( x ) = α m d m f_m(x)=\alpha_m d_m ,其中N维数据空间中的最佳下降方向 d m d_m 为损失函数的负梯度方向: d m = { i = 1 N L ( y i , F ( x i ) ) F ( x i ) F = F m 1 ( x ) } d_m=-\bigg\{{\partial \sum_{i=1}^NL\big(y_i,F(x_i)\big)\over \partial F(x_i) }\bigg|_{F=F_{m-1}(x)}\bigg\} 线性搜索步长 α m \alpha_m 为: α m = arg min α i = 1 N L ( y i , F m 1 ( x i ) + α d m ) \alpha_m=\arg\min_\alpha \sum_{i=1}^NL\big(y_i,F_{m-1}(x_i)+\alpha d_m\big)

3. 用基学习器拟合最速下降方向

最佳下降方向 d m d_m 是一个 N N 维的向量 ( d m 1 , d m 2 , , d m N ) \big(d_m^1,d_m^2,\dots,d_m^N\big) ,其中 d m   i = [ L ( y i , F ( x i ) ) F ( x i ) ] F = F m 1 ( x ) d_m^{\ i}=-\bigg[{\partial L\big(y_i,F(x_i)\big)\over \partial F(x_i) }\bigg]_{F=F_{m-1}(x)} 它不能表示在N维数据空间中的函数,因此GBDT的最奥妙的地方就在于每次迭代中,用基学习器 β m h ( x ; a m ) \beta_m h(x;a_m) 去拟合当前的最佳下降方向 d m d_m ,也就是把这个 N N 维的向量当做新的“伪标签”,用最简单的最小二乘去拟合得到当前的一个基学习器,即最小化平方损失函数得到 a m = arg min β , a i = 1 N [ d m   i β h ( x i ; a ) ] 2 a_m=\arg\min_{\beta,a} \sum_{i=1}^N\big[d_m^{\ i}-\beta h(x_i;a)\big]^2 此时的线性搜索为 β m = arg min β i = 1 N L ( y i , F m 1 ( x i ) + β h ( x i ; a m ) ) \beta_m=\arg\min_\beta \sum_{i=1}^NL\big(y_i,F_{m-1}(x_i)+\beta h(x_i;a_m)\big) 这样就得到了第 m m 次迭代时的基学习器 β m h ( x ; a m ) \beta_m h(x;a_m) ,以及当前对于目标函数的逼近 F m ( x ) = k = 1 m β k h ( x ; a k ) F_m(x)=\sum_{k=1}^m\beta_k h(x;a_k)

4. Gradient Boosting框架

这样我们就得到了下面基本的Gradient Boosting框架:

  1. 初始化 F 0 ( x ) = arg min c i = 1 N L ( y i , c ) F_0(x)=\arg\min_c\sum_{i=1}^NL(y_i,c)
  2. m = 1 m=1 M M
    (1) 对 i = 1 , 2 , , N i=1,2,\dots,N ,计算第 m m 次的最速下降方向: d m   i = [ L ( y i , F ( x i ) ) F ( x i ) ] F = F m 1 ( x ) d_{m}^{\ i}=-\bigg[{\partial L(y_i,F(x_i))\over \partial F(x_i)}\bigg]_{F=F_{m-1}(x)} (2) 用基学习器拟合下降方向,得到第 m m 个基学习器的参数 a m = arg min β , a i = 1 N [ d m   i β h ( x i ; a ) ] 2 a_m=\arg\min_{\beta,a} \sum_{i=1}^N\big[d_m^{\ i}-\beta h(x_i;a)\big]^2 (3) 计算线性搜索: β m = arg min β i = 1 N L ( y i , F m 1 ( x i ) + β h ( x i ; a m ) ) \beta_m=\arg\min_\beta \sum_{i=1}^NL\big(y_i,F_{m-1}(x_i)+\beta h(x_i;a_m)\big) (4)更新 F m ( x ) = F m 1 ( x ) + β m h ( x ; a m ) F_m(x)=F_{m-1}(x)+\beta_mh(x;a_m)
  3. 输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

5. 决策树的形式

之前在集成学习—决策树(CART)中曾经详细讨论过CART树 (Classification And Regression Tree),这里主要使用的是回归树,GBDT的第 m m 个基学习器是一个 J m J_m 个叶结点的回归树,于是相当于这棵树把特征空间划分为 J m J_m 个互不相交的单元 R m 1 , R m 2 , R m J m R_m^1,R_m^2\cdots,R_m^{J_m} ,并且在每个单元 R m j R_m^j 上有一个固定的输出值 b m j b_m^j ,于是第 m m 个基学习器可以表示为:
h ( x ; { b m j , R m j } j = 1 J m ) = j = 1 J m b m j I ( x R m j ) h(x;\{b_m^j,R_m^j\}_{j=1}^{J_m})=\sum_{j=1}^{J_m}b_m^j I(x\in R_m^j) 这样,上述Gradient Boosting框架中用基学习器拟合下降方向就相当于是用回归树来拟合下降方向(伪标签) { d m   i } i = 1 N \{d_{m}^{\ i}\}_{i=1}^N ,得到 J m J_m 个单元 R m 1 , R m 2 , R m J m R_m^1,R_m^2\cdots,R_m^{J_m} 以及在每个单元上的系数 b m 1 , b m 2 , , b m J m b_m^1,b_m^2,\dots,b_m^{J_m}

对于如何划分特征空间得到这样 J m J_m 个单元,是根据MSE准则寻找最优切分变量和切分点,具体形式我们不关心,但我们关心每个单元上的系数的具体形式。CART回归树就是用MSE最小的准则来求解每个单元上的最优输出值,即在任意单元 R m j R_m^j 中最小化 x i R m j ( d m   i b m j ) 2 \sum_{x_i\in R_m^j}(d_{m}^{\ i}-b_m^j)^2 令它对 b m j b_m^j 求导为零,可知最优的 b m j b_m^j R m j R_m^j 上所有特征 x i x_i 对应的伪标签 d m   i d_{m}^{\ i} 的均值,即 b m j = a v e x i R m j ( d m   i ) b_m^j=ave_{x_i\in R_m^j}(d_{m}^{\ i})

因此,我们可以把上述内容带入到Gradient Boosting框架,就得到了更新 F m ( x ) = F m 1 ( x ) + β m j = 1 J m b m j I ( x R m j ) F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) \begin{aligned} F_m(x)&=F_{m-1}(x)+\beta_m\sum_{j=1}^{J_m}b_m^j I(x\in R_m^j)\\ &\triangleq F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^j I(x\in R_m^j) \end{aligned} 其中 γ m j = β m b m j \gamma_m^j =\beta_mb_m^j 。因此我们线性搜索的目标变为
{ γ m j } j = 1 J = arg min { γ j } 1 J i = 1 N L ( y i , F m 1 ( x i ) + j = 1 J m γ j I ( x i R m j ) ) \{\gamma_m^j \}_{j=1}^J=\arg\min_{\{\gamma^{j}\}_1^J}\sum_{i=1}^NL\bigg(y_i,F_{m-1}(x_i)+\sum_{j=1}^{J_m}\gamma^j I(x_i\in R_m^j)\bigg) 由于回归树产生的区域具有不相交的性质,这就简化为 γ m j = arg min γ x i R m j L ( y i , F m 1 ( x i ) + γ ) \gamma_{m}^j=\arg\min_{\gamma}\sum_{x_i\in R_{m}^j}L\bigg(y_i,F_{m-1}(x_i)+\gamma \bigg)

至此,就得到了最开始总结里的GBDT的框架

6. 损失函数(LS/LAD/M/logistic)

下面具体将不同的损失函数带入GBDT的框架:

LS_TreeBoost

LS即最小二乘(Least-squares),这里的损失函数为平方损失 L ( y , F ) = ( y F ) 2 / 2 L(y,F)=(y-F)^2/2 ,因此初始化为数据标签的均值,即 F 0 ( x ) = y ˉ F_0(x)=\bar y ,最速下降方向的第 i i 个分量为 d m   i = y i F m 1 ( x i ) d_{m}^{\ i}=y_i-F_{m-1}(x_i) ,从形式上看,这个量是数据标签和当前拟合值的残差(residuals),因此也有很多人说GBDT是用基学习器去拟合当前的残差,所以最开始给出的最速下降方向是以 r m i r_{m}^i 而不是 d m   i d_{m}^{\ i} 的形式(对此,我个人觉得这个是比较狭义的看法,如果换一个损失函数,不一定就是这么标准的残差形式了,所以宁愿称之为最速下降方向)。由于CART回归树也是使用最小化平方损失,因此在用残差拟合回归树时,除了可以得到划分单元 R m j R_m^{j} 外,还能得到与每个单元上的系数 b m j b_m^{j} 相等的线性搜索。

最后得到LS_TreeBoost算法为:

初始化 F 0 ( x ) = y ˉ F_0(x)=\bar y
m = 1 m=1 M M 循环:
(1) r m i = y i F m 1 ( x i ) r_{m}^i=y_i-F_{m-1}(x_i) i = 1 , 2 , , N i=1,2,\dots,N
(2) 对 { x i , r m i } 1 N \{x_i,r_{m}^i\}_1^N 拟合一个回归树,得到第 m m 颗树的参数 ( γ m j , R m j ) = arg min R j , γ j x i R j ( r m   i γ j ) 2 ,    j = 1 , 2 , , J m (\gamma_m^{j},R_m^j)=\arg\min_{R^j,\gamma^j}\sum_{x_i\in R^j}(r_{m}^{\ i}-\gamma^j)^2,\ \ j=1,2,\dots,J_m (3) 更新 F m ( x ) = F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^j I(x\in R_m^j)
输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

LAD_TreeBoost

LAD即最小绝对偏差(Least absolute deviation),这里的损失函数为绝对偏差损失 L ( y , F ) = y F L(y,F)=|y-F| ,因此初始化为数据标签的中位数,即 F 0 ( x ) = arg min γ i = 1 N y i γ = m e d i a n { y i } 1 N F_0(x)=\arg\min_\gamma\sum_{i=1}^N|y_i-\gamma|=median\{y_i\}_1^N

最速下降方向的第 i i 个分量为 d m   i = [ L ( y i , F ( x i ) ) F ( x i ) ] F = F m 1 = s i g n ( y i F m 1 ( x i ) ) d_{m}^{\ i}=-\bigg[{\partial L(y_i,F(x_i))\over \partial F(x_i)}\bigg]_{F=F_{m-1}}=sign\big(y_i-F_{m-1}(x_i)\big) 也就是说基学习器需要去拟合当前残差的符号函数。在得到划分单元后,线性搜索为
γ m j = arg min γ x i R m j L ( y i , F m 1 ( x i ) + γ ) = arg min γ x i R m j y i F m 1 ( x i ) γ = m e d i a n x i R m j { y i F m 1 ( x i ) } 1 N \begin{aligned} \gamma_m^{j}&=\arg\min_\gamma\sum_{x_i\in R_m^{j}}L(y_i,F_{m-1}(x_i)+\gamma)\\ &=\arg\min_\gamma\sum_{x_i\in R_m^{j}}|y_i-F_{m-1}(x_i)-\gamma|\\ &=median_{x_i\in R_{m}^j}\{y_i-F_{m-1}(x_i)\}_1^N \end{aligned} 最后得到LAD_TreeBoost算法为:

初始化 F 0 ( x ) = m e d i a n { y i } 1 N F_0(x)=median\{y_i\}_1^N
m = 1 m=1 M M 循环:
(1) r m i = s i g n ( y i F m 1 ( x i ) ) r_{m}^i=sign\big(y_i-F_{m-1}(x_i)\big) i = 1 , 2 , , N i=1,2,\dots,N
(2) 对 { x i , r m i } 1 N \{x_i,r_{m}^i\}_1^N 拟合回归树,得到第 m m 颗树的划分单元 { R m j } j = 1 J m \{R_m^j\}_{j=1}^{J_m}
(3) 线性搜索为 γ m j = m e d i a n x i R m j { y i F m 1 ( x i ) } 1 N \gamma_m^{j}=median_{x_i\in R_{m}^j}\{y_i-F_{m-1}(x_i)\}_1^N
(4) 更新 F m ( x ) = F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^j I(x\in R_m^j)
输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

M_TreeBoost

这里的损失函数为Huber损失函数 L ( y , F ) = { 1 2 ( y F ) 2 , y F δ δ ( y F δ / 2 ) , y F > δ L(y,F)=\begin{cases}{1\over2}(y-F)^2, &|y-F|\leqslant \delta\\\delta(|y-F|-\delta/2), &|y-F|>\delta \end{cases} 由于这里是和绝对值项 y F |y-F| 有关,因此初始化可以设为数据标签的中位数,即 F 0 ( x ) = m e d i a n { y i } 1 N F_0(x)=median\{y_i\}_1^N

最速下降方向的第 i i 个分量(也就是第 i i 个伪标签的值)为 d m   i = [ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) = { y i F m 1 ( x i ) , y i F m 1 ( x i ) δ δ s i g n ( y i F m 1 ( x i ) ) , y i F m 1 ( x i ) > δ \begin{aligned} d_{m}^{\ i}&=-\bigg[{\partial L\big(y_i,F(x_i)\big)\over\partial F(x_i)}\bigg]_{F(x)=F_{m-1}(x)}\\ &=\begin{cases} y_i-F_{m-1}(x_i), & |y_i-F_{m-1}(x_i)|\leqslant\delta\\ \delta\cdot sign(y_i-F_{m-1}(x_i)), & |y_i-F_{m-1}(x_i)|>\delta \end{cases} \end{aligned} 可以看出, δ \delta 的值受绝对损失控制,它的最优值取决于 y F ( x ) y-F^*(x) 的分布,其中 F F^* 是真正的目标函数。选择 δ \delta 值的常见的做法是选为分布 y F ( x ) |y-F^*(x)| α \alpha 分位数,这里 ( 1 α ) (1-\alpha) 把样本分为一部分,这部分可以任意修改而不会降低结果的质量。但由于 F ( x ) F^*(x) 是未知的,我们在第 m m 次迭代中使用当前估计 F m 1 ( x ) F_{m-1}(x) 作为近似。 y F m 1 ( x ) |y-F_{m-1}(x)| 的分布由当前的残差来估计,这样 δ m = q u a n t i l e α { y i F m 1 ( x i ) } 1 N \delta_m=quantile_\alpha\{|y_i-F_{m-1}(x_i)|\}_1^N

因此,基学习器需要去拟合的伪标签也是和当前残差 y F m 1 ( x ) y-F_{m-1}(x) 有关。使用回归树作为基学习器,在得到划分单元 R m j R_{m}^j 后,将Huber损失函数带入线性搜索得
γ m j = arg min γ x i R m j L ( y i , F m 1 ( x i ) + γ ) = arg min γ x i R m j { 1 2 ( y i F m 1 ( x i ) γ ) 2 , y i F m 1 ( x i ) γ δ m δ m ( y i F m 1 ( x i ) γ δ m / 2 ) , y i F m 1 ( x i ) γ > δ m \begin{aligned} \gamma_m^{j}&=\arg\min_\gamma\sum_{x_i\in R_m^{j}}L(y_i,F_{m-1}(x_i)+\gamma)\\ &=\arg\min_\gamma\sum_{x_i\in R_m^{j}} \begin{cases} {1\over2}(y_i-F_{m-1}(x_i)-\gamma)^2,& |y_i-F_{m-1}(x_i)-\gamma|\leqslant\delta_m\\ \delta_m(|y_i-F_{m-1}(x_i)-\gamma|-\delta_m/2),& |y_i-F_{m-1}(x_i)-\gamma|>\delta_m\\ \end{cases}\\ \end{aligned}

因为平方最小求出来大概形如 a v e x i R m j { y i F m 1 ( x i ) } 1 N ave_{x_i\in R_{m}^j}\{y_i-F_{m-1}(x_i)\}_1^N ,绝对值最小求出来大概形如 m e d i a n x i R m j { y i F m 1 ( x i ) } 1 N median_{x_i\in R_{m}^j}\{y_i-F_{m-1}(x_i)\}_1^N ,但由于后面带有一个约束条件,所以不这么简单。因此,令 r ~ m j = m e d i a n x i R m j { r m 1 ( x i ) } 1 N \tilde{r}_m^j=median_{x_i\in R_{m}^j}\{r_{m-1}(x_i)\}_1^N ,其中 r m 1 ( x i ) = y i F m 1 ( x i ) r_{m-1}(x_i)=y_i-F_{m-1}(x_i) 是当前残差,则上面复杂的线性搜索 γ m j \gamma_m^{j} 可以从中位数 r ~ m j \tilde{r}_m^j 开始优化近似得到 γ m j = r ~ m j + 1 N m j x i R m j s i g n ( r m 1 ( x i ) r ~ m j ) min ( δ m , a b s ( r m 1 ( x i ) r ~ m j ) ) \gamma_m^{j}=\tilde{r}_m^{j}+{1\over N_m^{j}}\sum_{x_i\in R_m^{j}}sign\big(r_{m-1}(x_i)-\tilde{r}_m^{j}\big)\cdot \min\big(\delta_m,abs(r_{m-1}(x_i)-\tilde{r}_m^{j})\big)

最后得到M_TreeBoost算法为:

初始化 F 0 ( x ) = m e d i a n { y i } 1 N F_0(x)=median\{y_i\}_1^N
m = 1 m=1 M M 循环:
(1) r m ( x i ) = y i F m 1 ( x i ) r_{m}(x_i)=y_i-F_{m-1}(x_i) i = 1 , 2 , , N i=1,2,\dots,N
(2) δ m = q u a n t i l e α { r m ( x i ) } 1 N \delta_m=quantile_\alpha\{|r_{m}(x_i)|\}_1^N
(3) i = 1 , 2 , , N i=1,2,\dots,N r m   i = { r m ( x i ) , r m ( x i ) δ m δ m s i g n ( r m ( x i ) ) , r m ( x i ) > δ m \begin{aligned} r_{m}^{\ i} &=\begin{cases} r_{m}(x_i), & |r_{m}(x_i)|\leqslant\delta_m\\ \delta_m\cdot sign(r_{m}(x_i)), & |r_{m}(x_i)|>\delta_m \end{cases} \end{aligned} (4) 对 { x i , r m i } 1 N \{x_i,r_{m}^i\}_1^N 拟合回归树,得到第 m m 颗树的划分单元 { R m j } j = 1 J m \{R_m^j\}_{j=1}^{J_m}
(5) r ~ m j = m e d i a n x i R m j { r m 1 ( x i ) } 1 N ,    j = 1 , 2 , , J m \tilde{r}_m^j=median_{x_i\in R_{m}^j}\{r_{m-1}(x_i)\}_1^N,\ \ j=1,2,\dots,J_m
(6) 线性搜索为 γ m j = r ~ m j + 1 N m j x i R m j s i g n ( r m 1 ( x i ) r ~ m j ) min ( δ m , a b s ( r m 1 ( x i ) r ~ m j ) ) ,    j = 1 , 2 , , J m \gamma_m^{j}=\tilde{r}_m^{j}+{1\over N_m^{j}}\sum_{x_i\in R_m^{j}}sign\big(r_{m-1}(x_i)-\tilde{r}_m^{j}\big)\cdot \min\big(\delta_m,abs(r_{m-1}(x_i)-\tilde{r}_m^{j})\big),\ \ j=1,2,\dots,J_m (7) 更新 F m ( x ) = F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^j I(x\in R_m^j)
输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

上述三种不同损失的比较
  • 在正态误差下LS_TreeBoost(平方损失)表现较好;
  • 在异常值较多的情况下LAD_TreeBoost(绝对损失)表现较好;
  • M_TreeBoost(Huber损失)在这两种情况下都接近最好表现。

因此,在实际应用中,如果数据的清洁度不能保证或数据存在较多离群值,那么M_TreeBoost的相对较高的精度、一致的性能和鲁棒性可能是一个很大的优势。

L k L_k _TreeBoost

这里的损失函数为负的二项对数似然(FHT00) L ( y , F ) = l o g ( 1 + e x p ( 2 y F ) ) ,    y { 1 , 1 } L(y,F)=log(1+exp(-2yF)),\ \ y\in\{-1,1\} 其中 F ( x ) = 1 2 l o g [ P r ( y = 1 x ) P r ( y = 1 x ) ] F(x)={1\over2}log\bigg[{Pr(y=1|x)\over Pr(y=-1|x)}\bigg] 因此初始化为 F 0 ( x ) = 1 2 l o g 1 + y ˉ 1 y ˉ F_0(x)={1\over2}log{1+\bar y\over 1-\bar y}

m m 次迭代的最速下降方向的第 i i 个分量(也就是第 m m 次迭代的第 i i 个伪标签的值)为 d m   i = [ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) = 2 y i / ( 1 + e x p ( 2 y i F m 1 ( x ) ) ) d_{m}^{\ i}=-\bigg[{\partial L(y_i,F(x_i))\over \partial F(x_i)}\bigg]_{F(x)=F_{m-1}(x)}=2y_i\big/\bigg(1+exp\big(2y_iF_{m-1}(x)\big)\bigg) 用回归树作为基学习器,在得到划分单元 R m j R_{m}^j 后,将负二项对数似然损失函数带入线性搜索得: γ m j = arg min γ x i R m j l o g ( 1 + e x p ( 2 y i ( F m 1 ( x i ) + γ ) ) ) \gamma_{m}^j=\arg\min_\gamma\sum_{x_i\in R_{m}^j}log\bigg(1+exp\big(-2y_i(F_{m-1}(x_i)+\gamma)\big)\bigg) 上式没有闭式解,因此用牛顿迭代法来求解得到 γ m j = x i R m j d m   i / x i R m j d m   i ( 2 d m   i ) \gamma_{m}^j=\sum_{x_i\in R_{m}^j}d_{m}^{\ i}\bigg/\sum_{x_i\in R_{m}^j}|d_{m}^{\ i}|(2-|d_{m}^{\ i}|)

最后得到 L k L_k _TreeBoost算法为:

初始化 F 0 ( x ) = 1 2 l o g 1 + y ˉ 1 y ˉ F_0(x)={1\over2}log{1+\bar y\over 1-\bar y}
m = 1 m=1 M M 循环:
(1) r m i = 2 y i / ( 1 + e x p ( 2 y i F m 1 ( x ) ) ) r_{m}^i=2y_i\big/\bigg(1+exp\big(2y_iF_{m-1}(x)\big)\bigg) i = 1 , 2 , , N i=1,2,\dots,N
(2) 对 { x i , r m i } 1 N \{x_i,r_{m}^i\}_1^N 拟合回归树,得到第 m m 颗树的划分单元 { R m j } j = 1 J m \{R_m^j\}_{j=1}^{J_m}
(3) 线性搜索为 γ m j = x i R m j r m   i / x i R m j r m   i ( 2 r m   i ) \gamma_m^{j}=\sum_{x_i\in R_{m}^j}r_{m}^{\ i}\big/\sum_{x_i\in R_{m}^j}|r_{m}^{\ i}|(2-|r_{m}^{\ i}|)
(4) 更新 F m ( x ) = F m 1 ( x ) + j = 1 J m γ m j I ( x R m j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m}\gamma_m^j I(x\in R_m^j)
输出 F ^ ( x ) = F M ( x ) \hat F(x)=F_M(x)

最后得到的 F M ( x ) F_M(x) 通过 F ( x ) = 1 2 l o g [ P r ( y = 1 x ) P r ( y = 1 x ) ] F(x)={1\over2}log\bigg[{Pr(y=1|x)\over Pr(y=-1|x)}\bigg] 和对数几率联系起来,这样可以转化得到概率估计 p + ( x ) = P r ^ ( y = 1 x ) = 1 / ( 1 + e 2 F M ( x ) ) p ( x ) = P r ^ ( y = 1 x ) = 1 / ( 1 + e 2 F M ( x ) ) p_+(x)=\hat{Pr}(y=1|x)=1/(1+e^{-2F_M(x)})\\ p_-(x)=\hat{Pr}(y=-1|x)=1/(1+e^{2F_M(x)}) 因此GBDT又可以用于分类,预测的标签为 y ^ ( x ) = 2 I [ c ( 1 , 1 ) p + ( x ) > c ( 1 , 1 ) p ( x ) ] 1 \hat{y}(x)=2\cdot I[c(-1,1)p_+(x)>c(1,-1)p_-(x)]-1 其中 c ( y ^ , y ) c(\hat y,y) 是当真实值为 y y ,预测值为 y ^ \hat y 时有关的损失。

类似地,将损失函数改为多项分布的对数似然函数,并利用对称的多重逻辑变换就可以得到多分类逻辑回归和分类。这里就不讨论了。

7. 正则化

Shrinkage(收缩)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,希望通过多学几棵树来弥补不足。

在实际应用中,我们可以通过控制迭代次数来控制过拟合,但这隐含了一种先验信念,即“稀疏”近似的项数越少,预测效果越好。然而,人们经常发现,通过收缩实现的正则化比通过限制项的数量实现的正则化效果更好[Copas(1983)]。因此,Friedman提出在模型更新时添加一个“学习率”参数 ν \nu ,GBDT的更新就变为 F m ( x ) = F m 1 ( x ) + ν j = 1 J m γ m j I ( x R m j ) ,     0 < ν 1 F_m(x)=F_{m-1}(x)+\nu\cdot\sum_{j=1}^{J_m}\gamma_m^{j}I(x\in R_m^{j}),\ \ \ 0<\nu\leqslant 1 每次更新都是简单地根据“学习率”参数 ν \nu 的值进行缩放。这样就达到了收缩的目的,减少了对单独的每棵树的信任,但一定程度上需要更多的树来达到一个很好的拟合效果。

因此,这里就有两种正则化参数,学习速率 ν \nu 和迭代次数 M M 。设置一个较小的 ν \nu 值会增加 M M 的最佳值,也就是增加迭代次数。经验表明, ν 0.1 \nu\leqslant0.1 会得到一个更好的泛化性能[Friedman(2002)],但还应该考虑到计算的可行性,迭代次数 M M 应该在计算方便或者可行的时候尽可能大。

8. 特征重要性

特征重要性就是看单个特征 x j x_j 对最后估计出的模型 F ( x ) F(x) 的相对影响 I j I_j 。Breiman、Friedman、Olshen和Stone(1983)提出用下面这个式子来度量特征 x j x_j 在单颗决策树 T T 上对模型 F ( x ) F(x) 的相对影响 I j ( T ) I_j(T) I j 2 ( T ) = t = 1 J 1 l t 2 I ( v t = j ) I_j^2(T)=\sum_{t=1}^{J-1} l_t^2I(v_t=j) 由于CART树特殊的生成规则,即只有一个孩子能产生孩子的二叉树结构,因此一个拥有 J J 个叶子结点的决策树 T T 有且仅有 J 1 J-1 个内部结点,而分裂只在内部结点上进行,因此这里对 t = 1 t=1 J 1 J-1 求和; v t v_t 是和结点 t t 有关的分裂变量, I ( v t = j ) I(v_t=j) 表示分裂变量是 x j x_j 时的示性函数; l t 2 l_t^2 是类似于Gini指数或信息熵的一个度量分裂准则,值越大表示左孩子和右孩子差别越大,因此用当前特征来做分割的影响更大。评估一个当前区域 R R 可能分裂为两个子区域 ( R l , R r ) (R_l,R_r) 的具体形式如下 l 2 ( R l , R r ) = w l w r w l + w r ( y ˉ l y ˉ r ) 2 l^2(R_l,R_r)={w_lw_r\over w_l+w_r}(\bar y_l-\bar y_r)^2 其中 y ˉ l , y ˉ r \bar y_l,\bar y_r 分别为左、右两边的子标签的均值, w l , w r w_l,w_r 为对应的权重之和。所以这样的度量 I j 2 ( T ) I_j^2(T) 就相当于是把这棵树所有分裂结点取特征 x j x_j 时的影响全都加和起来。

因此,对于一个由Boosting得到的决策树集 { T m } 1 M \{T_m\}_1^M ,我们可以这个集合中所有树的平均值来定义这个模型中特征 x j x_j 在决策树集 { T m } 1 M \{T_m\}_1^M 上对模型 F ( x ) F(x) 的相对影响 I j I_j ,即 I j 2 = 1 M m = 1 M I j 2 ( T m ) I_j^2={1\over M}\sum_{m=1}^{M} I_j^2(T_m) 这样就得到了每个特征对最后估计出的模型 F ( x ) F(x) 的相对影响了,这个值越大,说明对模型影响越大,这个特征也就越重要,因此是特征之间的一个相对重要性度量。我们可以用它来解释模型或者做变量选择等。

9. 优缺点

优点:

  • 预测精度高;
  • 在损失函数的选择上有很大的灵活性;
  • 对特征的单调变换具有不变性,例如,用 x j , log x j , e x j x_j,\log x_j,e^{x_j} x j a x^a_j 作为第 j j 个输入变量都会得到相同的结果;
  • 可以灵活处理各种类型的数据,包括连续值和离散值;
  • 可以做分类也可以做回归;
  • 继承了决策树可以很好处理缺失值的特性;
  • 对长尾分布和异常值不敏感,使用一些稳健的损失函数,比如Huber损失函数等,对异常值的鲁棒性非常强;
  • 可以作为模型预处理工具,先用较少的计算量快速建模,可以在先前停止的地方重新启动过程,不会造成计算损失。

缺点:

  • 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行;
  • 如果数据维度较高时会加大算法的计算复杂度。

参考资料

  • Friedman J H . Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.
  • Minasny B . Trevor Hastie, Robert Tishirani, Jerome Friedman, The Elements of Statistical Learning Second Edition (2009) Springer Series in Statistics, ISBN 0172-7397, 745 pp.[J]. Geoderma, 2009, 153(1-2):1.
发布了32 篇原创文章 · 获赞 33 · 访问量 6621

猜你喜欢

转载自blog.csdn.net/weixin_44750583/article/details/102985804
今日推荐