【机器学习】比较全面的XGBoost算法讲解

news2024/12/26 21:12:58

本文是《机器学习入门基础》(黄海广著)的第十章的部分内容。

XGBoost算法

XGBoost是2014年2月由华盛顿大学的博士生陈天奇发明的基于梯度提升算法(GBDT)的机器学习算法,其算法不但具有优良的学习效果,而且训练速度高效,在数据竞赛中大放异彩。

XGBoost 是大规模并行Boosting Tree 的工具,它是性能和速度俱佳的开源Boosting Tree 工具包,比常见的工具包快很多倍。XGBoost 和 GBDT 两者都是Boosting 方法,除了工程实现、解决问题上的一些差异外,最大的不同就是目标函数的定义。

10.5.1 算法思想

XGBoost算法原理主要是以下几个方面:

1.防止过拟合

机器学习算法的泛化误差可以分为偏差(Bias)和方差(Variance)两部分。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。

如图10-9所示,随着机器学习的模型复杂度增加,偏差越来越小,但方差却越来越大,而当模型越简单时,模型的方差很小,偏差却往往越大,也就是说,高方差导致过拟合,而高偏差导致欠拟合。

21e3b1e46cb4644319d1df43f041df0c.png

图10-9 机器学习方差和偏差

XGBoost有效解决了过拟合问题,对叶节点的权重进行了惩罚,防止过拟合,惩罚相当于添加了正则项,即目标函数为:训练损失加上正则项。

2.采用二阶泰勒展开加快收敛

GBDT的损失函数用了一阶收敛,用到了梯度下降,XGBoost的方法是用牛顿法进行二阶收敛,即将损失函数做二阶泰勒展开,使用前两阶作为改进的残差。梯度下降法是用了目标函数的一阶偏导数,而牛顿法就是用用了目标函数的二阶偏导数,二阶偏导数考虑了梯度的变化趋势,所以牛顿法会更容易收敛。图10-10显示了牛顿法(左)和梯度下降法(右)的迭代路径,可以发现,左边的路径更符合最优下降路径。使用二阶收敛,这也是XGBoost加快收敛的原因。

30c8b51c43ab4675a769cec8e3babcfc.png

图10-10 牛顿法(左)和梯度下降法(右)

3.树构造的分裂条件采用导数统计量

在寻找最佳分割点时,XGBoost 也实现了一种完全搜索式的精确的贪心算法(Exact Greedy Algorithm)。这种搜索算法会遍历一个特征上所有可能的分裂点,分别计算其损失减小量,然后选择最优的分裂点。根据结构分数的增益情况计算出来选择哪个特征的哪个分割点,某个特征的重要性,就是它在所有树中出现的次数之和。即增益(Gain)计算完了之后会选择一个增益最高的特征来分裂,然后这个特征的重要性加1。

4.支持并行计算,可以采用多线程优化技术

XGBoost的并行,并不是说每棵树可以并行训练,XGBoost本质上仍然采用boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。

XGBoost的并行,指的是特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。

10.5.2 XGBoost算法推导

XGBoost中最主要的基学习器为CART(分类与回归树),这里定义是叶子的权重, 是将每个节点分配给叶子的函数,是树的数量,并定义为一个常数。假设前步迭代优化得到的模型为,在第步中,待求参数为,则第步的目标函数为:

公式(10.14)第一部分是预测值和目标真实值之间的训练误差,第二部分是每棵树的复杂度之和。

根据泰勒展开公式,使用了二阶泰勒展开:

把看成则,就可以看成,则:

公式(10.16)中:

为的一阶偏导数:

为的二阶偏导数:

则公式(10.14)可以转化为:

在这里,我们首先改进一棵树的定义 如下:

在 XGBoost 中,我们将复杂度定义为:

γ

则目标函数可以定义为:

很明显,是一个常数,可以用替代,对于目标函数无影响,则目标函数可以转换为:

γ

其中定义是分配给第  个叶子的数据点的索引的集合。因为在同一叶子上,所有数据点的分数相同,所以在第二行中,我们更改了总和的索引。因此公式(10.23)等价于:

γγ

即:

γ

我们可以通过定义,来进一步压缩表达式,则:

γ

对求偏导,如果有一个给定的树的结构,那么在上式达到最小的情况下(即导数为0),得到:

则:

γ

并且得到相对应的最优目标函数值:

以图10-11为例:

1d283142e729f20b68785a163c8d1c98.png

图10-11 决策树案例

根据已知的数据,得到相应的参数如图10-12:

0649673cc6683e64a604f9e61813a1b7.png

图10-12 决策树参数

图10-12的数据,,根据公式(10.30),则:

$分数越小,代表这个树的结构越好。

在寻找最佳分割点时,使用一种完全搜索式的精确贪心算法(Exact Greedy Algorithm)。这种搜索算法会遍历一个特征上所有可能的分裂点,分别计算其损失减小量,然后选择最优的分裂点。精确贪心算法的流程见算法10.1。

算法10.1精确贪心算法

56d6bc98b12b76b325aa687150c592db.png

算法思路:

由于树的结构是未知的,而且也不可能去遍历所有的树结构。因此,XGBoost采用贪婪算法来分裂节点,从根节点开始,遍历所有属性,遍历属性的可能取值,计算复杂度是:决策树叶子节点数减去1。根据定义,记分到左、右子树的样本集为、,,则分裂该节点导致的损失减少值为:

即:

其中:为分割后左子树的分数,为分割后右子树的分数,为未分割的树的分数,为新叶子的正则化项,即加入新叶子节点引入的复杂度代价,我们希望找到一个属性以及其对应的大小,使得取值最大。

10.5.3 XGBoost算法总结

XGBoost是算法竞赛中最热门的算法之一,它将GBDT的优化走向了一个极致:

(1) XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。

(2) XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。

(3) XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳分割点时可以开启多线程进行,大大提高了运行速度。当然,后续微软又出了LightGBM,在内存占用和运行速度上又做了不少优化,但是从算法本身来说,优化点则并没有比XGBoost多。

原文出自这本书:

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

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

相关文章

【软件测试】测试的分类

目录 测试的分类 1.按测试对像划分 ⭐1.界面测试 2.可靠性测试 3.容错性测试 4.文档测试 ⭐5.兼容性测试: ⭐6.易用性测试: ⭐7.安装卸载测试 ⭐8. 安全测试: ⭐9.性能测试 10.内存泄漏测试 2.按是否查看代码划分 1.黑盒测试(…

Html + Jquery + Vue前端学习笔记

文章目录 一,Vue1,v-model 数据绑定2,生成描述列表 二,HtmlJquery1,动态修改类名2,layui手风琴效果3,输入框样式修改4,多行文本显示省略号5,div内容居右6,字符…

Mysql基础教程

SELECT Company FROM Orders SQL 简介 SQL 教程SQL 语法 SQL 是用于访问和处理数据库的标准的计算机语言。 什么是 SQL? SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机语言 编者注:ANSI,美国国家标准化…

HDFS之Java客户端操作

HDFS之Java客户端操作 文章目录 HDFS之Java客户端操作写在前面准备Windows关于Hadoop的开发环境下载依赖配置HADOOP_HOME环境变量配置Path环境变量 创建Maven工程XML文件创建新的Package创建HdfsClient类执行程序 HDFS的API操作 写在前面 Hadoop版本:Hadoop-3.1.3L…

CentOS忘记密码重置密码教程

文章目录 前言背景介绍:操作步骤 前言 今天打开了很久没有用过的CentOS虚拟机,然后发现我好像将所有的密码全部忘记了,根本登录不进去,最终在网找到了解决办法,这里记录一下,希望对大家有帮助 背景介绍&a…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电,开发板正常启动后,使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下,然后使用以下命令对开机自启动脚本 rcS 进行查看,如下图所示: vi rcS 从上…

机器学习优化器和SGD和SGDM实验对比(编程实现SGD和SGDM)

机器学习优化器和SGD和SGDM实验对比 博主最近在学习优化器,于是呢,就做了一个SGD和SGDM的实验对比,可谓是不做不知道,一做吓一跳,这两个算法最终对结果的影响还是挺大的,在实验中SGDM明星要比SGD效果好太多…

HHU云计算期末复习(下)Hadoop、虚拟化技术、openstack

文章目录 第五章 Hadoop分布式文件系统HDFS分离元数据和数据:NameNode和DataNode流水线复制 第七章 虚拟化技术7.1 虚拟化技术简介7.2 虚拟机迁移7.3 网络虚拟化 第八章 openstack8.1 计算服务NovaRabbitMQ 8.2 Swift 第九章 云计算数据中心9.1 云数据中心特征9.2 网…

Android firebase google登录配置流程和app内测发布流程

googlePlay使用OAuth2.0保护账号安全,且与firebase相关。如果配置错误,会出现error code比如: 10: auth,如clientId不对; 7: 网络或墙的问题; 12500:签名问题。 正确配置流程 Relea…

【Redis】不卡壳的 Redis 学习之路:事务

本文是Redis系列第三篇,前两篇欢迎移步 【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确&#x…

2.Apache Hive

Apache Hive概述 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hivev查询语言(HQL)&#xf…

SpringBoot3之GraalVM之Windows详细安装及使用教程

配置Maven环境变量 我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 %MAVEN_HOME%\bin安装Visual Studio Community 因为GraalVM需要调用操作系统的底层工具,而Windows底层工具是VisualStudio,所以我们要先下载…

2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题,共50分) 1.数据文件“abc.txt”中包含若干个英文单词,如图所示: 读取文件“abc.txt”中数据的Python程序段如下: file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wo…

