常用集成学习算法

it2024-05-10  58

常用集成学习算法

1. 概念2. Bagging3. Boosting3.1 AdaBoost(Adaptive Boosting 算法)3.1.1算法流程3.1.2 AdaBoost 误差分析3.1.3 AdaBoost 总结 3.2 GBDT(Gradient Boost Decision Tree)3.2.1 提升树算法3.2.2 梯度提升决策树算法 3.3 XGBoost (Extreme Gradient Boosting)3.4 LightGBM3.4.1 数学原理3.4.2 工程实现3.4.3 参数调节3.4.4 优缺点分析 4. 总结

1. 概念

集成算法是对几种机器学习的学习器进行组合,形成一个方差更小、偏差更小、或预测效果更好的模型。主要有bagging、boosting、stacking三种方法。

2. Bagging

图源:机器学习算法之Boosting

【步骤】

Bootstrap: 从原始样本集中采用有放回抽样的方式抽取n个训练样本,共进行n轮抽取,得到k个相互独立的训练集对每个训练集进行训练,得到k个模型,可以是相同也可以是不相同的训练方法对分类问题:预测结果为k个分类器投票方式得到的分类结果; 对回归问题,将分类器的均值作为预测结果

【应用】随机森林

【说明】

对于有m个样本的训练集,在Bagging中任何一个样本每次被选中的概率为1/m, 不被抽到的概率为 1 − 1 m 1-\frac{1}{m} 1m1,如果m次都没有被抽到的概率为 ( 1 − 1 m ) m (1 - \frac{1}{m})^m 1m1)m ,当 m → ∞ m \to \infty m时, 该式极限为 1 e \frac{1}{e} e1 ≈ 36.8%。也就是说,每轮采样大约有36.8%的数据没有被采样采中,实际上是一种欠采样的抽样方式。需要放回抽样的原因:有放回抽样才能保证不破坏数据的分布

3. Boosting

图源:机器学习算法之Boosting

Boosting的主要思想是将弱分类器经过对迭代,按照不同的权重组合成为一个强分类器,这些基本分类器之间有依赖关系。主要有包括Adaboost算法、提升树、GBDT算法。

3.1 AdaBoost(Adaptive Boosting 算法)

AdaBoost 算法在训练初始对所有样本赋予相同权重,训练时,会对上一轮分类器的样本进行权值调整,对于预测正确的样本权值降低,而对于预测错误的样本进行权值增加。

【AdaBoost 实例】通俗易懂理解——Adaboost算法原理

3.1.1算法流程

图源:AdaBoost基本原理与算法描述

用于解决回归问题的流程参考: 梯度提升树(GBDT)原理小结

3.1.2 AdaBoost 误差分析

AdaBoost 的训练误差界: 1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ≤ 1 N ∑ i e x p ( − y i f ( x i ) ) = ∏ Z m \frac{1}{N} \sum_{i=1}^N I(G(x_i ) \neq y_i) \leq \frac{1}{N}\sum_{i}exp(-y_if(x_i))=\prod Z_m N1i=1NI(G(xi)=yi)N1iexp(yif(xi))=Zm

证明: (1)第一步:证明第一个不等式

G ( x i ) = y i G(x_i) = y_i G(xi)=yi时, y i f ( x i ) > 0 y_if(x_i) > 0 yif(xi)>0, 左 边 I ( G ( x i ) ≠ y i ) = 0 左边I(G(x_i ) \neq y_i) = 0 I(G(xi)=yi)=0,右边 e x p ( − y i f ( x i ) ) > 0 exp(-y_if(x_i)) > 0 exp(yif(xi))>0

G ( x i ) ≠ y i G(x_i) \neq y_i G(xi)=yi 时, y i f ( x i ) < 0 y_if(x_i) < 0 yif(xi)<0, 左 边 I ( G ( x i ) ≠ y i ) = 1 左边I(G(x_i ) \neq y_i) = 1 I(G(xi)=yi)=1,右边 e x p ( − y i f ( x i ) ) ≥ 1 exp(-y_if(x_i)) \ge 1 exp(yif(xi))1

第一个不等式成立。

