[机器学习]XGBoost(3)——确定树的结构

XGBoost的目标函数详见[机器学习]XGBoost(2)——目标函数(公式详解)

确定树的结构

之前在关于目标函数的计算中,均假设树的结构是确定的,但实际上,当划分条件不同时,叶子节点包含的样本不同,计算的 H j H_j Hj G j G_j Gj不同,每个叶子节点的W值也就不同
每一棵树都有属于自己最优的 O b j ∗ Obj^* Obj,因此要找一种最优的划分方式,即要找出使得 O b j ∗ Obj^* Obj最小的树作为基学习器的决策树

  1. 穷举法:计算所有可能的组合情况,然后选出最小的 O b j ∗ Obj^* Obj
    缺点:在实际应用中,穷举所有可能的分裂点通常是不可行的,因为计算成本太高。
  2. 精确贪心算法:每次选择最优的分裂点

XGBoost用的是精确贪心算法

精确贪心算法

在XGBoost中,用精确贪心算法在构建决策树的过程中选择最优的分裂点。这种方法旨在找到能够最大化目标函数增益的分裂点,从而提高模型的预测性能。

核心思想:

  • 贪心选择:在每一步分裂决策中,算法不是寻找全局最优解,而是做出局部最优选择。这意味着在当前步骤中,选择能够最大程度降低目标函数(损失函数和正则化项之和)的分裂点。
  • 精确计算:对于每个可能的分裂点,精确计算分裂后的增益。增益是通过比较分裂前后的目标函数值来计算的,即增益等于分裂前的目标函数值减去分裂后所有子节点目标函数值的总和。
  • 递归分裂:一旦选择了最优分裂点,算法将递归地对每个子节点重复分裂过程,直到满足停止条件(如达到最大树深度、增益小于阈值或子节点中的样本数小于某个阈值)。

算法步骤

  1. 初始化:开始时,所有样本都在根节点。初始化目标函数 Obj 为所有样本的损失之和。

  2. 计算增益:对于每个可能的分裂点,计算分裂后的增益。增益是通过比较分裂前后的目标函数值来计算的,即增益 = 父节点的目标函数值 - 子节点的目标函数值之和。

    • 对于每个子节点 j,目标函数 Obj_j 可以表示为 O b j j = γ + 0.5 ∗ ( G j 2 / ( H j + λ ) ) Obj_j = γ + 0.5 * (G_j^2 / (H_j + λ)) Objj=γ+0.5(Gj2/(Hj+λ))
      其中 G j G_j Gj 是子节点上所有样本梯度的和, H j H_j Hj 是Hessian的和,这两个都是可以计算的。
    • 增益 Gain 可以表示为: G a i n = O b j p a r e n t − [ O b j l e f t + O b j r i g h t ] Gain = Obj_{parent} - [Obj_{left} + Obj_{right}] Gain=Objparent[Objleft+Objright]
      其中, O b j p a r e n t Obj_{parent} Objparent 是父节点的目标函数值, O b j l e f t Obj_{left} Objleft O b j r i g h t Obj_{right} Objright 是分裂后左右子节点的目标函数值。
  3. 选择最佳分裂:在所有可能的分裂点中,选择增益最大的分裂点作为最优分裂。这个分裂点将被用来将当前节点分裂为两个子节点。

  4. 更新目标函数:使用最优分裂点分裂节点后,更新目标函数。计算每个子节点上的 G j G_j Gj H j H_j Hj,并更新 O b j Obj Obj

  5. 递归构建:对每个新创建的子节点重复步骤2-4,直到满足停止条件(如达到最大深度或增益小于阈值)。

什么时候停止划分?

  1. 最大增益小于一个很小的数:如果进一步划分带来的增益小于预设的最小增益阈值(min_split_gain),则不会进行分裂。这个阈值用于控制只有当分裂能够显著提高模型性能时,才会进行分裂。

  2. 叶子节点包含样本个数小于等于1:如果一个叶子节点中的样本数量小于或等于1,那么这个叶子节点将不再进一步划分。这是为了防止树的过拟合,因为单个样本的分裂不会提供泛化能力。

  3. 达到最大树深度:如果树的深度已经达到预设的最大深度(max_depth),则停止进一步划分。

