机器学习之集成学习:GBDT

article/2025/8/21 9:07:53

目录

一、什么是GBDT

二、GBDT的理解

2.1、GBDT通俗解释 

2.2、GBDT详解

三、GBDT的应用

3.1、二分类问题 

3.2、多分类问题 

3.3、回归问题

四、GBDT如何选择特征

五、GBDT优缺点


一、什么是GBDT

GBDT,Gardient Boosting Decision Tree,梯度提升树,是一种属于boosting思想的迭代决策树。

提升树是采用前向分布算法训练多个弱学习器,而每个弱学习器用CART回归树构建,然后将多个弱学习器采用加法模型结合起来,作为最终的强学习器。GBDT属于boosting模型,所以每个弱分类器之间是有联系的,GBDT的后一个弱分类器训练的是前一个弱分类器损失的梯度,这样每次迭代都向着损失减小的方向,最终得到最优解。

二、GBDT的理解

2.1、GBDT通俗解释 

提升树模型可表示为以决策树为基学习器的加法模型,具体公式为:\large f(x)=f_{M}(x)=\sum_{m=1}^{M}h_{m}(x;\alpha _{m})

其中,\small h_{m}(x;\alpha _{m})表示第m棵决策树,M表示基学习器的数量,\small \alpha _{m}表示第m棵学习器的参数,比如叶子节点个数、树的深度等等。

那么如何求解加法模型呢?这里就要用到前向分布算法了,其实也就是用最直观的迭代求解。 

首先初始化:f_{0}(x)=0

第m部的模型为:f_{m}(x)=f_{m-1}(x)+h(x;\alpha _{m})

通过最小化经验风险,也就是损失函数最小化来求解:\alpha _{m}=arg min _{\alpha _{m}}\sum_{i=1}^{N}L(y_{i},f_{m}(x_{i}))

这里的L()为损失函数,回归常用的损失函数为MSE、绝对损失、Huber损失和分位数损失。分类常用的损失函数为指数损失和对数损失。

2.2、GBDT详解

上面说到要损失函数最小化,那么如何来进行损失函数最小化呢?梯度下降法是我们首先想到的,当我们进行GBDT回归时,如果损失函数为MSE,那么我们可以很方便的求梯度,找到最优解——残差。残差是指真实值与预测值之间的误差,对于损失函数:L=\frac{1}{2}\sum_{i=1}^{N}(y_{i}-f(x_{i}))^2,对其求导可得最优解为(y_{i}-f(x_{i})),这就是残差的由来。

残差是回归模型的损失为MSE的一种特殊情况,但一般情况下损失函数求导并不方便,前向分布优化并不顺利,因此利用损失函数的负梯度在当前模型的值\large -\left [\frac{\partial L(y,f(x_{i}))}{\partial f(x_{i})} \right ]_{f_{m}(x)=f_{m-1}(x)}作为回归问题提升树算法的残差近似值,拟合一个回归树,成为了GDBT的核心思想。

三、GBDT的应用

3.1、二分类问题 

二分类GBDT流程如下:

 

 

 

3.2、多分类问题 

 

 

3.3、回归问题

 

当使用MSE时,梯度求解就变成了残差,通过后续对残差的优化来拟合训练数据。这里不做详细介绍。

四、GBDT如何选择特征

不论将GBDT用于分类任务还是回归任务,GBDT的基学习器均为CART回归树,因为要拟合每一轮迭代的残差。所以选择特征的问题就变成了CART回归树构造如何选择特征。

但是在机器学习库sklearn中,用于分类的GBDT的基学习器可以用CART回归树,其特征选择可以基于基尼系数。

五、GBDT优缺点

优点:

  • 精度高,无论是分类还是回归任务
  • 可以处理非线性数据
  • 可以处理离散值和连续值
  • 使用一些健壮的损失函数,对异常值不敏感。比如 Huber损失函数和Quantile损失函数。

缺点:由于下一个学习器需要拟合上一个学习器的残差,所以必须穿行执行,无法并行,这也导致处理大型数据时速度特别慢。因此后来的XGBoost和LightGBM都是基于GBDT但在并行性上做出了改进。           


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

相关文章

传统机器学习笔记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(最简单的一种)…

c++ string转int, double,int,double转string

c string与常用数值变量互转 写了几个字符串与数值变量互相转换的几个函数,每次用到都要上网查一堆,耽误时间,写好放到这里备用。方法有很多,这里列出来测试过能用的,其他方法慢慢添加。以下函数自动判断int或者double…