XGBoost学习总结(二)

别等时光非礼了梦想. 提交于 2019-11-27 08:33:23

1_XGBoost原理

\[ \begin{align} X\!G\!Boost&=eXtreme+GBDT\\ &=eXtreme+(Gradient+BDT) \\ &=eXtreme+Gradient+(Boosting+DecisionTree) \end{align} \]

\[Boosting \to BDT \to GBDT \to X\!G\!Boost\]

  * 提升方法boosting + 决策树DecisionTree --> BDT提升决策树

  * BDT + Gradient梯度拟合残差 --> GBDT梯度提升决策树

  * GBDT + eXtreme工程优化 --> XGBoost

决策树的表示形式:

 (1)树形结构,由根结点到叶结点
 (2)规则集表示方法,if--else---
 (3)回归树 在坐标系中画出回归决策树
 (4)用公式表示

决策树的特征选择方法

决策树的剪枝方法

1_1_提升方法(Boosting)

  提升方法使用加法模型前向分步算法

  加法模型:要求模型要具备可加性(如:决策树)

   加法模型

\[f\left(x\right)=\sum_{m=1}^M\beta_m b\left(x;\gamma_m\right) \tag{1.1}\]

其中,\(b\left(x;\gamma_m\right)\)为基函数,\(\gamma_m\)为基函数的参数,\(\beta_m\)为基函数的系数。

给定数据集,学习加法模型,变成了经验分险最小化的问题

  在给定训练数据\(\{\left(x_i,y_i\right)\}_{i=1}^N\)及损失函数\(L\left(y,f\left(x\right)\right)\)的条件下,学习加法模型\(f\left(x\right)\)成为经验风险极小化问题:

\[\min_{\beta_m,\gamma_m}\sum_{i=1}^N L\left(y_i,\sum_{m=1}^M\beta_m b\left(x_i;\gamma_m\right)\right)\tag{1.2}\]

加法模型算法,不在针对加法模型优化,而是针对加法模型的一部分,对一个个基模型优化。

对一个基模型优化之后,累加到当前模型上,再优化下一个基模型,这样把一个问题拆解成一系列小问题。

  前向分步算法求解这一优化问题的思路:因为学习的是加法模型,可以从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(1.2),则可以简化优化复杂度。具体地,每步只需优化如下损失函数:

\[\min_{\beta,\gamma}\sum_{i=1}^N L\left(y_i,\beta b\left(x_i;\gamma\right)\right)\tag{1.3}\]

算法1.1 前向分步算法

输入:训练数据集\(T=\{\left(x_1,y_1\right),\left(x_2,y_2\right),\dots,\left(x_N,y_N\right)\}\); 损失函数\(L\left(y,f\left(x\right)\right)\);基函数集合\(\{b\left(x;\gamma\right)\}\)

输出:加法模型\(f\left(x\right)\)

(1)初始化\(f_0\left(x\right)=0\)

(2)对\(m=1,2,\dots,M\)

(a)极小化损失函数

\[\left(\beta_m,\gamma_m\right)=\mathop{\arg\min}_{\beta,\gamma} \sum_{i=1}^N L\left(y_i, f_{m-1}\left(x_i\right)+\beta b\left(x_i;\gamma\right)\right) \tag{1.4}\]

得到参数\(\beta_m\)\(\gamma_m\)

(b)更新

\[f_m\left(x\right)=f_{m-1}\left(x\right)+\beta_m b\left(x;\gamma_m\right) \tag{1.5}\]

(3)得到加法模型

\[f\left(x\right)=f_M\left(x\right)=\sum_{m=1}^M\beta_m b\left(x;\gamma_m\right) \tag{1.6}\]

  前向分步算法将同时求解从\(m=1\)\(M\)所有参数\(\beta_m,\gamma_m\)的优化问题简化为逐次求解各个\(\beta_m, \gamma_m\)的优化问题。

每个基函数学习能力不同,给每个基函数加上权重,学习时,也学习了权重\(\beta_m\)

