万字总结GBDT原理、核心参数以及调优思路

news2024/9/21 11:05:02

万字总结GBDT原理、核心参数以及调优思路

在机器学习领域,梯度提升决策树(Gradient Boosting Decision Tree, GBDT)以其卓越的预测性能和强大的模型解释能力而广受推崇。GBDT通过迭代地构建决策树,每一步都在前一步的残差上进行优化,从而实现对复杂数据模式的捕捉。本文将万字总结GBDT的工作原理、核心参数,以及如何高效地进行模型调优。从损失函数到树的构建,从正则化项到特征选择,我们将深入探讨GBDT的每一个细节,为读者提供全面的调优思路和实用技巧。

文章目录

  • 万字总结GBDT原理、核心参数以及调优思路
  • 一、GBDT的基本思想
  • 二、GBDT实现以及参数
    • 1.迭代过程
      • 1.1 初始预测结果的设置
      • 1.2 GBDT是如何使用回归器完成分类任务的
      • 1.3 GBDT的损失函数
    • 2.弱评估器结构
      • 2.1 GBDT中弱评估器的复杂度
      • 2.2 弗里德曼均方误差(梯度提升树中专门的不纯度衡量指标)
    • 3.GBDT的提前停止机制
    • 4.GBDT的袋外数据
  • 三、GBDT调参
  • 总结


一、GBDT的基本思想

梯度提升树(Gradient Boosting Decision Tree,GBDT)是提升法中的代表性算法,它即是当代强力的XGBoost、LGBM等算法的基石,也是工业界应用最多、在实际场景中表现最稳定的机器学习算法之一。在最初被提出来时,并没有规定他的弱评估器一定是树模型,GBDT被写作梯度提升机器(Gradient Boosting Machine,GBM),它融合了Bagging与Boosting的思想、扬长避短,可以接受各类弱评估器作为输入,在后来弱评估器基本被定义为决策树后,才慢慢改名叫做梯度提升树。受Boosting算法首个发扬光大之作AdaBoost的启发,GBDT中自然也包含Boosting三要素:
在这里插入图片描述
同时GBDT也遵循boosting算法的基本流程进行建模:
依据上一个弱评估器 的结果,计算损失函 ,并使用𝐿 自适应地影响下一个弱评估器 构建。集成模型输出的结果,受到整体所有弱评估器 ~ 的影响。
但与RandomForest和AdaBoost不同,GBDT在整体建树过程中做出了几个关键的改变:

  • 弱评估器:GBDT的弱评估器输出类型不再与整体集成算法输出类型一致。 对于AdaBoost或随机森林算法来说,当集成算法执行的是回归任务时,弱评估器也是回归器,当集成算法执行分类任务时,弱评估器也是分类器。但对于GBDT而言,无论GBDT整体在执行回归/分类/排序任务,弱评估器一定是回归器。GBDT通过sigmoid或softmax函数输出具体的分类结果,但实际弱评估器一定是回归器。(借助softmax或Sigmoid函数将输出的连续型结果转换成类别)

  • 损失函数:在GBDT当中,损失函数范围不再局限于固定或单一的某个损失函数(且不要求损失函数的值域,GBDT对损失函数几乎没有任何要求,唯一要求是可微)(在AdaBoost中损失函数是指数损失,值域必在[0,1]之间否则会出问题),而从数学原理上推广到了任意可微的函数。因此GBDT算法中可选的损失函数非常多,GBDT实际计算的数学过程也与损失函数的表达式无关。

  • 拟合残差(面试最爱问):GBDT依然自适应调整弱评估器的构建,但却不像AdaBoost(奠定的比较根源的点是:后面建立的弱评估器需要依赖于前面建立的弱评估器的结果来进行自适应的调整,Boosting算法之间的不同就在于自适应调整的方法不太一样)一样通过调整数据分布来间接影响后续弱评估器。相对的,GBDT通过修改后续弱评估器的拟合目标来直接影响后续弱评估器的结构。

  • 抽样思想:GBDT加入了随机森林中随机抽样的思想,在每次建树之前,允许对样本和特征进行抽样来增大弱评估器之间的独立性(也因此可以有袋外数据集)。虽然Boosting算法不会大规模地依赖于类似于Bagging的方式来降低方差,但由于Boosting算法的输出结果是弱评估器结果的加权求和,因此Boosting原则上也可以获得由“平均”带来的小方差红利。当弱评估器表现不太稳定时,采用与随机森林相似的方式可以进一步增加Boosting算法的稳定性。

二、GBDT实现以及参数

from sklearn.ensemble import GradientBoostingRegressor as GBR
from sklearn.ensemble import GradientBoostingClassifier as GBC
from sklearn.model_selection import cross_validate, KFold
gbr = GBR(random_state=1412) #实例化
result_gbdt = cross_validate(gbr,X,y,cv=cv
                             ,scoring="neg_root_mean_squared_error" #负根均方误差
                             ,return_train_score=True
                             ,verbose=True
                             ,n_jobs=-1)

