机器学习中XGBoost算法调参技巧

图片

本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。

对于XGBoost来说,默认的超参数是可以正常运行的,但是如果你想获得最佳的效果,那么就需要自行调整一些超参数来匹配你的数据,以下参数对于XGBoost非常重要:

  • eta

  • num_boost_round

  • max_depth

  • subsample

  • colsample_bytree

  • gamma

  • min_child_weight

  • lambda

  • alpha

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文文章由粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自CSDN + 加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

XGBoost的API有2种调用方法,一种是我们常见的原生API,一种是兼容Scikit-learn API的API,Scikit-learn API与Sklearn生态系统无缝集成。我们这里只关注原生API(也就是我们最常见的),但是这里提供一个列表,这样可以帮助你对比2个API参数,万一以后用到了呢:

图片

如果想使用Optuna以外的超参数调优工具,可以参考该表。下图是这些参数对之间的相互作用:

图片

这些关系不是固定的,但是大概情况是上图的样子,因为有一些其他参数可能会对我们的者10个参数有额外的影响。

1、objective

这是我们模型的训练目标

图片

最简单的解释是,这个参数指定我们模型要做的工作,也就是影响决策树的种类和损失函数。

2、num_boost_round - n_estimators

num_boost_round指定训练期间确定要生成的决策树(在XGBoost中通常称为基础学习器)的数量。默认值是100,但对于今天的大型数据集来说,这还远远不够。

增加参数可以生成更多的树,但随着模型变得更复杂,过度拟合的机会也会显著增加。

从Kaggle中学到的一个技巧是为num_boost_round设置一个高数值,比如100,000,并利用早停获得最佳版本。

在每个提升回合中,XGBoost会生成更多的决策树来提高前一个决策树的总体得分。这就是为什么它被称为boost。这个过程一直持续到num_boost_round轮询为止,不管是否比上一轮有所改进。

但是通过使用早停技术,我们可以在验证指标没有提高时停止训练,不仅节省时间,还能防止过拟合

有了这个技巧,我们甚至不需要调优num_boost_round。下面是它在代码中的样子:

 # Define the rest of the paramsparams = {...}# Build the train/validation setsdtrain_final = xgb.DMatrix(X_train, label=y_train)dvalid_final = xgb.DMatrix(X_valid, label=y_valid)bst_final = xgb.train(params,dtrain_final,num_boost_round=100000 # Set a high numberevals=[(dvalid_final, "validation")],early_stopping_rounds=50, # Enable early stoppingverbose_eval=False,)

上面的代码使XGBoost生成100k决策树,但是由于使用了早停,当验证分数在最后50轮中没有提高时,它将停止。一般情况下树的数量范围在5000-10000即可。控制num_boost_round也是影响训练过程运行时间的最大因素之一,因为更多的树需要更多的资源。

3、eta - learning_rate

在每一轮中,所有现有的树都会对给定的输入返回一个预测。例如,五棵树可能会返回以下对样本N的预测:

 Tree 1: 0.57   Tree 2: 0.9   Tree 3: 4.25   Tree 4: 6.4   Tree 5: 2.1

为了返回最终的预测,需要对这些输出进行汇总,但在此之前XGBoost使用一个称为eta或学习率的参数缩小或缩放它们。缩放后最终输出为:

 output = eta * (0.57 + 0.9 + 4.25 + 6.4 + 2.1)

大的学习率给集合中每棵树的贡献赋予了更大的权重,但这可能会导致过拟合/不稳定,会加快训练时间。而较低的学习率抑制了每棵树的贡献,使学习过程更慢但更健壮。这种学习率参数的正则化效应对复杂和有噪声的数据集特别有用。

学习率与num_boost_round、max_depth、subsample和colsample_bytree等其他参数呈反比关系。较低的学习率需要较高的这些参数值,反之亦然。但是一般情况下不必担心这些参数之间的相互作用,因为我们将使用自动调优找到最佳组合。

4、subsample和colsample_bytree

子抽样subsample它将更多的随机性引入到训练中,从而有助于对抗过拟合。

Subsample =0.7意味着集合中的每个决策树将在随机选择的70%可用数据上进行训练。值1.0表示将使用所有行(不进行子抽样)。

与subsample类似,也有colsample_bytree。顾名思义,colsample_bytree控制每个决策树将使用的特征的比例。Colsample_bytree =0.8使每个树使用每个树中随机80%的可用特征(列)。

调整这两个参数可以控制偏差和方差之间的权衡。使用较小的值降低了树之间的相关性,增加了集合中的多样性,有助于提高泛化和减少过拟合。

但是它们可能会引入更多的噪声,增加模型的偏差。而使用较大的值会增加树之间的相关性,降低多样性并可能导致过拟合。

5、max_depth

最大深度max_depth控制决策树在训练过程中可能达到的最大层次数。