\({\gamma_m}\)是模型内的参数

一般boosting时,基函数不一定是决策树

1_2_提升决策树 (BDT,Boosting Decision Tree)

  以决策树为基函数的提升方法为提升决策树。

  提升决策树模型可以表示为决策树的加法模型:

\[f_M=\sum_{m=1}^M T\left(x;\Theta_m\right) \tag{2.1}\]

其中,\(T\left(x;\Theta_m\right)\)表示决策树;\(\Theta_m\)为决策树的参数;\(M\)为树的个数。

这里没有权重,默认权重省略

  提升决策树采用前向分步算法。首先确定初始提升决策树\(f_0\left(x\right)=0\),第\(m\)步的模型是

\[f_m\left(x\right)=f_{m-1}\left(x\right)+T\left(x;\Theta_m\right) \tag{2.2}\]

其中,\(f_{m-1}\left(x\right)\)为当前模型,通过经验风险极小化确定下一棵决策树的参数\(\Theta_m\)

\[\hat{\Theta}_m=\mathop{\arg\min}_{\Theta_m}\sum_{i=1}^N L\left(y_i,f_{m-1}\left(x_i\right)+T\left(x_i;\Theta_m\right)\right) \tag{2.3}\]

  已知训练数据集\(T=\{\left(x_1,y_1\right),\left(x_2,y_2\right),\dots\left(x_N,y_N\right)\}\)\(x_i\in\mathcal{X}\subseteq\mathbb{R}^n\)\(\mathcal{X}\)为输入空间,\(y_i\in\mathcal{Y}\subseteq\mathbb{R}\)\(\mathcal{Y}\)为输出空间。如果将输入空间\(\mathcal{X}\)划分为\(J\)个互不相交的区域\(R_1,R_2,\dots,R_J\),并且在每个区域上确定输出的常量\(c_j\),那么决策树可表示为

\[T\left(x;\Theta\right)=\sum_{j=1}^J c_j I\left(x\in R_j\right) \tag{2.4}\]

其中,参数\(\Theta=\{\left(R_1,c_1\right),\left(R_2,c_2\right),\dots,\left(R_J,c_J\right)\}\)表示决策树的区域划分和各区域上的常量值。\(J\)是决策树的复杂度即叶子结点个数。

决策树的表示:将输入空间X划分成J个互不相交的区域,相当于叶子结点,每个区域输出的常量\(C_j\),就是叶子的输出值

判断x是\(C_j​\)叶子中的样本,才会输出\(C_j​\)值,\(I​\)是条件函数,当x属于\({{R_j}}​\)时,\(I=1​\);当x不属于\(R_j​\)\(I=0​\)

回归树 + softmax/sigmoid --> 分类问题

  提升决策树使用以下前向分步算法:
\[\begin{align} f_0\left(x\right)&=0 \\ f_m\left(x\right)&=f_{m-1}\left(x\right)+T\left(x;\Theta_m\right),\quad m=1,2,\dots,M \\ f_M\left(x\right)&=\sum_{m=1}^M T\left(x;\Theta_m\right) \end{align}\]

在前向分步算法的第\(m​\)步,给定当前模型\(f_{m-1}\left(x\right)​\),需要求解

\[\hat{\Theta}_m=\mathop{\arg\min}_{\Theta_m}\sum_{i=1}^N L\left(y_i,f_{m-1}\left(x_i\right)+T\left(x_i;\Theta_m\right)\right)​\]

得到\(\hat{\Theta}_m\),即第\(m\)棵树的参数。

  当采用平方误差损失函数时,

\[L\left(y,f\left(x\right)\right)=\left(y-f\left(x\right)\right)^2\]

其损失变为

\[\begin{align} L\left(y,f_{m-1}\left(x\right)+T\left(x;\Theta_m\right)\right) &=\left[y-f_{m-1}\left(x\right)-T\left(x;\Theta_m\right)\right]^2 \\ &=\left[r-T\left(x;\Theta_m\right)\right]^2 \end{align}\]