注意:由于GBDT的弱评估器只能是回归树,所以并没有分类树相关的属性如class_weight等。

1.迭代过程

GBDT迭代过程

1.1 初始预测结果的设置

参数init:输入计算初始预测结果H0的估计器对象。

在该参数中,可以输入任意评估器(最理想的状况)、字符串"zero"(上述两者结果都不好的时候才会选择zero)、或者None对象(第二选择),默认为None对象。
初始预测结果的设置

1.2 GBDT是如何使用回归器完成分类任务的

由于GBDT中所有的弱评估器都是回归树,因此在实际调用梯度提升树完成分类任务时,需要softmax函数或sigmoid函数对回归树输出的结果进行处理
GBDT是如何使用回归器完成分类任务的

1.3 GBDT的损失函数

对于GBDT而言,损失函数可以是任意可微的函数。

  • 分类器中的loss:字符串型,可输入"deviance", “exponential”,默认值=“deviance”
    其中"deviance"直译为偏差,特指逻辑回归的损失函数——交叉熵损失,而"exponential"则特指AdaBoost中使用的指数损失函数。

GBDT的损失函数

2.弱评估器结构

2.1 GBDT中弱评估器的复杂度

  • max_depth

对GBDT来说,无论是分类器还是回归器,默认的弱评估器最大深度都为3,因此GBDT默认就对弱评估器有强力的剪枝机制,因此在控制过拟合方面,max_depth的调参空间并不大。

  • max_features

当GBDT等Boosting算法处于过拟合状态时,一般从数据上下手控制过拟合(例如,使用参数max_features,在GBDT中其默认值为None),毕竟当max_depth已经非常小时,其他精剪枝的参数如min_impurity_decrease一般发挥不了太大的作用。也因此,通常认为Boosting算法比Bagging算法更不容易过拟合,一般在相似的数据上,Boosting算法表现出的过拟合程度会较轻。

2.2 弗里德曼均方误差(梯度提升树中专门的不纯度衡量指标)

弗里德曼均方误差

3.GBDT的提前停止机制

对于任意需要迭代的算法,迭代的背后往往是损失函数的最优化问题。例如在逻辑回归中,在进行梯度下降的迭代时,是希望找到交叉熵损失函数的最小值;而在梯度提升树中,在一轮轮建立弱评估器过程中,也是希望找到对应损失函数的最小值。理想状态下,无论使用什么算法,只要能够找到损失函数上真正的最小值,那模型就达到“收敛”状态,迭代就应该被停止。

然而遗憾的是,我们和算法都不知道损失函数真正的最小值是多少,而算法更不会在达到收敛状态时就自然停止。在机器学习训练流程中,往往是通过给出一个极限资源来控制算法的停止,比如,通过超参数设置允许某个算法迭代的最大次数,或者允许建立的弱评估器的个数。因此无论算法是否在很短时间内就锁定了足够接近理论最小值的次小值、或者算法早已陷入了过拟合状态、甚至学习率太低导致算法无法收敛,大多数算法都会持续(且无效地)迭代下去,直到给与的极限资源全部被耗尽。对于复杂度较高、数据量较大的Boosting集成算法来说,无效的迭代常常发生,因此作为众多Boosting算法的根基算法,梯度提升树自带了提前停止的相关超参数。另外,逻辑回归看起来会自然停止,是因为逻辑回归内置提前停止机制。

GBDT的提前停止机制

4.GBDT的袋外数据

受到随机森林的启发,梯度提升树在每次建树之前,也允许模型对于数据和特征进行随机有放回抽样,构建与原始数据集相同数据量的自助集。在梯度提升树的原理当中,当每次建树之前进行随机抽样时,这种梯度提升树叫做随机提升树(Stochastic Gradient Boosting)。相比起传统的梯度提升树,随机提升树输出的结果往往方差更低(表现的更加稳定),但偏差略高。如果发现GBDT的结果高度不稳定(或者结果处于严重过拟合状态),则可以尝试使用随机提升树(打开控制抽样的参数)。

在GBDT当中,对数据的随机有放回抽样比例由参数subsample确定,当该参数被设置为1时,则不进行抽样,直接使用全部数据集进行训练。当该参数被设置为(0,1)之间的数字时,则使用随机提升树,在每轮建树之前对样本进行抽样(不为1的话是0.7或者0.8之类的)。对特征的有放回抽样比例由参数max_features确定,随机模式则由参数random_state确定,这两个参数在GBDT当中的使用规则都与随机森林中完全一致。
GBDT的袋外数据

三、GBDT调参

GBDT调参思路与贝叶斯优化

总结

