XGBoost学习总结
Posted conan-ai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XGBoost学习总结相关的知识,希望对你有一定的参考价值。
1_XGBoost原理
\[ \beginalign X\!G\!Boost&=eXtreme+GBDT\&=eXtreme+(Gradient+BDT) \&=eXtreme+Gradient+(Boosting+DecisionTree) \endalign \]
\[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) \tag1.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)\tag1.2\]
加法模型算法,不在针对加法模型优化,而是针对加法模型的一部分,对一个个基模型优化。
对一个基模型优化之后,累加到当前模型上,再优化下一个基模型,这样把一个问题拆解成一系列小问题。
??前向分步算法求解这一优化问题的思路:因为学习的是加法模型,可以从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(1.2),则可以简化优化复杂度。具体地,每步只需优化如下损失函数:
\[\min_\beta,\gamma\sum_i=1^N L\left(y_i,\beta b\left(x_i;\gamma\right)\right)\tag1.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) \tag1.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) \tag1.5\]
(3)得到加法模型
\[f\left(x\right)=f_M\left(x\right)=\sum_m=1^M\beta_m b\left(x;\gamma_m\right) \tag1.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) \tag2.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) \tag2.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) \tag2.3\]
??已知训练数据集\(T=\\left(x_1,y_1\right),\left(x_2,y_2\right),\dots\left(x_N,y_N\right)\\),\(x_i\in\mathcalX\subseteq\mathbbR^n\),\(\mathcalX\)为输入空间,\(y_i\in\mathcalY\subseteq\mathbbR\),\(\mathcalY\)为输出空间。如果将输入空间\(\mathcalX\)划分为\(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) \tag2.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 --> 分类问题
??提升决策树使用以下前向分步算法:
\[\beginalign
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)
\endalign\]
在前向分步算法的第\(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\]
其损失变为
\[\beginalign 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 \endalign\]
其中,
\[r=y-f_m-1\left(x\right) \tag2.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) \tag3.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)\)
输出:梯度提升决策树\(\hatf\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)得到回归梯度提升决策树
\[\hatf\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)
??训练数据集\(\mathcalD=\\left(\mathbfx_i,y_i\right)\\),其中\(\mathbfx_i\in\mathbbR^m,y_i\in\mathbbR,\left|\mathcalD\right|=n\)。
??决策树模型
\[f\left(\mathbfx\right)=w_q\left(\mathbfx\right) \tag4.1\]
其中,\(q:\mathbbR^m\to \1,\dots,T\,w\in\mathbbR^T\),\(T\)为决策树叶子节点数。
公式(4.1)中\(w_q\left(\mathbfx\right)\) 表示:输入一个\(x\),经过函数\(q\left(\mathbfx\right)\),就可以得到样本\(x\)属于哪个叶子结点,\(w\)表示那个叶子结点的评分
\(q\left(\mathbfx\right)\)输出的是叶子序号
\(w\)是一个向量空间,里面有\(T\)个数,一个数对应一个叶子的评分
\(w_q\left(\mathbfx\right)\)就是某一个叶子的评分
??提升决策树模型预测输出
\[\haty_i=\phi\left(\mathbfx_i\right)=\sum_k=1^K f_k\left(\mathbfx_i\right) \tag4.2\]
其中,\(f_k\left(\mathbfx\right)\)为第\(k\)棵决策树。
??正则化目标函数
\[\mathcalL\left(\phi\right)=\sum_i l\left(\haty_i,y_i\right)+\sum_k \Omega\left(f_k\right) \tag4.3\]
其中,\(\Omega\left(f\right)=\gamma T+\frac12\lambda\|w\|^2=\gamma T+\frac12\lambda\sum_j=1^T w_j^2\)。
损失函数最小化,会使模型越来越复杂,要把复杂程度在正则化中体现出来
- 不能让评分\(w\)太高,评分要放到正则化中
- 叶子越多,树就越复杂,叶子的数量也要放到正则化中,不是对每一个叶子加约束,而是对所有叶子的和加约束,整体叶子和的评分小可以保证叶子的个数少,进而使树模型简单。
??第\(t\)轮目标函数
\[\mathcalL^\left(t\right)=\sum_i=1^n l\left(y_i,\haty^\left(t-1\right)_i+f_t\left(\mathbfx_i\right)\right)+\Omega\left(f_t\right) \tag4.4\]
泰勒二阶展开中
\(\haty^\left(t-1\right)_i\)是已知变量,相当于\(x\),??\(f_t(x_i)\)相当于\(\Deltax\)
\[f(x+\Delta x)\approx f(x) + f^\prime\left(x\right)\Delta x + \fracf^\prime \prime\left(x\right)\Delta x^22 + O\]
??第\(t\)轮目标函数在\(\haty^\left(t-1\right)\)处的二阶泰勒展开
\[\mathcalL^\left(t\right)\simeq\sum_i=1^n\left[l\left(y_i,\haty^\left(t-1\right)\right)+g_i f_t\left(\mathbfx_i\right)+\frac12h_i f^2_t\left(\mathbfx_i\right)\right]+\Omega\left(f_t\right) \tag4.5\]
其中,\(g_i=\partial_\haty^\left(t-1\right)l\left(y_i,\haty^\left(t-1\right)\right),h_i=\partial^2_\haty^\left(t-1\right)l\left(y_i,\haty^\left(t-1\right)\right)\)。
优化的目标是\(f_t(x_i)\),但是\(l\left(y_i,\haty^\left(t-1\right)\right)\)当前的损失,已知变量,对公式求解没有作用,求导后为\(0\),所以可以移除
??第\(t\)轮目标函数的二阶泰勒展开移除关于
\(f_t\left(\mathbfx_i\right)\)常数项
\[\beginalign \tilde\mathcalL^\left(t\right)&=\sum_i=1^n\left[g_i f_t\left(\mathbfx_i\right)+\frac12h_i f^2_t\left(\mathbfx_i\right)\right]+\Omega\left(f_t\right) \tag4.6\&=\sum_i=1^n\left[g_i f_t\left(\mathbfx_i\right)+\frac12h_i f^2_t\left(\mathbfx_i\right)\right]+\gamma T+\frac12\lambda\sum_j=1^T w_j^2 \endalign \\\]
定义叶结点\(j\)上的样本的下标集合\(I_j=\i|q\left(\mathbfx_i\right)=j\\),则目标函数可表示为按叶结点累加的形式
$$$$
\(I_j\)表示叶子结点\(j\)的样本集合
由公式\(f\left(\mathbfx\right)=w_q\left(\mathbfx\right)\)得\(f_t(x_i)\)-->\(w_j\)
\[\tilde\mathcalL^\left(t\right)=\sum_j=1^T\left[\left(\sum_i\in I_jg_i\right)w_j+\frac12\left(\sum_i\in I_jh_i+\lambda\right)w_j^2\right]+\gamma T \tag4.7\]
求导时,T个叶子中,只有一个是当前叶子,则其他叶子对当前叶子求导为0
在以上的计算中,\(T\)一直作为常量,\(T\)是决策树的叶子结点数,也就是说,在前面计算每个叶子结点的最佳输出值的时候,\(T\)个叶子结点必须先确定下来,意味着树的形状必须先确定。
以上假设,当树的形状确定后,经过计算,求得叶子输出值是\(w^*\)
但我们不知道树的结构,此时需要把\(w^*\)反带回目标函数。
由于\[w_j^*=\mathop\arg\min_w_j\tilde\mathcalL^\left(t\right)\]
可令\[\frac\partial\tilde\mathcalL^\left(t\right)\partial w_j=0\]
得到每个叶结点\(j\)的最优分数为
\[w_j^*=-\frac\sum_i\in I_jg_i\sum_i\in I_j h_i+\lambda \tag4.8\]
代入每个叶结点\(j\)的最优分数,得到最优化目标函数值
\[\tilde\mathcalL^\left(t\right)\left(q\right)=-\frac12\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 \tag4.9\]
\(\tilde\mathcalL^\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_jg_i\sum_i\in I_j h_i+\lambda\)非常相似
可以理解成\(\tilde\mathcalL^\left(t\right)\left(q\right)\)由一个个叶子结点累加得到的(每个叶子结点累积的损失,得到最优损失),认为叶子结点输出对目标函数贡献度的度量
??假设\(I_L\)和\(I_R\)分别为分裂后左右结点的实例集,令\(I=I_L\cup I_R\),则分裂后损失减少量由下式得出
\[\mathcalL_split=\frac12\left[\frac\left(\sum_i\in I_L g_i\right)^2\sum_i\in I_Lh_i+\lambda+\frac\left(\sum_i\in I_R g_i\right)^2\sum_i\in I_Rh_i+\lambda-\frac\left(\sum_i\in I g_i\right)^2\sum_i\in Ih_i+\lambda\right]-\gamma \tag4.10\]
用以评估待分裂结点。
xgboost广度优先,一层一层分裂
对每个整个数据集遍历,每个样本、特征都计算,以\(\mathcalL_split\)作为度量指标,值最小的最优
XGBoost的分裂指标:
1.假定树结构-->2.计算出每个节点的预测输出后-->3.反带回目标函数-->4.其中每一项认为是每个叶子结点损失度量-->5.用这个损失度量去表示作为分裂时的分裂依据-->6.遍历数据集所有数据特征后,找到最优的分裂结点\(\mathcalL_split\)的最小值-->7.分裂成左右支树后,按照相同规则分裂
算法4.1 分裂查找的精确贪婪算法
输入:当前结点实例集\(I\);特征维度\(d\)
输出:根据最大分值分裂
(1)\(gain\leftarrow 0\)
(2)\(G\leftarrow\sum_i\in Ig_i\),\(H\leftarrow\sum_i\in Ih_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 \(\mathbfx_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,\fracG_L^2H_L+\lambda+\fracG_R^2H_R+\lambda-\fracG^2H+\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\mathbfx_jk>s_k,v-1\g_j\)
(3.2)\(H_kv\gets =\sum_j\in\j|s_k,v\geq\mathbfx_jk>s_k,v-1\h_j\)
(4)end
按照与前一节相同的步骤,在提议的分割中找到最大值。
候选分割点\(S_k=\s_k1,s_k2,\dots,s_kl\\)中,
令
\[s_k1=\min_i\mathbfx_ik,s_kl=\max_i\mathbfx_ik\]
其余各分割点满足
\[|r_k\left(s_k,j\right)-r_k\left(s_k,j+1\right)|<\epsilon \tag4.11\]
其中,函数\(r_k:\mathbbR\to[0,+\infty)\)
\[r_k\left(z\right)=\frac1\sum_\left(x,h\right)\in\mathcalD_kh\sum_\left(x,h\right)\in\mathcalD_k,x<zh\]
\(\mathcalD_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\frac12h_i\left(f_t\left(\mathbfx_i\right)-g_i/h_i\right)^2+\Omega\left(f_t\right)+constant\]
即是权重为\(h_i\)的\(f_t\left(\mathbfx_i\right)\)对\(g_i/h_i\)的加权平方损失。
本篇学习笔记来自七月在线机器学习训练营陈老师的课件,是我至今见过最详细的xgboost推导过程,
陈老师课上推导更精彩,所以,我在根据老师上课推导,在原课件基础上,细化了一些内容,希望对理解有所帮助。
如果内容有错,还请指正,谢谢!
以上是关于XGBoost学习总结的主要内容,如果未能解决你的问题,请参考以下文章