(2)第二步:证明第二个等式 首先,回忆对于 w m + 1 , i = w m i Z m e x p ( − α m y i G m ( x i ) ) w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)) wm+1,i=Zmwmiexp(αmyiGm(xi)) Z m = ∑ i = 1 N w m i e x p ( − α m y i G m ( x i ) ) Z_m = \sum_{i = 1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)) Zm=i=1Nwmiexp(αmyiGm(xi))

对第一个式子变形得到: w m + 1 , i Z m = w m i e x p ( − α m y i G m ( x i ) ) w_{m+1,i}Z_m = w_{mi}exp(-\alpha_my_iG_m(x_i)) wm+1,iZm=wmiexp(αmyiGm(xi))

现推导如下:

1 N ∑ i e x p ( − y i f ( x i ) ) = 1 N ∑ i e x p ( − y i ∑ m α m G m ( x i ) ) = 1 N ∑ i e x p ( − ∑ m α m y i G m ( x i ) ) = ∑ i w 1 , i ∏ m = 1 M e x p ( − α m y i G m ( x i ) ) = Z 1 ∑ i w 2 , i ∏ m = 2 M e x p ( − α m y i G m ( x i ) ) = Z 1 Z 2 ∑ i w 3 , i ∏ m = 3 M e x p ( − α m y i G m ( x i ) ) = Z 1 Z 2 . . . Z M − 1 ∑ i w M , i e x p ( − α M y i G M ( x i ) ) = ∏ m = 1 M Z m \frac{1}{N}\sum_{i}exp(-y_if(x_i)) \\ = \frac{1}{N}\sum_{i}exp(-y_i\sum_m\alpha_mG_m(x_i)) \\ =\frac{1}{N}\sum_{i}exp(-\sum_m\alpha_my_iG_m(x_i)) \\ = \sum_i w_{1,i} \prod_{m =1}^M exp(-\alpha_my_iG_m(x_i)) \\ = Z_1\sum_iw_{2,i}\prod_{m =2}^M exp(-\alpha_my_iG_m(x_i)) \\ =Z_1Z_2\sum_iw_{3,i}\prod_{m =3}^M exp(-\alpha_my_iG_m(x_i)) \\ = Z_1Z_2...Z_{M-1} \sum_i w_{M,i} exp(-\alpha_My_iG_M(x_i)) =\prod_{m=1}^MZ_m N1iexp(yif(xi))=N1iexp(yimαmGm(xi))=N1iexp(mαmyiGm(xi))=iw1,im=1Mexp(αmyiGm(xi))=Z1iw2,im=2Mexp(αmyiGm(xi))=Z1Z2iw3,im=3Mexp(αmyiGm(xi))=Z1Z2...ZM1iwM,iexp(αMyiGM(xi))=m=1MZm

二分类问题AadaBoost的训练误差界 ∏ m = 1 M Z m = ∏ m = 1 M 1 − 4 γ m 2 ≤ e x p ( − 2 ∑ m = 1 M γ m 2 ) \prod_{m = 1}^MZ_m = \prod_{m = 1}^M \sqrt{1-4\gamma_m^2} \le exp(-2\sum_{m=1}^M \gamma_m^2) m=1MZm=m=1M14γm2 exp(2m=1Mγm2) 其中, γ m = 1 2 − e m \gamma_m = \frac{1}{2} - e_m γm=21em

证明: 这里需要利用 α m = 1 2 l n 1 − e m e m \alpha_m = \frac{1}{2}ln\frac{1-e_m}{e_m} αm=21lnem1em

Z m = ∑ i = 1 N w m i e x p ( − α m y i G m ( x i ) ) = ∑ T r u e w m i e − α m + ∑ F a l s e w m i e α m = ( 1 − e m ) e − α m + e m e α m = e m ( 1 − e m ) = 1 − 4 γ m 2 Z_m = \sum_{i = 1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)) \\ = \sum_{True} w_{mi}e^{-\alpha_m} + \sum_{False} w_{mi}e^{\alpha_m}\\ =(1 - e_m)e^{-\alpha_m} + e_me^{\alpha_m} \\ = \sqrt{e_m(1-e_m)} = \sqrt{1-4\gamma_m^2} Zm=i=1Nwmiexp(αmyiGm(xi))=Truewmieαm+Falsewmieαm=(1em)eαm+emeαm=em(1em) =14γm2

