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

万字总结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调参思路与贝叶斯优化

总结

欢迎关注我的公众号

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

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

相关文章

【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 ,本文我们接着来学习一道在面试中极大概率会被考到的经典题目:接雨水 问题 。 42. 接雨水 给定 n 个非负整数,表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子…

【高校科研前沿】中国农业大学姚晓闯老师等人在农林科学Top期刊发表长篇综述:深度学习在农田识别中的应用

文章简介 论文名称:Deep learning in cropland field identification: A review(深度学习在农田识别中的应用:综述) 第一作者及单位:Fan Xu(中国农业大学土地科学与技术学院) 通讯作者及单位&…

【电路笔记】-C类放大器

C类放大器 文章目录 C类放大器1、概述2、C类放大介绍3、C类放大器的功能4、C 类放大器的效率5、C类放大器的应用:倍频器6、总结1、概述 尽管存在差异,但我们在之前有关 A 类、B 类和 AB 类放大器的文章中已经看到,这三类放大器是线性或部分线性的,因为它们在放大过程中再现…

【WebGIS平台】传统聚落建筑科普数字化建模平台

基于上述概括出建筑单体的特征部件,本文利用互联网、三维建模和地理信息等技术设计了基于浏览器/服务器(B/S)的传统聚落建筑科普数字化平台。该平台不仅实现了对传统聚落建筑风貌从基础到复杂的数字化再现,允许用户轻松在线构建从…

Java线程池及面试题

1.线程池介绍 顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。 总结一下使用线程池的好处: 降低资源消耗。通过重复利用已创建的…

去除Win32 Tab Control控件每个选项卡上的深色对话框背景

一般情况下,我们是用不带边框的对话框来充当Tab Control的每个选项卡的内容的。 例如,主对话框IDD_TABBOX上有一个Tab Control,上面有两个选项卡,第一个选项卡用的是IDD_DIALOG1充当内容,第二个用的则是IDD_DIALOG2。I…

Git本地仓库的搭建与使用

目录 一、前言 二、Linux下搭建 git 仓库 三、Windows下搭建 git 仓库 一、前言 做项目时,我们常常需要将自己的代码进行托管,但有时候 Github 的速度属实叫人流泪。有的人会选择 Gitee 等进行托管代码,这当然是可以的。那如果没有其他代码…

linux使用chattr与lsattr设置文件/目录防串改

背景 linux服务器下,防止某个文件/目录被串改(增删改),可以使用chattr与lsattr设置,这是一种保护机制,用于防止意外地修改或删除重要的文件内容。 chattr与lsattr使用 1.设置目录 图中/tmp/zhk,设置目录属性文件可能被设置为不可更改(immutable)或者只追加(append …

java Web学习笔记(一)

1. 前置学习知识 JavaScript学习笔记 CSS3学习笔记 html学习笔记 2. Tomcat介绍 前端App的运行环境: 服务器 --> JRE --> Tomcat --> App Tomcat目录文件介绍 bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目…

leetcode判断二分图

判断二分图 图的问题肯定要用到深度优先遍历或者广度优先遍历,但又不是单纯的深度优先遍历算法和广度优先遍历算法,而是需要在遍历的过程中加入与解决题目相关的逻辑。 题干中说了,这个图可能不是连通图,这个提示有什么作用呢&a…

【状态估计】非线性非高斯系统的状态估计——离散时间的批量估计

上一篇文章介绍了离散时间的递归估计,本文着重介绍离散时间的批量估计。 上一篇位置:【状态估计】非线性非高斯系统的状态估计——离散时间的递归估计。 离散时间的批量估计问题 最大后验估计 目标函数 利用高斯-牛顿法来解决估计问题的非线性版本&a…

了解Adam和RMSprop优化算法

优化算法是机器学习和深度学习模型训练中至关重要的部分。本文将详细介绍Adam(Adaptive Moment Estimation)和RMSprop(Root Mean Square Propagation)这两种常用的优化算法,包括它们的原理、公式和具体代码示例。 RMS…

Studying-代码随想录训练营day34| 62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树

第34天,动态规划part02,牢记五部曲步骤,编程语言:C 目录 62.不同路径 63.不同路径II 343.整数拆分 96.不同的二叉搜索树 总结 62.不同路径 文档讲解:代码随想录不同路径 视频讲解:手撕不同路径 题目…

AI赋能,全面筑牢防线:重点非煤矿山重大灾害风险防控系统探析

一、背景需求 随着工业化和现代化的快速发展,非煤矿山作为重要的资源开采基地,其安全生产问题日益受到社会各界的广泛关注。非煤矿山在开采过程中,面临着诸多重大灾害风险,如滑坡、坍塌、水害、火灾等,这些灾害一旦发…

C基础day7

一、思维导图 二、课后练习 1、提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格以及其他字符的个数 #include<myhead.h> #define M 20 int main(int argc, const char *argv[]) {int sum_a0,sum_b0,sum_c0,sum_d0;char str[M];printf("please en…

用流式数据库解决「自动化检测服务器性能异常」难题

对 DevOps 团队来说&#xff0c;检测大量服务器的性能异常并尽快响应一直是个挑战。他们设置了各种指标来监控服务器性能&#xff0c;但诊断性能问题复杂且耗时&#xff0c;因为诊断数据的量可能非常大。越来越多的人认为这个过程应该自动化。但怎么做呢&#xff1f; 流式系统…

Chromium编译指南2024 Linux篇-同步Chromium第三方库(四)

1.引言 在成功拉取Chromium源码并创建新分支后&#xff0c;我们需要进一步配置开发环境。这包括拉取必要的第三方库以及设置hooks&#xff0c;以确保我们能够顺利进行编译和开发工作。以下步骤将详细介绍如何进行这些配置。 2.拉取第三方库以及hooks Chromium 使用了大量的第…

2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】

目录 ■概要 ■概要&#xff08;日语&#xff09; ■相关知识 openssh 和 ssh 有区别吗 如何查看 openssh的版本 漏洞描述 glibc Linux是什么 如何查看系统是不是基于 Gibc RHEL Linux 是基于Glibc的Linux吗 还有哪些 Linux版本是基于 GNU C库&#xff08;glibc&…

opencv读取视频文件夹内视频的名字_时长_帧率_分辨率写入excel-cnblog

看视频的时候有的视频文件名贼长。想要翻看&#xff0c;在文件夹里根本显示不出来&#xff0c;缩短又会丢失一些信息&#xff0c;所以我写了一份Python代码&#xff0c;直接获取视频的名字&#xff0c;时长&#xff0c;帧率&#xff0c;还有分辨率写到excel里。 实际效果如下图…

【2024——CUMCM】Matlab快速入门

目录 常识 disp and input 字符串合并 sum 提取矩阵指定位置的元素 指定行列 指定行or指定列&#xff08;返回行/列向量&#xff09; 指定某些行 指定全部元素&#xff0c;按列拼接 size repmat 矩阵的运算 基本运算 形状相同的矩阵运算 每个元素同时和常数相乘或相…