XGBoost算法-上

简单解释一下xgboost这个模型

xg是一个非常强大,非常受欢迎的机器学习模型,其中最大的特色就是boosting(改进、推进),怎么改进呢?就是xgboost这个算法,它会先建立一颗简单的决策树,然后看这个决策树的预测结果,有哪些地方算错了,针对这些错误,来进行一些改进,又拿到一颗决策树,然后看第二颗决策树预测结果又哪些地方错了,然后再根据这些错误再做一些改进,通过这一次次的快速的改进,将错误最小化,最后xg可达到一个非常精确的结果。

上面一个非常精略的解释,如果细究的话,有很多的技术细节。我们可以把这些技术细节通通跳过,如何跟一个不懂技术的人来解释这个模型。

以做菜打比方,当我第一次做菜的时候,我也不知道应该怎么做,所以我会凭着我的直觉决定我需要加哪些材料,需要煮多长时间,结果大概率非常的不好吃,我尝过之后,判断是盐放多了,煮的时间也有些长。下一轮做菜的时候,我会把盐放少一些,煮的时间也会缩短5分钟的时间,第二轮品尝之后,觉着好像还是不够入味,可能是没有腌制,于是第三次尝试的时候,我先把自己的材料腌制三十分钟,然后再开始煮,尝试上百次之后,终于做出一道比较完美的菜。

这个时候,我会记录下来,我到底做了什么,比如放三克盐,煮了二十分钟,下一次做同样的菜的时候,我只需要按照我的菜谱来就可以了。

这种不断从错误中学习,不断改进的算法就是xg。而我记录下来的这个菜谱,就是这个菜所特定的模型参数parameter。

简介

想要知道,这个模型是在做什么,为什么要这么做

回归树及其数学表达式

回归树:输入一个样本,得到这个样本对应的节点值,并不能将树结构表达出来,只能表达最终的叶子节点和节点的值

目标函数

整体表达式

我们定义好一个模型之后,第一步是要确定其目标函数,然后把问题转化为求解最优值的问题。比如把损失函数降到最小,然后利用各种求解最优值的求解凸优化的一些方法,把基学习器的参数求解出来。

首先规定一些用到的数学符号和数学公式

首先定义一下加法模型

模型由T个基学习器累加,里面每一个基学习器就是我们上面的回归树,可以写成前T-1个基学习器加上最后一个基学习器的形式

前向分布算法采用的是贪心的策略,逐一颗树进行优化,先优化第一颗树,然后优化第二颗,依次类推。假设现在需要优化第t颗树,就可以写成前面t-1颗树加上第t颗待优化的树。第t颗树是一颗回归树,所以可以写成下面公式:

  • t表示当前优化的是第t个回归树,其叶子节点有T个

接下来我们定义一下目标函数,每一个样本输入模型之后,都能够得到一个预测值,预测值和真实值就可以计算中间的损失,假设我们一共有n个样本,我们将n个样本得到的损失累加起来,就得到了总体的一个损失。为了防止过拟合,我们会再后面增加一个正则项,即将t颗回归树的复杂度累加起来,后面会讲解复杂度如何定义。那么我们的优化目标就是希望得到我们目标函数的最小值【找到一组w,使得目标函数最小】。

正则项处理

接下来我们分析一下目标函数中的正则项部分。

关于oumeiga的定义如下:

上面框中的函数:

  • 有两个超参数,左侧的gama和后侧的lamda,这两个超参数可以控制我们惩罚的力度
  • T指的是当前这颗回归树,叶子节点个数,图中是4个叶子节点
  • lamda后面是各个节点值的平方累加和

正则项的作用是防止过拟合,当我们叶子节点的数量越来越多的时候,说明回归树的深度是越来越深的,这种情况下是越容易出现过拟合的情况,所以我们需要对其进行一个惩罚,惩罚的力度就可以通过gama来进行控制,同理如果我们后面节点值w比较大的情况下,表示这一颗回归树在我们所有的回归树当中,其值的占比会比较大,比如我们有5颗回归树,我们xgboost模型得到的结果,其中某一颗回归树贡献了80%,说明xgboost模型过拟合的风险是比较高的,所以也需要对其进行惩罚,惩罚的力度可以通过lamda进行控制。