算法伪代码

在这里插入图片描述

输入参数:
  • I:当前节点的所有样本实例。
  • d:特征的维度,即数据集中特征的数量。
初始化:
  • gain:初始化为0,用来存储在所有可能的分裂中找到的最大增益值。
  • G:所有样本梯度的总和。
  • H:所有样本Hessian的总和。
算法步骤:
  1. 遍历所有特征:对于每个特征 k(从1到特征总数 m),执行以下操作。

  2. 初始化左右子树的梯度和Hessian和: G L G_L GL H L H_L HL 分别初始化为0,用来存储左子树的梯度和和Hessian和。

  3. 对样本按特征值排序:将样本集 I 按照特征 k 的值进行排序。
    注意:不同特征会划分出不同的样本集,所以每次排序都要重新排。当特征非常多时,排序操作非常耗时

  4. 计算左右子树的统计量:遍历排序后的样本,逐步构建左子树的统计量(GL 和 HL),同时计算右子树的统计量(GR = G - GL 和 HR = H - HL)。

  5. 计算分裂增益:使用公式计算当前分裂点的增益 score:
    score = G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ \text{score} = \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{G^2}{H + \lambda} score=HL+λGL2+HR+λGR2H+λG2
    如果当前分裂点的增益大于之前记录的最大增益 gain,则更新 gain。

  6. 选择最佳分裂:在所有特征和所有可能的分裂点中,选择增益最大的分裂点作为最终的分裂点。

输出:

具有最大增益的分裂点,这将用于构建决策树的节点分裂。

算法优化——近似算法

针对不同特征会划分出不同的样本集,所以每次排序都要重新排的问题进行优化(以牺牲精度为代价)

  1. 压缩特征
  2. 采样特征值

压缩特征——列采样

按树随机采样(Tree-wise Subsampling):
在构建每棵树之前,从所有特征中随机选择一部分特征进行考虑。例如一共有X1……X10个特征,选3个特征X1,X5,X7,之后每次计算都只用这三个特征

优点:

  • 减少每棵树的计算量,因为每次分裂只考虑一部分特征,可能的分裂点减少,gain值的个数减少。
  • 有助于防止过拟合,因为模型不会对所有特征都过于敏感。

缺点:

  • 固定随机选择的特征可能会忽略一些对模型预测性能有重要影响的特征,导致模型无法充分利用所有特征信息。(每次都只用X1,X5,X7,可能忽略其他特征的信息)

按层随机采样(Level-wise Subsampling):
在构建树的每个层级时,都重新对特征进行采样。例如一共有X1……X10个特征,第一层根节点选3个特征X1,X5,X7,之后每次计算都重新选三个特征,第二层左节点用X2,X3,X4,第二层右节点用X1,X8,X10……

优点:

  • 减少每棵树的计算量,因为每次分裂只考虑一部分特征,可能的分裂点减少,gain值的个数减少
  • 确保每一层的分裂都有新的随机特征选择,增加了模型的多样性。
  • 通常比按树随机采样更复杂,但可能提供更好的性能。

分桶采样特征值

在构建树的每个层级时,对特征的值进行采样,而不是使用全部特征值。例如,对于每个特征 X i,将其值域分成 k 组,从每个特征的 k 组中随机选择一个值,这样总共选择了 k 个特征值。

优点:

  • 减少每个特征的计算量,因为每个特征的计算只考虑一部分特征值, H j H_j Hj G j G_j Gj计算量变小

注意:

  • 不是随机选取,是先分桶,再从每个桶里选一个代表
  • 理想化假设特征值均匀分布,每个桶里的特征值数量应该尽量接近,但实际并不是这样的,因此用加权分位法