Flink报错大全

1.flink版本由1.13.6提升到1.15.2 maven jar依赖问题 官方因为1.15.2弃用了2.11版本的scala,jar的命名也发生改变,部分默认的2.12版本的scala不用再特声明 1.15.2版本maven依赖 <repositories><repository><id>aliyunmaven</id><name>阿里云…

构建交互式颜色选择器:介绍Gradio的ColorPicker模块和方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

环二肽试剂:Cyclo(-Hyp-Gly),环二肽含有一个六元环结构,结构稳定

编辑作者|陕西新研博美生物科技有限公司​ 英文名称&#xff1a;Cyclo(-Hyp-Gly) 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;N/A 分子式&#xff1a;C7H10N2O3 分子量&#xff1a;170.17Cyclo(-Hyp-Gly)结构式&#xff1a; 反应机理&#xff1a; Cyclo(-Hyp-Gly)环二肽…

【vscode设置默认浏览器为google,配置默认浏览器没有google,VS Code 报Windows找不到文件‘chrome‘】

问题描述 VS Code 报Windows 找不到‘chrome’ 项目启动ctar鼠标左键快捷打开并没有使用默认浏览器 并且自己去浏览器配置并提供完整的选项 解决方案&#xff1a; 网上有很多其他的答案不过对我都没有 最后解决是在google里配置 不是默认浏览器会有个按钮 点一下就跳转到系统…

设计模式第19讲——命令模式(Command)

目录 一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象命令&#xff08;Command&#xff09;——Command 5.2 接收者&#xff08;Receiver&#xff09;——Chef 5.3 具体命令&#xff08;Co…

第十六章、Spring AOP开发中的一个坑

坑&#xff1a;在同⼀个业务类中&#xff0c;进⾏业务⽅法间的相互调⽤&#xff0c;只有最外层的⽅法,才是加⼊了额外 功能的(内部的⽅法&#xff0c;通过普通的⽅式调⽤&#xff0c;都调⽤的是原始⽅法)。如果想让内层的⽅法也 调⽤代理对象的⽅法&#xff0c;就要实现Appicat…

如何在SQL Server中实现Ungroup操作

概要 我们经常在SQL Server中使用group by语句配合聚合函数&#xff0c;对已有的数据进行分组统计。本文主要介绍一种分组的逆向操作&#xff0c;通过一个递归公式&#xff0c;实现ungroup操作。 代码和实现 我们看一个例子&#xff0c;输入数据如下&#xff0c;我们有一张产…