GBDT模型详解

article/2025/8/21 8:50:33

GBDT算法

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。

Boosting核心思想

Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。

Bagging 与 Boosting 的串行训练方式不同,Bagging方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。

GBDT详解

GBDT的原理

(1)所有弱分类器的结果相加等于预测值;

(2)每次都以当前预测为基准,下一个弱分类器去拟合误差函数对预测值的残差(预测值与真实值之间的误差)

(3)GBDT的弱分类器使用的是树模型

如下图所示是一个非常简单的帮助理解的示例,我们用GBDT去预测年龄:

第一个弱分类器(第一棵树)预测一个年龄(如20岁),计算发现误差有10岁;

第二棵树预测拟合残差,预测值6,计算发现差距还有4岁;

第三棵树继续预测拟合残差,预测值3,发现差距只有1岁了;

第四课树用1岁拟合剩下的残差,完成。

最终,四棵树的结论加起来,得到30岁这个标注答案(实际工程实现里,GBDT是计算负梯度,用负梯度近似残差)。

GBDT与负梯度近似残差

回归任务下,GBDT在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数:
l ( y i , y i ^ ) = 1 2 ( y i − y i ^ ) 2 l(y_i,\hat{y_i})=\frac{1}{2}(y_i-\hat{y_i})^2 l(yi,yi^)=21(yiyi^)2

损失函数的负梯度计算如下:
− [ ∂ l ( y i , y i ^ ) ∂ y i ^ ] = ( y i − y i ^ ) -[\frac{\partial l(y_i,\hat{y_i})}{\partial\hat{y_i}}]=(y_i-\hat{y_i}) [yi^l(yi,yi^)]=(yiyi^)

可以看出,当损失函数选用**「均方误差损失」时,每一次拟合的值就是(真实值-预测值),即残差。**

GBDT训练过程

我们来借助1个简单的例子理解一下 GBDT 的训练过程。

假设训练集只有4个人(A,B,C,D),他们的年龄分别为(14,16,24,26)。其中,A,B分别是高一和高三学生;C和D分别是应届毕业生和工作两年的员工。

我们先看看用回归树来训练,得到的结果如下图所示:

接下来改用 GBDT来训练。由于样本数据少,我们限定叶子节点最多为2(及每棵树都只有一个分支),并且限定树的棵树为2,最终训练得到的结果如下图所示:

上图中的树很好理解:A,B年龄较为相近,C,D年龄较为相近,被分为左右两支,每支用平均年龄作为预测值。

我们计算残差(即「实际值」-「预测值」),所以A的残差为:14-15=-1

这里A的「预测值」是指前面所有树预测结果累加的和,在当前情形下前序只有一棵树,所以直接是15,其他多树的复杂场景下需要累加计算作为A的预测值。

上图中的树就是残差学习的过程了:

把A,B,C,D的值换作残差-1、1、-1、1,再构建一棵树学习,这棵树只有两个值1和-1,直接分成两个节点:A、C在左边,B、D在右边。

这棵树学习残差,在我们当前这个简单的场景下,已经能保证预测值和实际值(上一轮残差)相等了。

我们把这棵树的预测值累加到第一棵树上的预测结果上,就能得到真实年龄,这个简单例子中每个人都完美匹配,得到了真实的预测值。

最终的预测过程是这样的:

1)A:高一学生,购物较少,经常问学长问题,真实年龄14岁,预测年龄A=15-1=14

2)B:高三学生,购物较少,经常被学弟提问,真实年龄16岁,预测年龄B=15+1=16

3)C:应届毕业生,购物较多,经常问学长问题,真实年龄24岁,预测年龄C=25-1=24

4)D:工作两年员工,购物较多,经常被学弟提问,真实年龄26岁,预测年龄D=25+1=26

综上,GBDT需要将多棵树的得分累加得到最终的预测得分,且每轮迭代,都是在现有树的基础上,增加一棵新的树去拟合前面树的预测值与真实值之间的残差。

梯度提升 vs 梯度下降

下面我们来对比一下「梯度提升」与「梯度下降」。这两种迭代优化算法,都是在每1轮迭代中,利用损失函数负梯度方向的信息,更新当前模型,只不过:

梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。
F = F T − 1 − ρ t ∇ F L ∣ F = F t − 1 L = ∑ i l ( y i , F ( x i ) ) \begin{split} &F=F_{T-1}-\rho_t\nabla_FL|_{F=F_{t-1}}\\ &L=\sum_{i}l(y_i,F(x_i)) \end{split} F=FT1ρtFLF=Ft1L=il(yi,F(xi))

梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
ω t = ω t − 1 − ρ t ∇ ω L ∣ ω = ω t − 1 L = ∑ i l ( y i , f ω ( ω i ) ) \begin{split} &\omega_t=\omega_{t-1}-\rho_t\nabla_{\omega}L|_{\omega=\omega_{t-1}}\\ &L=\sum_{i}l(y_i,f_{\omega}(\omega_i)) \end{split} ωt=ωt1ρtωLω=ωt1L=il(yi,fω(ωi))

GBDT优缺点

下面我们来总结一下 GBDT 模型的优缺点:

优点

预测阶段,因为每棵树的结构都已确定,可并行化计算,计算速度快。

适用稠密数据,泛化能力和表达能力都不错,数据科学竞赛榜首常见模型。

可解释性不错,鲁棒性亦可,能够自动发现特征间的高阶关系。

缺点

1)GBDT 在高维稀疏的数据集上,效率较差,且效果表现不如 SVM 或神经网络。

2)适合数值型特征,在 NLP 或文本特征上表现弱。

3)训练过程无法并行,工程加速只能体现在单颗树构建过程中。

随机森林 vs GBDT

相同点

1)都是集成模型,由多棵树组构成,最终的结果都是由多棵树一起决定。

2)RF 和 GBDT 在使用 CART 树时,可以是分类树或者回归树。

不同点

1)训练过程中,随机森林的树可以并行生成,而 GBDT 只能串行生成。

2)随机森林的结果是多数表决表决的,而 GBDT 则是多棵树累加之。

3)随机森林对异常值不敏感,而 GBDT 对异常值比较敏感。

4)随机森林降低模型的方差,而 GBDT 是降低模型的偏差。
可以是分类树或者回归树。

不同点

1)训练过程中,随机森林的树可以并行生成,而 GBDT 只能串行生成。

2)随机森林的结果是多数表决表决的,而 GBDT 则是多棵树累加之。

3)随机森林对异常值不敏感,而 GBDT 对异常值比较敏感。

4)随机森林降低模型的方差,而 GBDT 是降低模型的偏差。


http://chatgpt.dhexx.cn/article/rFd18B8X.shtml

相关文章

机器学习之集成学习:GBDT

目录 一、什么是GBDT 二、GBDT的理解 2.1、GBDT通俗解释 2.2、GBDT详解 三、GBDT的应用 3.1、二分类问题 3.2、多分类问题 3.3、回归问题 四、GBDT如何选择特征 五、GBDT优缺点 一、什么是GBDT GBDT,Gardient Boosting Decision Tree,梯度…

传统机器学习笔记7——GBDT模型详解

目录 前言一.GBDT算法1.1.Boosting1.2.GDBT1.2.1.GBDT与负梯度近似残差1.2.2.GDBT训练过程 二.梯度提升与梯度下降三.GDBT模型优缺点四.GDBT vs 随机森林 前言 上篇博文我们介绍了关于回归树模型的基本知识点,有不懂的小伙伴可以回到前面再看下,传统机器…

机器学习集成学习——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

移动端UI框架大比拼

1、vonic vonic是一个基于 vue.js 和 ionic 样式的 UI 框架,用于快速构建移动端单页应用 onic 依赖以下几个库,在创建 vonic 项目之前,请确保引入它们。 vue.js vue-router.js axios.js (vue.js 官方推荐的 ajax 方案) 中文文档 在线预览 …

手机/移动端的UI框架-Vant和NutUI

下面推荐2款手机/移动端的UI框架。 其实还有很多的框架,各个大厂都有UI框架。目前,找来找去,只有腾讯的移动端是setup语法写的TDesign,其他大厂,虽然都是VUE3写的,但是都还未改成setup的语法,而…

一:移动端UI框架mint-ui