加权分位法
  1. 收集梯度和Hessian:对于每个特征,收集所有样本的梯度 g i g_i gi 和Hessian h i h_i hi

  2. 计算权重:样本权重通常与梯度和Hessian有关。在XGBoost中,样本权重可以是Hessian的函数表示。
    在这里插入图片描述

  3. 排序:根据样本权重对特征的所有可能值进行排序。具有更高权重的样本在排序中会有更大的影响力。

  4. 计算分位数:在排序后的特征值上,根据预设的桶数量(由参数 max_bin 控制)计算分位数。这些分位数将用作桶的边界。

  5. 分桶:使用计算出的分位数将特征值域分割成若干个桶。每个桶代表特征值的一个区间。

  6. 选择代表值:从每个桶中选择一个代表值,这个值将用于构建模型。在XGBoost中,这个值通常是桶中所有样本梯度和的加权平均值。

策略

  1. 全局策略
    分一次桶,以后每次都按这个分法来分
  2. 局部策略
    每次都重新分一次桶

缺失值处理 Sparsity-aware Split Finding

实际场景拿到的数据是很稀疏的,有大量缺失值,因此需要处理缺失值

  1. 穷举法:为所有组合计算增益,选最大的
  2. 贪心法:把每个缺失值分别放到左边和右边计算gain,比较两个gain的大小,这样要计算2*缺失值个数
  3. 论文采用的方法:把所有缺失值当成整体看待,都同时放到左边计算一个gain,再把所有缺失值放到右边计算一个gain,比较两个gain的大小,然后把所有缺失值样本全部放到gain大的那边。这样只用计算2

注意:加权分位法中缺失值不参与排序和分桶

学习率 shrinkage

目的:为了防止过拟合
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot444新冠物资管理系统的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装新冠物资管理系统软件来发挥其高效地信息处理的作用&#x…

Javascript-web API-day02

文章目录 01-事件监听02-点击关闭广告03-随机点名案例04-鼠标经过或离开事件05-可点击的轮播图06-小米搜索框07-键盘类型事件08-键盘事件-发布评论案例09-focus选择器10-评论回车发布11-事件对象12-trim方法13-环境对象14-回调函数15-tab栏切换 01-事件监听 <!DOCTYPE html…

使用xjar 对Spring-Boot JAR 包加密运行

1 Xjar 介绍 Spring Boot JAR 安全加密运行工具&#xff0c;同时支持的原生JAR。 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动&#xff0c;动态解密运行的方案&#xff0c;避免源码泄露或反编译。 功能特性 无需侵入代码&#xff0c;只需要把编译好的…

深度学习的下一站:解锁人工智能的新边界

引言&#xff1a;新边界的呼唤 深度学习的诞生&#xff0c;犹如人工智能领域的一次革命&#xff0c;激发了语音助手、自动驾驶、智能医疗等前沿技术的飞速发展。然而&#xff0c;面对现实世界的复杂性&#xff0c;现有的深度学习模型仍然存在数据依赖、可解释性差、环境适应力不…

基于DockerCompose搭建Redis主从哨兵模式

linux目录结构 内网配置 哨兵配置文件如下&#xff0c;创建3个哨兵配置文件 # sentinel26379.conf sentinel26380.conf sentinel26381.conf 内容如下 protected-mode no sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 60000 s…

upload-labs靶场1-19关

第 1 关&#xff08;删除前端js校验&#xff09; 点击第一关&#xff0c;我们可以看到页面上传区可以上传一个图片&#xff0c;我们要上传一个 webshell&#xff0c;这里我们上传一句话木马的 php 点击上传 显示文件不支持上传&#xff0c;这时我们查看源码 查看代码后发现&am…

vue3+vite 引入动画组件库 Inspira UI

关于Inspira UI Inspira UI不是传统的组件库。相反&#xff0c;它是精选的优雅组件集合&#xff0c;您可以轻松将其集成到您的应用程序中。只需选择所需的组件&#xff0c;复制代码&#xff0c;然后自定义以适合您的项目即可。您可以随意使用和修改代码&#xff01; 官网地址…

Go语言启动独立进程

