当前位置: 首页 > news >正文

大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现

点一下关注吧!!!非常感谢!!持续更新!!!

大模型篇章已经开始!

  • 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 Figma+Cursor 自动设计原型

Java篇开始了!

  • MyBatis 更新完毕
  • 目前开始更新 Spring,一起深入浅出!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(已更完)
  • Prometheus(已更完)
  • Grafana(已更完)
  • 离线数仓(已更完)
  • 实时数仓(正在更新…)
  • Spark MLib (正在更新…)

在这里插入图片描述

Gradient Boosting

梯度提升树(Gradient Boosting)是提升树(Boosting Tree)的一种改进算法,所以在讲梯度提升树之前先来说一下提升树。
先来例子理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。
如果我们迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小,最后将每次拟合的岁数加起来便是模型输出的结果

提升树算法:
初始化 f0(x)= 0
对 m = 1,2…M,计算残差 rmi = yi - fm - 1(x) , i = 1,2…N
拟合残差 rmi 学习一个回归树,得到 hm(x)
更新 fx(m) = fm - 1 + hm(x)
得到回归问题提升树:

在这里插入图片描述
上面伪代码中的残差是什么?
在提升树算法中:
假设前一轮迭代得到的强学习器是:ft-1(x)
损失函数是:L(y, ft-1(x))
本轮迭代的目标是找到一个弱学习器:ht(x)
最小化本轮的损失:L(y, ft(x)) = L(y, ft- 1(x) + ht(x))
当采用平方损失函数时:
在这里插入图片描述
这里,r = y - ft -1(x) 是当前模型拟合数据的残差(residual)
所以,对于提升树来说只需要简单你和当前模型的残差

当损失函数是平方损失和指数损失函数时,梯度提升树每一步优化都是很简单的,但是对于一般损失函数而言,往往每一步优化起来都不那么容易。
针对这一问题,Friedman 提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升算法树中的残差的近似值。

那么负梯度长什么样子呢?
第t轮的第i个样本的损失函数的负梯度为:
在这里插入图片描述
此时不同的损失函数将会得到不同的负梯度,如果选择平方损失:
在这里插入图片描述
负梯度为:
在这里插入图片描述
此时我们发现 GBDT 的负梯度就是残差,所以说对于回归问题,我们要拟合的就是残差。那么对于分类问题呢?二分类和多分类的损失函数都是 logloss

GBDT算法原理

将 Decision Tree 和 Gradient Boosting 这两部分组合在一起就是 GBDT 了。

GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一类 逐步加法模型+梯度下降优化 的集成学习算法。

  • Boosting:按序列方式训练多个弱学习器(一般是浅决策树),后一个模型专门弥补前面模型的错误。
  • Gradient:把“如何修正错误”形式化为在损失函数上的梯度下降;每一步都在函数空间中向负梯度方向迈出一小步。
  • Decision Tree:最常用的弱学习器是 CART 回归树(可处理回归或分类,经适当编码)。

初始化弱学习器
在这里插入图片描述
**对 m = 1,2…M **
对于每个样本 i =1,2…N 计算负梯度(即残差)
在这里插入图片描述
将上步得到的残差作为样本新的真实值,并将数据 (xi, rim), i = 1,2…N 作为下颗树的训练数据,得到一个新的回归树 fm(x) 其对应的叶子节点区域为 Rjm, j = 1,2…J。
其中J为回归树t的叶子节点的个数。

对叶子区域 j = 1,2…J 计算最佳拟合值
在这里插入图片描述
更新强学习器
在这里插入图片描述

得到最终学习器
在这里插入图片描述

为什么效果好

  • 任意可导损失:统一框架下同时处理回归、二分类、多分类、排名、异常检测(自定义损失)。
  • 高阶非线性:树天然捕获特征交互,无需显式交叉特征工程。
  • 抗尺度:对不同量级特征无需标准化。
  • 可解释:基于树的内部结构可做特征重要度、SHAP 解释。

常见高效实现

  • XGBoost:二阶近似、稀疏感知、Block 近似直方图,加 L1/L2 正则。
  • LightGBM:GOSS 行采样+EFB 特征并列,叶子优先生长,高速+低耗内存。
  • CatBoost:针对类别特征的有序目标编码,内置对称树,支持文本特征。

它们都在经典 GBDT 框架上做了大量工程与算法加速,但核心思想(负梯度+浅树叠加)不变。

何时使用 / 何时不用

  • 适用:结构化表格数据、特征之间存在复杂非线性关系、不想做大量特征工程。
  • 不适:高维稀疏文本、图像、语音等深度学习占优场景;数据量极大但特征简单时线性模型更高速。

这里可以放一小段代码:

from xgboost import XGBClassifier
model = XGBClassifier(n_estimators=300,max_depth=6,learning_rate=0.05,subsample=0.8,colsample_bytree=0.8,objective='binary:logistic',eval_metric='auc'
)
model.fit(X_train, y_train,eval_set=[(X_val, y_val)],early_stopping_rounds=50)
http://www.lqws.cn/news/97237.html

相关文章:

  • 数字商城小程序源码,开启便捷电商新体验
  • 大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
  • 【后端架构师的发展路线】
  • Elasticsearch + Milvus 构建高效知识库问答系统《一》
  • Java高级 | (二十二)快速应用开发框架——Spring Boot
  • 小白的进阶之路系列之十二----人工智能从初步到精通pytorch综合运用的讲解第五部分
  • OpenCV CUDA模块图像处理------图像融合函数blendLinear()
  • Attention Is All You Need (Transformer) 以及Transformer pytorch实现
  • 【JavaWeb】SpringBoot原理
  • SpringBoot 自定义注解实现限流
  • 【Vmware】虚拟机安装、镜像安装、Nat网络模式、本地VM8、ssh链接保姆篇(图文教程)
  • 优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷
  • 托福39-1 Early Writing Systems感悟
  • Kotlin List 操作全面指南
  • RabbitMQ 监控与调优实战指南(二)
  • JavaScript性能优化实战大纲
  • Neovim - 打造一款属于自己的编辑器(一)
  • 提取 PDF 文件中的文字以及图片中的文字
  • HALCON 深度学习训练 3D 图像的几种方式优缺点
  • 论文中pdf图片文件太大怎么办
  • 关于FPGA软核的仿真(一)
  • 基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案
  • 云计算 Linux Rocky day03
  • YAML文件
  • 什么是AI芯片?
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(六):图片上传功能
  • ArcGIS Pro字段计算器与计算几何不可用,显示灰色
  • 二分查找的边界艺术:LeetCode 34 题深度解析
  • 第七部分:阶段项目 5:构建 NestJS + MySQL RESTful API 服务器
  • 基于Python学习《Head First设计模式》第五章 单件模式