其中,

\[r=y-f_{m-1}\left(x\right) \tag{2.5}\]

是当前模型拟合数据的残差(residual)。对回归问题的提升决策树,只需要简单地拟合当前模型的残差。

公式(2.5)和平方误差损失函数\(L\left(y,f\left(x\right)\right)=\left(y-f\left(x\right)\right)^2\)对比

\(r\)如果是实际输出,\({T(x;\Theta_m)}\)就是拟合预测输出,

\(r\)表示当前模型的残差,则公式(2.5)表示对新的树的拟合

算法2.1 回归问题的提升决策树算法

输入:训练数据集\(T=\{\left(x_1,y_1\right),\left(x_2,y_2\right),\dots,\left(x_N,y_N\right)\}\)

输出:提升决策树\(f_M\left(x\right)\)

(1)初始化\(f_0\left(x\right)=0\)

(2)对\(m=1,2,\dots,M\)

(a)按照式(2.5)计算残差

\[r_{mi}=y_i-f_{m-1}\left(x_i\right), \quad i=1,2,\dots,N\]

(b)拟合残差\(r_{mi}\)学习一个回归树,得到\(T\left(x;\Theta_m\right)\)

(c)更新$f_m\left(x\right)=f_{m-1}\left(x\right)+T\left(x;\Theta_m\right) $

(3)得到回归提升决策树

\[f_M\left(x\right)=\sum_{m=1}^M T\left(x;\Theta_m\right) \]

什么时候循环结束呢?

  • 1.指定循环次数
  • 2.当残差小到一定程度

1_3_梯度提升决策树 (GBDT,Gradient Boosting Decision Tree)

  梯度提升算法使用损失函数的负梯度在当前模型的值

\[-\left[\frac{\partial L\left(y,f\left(x_i\right)\right)}{\partial f\left(x_i\right)}\right]_{f\left(x\right)=f_{m-1}\left(x\right)} \tag{3.1}\]

作为回归问题提升决策树算法中残差的近似值,拟合一个回归树。

用(3.1)代替,做当前残差的近似值

损失函数\(L\left(y,f\left(x_i\right)\right)\)是二元函数,其中\(y\)是已知的变量

这里不是在参数空间,而是在函数空间是损失越来越小

在函数空间中,用损失函数对函数\(f(x_i)\)求导的负梯度,近似残差值

算法3.1 梯度提升算法

输入:训练数据集\(T=\{\left(x_1,y_1\right),\left(x_2,y_2\right),\dots,\left(x_N,y_N\right)\}\); 损失函数\(L\left(y,f\left(x\right)\right)\)

输出:梯度提升决策树\(\hat{f}\left(x\right)\)

(1)初始化

\[f_0\left(x\right)=\mathop{\arg\min}_c\sum_{i=1}^N L\left(y_i,c\right)\]

(2)对\(m=1,2,\dots,M\)

(a)对\(i=1,2,\dots,N\),计算

\[r_{mi}=-\left[\frac{\partial L\left(y,f\left(x_i\right)\right)}{\partial f\left(x_i\right)}\right]_{f\left(x\right)=f_{m-1}\left(x\right)}\]

(b)对\(r_{mi}\)拟合一个回归树,得到第\(m\)棵树的叶结点区域\(R_{mj},j=1,2,\dots,J\)

(c)对\(j=1,2,\dots,J\),计算

\[c_{mj}=\mathop{\arg\min}_c\sum_{x_i\in R_{mj}} L\left(y_i, f_{m-1}\left(x_i\right)+c\right)\]

(d)更新\(f_m\left(x\right)=f_{m-1}\left(x\right)+\sum_{j=1}^J c_{mj} I\left(x\in R_{mj}\right)\)

(3)得到回归梯度提升决策树

\[\hat{f}\left(x\right)=f_M\left(x\right)=\sum_{m=1}^M \sum_{j=1}^J c_{mj} I\left(x\in R_{mj}\right) \]