文章目录 问题解决方案1. **将 npc.exe 启动为独立的进程**2. **修改 exec.Command 函数**示例代码解释为什么这样有效注意 问题 在你当前的代码中&#xff0c;调用 exec.Command("XXX.exe") 启动 XXX.exe 程序时&#xff0c;这个程序是由 Go 程序直接启动的。如果 …

计算机网络错题

文章目录 码分复用透明传输差错检测停止-等待协议回退N帧协议CSMA/CD协议以太网交换机Vlanip地址的无分类编制方法ip地址的应用规划ip数据包的发送和转发过程路由信息协议IPI2016201720202022 2.5信道 码分复用 透明传输 差错检测 停止-等待协议 回退N帧协议 CSMA/CD协议 以太网…

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制&#xff08;COPY和ADD指令&#xff09; 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…

Zabbix6.0升级为7.2

Zabbix 7.0 进行了全新升级&#xff0c;本文讲解如何从 6.0 版本升级至最新版本 7.2。在 CentOS 8 上通过RPM 方式安装 Zabbix 服务 一、环境信息 我是CentOS 7安装的服务端&#xff0c;在该机器在通过源码去安装 Zabbix 7.0 版本的话&#xff0c;会比较费劲&#xff0c;因为有…

2024.4 评估大语言模型在医疗行业应用的综合调查

A Comprehensive Survey on Evaluating Large Language Model Applications in the Medical Industry https://arxiv.org/abs/2404.15777 问题 大语言模型&#xff08;LLMs&#xff09;在医疗领域应用广泛&#xff0c;但缺乏专门针对其在医疗应用中有效性、准确性、可用性和…

apache应用(客户机地址限制、用户授权限制、日志分割、AWStats日志分析)

目录 一、 客户机地址限制 二、 用户授权限制 三、 日志分割 使用rotatelogs分割工具 使用第三方工具cronolog 四、 AWStats日志分析 具体的apache软件安装可以阅读我之前的文章apache安装https://blog.csdn.net/m0_68472908/article/details/139348739?spm1001.2014.300…

web3跨链预言机协议-BandProtocol

项目简介 Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上&#xff0c;基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain&#xff0c;主要功能是提供跨链预言机服务。Cosmos生态上第一个&#xff0c;也是目…

STM32二刷学习笔记--GPIO

文章目录 GPIO使用详解GPIO基本结构GPIO工作模式简单示例推挽输出LED闪烁按键控制LED闪烁**LED控制函数****按键控制函数** GPIO使用详解 在STM32开发中&#xff0c;GPIO&#xff08;通用输入输出&#xff09;是与外设接口的基础模块。通过GPIO&#xff0c;我们可以连接各种外…

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

WPF ControlTemplate 控件模板

区别于 DataTemplate 数据模板&#xff0c;ControlTemplate 是控件模板&#xff0c;是为自定义控件的 Template 属性服务的&#xff0c;Template 属性类型就是 ControlTemplate。 演示&#xff0c; 自定义一个控件 MyControl&#xff0c;包含一个字符串类型的依赖属性。 pub…

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave&#xff1a;选择最适合的 Python BDD 框架 Pytest BDD vs Behave&#xff1a;选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave&#xff1a;关键区别Pytest BDD vs Behave&#xff1a;最佳应用场景结…

FPGA-PS端编程1:

目标 在小梅哥的zynq 7015上&#xff0c;完成以下目标&#xff1a; 读取 S1 按键的电平&#xff0c; 当 S1 按键为按下状态时&#xff0c;驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别)&#xff0c; 当 S1 释放后&#xff0c;停止…

【Linux学习】十五、Linux/CentOS 7 用户和组管理

文章目录 一、组的管理1.组的创建格式&#xff1a;参数&#xff1a; 2.组的删除格式&#xff1a;参数&#xff1a; 3.组的属性修改格式&#xff1a;参数&#xff1a; 4.查看组的信息①cat /etc/group 命令②getent group 命令③仅显示系统中所有组名 二、用户的管理①超级用户&…