当第一颗到第t-1颗回归数都训练好了之后,下面红框中部分就变成了一个常量,在我们对第t颗回归树优化的时候,是没有价值的,可以直接删除掉,并且代入第t颗回归树正则项的公式:

得到下面的目标函数公式,可以看出当前待优化的正则项部分,只与当前要优化的这颗回归数的节点值w和节点个数T有关系。

目标拆解

接下来我们分析下,除了正则项外,左侧部分的处理

按照常规的机器学习思路,优化的时候可以使用梯度下降方法优化其中的参数,多次迭代就可以得到最后的结果,这个是常规训练模型的思路。但是我们的树模型是不适合使用梯度下降来做优化的,因为我们的树模型都是阶跃的,是不连续的。

但是我们的树模型是不适合使用梯度下降来做优化的,因为我们的树模型都是阶跃的,是不连续的。比如,下面这颗树,当x小于1时,为1,x大于等于1时为-1,可以看到其不是连续函数,我们是没法办法对其进行求导,梯度下降也是没有意义的。

那么,针对树模型,我们可以怎么做呢?首先我们回顾下回归树的工作流程,假设我们有5个训练样本,有两个特征x1和x2,其真实值为y,我们使用树模型的时候,每一个样本都会被划分到回归树其中的一个叶子节点。

此时,我们就可以得到每个样本的预测值,比如3和5,预测值为w1

当我们得到每个样本的预测值之后,就可以计算每个样本真实值和预测值的损失值是多少了,假设我们使用平方误差损失

再次看一下我们的目标函数,可以看到我们需要将所有样本的损失值累加起来,需要注意的是,遍历的顺序是按照样本的顺序来进行遍历的。

我们目标函数优化方向是希望找到一些合适的w,让所有样本损失值加起来是最小的,我们会发现,我们每一个损失值,只跟当前节点的节点值有关系,比如L3和L5只跟w1有关系。

每个w只能影响当前的叶子节点,我们只需要按照一个叶子节点为单位,将我们模型整体的损失值,换算成每个叶子节点的损失值累加也是可以的,目标函数优化目标就变成了每个叶子节点对应的损失值累加最小。

我们以第一个叶子节点为例,探讨其对应的损失值最小值怎么计算,第一个节点的损失函数累加变成了一个关于w1的一元二次方程,y3和y5都是已知的数据。w1很容易找到最值点【w1= y3+y5】。

沿着这个思想,我们可以将我们的目标函数改写成,从遍历样本改成遍历叶子节点,一共有T个叶子节点。

可以将上面的目标函数改写为下面的公式,将其拆解为以叶子节点的损失值累计和为单位的一个个的小目标。每一个小目标中只有一个变量w。

泰勒二级展开

上面我们已经假设我们的损失函数是平方误差函数,那么每个叶子节点在求损失值累加和的时候,都可以得到一个一元二次方程,通过求解w得到损失最小值。但是往往我们不会提前给定损失函数,我们可能会猜想有么有这么一种方法可以无视我们具体的损失函数,能够将目标函数中框出来部分,分解为包含w的一个公式。

其实可以采用泰勒公式实现我们的想法,在GBDT中我们使用的是泰勒一阶展开公式,在xgboost中我们需要使用的是泰勒二级展开公式【在不知道损失函数的情况,泰勒展开确实很给力】。

泰勒公式的作用是将一个函数展开成为一个多项式方式,做一个近似的表示【约等于】,阶数越高越精确。

下面举例:

那么对于我们的损失函数而言,yi 是一个常两,变量只有右侧的,其相当于多项式中的x,其中t-1那部分又是一个定值,wj 就相当于x-x0 ,

那么我们的目标函数按照泰勒二阶展开,就变成了一个关于wj 的一元二次函数。

第一个常量对于我们求最优解是没有任何意义的,我们可以直接将其删除。一阶梯度我们用gi 表示,二阶梯度我们使用hi 表示。

整理一下,得到下面的公式:

所以我们得到最后的目标函数为:

并且可以进一步去掉中括号:

合并 (1/2)λwj2 ,可得到:

小写的gi 表示一阶梯度,小写的 hi 表示二阶梯度。每一个样本我们都可以得到其gi 和 hi 。