1_4_极致梯度提升决策树(XGBoost,eXtreme Gradient Boosting Decision Tree)

  训练数据集\(\mathcal{D}=\{\left(\mathbf{x}_i,y_i\right)\}\),其中\(\mathbf{x}_i\in\mathbb{R}^m,y_i\in\mathbb{R},\left|\mathcal{D}\right|=n\)

  决策树模型

\[f\left(\mathbf{x}\right)=w_{q\left(\mathbf{x}\right)} \tag{4.1}\]

其中,\(q:\mathbb{R}^m\to \{1,\dots,T\},w\in\mathbb{R}^T\),\(T\)为决策树叶子节点数。

公式(4.1)中\(w_{q\left(\mathbf{x}\right)}\) 表示:输入一个\(x\),经过函数\({q\left(\mathbf{x}\right)}\),就可以得到样本\(x\)属于哪个叶子结点,\(w\)表示那个叶子结点的评分

\({q\left(\mathbf{x}\right)}\)输出的是叶子序号

\(w\)是一个向量空间,里面有\(T\)个数,一个数对应一个叶子的评分

\(w_{q\left(\mathbf{x}\right)}\)就是某一个叶子的评分

  提升决策树模型预测输出

\[\hat{y}_i=\phi\left(\mathbf{x}_i\right)=\sum_{k=1}^K f_k\left(\mathbf{x}_i\right) \tag{4.2}\]

其中,\(f_k\left(\mathbf{x}\right)\)为第\(k\)棵决策树。

  正则化目标函数

\[\mathcal{L}\left(\phi\right)=\sum_i l\left(\hat{y}_i,y_i\right)+\sum_k \Omega\left(f_k\right) \tag{4.3}\]

其中,\(\Omega\left(f\right)=\gamma T+\frac{1}{2}\lambda\|w\|^2=\gamma T+\frac{1}{2}\lambda\sum_{j=1}^T w_j^2\)

损失函数最小化,会使模型越来越复杂,要把复杂程度在正则化中体现出来

  • 不能让评分\(w\)太高,评分要放到正则化中
  • 叶子越多,树就越复杂,叶子的数量也要放到正则化中,不是对每一个叶子加约束,而是对所有叶子的和加约束,整体叶子和的评分小可以保证叶子的个数少,进而使树模型简单。

  第\(t\)轮目标函数

\[\mathcal{L}^{\left(t\right)}=\sum_{i=1}^n l\left(y_i,\hat{y}^{\left(t-1\right)}_i+f_t\left(\mathbf{x}_i\right)\right)+\Omega\left(f_t\right) \tag{4.4}\]

泰勒二阶展开中

\(\hat{y}^{\left(t-1\right)}_i\)是已知变量,相当于\(x\),  \({f_t({x}_i)}\)相当于\(\Delta{x}\)

\[f(x+\Delta x)\approx f(x) + f^{\prime}\left(x\right)\Delta x + \frac{f^{\prime \prime}\left(x\right)\Delta x^{2}}{2} + O\]

  第\(t\)轮目标函数在\(\hat{y}^{\left(t-1\right)}\)处的二阶泰勒展开

\[\mathcal{L}^{\left(t\right)}\simeq\sum_{i=1}^n\left[l\left(y_i,\hat{y}^{\left(t-1\right)}\right)+g_i f_t\left(\mathbf{x}_i\right)+\frac{1}{2}h_i f^2_t\left(\mathbf{x}_i\right)\right]+\Omega\left(f_t\right) \tag{4.5}\]

其中,\(g_i=\partial_{\hat{y}^{\left(t-1\right)}}l\left(y_i,\hat{y}^{\left(t-1\right)}\right),h_i=\partial^2_{\hat{y}^{\left(t-1\right)}}l\left(y_i,\hat{y}^{\left(t-1\right)}\right)\)

优化的目标是\({f_t({x}_i)}\),但是\(l\left(y_i,\hat{y}^{\left(t-1\right)}\right)\)当前的损失,已知变量,对公式求解没有作用,求导后为\(0\),所以可以移除

  第\(t\)轮目标函数的二阶泰勒展开移除关于

