tech share
  • tech-share
  • Engineering
    • 登录鉴权
    • SSR 页面路由
    • npm 版本号
    • 缓存
    • 数据库容灾
    • 动态效果导出 gif
    • Chrome-devtools
    • C 端 H5 性能优化
    • Docker
    • Monorepo 最佳实践
    • 技术架构演化
    • 项目规范最佳实践
    • snowpack
    • 静态资源重试
    • 前端页面渲染分析
    • Git
    • 前端重构
    • 微前端
    • 项目依赖分析
    • 前端监控原理
    • webpack
    • BS 架构与 CS 架构
    • HTTPS
    • package-lock.json 生成逻辑
    • SVN(Subversion)
    • 数据库分类
    • gulp
    • 前端架构
    • Bundle & Bundless
    • 控制反转 IoC
  • JavaScript
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • ES6 解构赋值
    • 前端离线化
    • Proxy
    • Object.defineProperty()简介
    • TypeScript
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • PyTorch优化器
    • 隐马尔可夫模型2
    • Shapley Value 算法
    • Embarassingly Autoencoder算法
    • AutoRec算法及其后续发展
    • 深度学习常用激活函数
    • 序列预测ConvTran算法
    • 联邦学习
    • 深度学习推荐系统算法整理
    • 隐马尔可夫模型
    • 黎曼优化方法
    • FM算法
    • 机器学习常见评价指标
    • VAE算法
    • Adam优化器详解
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 图嵌入
    • 集成学习算法
    • RecBole开源框架
    • NCE-PLRec
    • 深度学习初始化方法
    • RNN循环神经网络
    • PyTorch数据处理
    • PyTorch安装和基本操作
    • XGBoost算法
    • NCF算法与简单MF的对比
    • 计算最佳传输
  • CSS
    • 什么是BFC
    • 纯CSS实现可拖动布局
    • 滚动穿透解决方案
  • React
    • React 生命周期
    • React Ref
    • React Hooks
    • SWR
    • React 数据流
    • React 函数式组件和类组件的区别
  • 可视化
    • OffscreenCanvas
    • Echarts 平滑曲线端点为什么不平滑
    • 颜色空间
    • 词云布局解析
    • 3D 数学基础
    • Canvas 图片处理
    • GLGL ES
    • WebGL 中绘制直线
    • Graphics API
    • 现代计算机图形学基础
    • Canvas 灰度
  • Vue
    • Vue2.x全局挂载整理
    • Vue2.6.x源码阅读
      • Vue2.6.x源码阅读 - 2.目录结构分析
      • Vue2.6.x源码阅读 - 4.源码阅读-platform
      • Vue2.6.x源码阅读 - 1.准备工作
      • Vue2.6.x源码阅读 - 5.源码阅读-core-Vue构造函数
      • Vue2.6.x源码阅读 - 7.源码阅读-core-响应式原理
      • Vue2.6.x源码阅读 - 3.源码阅读-shared
      • Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载
    • Vue + TypeScript Web应用实践
    • Vue2.x指令
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • Electron-Vue + Python 桌面应用实践
    • Vite
    • Vue组件通信整理
    • 记录一个问题的探索过程
  • Linux
    • memcg
  • GameDev
    • 游戏中的几种投影视图
    • 从零开始写软渲染器06
    • 从零开始写软渲染器05
    • 从零开始写软渲染器04
    • 从零开始写软渲染器03
    • 从零开始写软渲染器02
    • 从零开始写软渲染器01
    • 从零开始写软渲染器00
    • 现代游戏常用的几种寻路方案(一)
  • Node
    • NPM Dependency
    • Node 优势
    • Node Stream
    • Node 模块系统
  • HTML
    • html5语义与结构元素
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • CART决策树
  • XGBoost概述和损失函数
  • 最佳分裂点选择
  • 精确贪心算法
  • 近似算法
  • 稀疏数据分裂点算法

这有帮助吗?

  1. MachineLearning

XGBoost算法

上一页PyTorch安装和基本操作下一页NCF算法与简单MF的对比

最后更新于4年前

这有帮助吗?

在Boost算法的家族中,XGBoost于2016年sigKDD中提出,普遍认为是一种设计非常优秀,且在工程实践上取得了良好效果的算法。本质上XGBoost是GBDT算法的一种改进,其改进主要体现在以下几个部分

  1. 对目标函数进行二阶泰勒展开,在目标函数中引入映射函数的一次和二次导数。

  2. 使用近似方法和直方图等方法提高决策树特征选取的速度。

CART决策树

