datawhale 10月学习——树模型与集成学习:XGBoost&LightGBM(待补)

前情回顾

  1. 决策树
  2. CART树的实现
  3. 集成模式
  4. 两种并行集成的树模型
  5. AdaBoost
  6. 梯度提升树

结论速递

本次学习了XGBoost和lightGBM,了解了XGBoost与常规GBDT的区别,随后又学习了lightGBM与XGBoost的区别,本次学习没有完全完成,待后续补充。

1 XGBoost

XGBoost的目标函数如下图所示(其中第二项是正则项)
可以看到目标函数由损失函数和正则项构成,其中损失函数经过泰勒展开近似为一个二次函数,而正则项描述了树的复杂程度。

不同于上一节中GBDT的梯度下降方法,XGBoost直接在 h ( m ) = 0 h^{(m)}=0 h(m)=0处(或 F i ( m ) = F i ( m − 1 ) F^{(m)}_i=F^{(m-1)}_i Fi(m)=Fi(m1)处)将损失函数近似为一个二次函数,从而直接将该二次函数的顶点坐标作为 h ∗ ( m ) ( X i ) h^{*(m)}(X_i) h(m)(Xi)的值,即具有更小的损失。梯度下降法只依赖损失的一阶导数,当损失的一阶导数变化较大时,使用一步梯度获得的 h ∗ ( m ) h^{*(m)} h(m)估计很容易越过最优点,甚至使得损失变大(如子图2所示);二次函数近似的方法需要同时利用一阶导数和二阶导数的信息,因此对于 h ∗ ( m ) h^{*(m)} h(m)的估计在某些情况下会比梯度下降法的估计值更加准确,或说对各类损失函数更有自适应性
在这里插入图片描述

在这里插入图片描述
XGBoost的核心算法思想是

  1. 不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数 f ( x ) f(x) f(x),去拟合上次预测的残差。
  2. 当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数。
  3. 最后只需要将每棵树对应的分数加起来就是该样本的预测值。

在这里插入图片描述
在这里插入图片描述
树的复杂程度可以由下式表示出来
在这里插入图片描述
它包含了树里面叶子节点的个数T,也包含了树上叶子结点的得分w的L2模平方。

在决策树的一节中,我们曾以信息增益作为节点分裂行为操作的依据,信息增益本质上就是一种损失,增益越大即子节点的平均纯度越高,从而损失就越小。因此我们可以直接将上述的近似损失来作为分裂的依据,即选择使得损失减少得最多的特征及其分割点来进行节点分裂。由于对于某一个节点而言,分裂前后整棵树的损失变化只和该节点 I I I及其左右子节点 I L I_L IL L R L_R LR w ∗ w^* w值有关,此时分裂带来的近似损失减少量为
G = [ γ T − 1 2 ( ∑ i ∈ I p i ) 2 ∑ i ∈ I q i + λ ] − [ γ ( T + 1 ) − 1 2 ( ∑ i ∈ I L p i ) 2 ∑ i ∈ I L q i + λ − 1 2 ( ∑ i ∈ I R p i ) 2 ∑ i ∈ I R q i + λ ] = 1 2 [ ( ∑ i ∈ I L p i ) 2 ∑ i ∈ I L q i + λ + ( ∑ i ∈ I R p i ) 2 ∑ i ∈ I R q i + λ − ( ∑ i ∈ I p i ) 2 ∑ i ∈ I q i + λ ] − γ \begin{aligned} G&= [\gamma T-\frac{1}{2}\frac{(\sum_{i\in I}p_i)^2}{\sum_{i\in I}q_i+\lambda}] - [\gamma (T+1)-\frac{1}{2}\frac{(\sum_{i\in I_L}p_i)^2}{\sum_{i\in I_L}q_i+\lambda}- \frac{1}{2}\frac{(\sum_{i\in I_R}p_i)^2}{\sum_{i\in I_R}q_i+\lambda}]\\ &= \frac{1}{2}[\frac{(\sum_{i\in I_L}p_i)^2}{\sum_{i\in I_L}q_i+\lambda}+\frac{(\sum_{i\in I_R}p_i)^2}{\sum_{i\in I_R}q_i+\lambda}-\frac{(\sum_{i\in I}p_i)^2}{\sum_{i\in I}q_i+\lambda}] -\gamma \end{aligned} G=[γT21iIqi+λ(iIpi)2][γ(T+1)21iILqi+λ(iILpi)221iIRqi+λ(iIRpi)2]=21[iILqi+λ(iILpi)2+iIRqi+λ(iIRpi)2iIqi+λ(iIpi)2]γ
模型应当选择使得 G G G达到最大的特征和分割点进行分裂。