图片

更深的树可以捕获特征之间更复杂的相互作用。但是更深的树也有更高的过拟合风险,因为它们可以记住训练数据中的噪声或不相关的模式。为了控制这种复杂性,可以限制max_depth,从而生成更浅、更简单的树,并捕获更通用的模式。

Max_depth数值可以很好地平衡了复杂性和泛化。

6、7、alpha,lambda

这两个参数一起说是因为alpha (L1)和lambda (L2)是两个帮助过拟合的正则化参数。

与其他正则化参数的区别在于,它们可以将不重要或不重要的特征的权重缩小到0(特别是alpha),从而获得具有更少特征的模型,从而降低复杂性。

alpha和lambda的效果可能受到max_depth、subsample和colsample_bytree等其他参数的影响。更高的alpha或lambda值可能需要调整其他参数来补偿增加的正则化。例如,较高的alpha值可能受益于较大的subsample值,因为这样可以保持模型多样性并防止欠拟合。

8、gamma

如果你读过XGBoost文档,它说gamma是:

在树的叶节点上进行进一步分区所需的最小损失减少。

英文原文:the minimum loss reduction required to make a further partition on a leaf node of the tree.

我觉得除了写这句话的人,其他人都看不懂。让我们看看它到底是什么,下面是一个两层决策树:

图片

为了证明通过拆分叶节点向树中添加更多层是合理的,XGBoost应该计算出该操作能够显著降低损失函数。

但“显著是多少呢?”这就是gamma——它作为一个阈值来决定一个叶节点是否应该进一步分割。

如果损失函数的减少(通常称为增益)在潜在分裂后小于选择的伽马,则不执行分裂。这意味着叶节点将保持不变,并且树不会从该点开始生长。

所以调优的目标是找到导致损失函数最大减少的最佳分割,这意味着改进的模型性能。

9、min_child_weight

XGBoost从具有单个根节点的单个决策树开始初始训练过程。该节点包含所有训练实例(行)。然后随着 XGBoost 选择潜在的特征和分割标准最大程度地减少损失,更深的节点将包含越来越少的实例。

图片

如果让XGBoost任意运行,树可能会长到最后节点中只有几个无关紧要的实例。这种情况是非常不可取的,因为这正是过度拟合的定义。

所以XGBoost为每个节点中继续分割的最小实例数设置一个阈值。通过对节点中的所有实例进行加权,并找到权重的总和,如果这个最终权重小于min_child_weight,则分裂停止,节点成为叶节点。

上面解释是对整个过程的最简化的版本,因为我们主要介绍他的概念。

总结

以上就是我们对这 10个重要的超参数的解释,如果你想更深入的了解仍有很多东西需要学习。所以建议给ChatGPT以下两个提示:

 1) Explain the {parameter_name} XGBoost parameter in detail and how to choose values for it wisely.2) Describe how {parameter_name} fits into the step-by-step tree-building process of XGBoost.

它肯定比我讲的明白,对吧。

最后如果你也用optuna进行调优,请参考以下的GIST:
https://gist.github.com/BexTuychiev/823df08d2e3760538e9b931d38439a68

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

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

相关文章

消息队列前世今生 字节跳动 Kafka #创作活动

消息队列前世今生 1.1 案例一: 系统崩溃 首先大家跟着我想象一下下面的这个的场景, 看到新出的游戏机,太贵了买不起,这个时候你突然想到,今天抖音直播搞活动,打开抖音搜索,找到直播间以后&am…

基于HarmonyOS ArkUI实现七夕壁纸轮播

七夕情人节,为了Ta,你打算用什么方式表达爱?是包包、鲜花、美酒、巧克力,还是一封充满爱意的短信?作为程序员,以代码之名,表达爱。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Ima…

qt信号槽同步问题

目录 信号槽: 注意事项: 具体例子: 线程安全问题的例子: 信号槽: 在Qt编程中,信号(Signal)和槽(Slot)是一种用于在对象之间进行通信的机制。信号用于发出…

ubuntu22安装和部署Kettle8.2

前提 kettle是纯java编写的etl开源工具,目前kettle7和kettle8都需要java8或者以上才能正常运行。所以运行kettle前先检查java环境是否正确配置,java版本是否是8或者以上。 kettle安装 1、创建kettle目录,并将kettle的zip包解压到kettle目…

推荐前 6 名 JavaScript 和 HTML5 游戏引擎

推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 事实是,自从引入JavaScript WebGL API以来,现代浏览器具有直观的功能,使它们能够渲染更复杂和复杂的2D和3D图形,而无需依赖第三方插件。 你可以用纯粹的JavaScript开…

使用ffmpeg将WebM文件转换为MP4文件的简单应用程序