再利用 e x e^x ex 1 − x \sqrt{1-x} 1x 在x = 0处泰勒展开可以得到: ∏ m = 1 M 1 − 4 γ m 2 ≤ e x p ( − 2 ∑ m = 1 M γ m 2 ) \prod_{m = 1}^M \sqrt{1-4\gamma_m^2} \le exp(-2\sum_{m=1}^M \gamma_m^2) m=1M14γm2 exp(2m=1Mγm2)

推论:如果存在 γ > 0 \gamma > 0 γ>0,对所有m有 γ m ≥ γ \gamma_m \ge \gamma γmγ,那么:

1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ≤ e x p ( − 2 M γ 2 ) \frac{1}{N} \sum_{i=1}^N I(G(x_i ) \neq y_i) \le exp(-2M\gamma^2) N1i=1NI(G(xi)=yi)exp(2Mγ2) 这表明,在此条件下,AdaBoost的训练误差是以指数下降的

3.1.3 AdaBoost 总结

【优点】:

很好的利用了弱分类器进行级联。可以将不同的分类算法作为弱分类器。AdaBoost具有很高的精度。相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重。

缺点:

AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。数据不平衡导致分类精度下降。训练比较耗时,每次重新选择当前分类器最好切分点。

3.2 GBDT(Gradient Boost Decision Tree)

GBDT称为梯度提升决策树,主要思想为通过每轮产生一颗CART树,对上一轮的CART树的残差进行学习,最终通过对弱分类器进行加权求和,得到最终的分类器。 【例子】一个简单易懂的例子 采用传统的决策树 GBDT 最终的预测值为各个子树预测结果的和。

图源:GBDT(MART) 迭代决策树入门教程 | 简介

3.2.1 提升树算法

初始化弱学习器, f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0对迭代轮数 m = 1,2,…,M, 2.1 对样本计算残差 r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . N r_{mi} = y_ i - f_{m-1}(x_i),i = 1,2,...N rmi=yifm1(xi),i=1,2,...N 2.2 对每一个样本 ( x i , r m i ) (x_i, r_{mi}) (xi,rmi)拟合一棵cart回归树,得到 T ( x ; Θ ) T(x;\Theta) T(x;Θ) 2.3 对叶子区域更计算最佳拟合值 2.4 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ ) f_m(x) = f_{m-1}(x) + T(x;\Theta) fm(x)=fm1(x)+T(x;Θ)得到回归问题提升树: f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^MT(x;\Theta_m) fM(x)=m=1MT(x;Θm)

3.2.2 梯度提升决策树算法

学习残差回归树时,当损失函数是平方损失和指数损失时,每一步优化较为简单;但当对一般损失函数而言(见下表),往往每步优化都并不那么容易,因此出现了梯度提升算法,利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中残差的近似值(残差是负梯度的特殊情况)。

损失函数列表 【算法流程】 对于处理分类问题和正则化可以参考:梯度提升树(GBDT)原理小结

【GBDT和AdaBoost区别】

GBDT弱分类器为回归树GBDT不涉及样本权重的更新Loss一般采用均方差或自定义损失函数

3.3 XGBoost (Extreme Gradient Boosting)

Xgboost是GBDT的一种,是一种Boosting算法。GBDT和XGBoost最大的差异是目标函数的定义。XGBoost的目标函数增加了正则化项,并采用二阶泰勒展开,使用牛顿法求解等。

【例子】

【模型形式】 对于一个给定的有n个样本和m个特征的数据集 D = ( x ) ( ∣ D ∣ = n , x i ∈ R m , y i ∈ R ) D = (x)(|D | = n,x_i \in R^m, y_i \in R) D=(x)(D=n,xiRm,yiR) y ^ = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y} = \sum_{k=1}^Kf_k(x_i), f_k \in \mathcal{F} y^=k=1Kfkxi,fkF f k f_k fk是每一轮训练的回归树,实质上,预测值是将该样本每一轮训练的预测结果相加得到

