机器学习:梯度提升树(GBDT)——基于决策树的树形模型

news2024/11/24 17:41:12

        梯度提升树(Gradient Boosting Decision Trees,GBDT)是一种强大的机器学习方法,广泛用于回归和分类任务。它通过构建一系列决策树来优化模型的预测能力,基于梯度提升框架,使得每一棵树都试图纠正前一棵树的错误。

注:文章中的 x = (f1,f2,...,fn)是一个特征向量,fn 为 x 的一个特征。

GBDT基本原理

        GBDT 的基本思想是:GBDT通过一棵棵新增的树来修正前面模型的误差。在每一轮迭代中,GBDT会构建一棵新树,这棵树的作用是拟合当前模型在训练数据上的残差(即预测值和真实值之间的误差),逐步改进模型的预测能力。它是一个集成学习方法,采用了“加法模型”和“梯度下降”思想。

1、加法模型

        GBDT 是一种加法模型,即每一轮迭代都会新增一棵决策树,通过将新的树加到现有模型 F(x)中来改善预测。假设我们要构建的模型为 F(x),每一轮迭代的目标是通过拟合残差来更新模型。

2、构建初始模型

  • 对于分类问题(以二分类问题为例),初始模型为对数几率:

F(x) = {F_{0}}(x) = log(\frac{p}{1-p})

        其中p为样本中类别1的概率。

  • 对于回归问题,初始模型一般为训练集目标值的均值:

F(x) = {F_{0}}(x) = \frac{1}{N}\sum yi

3、GBDT迭代过程

3.1  假设模型的预测值(即所求模型,待优化)为:

上述说的步长γM​是一个学习率,控制树的贡献大小,通常通过交叉验证等方法选择合适的值。

3.3  目标损失函数L

  •  对于回归任务,常用的损失函数是均方误差(MSE):

  • 对于二分类任务,常用的损失函数是对数损失函数:

  • 对于多分类任务,常用的损失函数是交叉熵损失函数:

 3.4  计算梯度

  •  计算负梯度:在第 M 轮迭代时,计算损失函数L相对于{F_{M-1}}(x)预测值的负梯度(即求损失函数在xi处的一阶导数值,再取负)。

        (以MSE损失函数为例)对于样本i,负梯度{g_{i}}^{(m)}计算公式为:

3.5  训练新树拟合误差(负梯度)

        每一轮迭代的目标是训练一棵决策树 h_{M}(x),使这棵决策树的预测值尽可能接近模型{F_{M-1}}(x)的误差(或者叫残差)。{F_{M-1}}(x)加上这一近似误差,就修正了部分{F_{M-1}}(x)预测的误差,得到了预测误差更小的模型{F_{M}}(对照3.1的公式)。这是一个重复M次迭代的过程。

  • 上面的论述中,为什么要 {F_{M-1}}(x)加上这一近似误差,而不是减呢?我们往下看。

  • 讲一下梯度下降思想:沿负梯度方向修正误差

        GBDT优化的核心思想之一是梯度下降。在每一轮迭代中,我们希望模型能沿着损失函数的负梯度方向进行优化。梯度等同于模型的误差或残差。这么理解,损失函数的损失方向是正方向,那么其反方向就是修正损失的方向,再俗一点讲,修正误差就是误差(梯度)的相反数,修正误差就是损失函数的负梯度。因此, {F_{M-1}}(x)加上的误差,实际上应该是加上误差的相反数(即负梯度或修正误差),要用加号。

  • 那怎么训练这颗决策树呢?

        1、首先,通过计算负梯度,我们得到了每个样本 i 的修正误差

        2、接着,修正误差与特征向量x结合,我们得到一个新数据集(x1,g1),...  ,(xn,gn),

              其中,每个数据集的xi是特征向量,修正误差gi为目标变量

        3、根据这个新数据集训练决策树 h_{M}(x),使得对于一个未知的x,我们能预测出修正误差

              (决策树的具体训练过程参考另一篇文章:A)

3. 5  更新模型预测值

        训练一棵决策树 h_{M}(x)后,我们再结合学习率,更新模型

3.6  迭代M次,不断优化模型{F_{M}}(M是一个超参数,通常由交叉验证等方法来选择合适的值)

4、最终模型

        经过 M 次迭代,最终模型的预测结果是所有决策树的加权和,即:

步骤总结

  • 初始模型:建立一个初始预测模型。

  • 残差计算:在每一轮迭代中,计算上一个模型的预测误差(纠正误差/残差)。

  • 拟合残差:通过训练一个新的决策树(弱学习器)来拟合这些残差。新模型的目的是减少之前模型在数据上的误差。

  • 更新模型:将新训练的决策树加入到当前模型中,通常通过一个学习率参数来调节新模型的贡献。这一步就是提升的过程,即逐步优化模型以减小误差。

  • 重复迭代:通过多个迭代,不断引入新的决策树,每次迭代都尽量减少当前模型的损失,逐步逼近最优解。

 GBDT的优点

  • 适合处理非线性数据:GBDT 通过构建多棵决策树的方式,能够灵活地拟合数据中的非线性特征。

  • 对数据预处理要求较低:GBDT 不需要对数据进行严格的标准化或正则化处理,能够自动处理不同的特征尺度。此外,它对缺失值也比较鲁棒。

  • 处理多种数据类型:GBDT 适合处理类别特征和数值特征,且对类别特征不需要特别的编码(如独热编码),直接输入即可。(特征编码可以参考文章:B)

  • 鲁棒性高,抗过拟合能力强:GBDT在处理异常值和噪声数据时表现较好。由于它采用集成学习的方式,并通过提升(boosting)算法逐步修正错误,模型对数据中的噪声不敏感,具有较好的鲁棒性。。

  • 灵活性和扩展性:GBDT不仅适用于回归和分类任务,还可以扩展到排序、异常检测等任务。GBDT可以根据任务的不同,选择不同的损失函数,比如平方损失、对数损失等,从而适应多种不同类型的问题。

  • 高准确性和强泛化能力:GBDT结合了多个弱学习器的预测结果,能够有效地降低误差,具有较强的泛化能力。它在许多实际应用中表现出色,尤其是在复杂的非线性问题中能够获得高准确度。

  • 强大的特征选择能力:由于GBDT也基于决策树,构建过程中会不断选择分裂特征来最大化信息增益,因此它天然具备特征选择的功能。GBDT可以对特征的重要性进行排序,从而帮助我们识别哪些特征对预测结果最为重要。

GBDT的缺点

  • 计算效率较低,训练速度慢:GBDT模型的训练过程是串行的,每棵树都依赖于前一棵树的结果,因此无法并行化。随着树的数量增加,训练时间会显著增长,特别是在大数据集上的表现不够理想。此外,由于每棵树的构建都需要多次计算分裂点,所以计算成本较高。

  • 容易过拟合:由于GBDT会逐步叠加新的树来减少训练误差,在数据量较小或特征过多的情况下,模型可能会学习到噪声数据,从而导致过拟合。尽管可以通过设置学习率、树的最大深度、树的数量等参数来进行控制,但仍然难以完全避免过拟合。

  • 对参数敏感,调参复杂:GBDT有多个超参数需要调节,比如学习率、树的数量、最大深度、叶子节点数等。不同数据集可能需要不同的参数组合,参数调优过程较为复杂且耗时,特别是在大数据集上,调参成本会进一步增加。

  • 对缺失值敏感:传统GBDT无法直接处理缺失值。与XGBoost等改进版本不同,GBDT通常要求在数据预处理阶段处理缺失值,比如填补或删除缺失值,否则可能会影响模型的性能。

  • 内存占用较大:随着树的数量增加,GBDT的内存占用会迅速增大。尤其在大规模数据上,GBDT可能占用大量的内存资源,对于计算资源要求较高。

  • 不适合高维稀疏数据:GBDT在处理高维稀疏数据(如文本数据或其他表示方式稀疏的特征)时表现较差。由于决策树的分裂过程依赖于特征的具体数值,GBDT在这类数据上效率较低。相比之下,线性模型或者神经网络在稀疏数据上的表现可能更好。

随机森林 vs GBDT

文章内容来源于各渠道整理。若对大噶有帮助的话,希望点个赞支持一下叭!

文章如有错误,欢迎大噶指正!

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

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

相关文章

Spark SQL大数据分析快速上手-伪分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 伪分布模式也是在一台主机上运行&…

github使用基础

要通过终端绑定GitHub账号并进行文件传输,你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程: 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git: bash 复制代码 git --version配置Git用户名和邮箱 bash …

Python OpenCV孤立点检测

孤立点检测 在Python中使用OpenCV进行孤立点(异常点)检测,可以通过应用统计分析或者使用OpenCV的findContours和convexHull函数来识别。以下是一个简单的例子,使用OpenCV的findContours和convexHull来识别并绘制孤立点。 孤立点…

Vue自定义指令详解——以若依框架中封装指令为例分析