那么一阶梯度和二阶梯度求和结果,用大写字母G和H表示,那么G1 就表示第一个节点中,g3 和 g5 之和,同样的H1 就表示H3和H5 之和。

可以看到,我们利用泰勒二级展开,将目标函数成功转化为了一个关于wj 有关的公式,因为我们使用的泰勒二级展开,所以其最高只能是二次幂,这样对我们接下来的优化和计算提供很大的便利。

最优的wj 和最优的目标函数obj

上面我们把目标函数利用泰勒二级展开,改写成了关于wj 有关的公式,本次讨论如何求解w,使得目标函数最小。

我们上面提到过,在求总体损失的时候,可以换算成求每一个叶子节点的损失累加和,只需要每一个叶子节点的损失值最小就好了。

用公式就可以表示为,将每一个w各个击破,分别求解即可:

因为其为一元二次方程,我们可以利用w = -(b/2a) 直接求解,但是我们需要知道这个一元二次方程的图像开口是向上的还是向下的。因为hi 是损失函数的二阶导,而我们的损失函数都是凸函数【都是有最小值的那种,对于凸函数,任意两点之间的函数值总是位于这两点连线下方或刚好在连线上】,不然就跟损失函数的含义相冲突了。凸函数的二阶导数一定是大于0 的,所以Hj 一定也是大于0 的。

λ作为超参数, 也是大于0 的,所以整体上二项式系数大于0,开口向上,可以利用w = -(b/2a) 直接求解每个叶子节点损失值最小值对应的w。

所以最优解w和最小目标函数可以表示为:

综上,我们在拿到一个个的样本之后,应该先计算出每个样本的一阶梯度【gj】和二阶梯度【hj】,进而计算每一个叶子节点对应的一阶梯度累加和【Gj】 and 二阶梯度累加和【Hj】。那么就可以计算出每个叶子节点的w值了,并且也可以计算出最小的目标函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机ubuntu配置opencv和opencv_contrib

前期准备 1.下载opencv和opencv_contrib源码 opencv-4.6.0:https://opencv.org/releases/ opencv_contrib-4.6.0:https://github.com/opencv/opencv_contrib 在ubuntu直接下载或者在window上下好传到虚拟机里都可以 自己找个地方把他们解压&#xf…

【Python篇】PyQt5 超详细教程——由入门到精通(终篇)

文章目录 PyQt5超详细教程前言第9部分:菜单栏、工具栏与状态栏9.1 什么是菜单栏、工具栏和状态栏9.2 创建一个简单的菜单栏示例 1:创建带有菜单栏的应用程序代码详解: 9.3 创建工具栏示例 2:创建带有工具栏的应用程序代码详解&…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688,功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算,可支持 16 路高清视频实时分析,灵活应对图像、语音、自…

多个路由器级联实现子网的方式

好久没写博客啦,最近搬家,换了网络环境,简单记录一下网络配置。 拓扑图就不画了,光猫 - > 华为TC7102路由 -> 华为AX2 Pro路由 -> 各种设备,简单表示就是这样。 原因是第一个路由是房东的,我希望自…

宝塔部署Vue项目解决跨域问题

一、前言 使用宝塔面板部署前端后端项目相比用命令行进行部署要简单许多,宝塔的可视化操作对那些对Linux不熟悉的人很友好。使用宝塔部署SpringBoot后端项目和Vue前端项目的方法如下: 1、视频教程 2、文字教程1 3、文字教程2 以上的教程完全可以按照步骤…

视频智能分析平台LntonAIServer视频质量诊断功能花屏、抖动、遮挡等检测

LntonAIServer新增了视频质量诊断功能,该功能专注于提升视频监控系统的稳定性和可用性,主要通过自动化检测来识别视频流中常见的质量问题,比如花屏、抖动、遮挡等问题。这些问题是影响视频监控效果的主要因素之一,而自动化的检测能…

解决el-table中使用el-input无法聚焦问题

在el-table中点击单元格时使用el-input或其他表单组件编辑单条数据。会出现聚焦不上的问题&#xff0c;需要手动点击才能够聚焦。究其原因是因为点击单元格时页面已自动聚焦到单元格&#xff0c;此时无法自动聚焦到对应的表单&#xff0c;需要手动设置。 <template><e…

操作系统八股总结