关于损失的选择,XGBoost有如下的要求:

最后我们来重新回到单个样本的损失函数上:由于XGBoost使用的是二阶展开,为了保证函数在拐点处取到的是近似损失的最小值,需要满足二阶导数 q i > 0 q_i>0 qi>0。当损失函数不满足此条件时, h i ∗ h^*_i hi反而会使得损失上升,即如下图中右侧的情况所示,而使用梯度下降法时并不会产生此问题。因此,我们应当选择在整个定义域上或在 y i y_i yi临域上二阶导数恒正的损失函数,例如平方损失。
在这里插入图片描述

【思考题】在下列的三个损失函数 L ( y , y ^ ) L(y,\hat{y}) L(y,y^)中,请选出一个不应作为XGBoost损失的函数并说明理由。

  • Root Absolute Error: ∣ y − y ^ ∣ \sqrt{\vert y-\hat{y}\vert} yy^
  • Squared Log Error: 1 2 [ log ⁡ ( y + 1 y ^ + 1 ) ] 2 \frac{1}{2}[\log(\frac{y+1}{\hat{y}+1})]^2 21[log(y^+1y+1)]2
  • Pseudo Huber Error: δ 2 ( 1 + ( y − y ^ δ ) 2 − 1 ) \delta^2(\sqrt{1+(\frac{y-\hat{y}}{\delta})^2}-1) δ2(1+(δyy^)2 1)

Squared Log Error 1 2 [ log ⁡ ( y + 1 y ^ + 1 ) ] 2 \frac{1}{2}[\log(\frac{y+1}{\hat{y}+1})]^2 21[log(y^+1y+1)]2不应作为XGBoost的损失函数,因为其二阶导数小于0。

2 LightGBM

LightGBM的GBDT原理与XGBoost的二阶近似方法完全一致,并且在此基础上提出了两个新算法,它们分别是单边梯度采样(GOSS)以及互斥特征绑定(EFB)

除此之外,lightGBM在划分节点时,采用直方图算法,将特征值分成许多小筒,进而在筒上搜索分裂点,减少了计算代价和存储代价,得到更好的性能。

2.1 单边梯度采样

具体说,对样本梯度绝对值排序后,先选出Top a % a \% a%梯度绝对值对应的样本,再从剩下 ( 1 − a ) (1-a) (1a)的样本中抽取 b % b \% b%的样本(此处 b % b\% b%是对于总样本的百分比)。

此时,考虑基于均方损失的GBDT回归,记当前节点、左子节点、右子节点的梯度均值为 g ˉ , g ˉ L , g ˉ R \bar{g},\bar{g}_L,\bar{g}_R gˉ,gˉL,gˉR,设特征及其分割点为 F , d F,d F,d,原先的信息增益为

G a i n ( F , d ) = 1 N [ ∑ i = 1 N ( g i − g ˉ ) 2 − ∑ i = 1 N L ( g i ( L ) − g ˉ L ) 2 − ∑ i = 1 N R ( g i ( R ) − g ˉ R ) 2 ] = 1 N [ ( ∑ i = 1 N g i 2 − N g ˉ 2 ) − ( ∑ i = 1 N L g i ( L ) 2 − N g ˉ L 2 ) − ( ∑ i = 1 N R g i ( R ) 2 − N g ˉ R 2 ) ] ∝ 1 N [ ( ∑ i = 1 N L g i ( L ) ) 2 N L + ( ∑ i = 1 N R g i ( R ) ) 2 N R ] \begin{aligned} Gain(F,d) &= \frac{1}{N}[\sum_{i=1}^N(g_i-\bar{g})^2-\sum_{i=1}^{N_L}(g^{(L)}_i-\bar{g}_L)^2-\sum_{i=1}^{N_R}(g^{(R)}_i-\bar{g}_R)^2]\\ &= \frac{1}{N} [(\sum_{i=1}^Ng_i^2-N\bar{g}^2)-(\sum_{i=1}^{N_L}{g^{(L)}_i}^2-N{\bar{g}_L}^2)-(\sum_{i=1}^{N_R}{g^{(R)}_i}^2-N{\bar{g}_R}^2)] \\ &\propto \frac{1}{N}[\frac{(\sum_{i=1}^{N_L}{g^{(L)}_i})^2}{N_L}+\frac{(\sum_{i=1}^{N_R}{g^{(R)}_i})^2}{N_R}] \end{aligned} Gain(F,d)=N1[i=1N(gigˉ)2i=1NL(gi(L)gˉL)2i=1NR(gi(R)gˉR)2]=N1[(i=1Ngi2Ngˉ2)(i=1NLgi(L)2NgˉL2)(i=1NRgi(R)2NgˉR2)]N1[NL(i=1NLgi(L))2+NR(i=1NRgi(R))2]