欢迎关注我的公众号

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

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

相关文章

39 线程库

目录 thread类的简单介绍线程函数参数锁线程交替打印原子性操作库无锁CAS智能指针的线程安全单例模式的线程安全 1. thread类的简单介绍 在c11之前,涉及到多线程问题,都是和平台相关的,如windows和linux下各有自己的接口,这使得…

基于SpringBoot的网上书城管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术,基于SpringBoot框架 工具:Eclipse,MySQL 系统展示 首…

数图助推朝阳佳惠辽宁华联开启数字化导航、精细化管理新纪元!

近期,辽宁省著名零售企业朝阳佳惠与辽宁华联,秉持创新精神,大胆尝试,在品类空间管理方面推出了创新举措。引入了先进的数图可视化陈列管理系统,通过智能化、直观化的方式优化商品布局。此举不仅大幅提高了商品管理的效…

探索Qt的QVariant:灵活的数据交换机制

😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的…

windows的远程桌面连接docker

1. Docker容器中运行远程桌面服务 (RDP):您的Docker容器需要安装和运行远程桌面服务。通常,远程桌面服务在Windows操作系统上可用。如果您使用的是Linux容器,则需要安装一个支持RDP协议的桌面环境和RDP服务器。 2. 开放RDP端口:通…

【正点原子i.MX93开发板试用连载体验】项目计划和开箱体验

本文最早发表于电子发烧友:【   】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)https://bbs.elecfans.com/jishu_2438354_1_1.html 有一段时间没有参加电子发…

Java泛型的定义与运用

泛型 泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确…

飞时达土方计算软件:工程师的得力助手

初识飞时达 飞时达土方计算软件,如同一位默默无闻的工匠,静静地伫立在我的工作台上。它没有华丽的外表,也没有炫目的光环,但它的存在,却如同一盏明灯,照亮了我前行的道路。 初识飞时达,是在一…

Word文件打开密码设置:掌握这两种方法,保护你的文档安全

在日常工作和学习中,我们经常会使用Microsoft Word来创建和编辑文档。有时候,为了保护文档内容不被未经授权的人员查看或修改,我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密? 方法一:使用Word软件内置…

GTK是如何加密WLAN组播和广播数据的?

1. References WLAN 4-Way Handshake如何生成GTK?_tk bigtk gtk igtk-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中组播帧和广播帧的加密使用GTK密钥,其PTK的密钥结构如下图所示: GTK的组成…

【技术选型】FastDFS、OSS如何选择

【技术选型】FastDFS、OSS如何选择 开篇词:干货篇:FastDFS:OSS(如阿里云OSS): 总结篇:我是杰叔叔,一名沪漂的码农,下期再会! 开篇词: 文件存储该选…

YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

Open3D SVD算法实现对应点集配准

目录 一、概述 1.1基本思想 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2配准后点云 3.3变换矩阵 一、概述 在点云配准中,SVD(Singular Value Decomposition,奇异值分解)方法是一种常用的精确计算旋转和平移变…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器,监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

互联网医院系统,开发互联网医院设计哪些功能?

随着科技的进步和数字化转型的推动,互联网医院系统已成为现代医疗服务的重要组成部分。这一系统通过整合信息技术与医疗资源,为用户提供便捷、高效的医疗服务。以下是互联网医院系统的主要功能介绍。 1、在线咨询与诊断 互联网医院系统允许患者通过网络平…

信息打点web篇--端口扫描-waf识别-蜜罐识别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理信息打点时 服务器类型,端口扫描,waf类型,蜜罐的识别。 端口扫描 描述: 简单介绍一下,端口扫描就是扫描对方服务器开放了哪些端口。 我们从他的端口…

彩色图像(RGB)或灰度图像(Gray)转tensor数据(附img2tensor代码)

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

【fscan】Windows环境下的fscan安装与使用指南

Fscan是一款专为网络安全专业人士设计的多功能扫描工具,它能够帮助用户在Windows环境中执行高效的网络扫描任务。以下是关于Fscan的详细使用指南: 获取Fscan 要开始使用Fscan,首先需要从其GitHub仓库下载最新版本的预编译二进制可执行文件。…

AI数字人直播系统搭建开发

目录 前言: 一、数字人直播系统 在技术层面: 二、商业层面: 三、用户体验层面: 总结: 前言: 直播渠道是目前比较热门的售货方式,数字人直播作为一种新兴的直播形式,具有其独特…

提升爬虫OCR识别率:解决嘈杂验证码问题

引言 在数据抓取和网络爬虫技术中,验证码是常见的防爬措施,特别是嘈杂文本验证码。处理嘈杂验证码是一个复杂的问题,因为这些验证码故意设计成难以自动识别。本文将介绍如何使用OCR技术提高爬虫识别嘈杂验证码的准确率,并结合实际…