XGB原理总结记录

2023-10-31

1、CART树

        Classification And Regression Tree(CART)是决策树的一种,并且是非常重要的决策树,属于Top Ten Machine Learning Algorithm。顾名思义,CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree)、模型树(Model Tree),两者在建树的过程稍有差异。

创建的过程是:选择当前数据集中具有最小Gini信息增益的特征作为结点划分决策树。ID3算法和C4.5算法虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但其生成的决策树分支、规模较大,CART算法的二分法可以简化决策树的规模,提高生成决策树的效率。对于连续特征,CART也是采取和C4.5同样的方法处理。为了避免过拟合(Overfitting),CART决策树需要剪枝。预测过程当然也就十分简单,根据产生的决策树模型,延伸匹配特征值到最后的叶子节点即得到预测的类别。

适用于:样本特征的取值为是或非的场景,对于连续特征的处理则与C4.5算法相似。

剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键。

CART算法由以下两步组成:

决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大; 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。

CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。本文我们仅讨论用于分类的CART。对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。 CART生成算法如下:

输入:训练数据集D,停止计算的条件: 

输出:CART决策树。

根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:

  • 设结点的训练数据集为D,计算现有特征对该数据集的Gini系数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或 “否”将D分割成D1和D2两部分,计算A=a时的Gini系数。 
  • 在所有可能的特征A以及它们所有可能的切分点a中,选择Gini系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。 
  • 对两个子结点递归地调用步骤l~2,直至满足停止条件。 
  • 生成CART决策树。 
  • 算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。

2.XGB算法原理

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

  注:w_q(x)为叶子节点q的分数,f(x)为其中一棵回归树

 如下图例子,训练出了2棵决策树,小孩的预测分数就是两棵树中小孩所落到的结点的分数相加。爷爷的预测分数同理。

3.损失函数

 对于回归问题,我们常用的损失函数是MSE,即:

对于分类问题,我们常用的损失函数是对数损失函数:

 

XGBoost目标函数定义为:

目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。正则化项同样包含两部分,T表示叶子结点的个数,w表示叶子节点的分数。γ可以控制叶子结点的个数,λ可以控制叶子节点的分数不会过大,防止过拟合。

正如上文所说,新生成的树是要拟合上次预测的残差的,即当生成t棵树后,预测分数可以写成:

同时,可以将目标函数改写成:

很明显,我们接下来就是要去找到一个f_t能够最小化目标函数。XGBoost的想法是利用其在f_t=0处的泰勒二阶展开近似它。所以,目标函数近似为:

  其中g_i为一阶导数,h_i为二阶导数:

由于前t-1棵树的预测分数与y的残差对目标函数优化不影响,可以直接去掉。简化目标函数为:

上式是将每个样本的损失函数值加起来,我们知道,每个样本都最终会落到一个叶子结点中,所以我们可以将所以同一个叶子结点的样本重组起来,过程如下图:

因此通过上式的改写,我们可以将目标函数改写成关于叶子结点分数w的一个一元二次函数,求解最优的w和目标函数值就变得很简单了,直接使用顶点公式即可。因此,最优的w和目标函数公式为

4.分裂结点算法

  在上面的推导中,我们知道了如果我们一棵树的结构确定了,如何求得每个叶子结点的分数。但我们还没介绍如何确定树结构,即每次特征分裂怎么寻找最佳特征,怎么寻找最佳分裂点。

  正如上文说到,基于空间切分去构造一颗决策树是一个NP难问题,我们不可能去遍历所有树结构,因此,XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用上式目标函数值作为评价函数。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。

5.正则化

xgboost使用了如下的正则化项:

注意:这里出现了γ和λ,这是xgboost自己定义的,在使用xgboost时,你可以设定它们的值,显然,γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。

为什么xgboost要选择这样的正则化项?很简单,好使!效果好才是真的好。

6.对缺失值处理

xgboost模型却能够处理缺失值,模型允许缺失值存在

原始论文中关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树

7.优缺点

优点:

1) xgBoosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);

2) xgBoosting对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;

3)当样本存在缺失值,xgBoosting能自动学习分裂方向

4)xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算

5)xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合

6)xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;

7)xgBoosting工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;

8)可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;

缺点:

1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;

2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合. 

参考资料:

Lightgbm 直方图优化算法深入理解_anshuai_aw1的博客-CSDN博客_直方图算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XGB原理总结记录 的相关文章