记划分到左子节点对应的a部分样本为 A L A_L AL、划分到左子节点对应的b部分抽样样本为 B L B_L BL、划分到右子节点对应的a部分样本为 A R A_R AR、划分到右子节点对应的b部分抽样样本为 B R B_R BR。对于抽样部分的梯度和,我们使用 1 − a b \frac{1-a}{b} b1a来进行补偿,例如原来从10个样本中划分6个为a部分,从剩下的4个中抽出两个为b部分,那么b部分的样本梯度和估计就是抽出两个样本的梯度和乘以 1 − 0.6 0.2 \frac{1-0.6}{0.2} 0.210.6。因此,可以写出对应的 G a i n ~ ( F , d ) \tilde{Gain}(F,d) Gain~(F,d)

G a i n ~ ( F , d ) = 1 N [ ( ∑ i ∈ A L g i + 1 − a b ∑ i ∈ B L g i ) 2 N L + ( ∑ i ∈ A R g i + 1 − a b ∑ i ∈ B R g i ) 2 N R ] \tilde{Gain}(F,d) = \frac{1}{N}[\frac{(\sum_{i\in A_L}{g_i}+\frac{1-a}{b}\sum_{i\in B_L}{g_i})^2}{N_L}+\frac{(\sum_{i\in A_R}{g_i}+\frac{1-a}{b}\sum_{i\in B_R}{g_i})^2}{N_R}] Gain~(F,d)=N1[NL(iALgi+b1aiBLgi)2+NR(iARgi+b1aiBRgi)2]

2.2 互斥特征绑定

实际的数据特征中可能有许多稀疏特征,即其非零值的数量远小于零值的数量,因此希望能够将这些特征进行合并来减少稀疏特征的数量,从而减少直方图构建的时间复杂度。

互斥特征是和着色问题对应的。

LightGBM提出了将互斥特征合并为单个特征的策略,从而让构建直方图的时间复杂度得以降低,因此需要找到最少的互斥绑定数量,即最少可以划分为几族。遗憾的是这个问题等价于图的着色问题,故它是NP-Hard的,目前并不存在多项式复杂度的解决方案,但我们可以通过近似方法来求解。为什么互斥特征绑定问题与图着色问题等价?如果我们把图的每一个顶点看做特征,将顶点之间是否存在边取决于两个特征是否存在同时为非零值的情况,若是则连接,那么此时没有边的顶点则代表他们之间满足互斥条件,将其涂上同种颜色作为同一族互斥特征,而寻找最少的绑定数量即是要寻找图的最少着色数。
在这里插入图片描述

在实际操作中,由于严格互斥的特征数量可能还并不算多,但是几乎互斥的特征数量却很多,若存在一个样本使得两个特征同时为非零值则称它们存在一次冲突,所谓几乎互斥即一族特征之间的冲突总数不超过给定的最大冲突数 K K K,此时即使两个顶点之间存在边的连接,只要新加入的顶点能够使得这族特征满足几乎互斥的条件,那么就仍然可进行合并(或着相同颜色),如果此时新顶点与任意一族特征都不满足几乎互斥,那么将自身作为新的一族互斥特征集合的第一个元素(或着新的颜色)。

特征绑定完需要进行特征的合并。

上述的讨论解决了特征绑定的问题,但我们只是将互斥特征放在了同一个集合里,还没有解决特征合并的问题。直观上说,我们需要用一个特征来表示多个特征时,要求新特征关于原特征族是可辨识的,即存在一一对应的关系。设需要合并的特征为 F 1 , . . . , F m F_1,...,F_m F1,...,Fm,它们对应的箱子分割点编号为 B i 1 , . . . , B i k i ( i = 1 , . . . , m ) B_{i1},...,B_{ik_i}(i=1,...,m) Bi1,...,Biki(i=1,...,m)。由稀疏性,这里假设 B i 1 B_{i1} Bi1是0对应的箱子。对于样本 s s s而言,如果其对应的特征都为0时,则投放至 B ~ 1 \tilde{B}_{1} B~1号,若第 i i i个特征非0,且其原特征对应的所在箱子为 B i j B_{ij} Bij,则投放至 B ~ k \tilde{B}_{k} B~k号,其中
k = j + ∑ p = 1 i − 1 k p k = j+ \sum_{p=1}^{i-1} k_p k=j+p=1i1kp

参考阅读

  1. XGBoost算法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SheltonXiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值