决策树是一种简单的机器学习方法。基本思路是利用树这种数据结构来表现根据特征做出预测的整个过程。例如我们仅根据人的头发长度是否大于5cm来决定人的性别是男是女,这就可以利用简单的一层的决策树来表现。即:

  • 根节点是所有学生的集合

  • 两个子节点分别表示模型预测出的男生和女生

  • 根节点到子节点的两条边表示判断条件,头发长度5cm

决策树的关键在于选取更加优秀的分裂点,即先选取哪个特征来进行节点分裂。XGBoost采用的是CART决策树。这种决策树的优越之处在于同时支持离散值和连续值的预测。 分裂点选择一般选择信息熵计算的方法,统计那些可以尽量将数据集平均分开特征。

  • 对于离散值,在分裂节点时,根据是否满足离散值条件来划分,预测时根据叶子节点分别给予不同的离散值标签即可。

  • 对于连续值,一般都是采用分箱的方法,将连续值划分到不同的连续值区间。在预测时,同一个叶子节点内的样本都将预测值设置为该区间的平均值,用这个平均值分别和每个样本的标签计算损失。

XGBoost概述和损失函数

XGBoost的原理和GBDT类似,借用论文中的图片,我们可以理解该算法对真实值的拟合过程。

图中展示了一个简单的模型。只训练了两个决策树作为子分类器。其中有两个关键点:

  1. 目标函数的逼近。 XGBoost在训练每个树时逼近的目标值是变化的。第一棵树的目标值是样本的真实标签,第二棵树的目标值就变味了样本的真实标签和上一棵树预测结果之间的差值。在完成训练后,我们只需要将所有子树的预测值加在一起就能得到XGBoost的最终预测结果。

  2. 特征选择和分裂点选择。每棵树用于进行决策构造的特征并不一定相同,需要根据一定的规则选择对当前的目标值拟合效果最好的特征。然后进行常规的分裂点选择。

对于第t+1个模型,算法的目标函数是:

l是损失函数,例如平方损失函数RMSE等。该目标函数中g和h分别是l函数的一次和二次导函数。事实上上式是下面的目标函数的变形,对l函数进行了二阶泰勒展开。

这种设计有几个原因: 1. 利用了更多的模型信息,比GBDT多了二阶梯度,可以用于下一个模型的分裂点选择和特征选择。 2. 提高模型的优化速度,这点在牛顿法中也有体现。 1. 提高模型的可扩展性,任何二次可导的损失函数都可以适用于这个损失以及后续推导得到的一系列方法。

最佳分裂点选择

上文我们已经提到决策树的关键在于选择合适的特征进行节点分裂。这个选择过程被XGBoost认为是最影响GBDT模型训练速度的部分,因此进行了详细的设计。

精确贪心算法

这个算法是算法的基线,通过遍历所有的特征计算每棵可能的树的总的收益值。注意此处的收益值是通过计算一阶导数值和二阶导数值的和进行计算的。这个思路是,希望让下一棵树能够尽可能地让模型得到最大的优化,符合GBDT的设计思路。

近似算法

精确贪心算法要遍历所有特征的所有排列可能排列成的决策树,因此时间复杂度极高,不具有实际可操作性。

因此将精确贪心算法改进为近似算法。近似算法首先根据特征值分布的百分位数产生一些候选分割点,然后根据候选分割点把连续的特征离散化,然后计算梯度统计gi和hi,根据梯度统计计算obj*和gain,进而寻找最佳候选分割点。

近似算法中重要的一步就是产生合理的候选分裂点,通常是根据特征值的百分位数点产生候选分割点,这样可以把特征值平均的分成若干个区间。XGBoost采用权重百分位数产生法((weighted quantile sketch)用二阶导数值作为百分位区间的权重。

稀疏数据分裂点算法

在实际应用中,常见类型是稀疏类型的特征,特征里面可能包含大量的缺失值。为了使XGBoost能够适用大量缺失值的场景,在树分裂的时候,给缺失值一个默认的分裂方向(全部分裂到左子节点或者全部分裂到右子节点)。

默认的分裂方向是通过在训练数据上学习得到的。学习默认分裂方向的算法见Algorithm3。

本文受时间限制和作者能力限制,只介绍了XGBoost算法的大概设计情况,和一些关键的组件。实际上XGBoost还有大量对于运行效率的改善以及严格的证明过程,例如对数据结构的设计以及并行计算的引入。有兴趣的读者可参考原文:

https://arxiv.org/pdf/1603.02754v1.pdf
XGBoost
XGBoost_obj
XGBoost_obj_origin
XGBoost_algorithm1
XGBoost_algorithm2
XGBoost_algorithm3