随机推荐

  • 简单易懂!详细讲解==与equals的区别(详讲equals源代码)

    与 equals 最本质的区别就在于 只是一个比较运算符 而equals却是一个方法 而只要是方法就可以重写 这就是 和equals最本质的区别 首先我们先来讲解 运算符 运算符可以对基本数据类型的值来进行判断 举例 int a 10 in
  • 关于保护继电器触点(灭弧)

    我用继电器驱动一个24V 60w电机 采用0 33uF 400V电容并联在触点上作为吸收和保护电容 用不了多久 就被击穿了 现在用的电容是0 1uF的X2电容 这种电容标称耐压是 275V 实际能承受2500V的冲击电压 后来的仿真和示波器
  • Prometheus-05 Prometheus的核心概念和架构

    Prometheus是一个开源的监控系统和时间序列数据库 被广泛应用于云原生环境中的监控和告警 本文将介绍Prometheus的核心概念和架构 帮助读者了解Prometheus的工作原理和基本组件 1 核心概念 Prometheus基于一些
  • python配置文件解析_【Python】configparser - 配置文件解析

    目录 一 介绍 ConfigParse 类实现一个基本配置文件解析器语言 提供了一个类似于Microsoft Windows INI 文件的结构 可以使用它来编写可由最终用户轻松定制的Python程序 注意 这个库不支持能够解析或写入在 W
  • java: 详解java中的集合框架

    一 Java集合框架概述 1 图解 集合可以看作是一种容器 用来存储对象信息 所有集合类都位于java util包下 但支持多线程的集合类位于java util concurrent包下 上图中淡绿色背景覆盖的是集合体系中常用的实现类 分别
  • GitHub项目管理详细教程/git教程【有图有代码】

    GitHub项目管理详细教程 git教程 有图有代码 一 Git 基本操作 二 Git 配置 1 配置个人的用户名称和电子邮件地址 2 查看配置信息 三 Git 工作区 暂存区和版本库 四 上传自己的项目到GitHub仓库 第一次 第二次
  • Python:Flask简单实现统计网站访问量

    hello 我是wangzirui32 今天我们来学习如何使用Flask简单实现统计网站访问量 开始学习吧 学习目录 1 项目架构 2 项目文件编写 2 1 index html 主页编写 2 2 people json 数据初始化 2 3
  • 为什么是 Dart ?

    为什么是 Dart 为什么选择Dart语言 这是很多人的疑问 让我们先来看看 最近Dart 编程语言的发展情况 2022年2月TIOBE编程语言排行榜 很遗憾 Dart在前20名之外 但好消息是它还处于前30名之内 在这个排行榜中 值得我们
  • 修复微信小程序获取头像的bug,微信小程序新版头像API使用

    接着我之前发布的一篇文章 微信小程序上传头像的临时路径 持久化保存到服务器与数据库 nodejs后台开发 盒子猫君的博客 CSDN博客 今天我就来解决掉之前的问题吧 从之前的后台报错来看 获取到的tempFilePath值和avatarUr
  • umi配合proLayout , 菜单与面包屑设置问题( 通过路由生成菜单)

    问题 本项目为umi配合 prolayout 设置路由自动生成菜单 出现问题为 有些二级三级路由 需要在导航路由显示 但在菜单栏不显示 一 配置proLayout生成菜单 ProLayout 与 umi 配合使用会有最好的效果 umi 会把
  • js获取cookie对象

    function getCookie sName 获取cookie对象 并按 进行分割 let aCookie document cookie split 遍历数组根据 遍历出来的每一个元素进行分割因为cookie中的存储形式 是这样的 u
  • 图像拼接(融合)算法—matlab代码

    寻找两图像色差差异最小处进行左右拼接 拼接 融合 clc clear close all img1 imread 试验图 1 bmp 左图 img2 imread 试验图 2 bmp 右图 figure imshow img1 显示 fig
  • 批次属性创建BAPI在S/4一些变化

    批次属性变更同样是使用的以下三个BAPI VB BATCH 2 CLASS OBJECT 获取物料批次信息 BAPI OBJCL GETDETAIL 获取批次对象属性 BAPI OBJCL CHANGE 修改批次对象属性 在传统的ECC系统
  • 复习前端知识(HTML)

    前言 前端学习学了忘 忘了学 知识点学的一地稀碎 最近准备对现在掌握的知识点进行梳理并整理 用于帮助自己记忆 如果有什么地方写的有错误或者有遗漏的地方 欢迎大家指正 一 HTML文档基本结构 HTML文档基本结构主要包含以下几个标签 用于声
  • 树莓派体验13 - 树莓派3B板载wifi配置方法

    树莓派3代B版自带板载wifi和蓝牙 因此想让树莓派通过wifi上网不再需要单独购买wifi模块 通过简单配置板载wifi即可快速实现 配置方法在命令行操作 前提是你需要进入命令行终端 进入命令行终端的方法有多种 串口 SSH HDMI 显
  • 正点原子IMX6ULL阿尔法USB摄像头的远程调用(四)Python的实现

    话不多说 先上界面 前情提示 做这个例子 需要USB摄像头已经调好了 同时电脑上已经安好了python pyqt5 opencv等 下面演出开始吧 直接上代码 源代码直接上 coding utf 8 Form implementation
  • [QT_012]Qt学习之QTreeWidget 详解

    本文转自 Qt编程指南 作者 奇先生 Qt编程指南 Qt新手教程 Qt Programming Guide 树形控件的节点可以有多层 多个子节点 如果将子节点全部展开 那么每一行都是一个数据条目 QTreeWidgetItem 比较特殊 一
  • python mypy类型检查_Python 类型检查指南

    Python 作为一种动态语言 在 PEP484 3 5 才支持 Type Hints 且类型申明是 optional 的 对于从静态语言 比如 Java 国内大学专业cs or se的教学语言也是以 C C Java 为主 转过来的人来讲
  • sort算法流程

    通过卷积神经网络得到detection以后做一个IoU的匹配 这个匹配是和当前的tracks做匹配 detection的数目和tracks的数目并不一定相等 匹配是通过匈牙利算法进行求解 结果就有 Unmatched Tracks 未匹配上
  • XGB原理总结记录

    1 CART树 Classification And Regression Tree CART 是决策树的一种 并且是非常重要的决策树 属于Top Ten Machine Learning Algorithm 顾名思义 CART算法既可以用