【目标函数】 O b j ( Θ ) = ∑ i = 1 N L ( y i , y i ^ ) + ∑ j = 1 t Ω ( f j ) , f k ∈ F Obj(\Theta) = \sum_{i=1}^N L(y_i,\hat{y_i}) + \sum_{j=1}^t \Omega(f_j) , f_k \in \mathcal{F} Obj(Θ)=i=1NL(yi,yi^)+j=1tΩ(fj),fkF

目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。

损失函数 Xgboost其实是通过贪心算法寻找局部最优解,当生成t棵树后,预测分数可以写成: y i ^ = ∑ j = 1 t f j ( x i ) = y i ^ ( t − 1 ) + f t ( x i ) \hat{y_i} = \sum_{j=1}^tf_j(x_i) = \hat{y_i}^{(t-1)} + f_t(x_i) yi^=j=1tfj(xi)=yi^(t1)+ft(xi) 每一次迭代寻找使损失函数降低最大的CART树 f t f_t ft,因此目标函数可以改写为: O b j ( Θ ) ( t ) = ∑ i = 1 N L ( y i , y i ^ ( t ) ) + ∑ j = 1 t Ω ( f j ) = ∑ i = 1 N L ( y i , y i ^ ( t − 1 ) + f t ( x i ) ) +   Ω ( f t ) + c o n s t a n t \begin{aligned} Obj(\Theta)^{(t)} &= \sum_{i=1}^N L(y_i,\hat{y_i}^{(t)}) + \sum_{j=1}^t \Omega(f_j) \\ &= \sum_{i=1}^N L(y_i,\hat{y_i}^{(t-1)} + f_t(x_i)) + \ \Omega(f_t) + constant \end{aligned} Obj(Θ)(t)=i=1NL(yi,yi^(t))+j=1tΩ(fj)=i=1NL(yi,yi^(t1)+ft(xi))+ Ω(ft)+constant 在t轮时,前t-1次迭代正则项看作常数。 接下来采用泰勒展开对目标函数进行近似: O b j ( t ) = ∑ i = 1 N L ( y i , y i ^ ( t − 1 ) + f t ( x i ) ) +   Ω ( f t ) + c o n s t a n t = ∑ i = 1 N ( L ( y i , y i ^ ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ) +   Ω ( f t ) + c o n s t a n t 其 中 , g i = ∂ L ( y i , y i ^ ( t − 1 ) ) ∂ y i ^ ( t − 1 ) , h i = ∂ 2 L ( y i , y i ^ ( t − 1 ) ) ∂ 2 y i ^ ( t − 1 ) \begin{aligned} Obj^{(t)} &= \sum_{i=1}^N L(y_i,\hat{y_i}^{(t-1)} + f_t(x_i)) + \ \Omega(f_t) + constant \\ &= \sum_{i=1}^N (L(y_i,\hat{y_i}^{(t-1)})+ g_if_t(x_i) + \frac12h_if_t^2(x_i)) + \ \Omega(f_t) + constant \\ 其中, &g_i = \frac{\partial L(y_i,\hat{y_i}^{(t-1)})}{\partial \hat{y_i}^{(t-1)}}, h_i = \frac{\partial^2 L(y_i,\hat{y_i}^{(t-1)})}{\partial^2 \hat{y_i}^{(t-1)}} \end{aligned} Obj(t),=i=1NL(yi,yi^(t1)+ft(xi))+ Ω(ft)+constant=i=1N(L(yi,yi^(t1))+gift(xi)+21hift2(xi))+ Ω(ft)+constantgi=yi^(t1)L(yi,yi^(t1)),hi=2yi^(t1)2L(yi,yi^(t1)) 由于前t-1棵树的预测分数与y的残差对目标函数优化不影响,可以直接去掉。简化目标函数为:: O b j ( t ) = ∑ i = 1 N ( g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ) + Ω ( f t ) Obj^{(t)} = \sum_{i=1}^N ( g_if_t(x_i) + \frac12h_if_t^2(x_i)) + \Omega(f_t) Obj(t)=i=1N(gift(xi)+21hift2(xi))+Ω(ft)

一元泰勒展开 对于一般的函数,泰勒公式的系数依赖于函数在一点的各阶导数值,函数f(x)在 x 0 x_0 x0处的泰勒展开基本形式如下: f ( x ) = ∑ n = 0 ∞ f n ( x 0 ) n ! ( x − x 0 ) n = f ( x 0 ) + f 1 ( x 0 ) ( x − x 0 ) + f 2 ( x 0 ) 2 ( x − x 0 ) 2 + . . . + f n ( x 0 ) n ! ( x − x 0 ) n \begin{aligned} f(x) &= \sum_{n = 0}^{\infty} \frac{f^{n}(x_0)}{n!}(x - x_0)^n \\ &= f(x_0) + f^1(x_0)(x-x_0) + \frac{f^2(x_0)}{2}(x-x_0)^2+ ...+\frac{f^{n}(x_0)}{n!}(x - x_0)^n \end{aligned} f(x)=n=0n!fn(x0)(xx0)n=f(x0)+f1(x0)(xx0)+2f2(x0)(xx0)2+...+n!fn(x0)(xx0)n f ( x + Δ x ) = f ( x ) + f 1 ( x ) Δ x + f 2 ( x 0 ) 2 Δ x 2 + . . . f(x+ \Delta x) = f(x) + f^1(x)\Delta x + \frac{f^2(x_0)}{2}\Delta x^2 + ... f(x+Δx)=f(x)+f1(x)Δx+2f2(x0)Δx2+... 二元泰勒展开 二元证明参考:二元函数的泰勒公式

正则项 树的复杂度可以用树的深度、节点个数等来衡量,XGBoost中的正则项定义为:树的叶子结点个数T和每棵树叶子节点输出分数w的平方和。

从直观上看,正则项要求叶子节点尽可能少,而输出分数尽可能不极端。

最终目标函数 由损失函数和正则项,可以到到目标函数为:

O b j ( t ) = ∑ i = 1 N ( g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 Obj^{(t)} = \sum_{i=1}^N ( g_if_t(x_i) + \frac12h_if_t^2(x_i)) + \gamma T+ \frac12\lambda \sum_{j=1}^T w_j^2 Obj(t)=i=1N(gift(xi)+21hift2(xi))+γT+21λj=1Twj2 第一部分是样本的累计,第二部分则是对叶节点的累加。

定义q函数,将输入x映射到某个叶子节点上,用叶子节点集合以及叶子节点得分表示原输入,则有: f t ( x ) = w q ( x ) , w ∈ R T , q : R d f_t(x) = w_{q(x)}, w \in R^T,q:R^d ft(x)=wq(x),wRT,q:Rd 每个样本都落在一个叶子节点上 ,q(x)表示样本x在某个叶子节点上, w q ( x ) w_{q(x)} wq(x)是该节点的打分,即该样本的模型预测值

定义每个叶子节点j上的样本集合为 I j = i ∣ q ( x i ) = j I_j = {i|q(x_i) = j} Ij=iq(xi)=j,可以将前面的目标函数做变形: O b j ( t ) = ∑ i = 1 N ( g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 N ( g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T ( ∑ i ∈ I j g i w j + 1 2 h i w j 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) + γ T 其 中 , G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h i \begin{aligned} Obj^{(t)} &= \sum_{i=1}^N ( g_if_t(x_i) + \frac12h_if_t^2(x_i)) + \gamma T+ \frac12\lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{i=1}^N ( g_iw_{q(x_i)} + \frac12h_iw_{q(x_i)}^2) + \gamma T+ \frac12\lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{j=1}^T(\sum_{i \in I_j}g_iw_j + \frac12h_iw_j^2)+ \gamma T+ \frac12\lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{j=1}^T(G_jw_j+ \frac12(H_j + \lambda )w_j^2)+ \gamma T \\ 其中, & G_j = \sum_{i \in I_j}g_i, H_j = \sum_{i \in I_j}h_i \end{aligned} Obj(t)=i=1N(gift(xi)+21hift2(xi))+γT+21λj=1Twj2=i=1N(giwq(xi)+21hiwq(xi)2)+γT+21λj=1Twj2=j=1T(iIjgiwj+21hiwj2)+γT+21λj=1Twj2=j=1T(Gjwj+21(Hj+λ)wj2)+γTGj=iIjgi,Hj=iIjhi

为了对目标函数进行优化,计算第t轮使目标函数函数最小的叶节点输出,即目标函数对w求导,并令其为0,得到: w j = − G j H j + λ w_j = - \frac{G_j}{H_j+ \lambda} wj=Hj+λGj 带入损失函数后,得到: O b j ( t ) = ∑ j = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) + γ T = ∑ j = 1 T ( − G j 2 H j + λ + 1 2 G j 2 H j + λ ) + γ T = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \begin{aligned} Obj^{(t)} &= \sum_{j=1}^T(G_jw_j+ \frac12(H_j + \lambda )w_j^2)+ \gamma T\\ &=\sum_{j=1}^T(- \frac{G_j^2}{H_j+ \lambda}+ \frac12 \frac{G_j^2}{H_j+ \lambda})+ \gamma T \\ & = - \frac12 \sum_{j=1}^T \frac{G_j^2}{H_j+ \lambda}+ \gamma T \end{aligned} Obj(t)=j=1T(Gjwj+21(Hj+λ)wj2)+γT=j=1T(Hj+λGj2+21Hj+λGj2)+γT=21j=1THj+λGj2+γT

【学习策略】 分裂结点算法

通过上面对目标函数的分析,我们知道如果需要目标函数越小越好,需要 G j 2 H j + λ \frac{G_j^2}{H_j+ \lambda} Hj+λGj2这部分越大越好,在XGBoost中增益定义为左子树、右子树的分数减去不分裂时的分数,再对叶节点的复杂度进行乘法,关系如下:

精确贪心算法 根据每个特征值对所有数据进行排序,并按排序顺序访问,计算相应的一阶导和二阶导,遍历每个特征值后选择增益最大的特征值进行分裂,该方法对计算量要求非常高。 精确贪心算法是需要枚举所有的分割条件后,计算阈值左右两边的导数和,但节点划分不一定会带来目标函数的下降,一旦进行分裂,会增大决策树复杂度带来的

近似算法 贪婪算法可以的到最优解,但当数据量太大时对算力要求较高,因此出现了近似算法。该算法根据特征的分位数提出候选切分点,将连续性特征划分到对应的桶中,然后聚合统计信息找到区间的最佳分割点。

在提出候选切分点时有两种策略: a. Global: 学习每棵树前就提出候选切分点,并在每次分裂时都采用这种分裂方式,当切分点足够多时,和精确贪心算法性能相当 b. Local: 每次分裂前重新候选切分点,切分点数量可以不用太多,性能与精确贪心算法性能相当

下图给出不同种分裂策略的 AUC 变换曲线,横坐标为迭代次数,纵坐标为测试集 AUC,eps 为近似算法的精度,其倒数为桶的数量,衡量了切分的细致程度。 算法的流程如下,

分位数缩略图 (Weighted Quantile Sketch) 加权分位数算法的思想是按比例选择对样本进行抽取,根据每个样本的对loss的贡献,选取k个样本中最优值。

直观上理解:

对前面的目标函数函数进行整理, 由于 1 2 g i 2 h i 2 \frac12 \frac{g_i^2}{h_i^2} 21hi2gi2为常数,与常数项C合并,从上面的推导可以看出, h i h_i hi就是损失函数中样本的权重。

接下来构造一个排序函数,计算第k个特征值小于z的样本比例。将样本对应的二阶导h作为划分依据,使得候选节点更容易选取到二阶导更大的地方。对于 D k = ( x 1 k , h 1 ) , . . . ( x n k , h n ) D_k = (x_{1k},h_1),...(x_{nk},h_n) Dk=(x1k,h1),...(xnk,hn)有: r k ( z ) = 1 ∑ ( x , k ) ∈ D k h ∑ ( x , k ) ∈ D k , x < z h r_k(z) = \frac{1}{\sum_{(x,k)\in D_k} h}\sum_{(x,k)\in D_k,x<z} h rk(z)=(x,k)Dkh1(x,k)Dk,x<zh 按照步幅 ϵ \epsilon ϵ挑选出取值候选点,组成候选点集

【缺失值处理】 处理方式:xgboost能对缺失值自动进行处理,主要思想是对于缺失值自动学习出其划分的方向,流程如下: a. 将缺失值都放在右子树,枚举划分节点,计算最大增益 b. 将缺失值都放在左子树,枚举划分节点,计算最大增益 c. 最后求出最大增益,确定缺失值的划分

【防止过拟合】

收缩率列采样 按层随机:对同一层内每个节点分裂之前,随机选一部分特征,这时每次分裂时只需要遍历这一部分特征来确定分割点按树随机:在建树结构之前就随机选择特征,之后所有叶子节点都只使用这些特征

手算xgboost:xgboost原理分析以及实践

3.4 LightGBM

和xgbosst一样,Lightgbm也是对gbdt的高效实现,原理上LightGBM和XGBoost类似,都是通过对采用损失函数的负梯度作为残差预测值进行新一轮的拟合,但相比与XGBoost,LightBGM的性能更佳。

LightGBM可以概括为以下式子: LightGBM = XGBoost + Histogram + GOSS + EFB

Histogram: 直方图算法 GOSS:基于梯度的单边采样算法 EFB:互斥特征捆绑算法

3.4.1 数学原理

【基于leaf - wise的决策树生长策略】 对于大部分决策树使用的是level - wise 生长策略,同一层的叶子节点都一起分裂,但实际上一些叶子节点的分裂增益较低,这种方法分裂会增加不小的开销

LightGBM使用基于leaf - wise的决策树生长策略:每次在当前叶子节点中,找出分裂增益最大的叶子节点进行分裂,而不是所有节点都进行分裂,从而提高精度

【直方图算法】

直方图算法是替代XGBoost预排序算法的,思路如下:

先把连续的浮点特征离散化成k个整数,对特征值进行分箱处理(bins)根据bins对其进行梯度累加和个数统计遍历所有bins, 以当前bin为分割点,累加其左边bins至当前bin的梯度和(SL)以及样本数量(nL)父结点上的梯度总和和样本总量与上一步得到的梯度与样本量分别相减得到右边所有bins梯度和(SR)和样本量(nR) -> Histogram(直方图)做差加速计算loss,计算遍历过程中的最大增益,并将此时的特征和特征值作为分裂的特征和分裂特征值

【GOSS(Gradient-based One-Side Sampling)】

GOSS的思路是在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益。

流程如下: 算法描述:

根据样本点的绝对梯度进行排序对排序后的结果取前a*100%%的样本作为大梯度样本集合对剩下的样本集合(1-a)100%的样本,随机选取 b (1 -a ) *100%样本点作为小梯度样本集合将大梯度样本和小梯度样本合并,小样本的权重系数为 1 − a b \frac{1-a}{b} b1a使用上述样本,学习一个新的弱学习器重复上述步骤直到规定的迭代

GOSS保留所有的梯度较大的实例,在梯度小的实例上使用随机采样。为了抵消对数据分布的影响,计算信息增益的时候,GOSS对小梯度的数据引入常量乘数。GOSS首先根据数据的梯度绝对值排序,选取top a个实例。然后在剩余的数据中随机采样b个实例。接着计算信息增益时为采样出的小梯度数据乘以(1-a)/b,这样算法就会更关注训练不足的实例,而不会过多改变原数据集的分布。

GOSS不会丢失许多训练精度,胜过随机采样,证明参考:机器学习算法之LightGBM(GOSS部分)

【EFB(Exclusive Feature Bundling)】 EFB称之为特征捆绑,利用互斥的特征(1个特征值为0,一个特征值不为0)进行捆绑,减少特征维度,实际上是一种降维技术。

如果两个特征不完全互斥,可以用冲突比率来衡量不互斥程度,通过选择冲突比率小的特征进行捆绑实现降维。

EBF步骤1:可绑定特征选择

首先构造一个加权无向图,顶点是特征,边是两个特征之间的互斥程度对根据节点的度进行排序,遍历每个特征,将它分配给现有特征包(或新建),使得总体冲突最小

EBF步骤2:绑定后特征值确定

合并应该也要使得原始特征能够分离出来,可以通过添加特征偏移量来实现,如bundle中有两个特征,原始特征A取值[0, 10],B取值[0, 20]。我们添加偏移量10到B中,因此B取值[10, 30]。通过这种做法,就可以安全地将A、B特征合并,使用一个取值[0, 30]的特征取代AB。

3.4.2 工程实现

【特征并行】

传统的特征并行是对数据进行垂直划分,即在不同的机器上划分数据,再基于通信将结果告诉其他机器划分结果,然后在具有最佳节点的机器上分裂,再由这个节点再广播到其他节点该特征左右节点的索引,其他节点才能进行分裂;

LGM的每个机器上都有全部数据,但是每个worker仅在特征子集上进行最佳切分点的寻找,然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可

很明显, LGB仅需要通信一个特征分裂点,不需要通信索引,但数据量大时仍然存在瓶颈,可以采用数据并行的方式。

【数据并行】

不同于传统的数据并行方式(水平划分数据后,构建本地直方图后,将所有本地直方图整合成全局直方图后再寻找最优划分),LGB采用Reduce Scatter分散规约的方式把直方图合并的任务分摊到不同的机器,然后从整合直方图中寻找最佳化分界点并同步至全局最优划分LightGBM 通过直方图做差法加速训练。 基于此,我们可以进行单叶子的直方图通讯,并且在相邻直方图上使用做差法

【投票并行】

针对数据量特别大特征也特别多的情况下,可以采用投票并行。

投票并行主要针对数据并行时数据合并的通信代价比较大的瓶颈进行优化,其通过投票的方式只合并部分特征的直方图从而达到降低通信量的目的。

主要思路是在每个worker中选出top k个分裂特征,然后将每个worker选出的k个特征进行汇总,并选出全局分裂特征,进行数据分裂

3.4.3 参数调节

调参参考: Lightgbm基本原理介绍

3.4.4 优缺点分析

【优点】

直方图算法使得计算过程中不需要存储排序结果,并且可以只存储离散化后的值,一般为整型,相比原来存储浮点类型的数值,内存开销大幅减少。直方图算法不需要对每个特征值进行分裂,并且可以采用直方图加速算法,使得计算代价大幅降低

【缺点】

不能找到很精确的分割点可能会长出比较深的决策树,产生过拟合

参考:LightGBM 直方图优化算法

4. 总结

【GBDT和随机森林】 xgboost/gbdt 的树浅,而RandomForest树深的原因:

从偏差和方差的角度来说比较好理解。要想精度高,泛化误差必须低,就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。

我们尽可能地让方差和偏差小一点,想一下,决策树的深度就决定了模型的偏差(越深,偏差越小,但是太深,会导致过拟合,也就是方差会大),而随机森林中多棵树的组合就是为了降低方差。这就是为什么随机森林的树深度会很高的原因。而GBDT的每一棵树是拟合的上一棵树的偏差,本身就保证了偏差,所以问题就在于怎么选择使方差更小的分类器,故决策树的深度都很浅。

【XGBoost和LightGBM对比】

内存:

XGboost使用预排序后需要记录特征值对应样本的统计值的索引,LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,极大的减少了内存消耗LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗

计算速度:

LightGBM不需要遍历所有特征节点,仅需遍历所有bins,极大降低了复杂度LightGBM在计算过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量计算LightGBM采用了Leaf-wise算法,减少很多计算LightGBMca爱用特征并行、数据并行等,加速计算

还有很多细节有遗漏,想到再补充…

参考:

李航:《统计学习方法》机器学习–集成学习(Ensemble Learning) 有放回采样和无放回采样boosting系列算法GBDT(MART) 迭代决策树入门教程 | 简介决策树(下)——XGBoost、LightGBM(非常详细)Newton Boosting Tree 算法原理:详解 XGBoostxgb和lgb在特征、数据并行上存在什么差异?Bagging 和 Boosting 算法异同为什么说bagging是减少variance,而boosting是减少biasLightGBM原文链接
最新回复(0)