\(f_t\left(\mathbf{x}_i\right)\)常数项

\[\begin{align} \tilde{\mathcal{L}}^{\left(t\right)}&=\sum_{i=1}^n\left[g_i f_t\left(\mathbf{x}_i\right)+\frac{1}{2}h_i f^2_t\left(\mathbf{x}_i\right)\right]+\Omega\left(f_t\right) \tag{4.6}\\ &=\sum_{i=1}^n\left[g_i f_t\left(\mathbf{x}_i\right)+\frac{1}{2}h_i f^2_t\left(\mathbf{x}_i\right)\right]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^T w_j^2 \end{align} \\\]

定义叶结点\(j\)上的样本的下标集合\(I_j=\{i|q\left(\mathbf{x}_i\right)=j\}\),则目标函数可表示为按叶结点累加的形式

$$$$

\(I_j\)表示叶子结点\(j\)的样本集合

由公式\(f\left(\mathbf{x}\right)=w_{q\left(\mathbf{x}\right)}\)\({f_t({x}_i)}\)-->\(w_j\)

\[\tilde{\mathcal{L}}^{\left(t\right)}=\sum_{j=1}^T\left[\left(\sum_{i\in I_j}g_i\right)w_j+\frac{1}{2}\left(\sum_{i\in I_j}h_i+\lambda\right)w_j^2\right]+\gamma T \tag{4.7}\]

求导时,T个叶子中,只有一个是当前叶子,则其他叶子对当前叶子求导为0

在以上的计算中,\(T\)一直作为常量,\(T\)是决策树的叶子结点数,也就是说,在前面计算每个叶子结点的最佳输出值的时候,\(T\)个叶子结点必须先确定下来,意味着树的形状必须先确定。

以上假设,当树的形状确定后,经过计算,求得叶子输出值是\(w^*\)

但我们不知道树的结构,此时需要把\(w^*\)反带回目标函数。

由于\[w_j^*=\mathop{\arg\min}_{w_j}\tilde{\mathcal{L}}^{\left(t\right)}\]

可令\[\frac{\partial\tilde{\mathcal{L}}^{\left(t\right)}}{\partial w_j}=0\]

得到每个叶结点\(j\)的最优分数为

\[w_j^*=-\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j} h_i+\lambda} \tag{4.8}\]

代入每个叶结点\(j\)的最优分数,得到最优化目标函数值

\[\tilde{\mathcal{L}}^{\left(t\right)}\left(q\right)=-\frac{1}{2}\sum_{j=1}^T \frac{\left(\sum_{i\in I_j} g_i\right)^2}{\sum_{i\in I_j} h_i+\lambda}+\gamma T \tag{4.9}\]

\(\tilde{\mathcal{L}}^{\left(t\right)}\left(q\right)\)\(\frac{\left(\sum_{i\in I_j} g_i\right)^2}{\sum_{i\in I_j} h_i+\lambda}\)\(w^*\)中的\(\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j} h_i+\lambda}\)非常相似

可以理解成\(\tilde{\mathcal{L}}^{\left(t\right)}\left(q\right)\)由一个个叶子结点累加得到的(每个叶子结点累积的损失,得到最优损失),认为叶子结点输出对目标函数贡献度的度量

  假设\(I_L\)\(I_R\)分别为分裂后左右结点的实例集,令\(I=I_L\cup I_R\),则分裂后损失减少量由下式得出

\[\mathcal{L}_{split}=\frac{1}{2}\left[\frac{\left(\sum_{i\in I_L} g_i\right)^2}{\sum_{i\in I_L}h_i+\lambda}+\frac{\left(\sum_{i\in I_R} g_i\right)^2}{\sum_{i\in I_R}h_i+\lambda}-\frac{\left(\sum_{i\in I} g_i\right)^2}{\sum_{i\in I}h_i+\lambda}\right]-\gamma \tag{4.10}\]