操作系统八股总结 操作系统的四大功能&#xff1a;进程控制&#xff0c;内存管理&#xff0c;设备管理&#xff0c;文件管理进程的定义:并发程序的执行&#xff0c;进程的同步与互斥进程的状态&#xff1a;创建&#xff0c;终止&#xff0c;就绪&#xff0c;运行&#xff0c;阻…

图论(2)

一、度 度统计的是一个节点上又多少条边 度出度入度 出度&#xff1a;统计以该节点为起始点箭头指向外面的边的条数 入度&#xff1a;统计箭头指向该节点的边数 度为1的节点为悬挂节点&#xff0c;边为悬挂边 用矩阵计算节点的度 二、握手定理 比如这里第一个集合里面有三…

blender图像如何分层导出?blender动画云渲染

在blender渲染时产品会被其他物体影响&#xff0c;这时候就可以用到blender中的阻隔&#xff1b;分层导出图像到PS中进行校色等后期处理。 在分层前&#xff0c;我们需要先打开渲染属性-胶片-透明&#xff0c;这样导出的图像才是透明背景的&#xff0c;反之会变成黑色底。 第一…

传统CV算法——边缘算子与图像金字塔算法介绍

边缘算子 图像梯度算子 - Sobel Sobel算子是一种用于边缘检测的图像梯度算子&#xff0c;它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子主要识别图像中亮度变化快的区域&#xff0c;这些区域通常对应于边缘。它是通过对图像进行水平和垂直方向的差分运算来…

VMware Fusion Pro 13 for Mac虚拟机软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 地址&#xff1a;www.macfxb.cn 二、开始安装 安装完成&#xff01;&#xff01;&#xff01;

【HarmonyOS NEXT】实现截图功能

【HarmonyOS NEXT】实现截图功能 【需求】 实现&#xff1a;实现点击截图按钮&#xff0c;实现对页面/组件的截图 【步骤】 编写页面UI Entry Component struct Screenshot {BuildergetSnapContent() {Column() {Image().width(100%).objectFit(ImageFit.Auto).borderRadi…

Webpack详解与配置环境

webpack&#xff1a;webpack网址 1、工作原理&#xff1a; Webpack是一个非常强大的静态模块的打包工具。从文件入口开始&#xff0c;递归解析以来关系&#xff0c;然后将所有模块打包成一个或多个budle文件。 2、webpack核心概念&#xff1a; Entry&#xff1a;入口起点(en…

基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表

首先借助STM32我们需要了解中断系统是如何构成的 会有一个中断源&#xff0c;也就是能够向CPU发出中断请求的设备或事件。中断源不分硬件和软件&#xff0c;也就是产生中断信号&#xff0c;就会执行中断服务函数 但是CPU是如何知道中断源产生后就找到对应的中断…

软件工程知识点总结(1):软件工程概述

1 什么是软件&#xff1f; 定义&#xff1a;计算机系统中的程序及其文档。 ——程序是计算机任务的处理对象和处理规模的描述&#xff1b; ——文档是为了便于了解程序所需要的阐明性资料。 2 软件的特点&#xff1f; 软件是无形的&#xff0c;不可见的逻辑实体 ——它的正确与…

828华为云征文|华为云服务器Flexus X搭建悟空crm管理系统——助力企业云上管理(解决APP Referer校验失败问题)

1、为什么我们企业会选择Flexus云服务器X实例来部署自己的CRM管理系统&#xff1f; 因为基于华为云Flexus X实例搭建CRM管理平台&#xff0c;可以从容面对企业内部瞬息万变的业务压力变化 2、华为云服务器Flexus X方案及优势&#xff1a; 灵活伸缩 搭配弹性伸缩服务AS及负载均…

Selenium 实现图片验证码识别

前言 在测试过程中&#xff0c;有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试&#xff0c;怎么做图片验证码识别&#xff1f;本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk&#xff1a;1.8 tessdata&…

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)

2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.…

复数随机变量(信号)的方差和协方差矩阵的计算

怎么计算复数随机变量的方差和协方差矩阵&#xff1f; 使得其与MATLAB中var函数和cov函数的结果一致。 前言 复信号在信号处理中随处可见&#xff0c;关于复信号&#xff08;复随机变量&#xff09;的方差和协方差矩阵该如何计算呢&#xff1f;本文给出了复信号的方差和协方差矩…