tiktok网上下载的short视频是webm格式的,有些程序无法处理该程序,比如roop程序,本文介绍了如何使用wxPython库创建一个简单的GUI应用程序,用于将WebM文件转换为MP4文件。这个应用程序使用Python编写,通过调用FFmpeg命令…

研磨设计模式day13组合模式

目录 场景 不用模式实现 代码实现 有何问题 解决方案 代码改造 组合模式优缺点 思考 何时选用 场景 不用模式实现 代码实现 叶子对象 package day14组合模式;/*** 叶子对象*/ public class Leaf {/*** 叶子对象的名字*/private String name "";/**…

第十四课:采用 Qt 开发翻页/分页/多页窗体组件

功能描述:采用 Qt 开发一个翻页/分页/多页的窗体组件,封装为 QWidget 的子类,在你的应用程序中可直接使用。 一、最终演示效果 本次制作的翻页/分页/多页窗体组件是基于 Qt 开发,整个程序封装成 PageWidget 类,继承于…

5G NR:协议 - PDCCH信道

1、基本概念 不同于LTE中的控制信道包括PCFICH、PHICH和PDCCH,在5G NR中,控制信道仅包括PDCCH(Physical Downlink Control Channel),负责物理层各种关键控制信息的传递,PDCCH中传递的下行控制信息&#xff…

507页XX市应急管理局智慧矿山煤矿数字化矿山技术解决方案

导读:原文《507页XX市应急管理局智慧矿山煤矿数字化矿山技术解决方案》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 部分内容: 第一章 项…

Git基础教程-常用命令整理:学会Git使用方法和错误解决

目录 一、了解Git的基本概念 二、Git的安装和配置 Git的安装 Git的配置 用户信息 文本编辑器 差异分析工具 查看配置信息 三、Git的基本操作 基本原理 基本操作命令 基本操作示例 场景一:创建新仓库 场景二:拉取并编辑远程仓库 四、常见问…

ModaHub魔搭社区:将图像数据添加至Milvus Cloud向量数据库中

将图像数据添加至向量数据库中 图像分割裁剪完成后,我们就可以将其添加至 Milvus Cloud 向量数据库中了。为了方便上手,本项目中使用了 Milvus Lite 版本,可以在 notebook 中运行 Milvus 实例。接下来,使用 PyMilvus 连接至 Milvus Lite 提供的默认服务器。 这一步骤中,…

量化:pandas基础

文章目录 简介Series构造 DataFrame构造列的查改增删填充默认值用loc与iloc取数据条件选择 简介 pandas是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构。 pandas主要的两种数据结构为Series和DataFrame,分别用于处理一维和二维数据。…

掌握C/C++协程编程,轻松驾驭并发编程世界

一、引言 协程的定义和背景 协程(Coroutine),又称为微线程或者轻量级线程,是一种用户态的、可在单个线程中并发执行的程序组件。协程可以看作是一个更轻量级的线程,由程序员主动控制调度。它们拥有自己的寄存器上下文…

常见API架构介绍

常见API架构介绍 两个服务间进行接口调用,通过调用API的形式进行交互,这是常见CS架构实现的模式,客户端通过调用API即可使用服务端提供的服务。相较于SPI这种模式,就是服务端只规定服务接口,但具体实现交由第三方或者自…

https 的ssl证书过期处理解决方案(lighthttpd)

更换证书:lighthttpd 配置文件位置:/opt/vmware/etc/lighttpd/lighttpd.conf (配置文件的最底部 G快速来到底部) 方案一:阿里云申请免费的证书 这里公司内网环境没有配置域名,可以创建一个临时域名&…

【JS真好玩】自动打字机效果

目录 一、前言二、布局分析三、总体样式四、中间部分五、底部5.1 div5.2 label5.3 input 六、JS让它动起来6.1定时器6.2 字符串处理6.2.1 slice6.2.2 splice6.3.3 split 七、总结 一、前言 大家好,今天实现一个自动打字机效果,旨在实现一些网上很小的de…

uniapp国际化npm install vue-i18n报错

npm install vue-i18n //npmyarn add vue-i18n //yarn在vue2环境下,默认安装 npm install vue-i18n 的版本是 vue-i18n9.1.9,所以报错。 npm view vue-i18n versions --json 用以上命令查看版本: vue2建议5.0版本 npm install vue-i1…

python可视化matplotlib——绘制正弦和余弦

这是一个使用matplotlib库绘制正弦和余弦函数曲线的代码示例。代码中导入了需要的库,并设置了x轴和y轴的标签字体为华文楷体。然后,使用numpy生成一组x轴上的值t,并使用正弦函数生成对应的y轴值s,再使用余弦函数生成对应的y轴值z。…

【LeetCode-中等题】24. 两两交换链表中的节点

文章目录 题目方法一:递归方法二:三指针迭代 题目 方法一:递归 图解: 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…