用以评估待分裂结点。

xgboost广度优先,一层一层分裂


对每个整个数据集遍历,每个样本、特征都计算,以\(\mathcal{L}_{split}\)作为度量指标,值最小的最优

XGBoost的分裂指标

1.假定树结构-->2.计算出每个节点的预测输出后-->3.反带回目标函数-->4.其中每一项认为是每个叶子结点损失度量-->5.用这个损失度量去表示作为分裂时的分裂依据-->6.遍历数据集所有数据特征后,找到最优的分裂结点\(\mathcal{L}_{split}\)的最小值-->7.分裂成左右支树后,按照相同规则分裂

算法4.1 分裂查找的精确贪婪算法

输入:当前结点实例集\(I\);特征维度\(d\)

输出:根据最大分值分裂

(1)\(gain\leftarrow 0\)

(2)\(G\leftarrow\sum_{i\in I}g_i\)\(H\leftarrow\sum_{i\in I}h_i\)

(3)for \(k=1\) to \(d\) do

(3.1)\(G_L \leftarrow 0\)\(H_L \leftarrow 0\)

(3.2)for \(j\) in sorted(\(I\), by \(\mathbf{x}_{jk}\)) do

(3.2.1)\(G_L \leftarrow G_L+g_j\)\(H_L \leftarrow H_L+h_j\)

(3.2.2)\(G_R \leftarrow G-G_L\)\(H_R=H-H_L\)

(3.2.3)\(score \leftarrow \max\left(score,\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{G^2}{H+\lambda}\right)\)

(3.3)end

(4)end

算法4.2 分裂查找的近似贪婪算法

(1)for \(k=1\) to \(d\) do

(1.1)通过特征\(k\)的百分位数求候选分割点\(S_k=\{s_{k1},s_{k2},\dots,s_{kl}\}\)

(1.2)可以在每颗树生成后(全局),可以在每次分裂后(局部)

(2)end

(3)for \(k=1\) to \(m\) do

(3.1)\(G_{kv}\gets =\sum_{j\in\{j|s_{k,v}\geq\mathbf{x}_{jk}>s_{k,v-1}\}}g_j\)

(3.2)\(H_{kv}\gets =\sum_{j\in\{j|s_{k,v}\geq\mathbf{x}_{jk}>s_{k,v-1}\}}h_j\)

(4)end

按照与前一节相同的步骤,在提议的分割中找到最大值。

候选分割点\(S_k=\{s_{k1},s_{k2},\dots,s_{kl}\}\)中,

\[s_{k1}=\min_i\mathbf{x}_{ik},s_{kl}=\max_i\mathbf{x}_{ik}\]

其余各分割点满足

\[|r_k\left(s_{k,j}\right)-r_k\left(s_{k,j+1}\right)|<\epsilon \tag{4.11}\]

其中,函数\(r_k:\mathbb{R}\to[0,+\infty)\)

\[r_k\left(z\right)=\frac{1}{\sum_{\left(x,h\right)\in\mathcal{D}_k}h}\sum_{\left(x,h\right)\in\mathcal{D}_k,x<z}h\]

\(\mathcal{D}_k=\{\left(x_{1k},h_1\right),\left(x_{2k},h_2\right),\dots,\left(x_{nk},h_n\right)\}\)

\(h_i\)作为数据点权重的原因是由于,将式(4.6)重写

可得\[\sum_{i=1}^n\frac{1}{2}h_i\left(f_t\left(\mathbf{x}_i\right)-g_i/h_i\right)^2+\Omega\left(f_t\right)+constant\]

即是权重为\(h_i\)\(f_t\left(\mathbf{x}_i\right)\)\(g_i/h_i\)的加权平方损失。

本篇学习笔记来自七月在线机器学习训练营陈老师的课件,是我至今见过最详细的xgboost推导过程,
陈老师课上推导更精彩,所以,我在根据老师上课推导,在原课件基础上,细化了一些内容,希望对理解有所帮助。
如果内容有错,还请指正,谢谢!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!