首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习 | XGBOOST原理&实现】

【机器学习 | XGBOOST原理&实现】

原创
作者头像
九年义务漏网鲨鱼
发布2025-07-22 15:17:05
发布2025-07-22 15:17:05
6680
举报
文章被收录于专栏:machine learningmachine learning
一、基本内容
  • 基本内容:GBDT的基础上,在损失函数上加入树模型复杂度的正则项

与GBDT一样,也是使用新的弱学习器拟合残差(当前模型负梯度,<u>残差方向</u>)

  • GBDT损失函数
Loss = \sum_{i=1}^{N}L(y_i, y_i^{t})
  • XGboost损失函数
Loss = \sum_{i=1}^{S}L(y_i, y_i^{t}) + \sum_{j=1}^{N}\Omega(f_j))
  • 正则项
\Omega(f_t))=\gamma L+\frac{1}{2} \lambda \sum_{j=1}^L \omega_j^2

其中,L 表示当前弱学习器的叶子节点个数,\gamma,\lambda 表示惩罚项,\omega_j 表示当前弱学习器的叶子节点$j$值。

二、目标函数优化

弱学习器损失函数可以写为:

Loss =\gamma N+ \sum_{j=1}^{L} 【\sum_{i=1}^{N}(L(y_i, y_i^{t})) + \frac{1}{2} \lambda \omega_j^2)】

其中,y_i^t = y_i^{t-1}+\omega_j ,表示当前的预测输出概率为前t-1 个学习器的输出结果加上当前学习器的输出,y_i^{t-1} 为常数;

目标函数:

argmin_{\omega}(\gamma N+ \sum_{j=1}^{L} 【\sum_{i=1}^{N}(L(y_i, y_i^{t-1}+\omega_j)) + \frac{1}{2} \lambda \omega_j^2)】)

泰勒二阶展开基础公式:f(x) = f(x_0) + f'(x_0)(x-x_0) + \frac{1}{2}f''(x_0)(x-x_0)^2

在目标优化中,对函数L(y_i, y_i^{t-1}+\omega_j) 二阶泰勒展开,可得:

L(y_i, y_i^{t-1}+\omega_j)=L(y_i, y_i^{t-1}) + L'(y_i, y_i^{t-1})\omega_j + \frac{1}{2}L''(y_i, y_i^{t-1})\omega_j^2

舍去常数项,令$g_i=L'(y_i, y_i^{t-1})\omega_j,h_i =\frac{1}{2}L''(y_i, y_i^{t-1})\omega_j^2 $,表示第$i$个样本的真实值与前$t-1$弱学习器模型输出值的损失导数

Loss = \gamma N+ \sum_{j=1}^{L} 【\sum_{i=1}^{N}(g_i\omega_j + \frac{1}{2}h_i\omega_j^2)) + \frac{1}{2} \lambda \omega_j^2)】
=\gamma N+ \sum_{j=1}^{L} 【\omega_j\sum_{i=1}^{N}g_i + \frac{1}{2}\omega_j^2 (\sum_{i=1}^{N}h_i+ \lambda)】

令$Gi=\sum{i=1}^{N}gi,H_i= \sum{i=1}^{N}h_i$,最后的优化目标函数可以写为:

Obj_{fun} = argmin_{\omega}(\gamma L +\sum_{j=1}^{L}(w_jG_j+\frac{1}{2}w_j^2(\lambda+H_j)))

可以发现,目标函数是关于$\omega$的二次函数,使得损失最小的$\omega$值为:

w_j=-\frac{b}{2a} =-\frac{G_j}{H_j + \lambda}

\omega 代入目标函数,可得:

Obj_{fun}=\gamma L -\frac{1}{2} \sum_{j=1}^L\frac{G_j^2}{H_j + \lambda}
三、树结构的确定
3.1 穷举法

逐一举例,时间复杂度过大,不可能实现

3.2 精确贪心算法

基本原理与决策树的结点选取类似,以信息增益的思想,遍历所有特征以及阈值选取当前节点的特征和阈值

假设当前叶子结点数为$1$,进一步划分的叶子节点数目为2,假设划分后的左子结点的样本二阶导之和为$G_L$,同理右子节点的样本二阶导之和为$G_R$,则未划分前应该是二者之和.损失减少,则表明当前分裂work,记录当前分裂特征和阈值,$Gain$越大,表明效果越好

Gain = Obj_{分裂前} - Obj_{分裂后}
3.3 列采样

一种对特征降采样的方式:选取一定的特征分裂,每一个弱学习器选取子特征集,例如从原有特征选择80%的特征,而弱学习器的每一个结点也可以在当前树下的子特征集重新随机选取,也可以全部使用进行遍历。

3.4 特征值分桶法

一种对==特征值降采样==的方式:对特征的值进行分桶,例如某一特征的值为0-9,分为五个桶只需要遍历五次,大大增加运算效率,桶数越大,与精确贪心算法的越接近,当每个桶只有一个样本时,即为精确贪心算法。

  • 全局策略:分裂结点的特征一样时,当前弱学习器的分桶阈值不变;
  • 局部策略:分裂结点的特征一样,当前弱学习器的新结点也会重新计算分桶阈值;

在论文中,桶的数目个数计算为:

Num = \frac{1}{eps}

如图可以得到以下结论:

  1. 局部策略在一般情况下比全局策略好;
  2. 当$eps$足够小时,时间复杂度以及精度是与精确贪心算法接近的,并且效果优于局部策略;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基本内容
  • 二、目标函数优化
  • 三、树结构的确定
    • 3.1 穷举法
    • 3.2 精确贪心算法
    • 3.3 列采样
    • 3.4 特征值分桶法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档