自定义指令 在Vue.js中,自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释: 一、自定义指令的基本概念 自定义指令允许开发者直接对DOM元素进行低层次操作,而无需编写大量的模板或者JavaScript代码。…

云渲染:服务器机房与物理机房两者有什么区别

云渲染选择服务器机房与物理机房两者主要区别在哪里呢? 服务器机房和物理机房作为云渲染的基础设施,各自扮演着不同的角色。 服务器机房的特点 服务器机房,通常指的是那些专门用于托管服务器的设施,它们可能位于云端&#xff0c…

即插即用篇 | YOLOv8 引入 代理注意力 AgentAttention

Transformer模型中的注意力模块是其核心组成部分。虽然全局注意力机制具有很强的表达能力,但其高昂的计算成本限制了在各种场景中的应用。本文提出了一种新的注意力范式,称为“代理注意力”(Agent Attention),以在计算效率和表示能力之间取得平衡。代理注意力使用四元组(Q…

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transform 3.特征…

vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框

1.基础功能 参考: https://blog.csdn.net/weixin_45148022/article/details/135696629 https://juejin.cn/post/7327353533618978842?searchId20241101133433B2BB37A081FD6A02DA60 https://www.freesion.com/article/67641324321/ https://github.com/AlexKrat…

【Elasticsearch入门到落地】1、初识Elasticsearch

一、什么是Elasticsearch Elasticsearch(简称ES)是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。它使用Java编写,基于Apache Lucene来构建索引和提供搜索功能,是一个分布式、可扩展、近实…

Rust开发一个命令行工具(一,简单版持续更新)

依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…

Xshell,Shell的相关介绍与Linux中的权限问题

目录 XShell的介绍 Shell的运行原理 Linux当中的权限问题 Linux权限的概念 Linux权限管理 文件访问者的分类(人) 文件类型和访问权限(事物属性) 文件权限值的表示方法 文件访问权限的相关设置方法 如何改变文件的访问权…

golang 实现比特币内核:公钥的 SEC 编码格式详解

比特币作为区块链的一个应用,它建立在分布式系统之上,‘节点’遍布全球。为了使所有节点协同工作并作为一个整体系统运行,需要保持所有节点同步在相同的状态中,也就是说节点之间需要频繁通信,并且相互交换大量数据消息。这要求在网络上传输的消息或数据要使用某种格式编码…

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

《Django 5 By Example》阅读笔记:p17-p53

《Django 5 By Example》学习第2天,p17-p53总结,总计37页。 一、技术总结 1.数据库迁移 python manage.py makemigrations blog python manage.py sqlmigrate blog 0001 python manage.py migrate 2.ORM Django自带ORM。 3.view (1)定义 p42, …

基于物联网的智能超市快速结算系统

摘 要 当今社会的商品层出不穷,人们因为越来越多大型仓储超市的出现使得生活更加便利,但许多随之而来的新问题也给人们带来了许多的不便,例如商家一直被更换标签不及时、货物丢失、超市内物品更换处理不及时、超市内人流高峰期人流控制不得…

阿里云Linux安装Docker服务报错问题

今天使用了阿里云99计划的服务器,之前用惯了 CentOS,这次想体验下阿里云调教的 Alibaba Cloud Linux 3 系统性能,但是在安装 docker 的时候遇到了问题! 传统安装方式 之前习惯安装docker方式: #查看是否已经安装的D…

数据结构《链表》

文章目录 前言一、什么是链表&#xff1f;二、单向链表2.1 单向链表的个人实现2.2 单向链表的例题 三、双向链表3.1 双向链表的个人实现3.2 关于真正的java中提供的链表的使用 总结 前言 提示&#xff1a;概念来源于&#xff1a;>>LinkedList<< 一、什么是链表&am…

typesScript 制作一个简易的区块链(2)

pow 机制 1.哈希函数的特点 说到 pow 机制&#xff0c;就离不开哈希函数&#xff0c;哈希函数具有以下特点&#xff1a; 输入长度不固定&#xff0c;输出长度固定输入不同&#xff0c;输出不同输入相同&#xff0c;输出相同不可逆雪崩效应 雪崩效应&#xff1a;输入变量中只…

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…

【树莓派raspberrypi烧录Ubuntu远程桌面登入树莓派】

提示&#xff1a;本文利用的是Ubuntu主机和树莓派4B开发板&#xff0c;示例仅供参考 文章目录 一、树莓派系统安装下载前准备工作下载安装树莓派的官方烧录软件imagerimager的使用方法 二、主机与树莓SSH连接查看数梅派IP地址建立ssh连接更新树莓派源地址 三、主机端远程桌面配…