官网按需引入的.babelrc写法是老的写法,配置的plugins一直报错是因为"component"后面不要[]直接跟{} 一:Mint-UI中按钮组件的使用 简介:Mint UI是基于 Vue.js 的移动端组件库.mint-ui官网链接 1.安装 // 安装 # Vue 1.x npm install mint-ui1 -S # Vue…

vue3使用的移动端UI框架,vue3.0 ui组件库

vue 3.0 项目中 element-ui form 表单元素中 仅 el-button 显示,其他不显示,如何解决? 谷歌人工智能写作项目:小发猫 在页面中引用了laydate插件,在显示的时候,字体图标一直显示不出来 typescript&#x…

值得推荐的Vue 移动端UI框架

1. Vant(支持Vue3) 是有赞前端团队基于有赞统一的规范实现的 Vue 组件库,提供了一整套 UI 基础组件和业务组件,这是我目前用过最好用的框架。 中文文档 | github地址 | 在线预览 2. Mint UI Mint UI 由饿了么前端团队推出的 M…

移动端UI框架总结

1. React Native 网站地址:React Native 中文网 使用React来编写原生应用的框架 GitHub:https://github.com/facebook/react-native 网站描述:Facebookt推出基于 React 的创建跨平台移动应用开发框架 React Native使你能够在Javascript和React的基础上获得完全一致的开发体验…

与运算()、或运算(|)、异或运算(^)的本质 及 用途,文末附加 位运算面试题

目录 一:与运算符(&)and 1、运算规则: 2、例如:3&5 3、用途: 1)判断 奇偶性 2)清零。 3)取一个数中指定位 二:或运算(|&#xff…

Python与或运算

今天碰到一道有意思的题目,看了之后发现自己对Python与或的理解还是欠缺,如下。 题目:求12…n 来源:Leetcode 如果不加限制,我们有很多方法计算该值,例如高斯公式,递归等。 我们思考下递归的解…

sql查询数据表某列的重复值并计数

查询sql为: SELECTdevice_id,count( device_id ) AS number FROMcms_sticker_member GROUP BYdevice_id HAVINGcount( device_id ) > 1 ORDER BYnumber DESC; 结果:

查询多个字段同时重复2次以上的记录的sql的次数

表数据如上图, 1.筛选 type、pid 重复的数据的次数大于等于2的 次数和对应的数据值 SELECT COUNT(*),TYPE,pid FROM AREA GROUP BY TYPE,pid HAVING COUNT(*)>2; 2.筛选 type、pid 重复的数据的次数大于等于2,并且对应的 pid和type值相反的重复的数…

sql查询、删除重复相同数据的语句或只保留一条数据

1、查询(字段1, 字段2, 字段3)全部重复相同的数据 SELECT * FROM 表 WHERE (字段1, 字段2, 字段3) IN (SELECT 字段1, 字段2, 字段3 FROM 表 GROUP BY 字段1, 字段2, 字段3 HAVING COUNT(*) > 1) ORDER BY 排序字段2、过滤(字段1, 字段…

分享SQL重复记录查询的几种方法

SQL重复记录查询的几种方法,需要的朋友可以参考一下 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 代码如下: select * from people where peopleId in (select peopleId from people group by peo…

SQL查询重复记录

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 2、删除表中多余的重复记录,重…

为什么int无法转换为Double????

规律:拆、装箱和升、降级两者可以在同一条语句中进行,但是一定要先拆箱或装箱再升级或者降级。。。 一条语句中,int无法转换为Double,因为这里涉及到先升级再装箱子,拆装箱一定要在升降级前面。。。。。 一条语句中&…

C++中int或double与string的相互转换

一、int转string 1.c11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_string (unsigned long val); string to_string (unsigned long …

java byte[]转int和double

一般无需java来处理byte字节的数据转成 int , C语言更适合干这事. 但是无奈遇到了这种需求. 网上百度了一小部分代码, 发现好多错误代码… 干脆自己手写了一遍… byte[]数据的格式协议文档如下: 先上使用代码 byte[] hex Base64.getDecoder().decode(data); int head Read…

详细讲解int、float与double的区别

最近为了看一下float的精确度仔细看了一下这三种数据在内存中的样子,看了一下别人的博客发现大家对精度都有这不同的定义,我自己也简单画了一下。 下面来主要讲解一下int、float与double三者的区别与详解 一、int(最简单的一种)…