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

Boosting(XGBoost、LightGBM以及CatBoost)

1.Boosting
  • 基本思想: 根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,将训练好的弱分类器以累加的形式结合到现有模型中。这个过程会不断减小损失函数,使模型偏差不断降低。
2.XGBoost

优势:(相对于GBDT)

  • 正则化: 防止模型过拟合
  • 并行处理: 在选取叶子节点分裂特征的时候可以并行,速度快很多
  • 自动处理缺失数据: 会把缺失值放进左右子树看效果
  • 剪枝策略: 普通的提升采用贪心算法,只有不再有增益的时候才会停止分裂,XGBoost有一个阈值,可以调节
  • 更加高效的拟合误差: 对目标函数进行了二阶泰勒展开
  • 支持对数据进行采样,支持列抽样: 降低过拟合,减少计算
  • 支持多种类型的基分类器: GBDT只支持CART
  • 对特征进行预排序: 能够快速,精确的找到分割点

缺点:

  • 内存消耗大: 因为要存储预排序的结果
  • 调参困难: 越复杂的模型参数越多
3.LightGBM

优势:(相对于XGBoost)

  • 直方图优化: 其实就是一种数据离散化,将数据按照范围进行分箱,是存储空间减小,运算更快将特征值转化为 b i n bin bin
  • 直方图做差加速: 一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到
  • 提出带深度限制的Leaf-wise: 以前主要使用的是按层生长(level-wise),Leaf-wise可以更好的拟合数据,得到更高的精度,但同时也会发生过拟合,因此带有深度限制
  • 提出了单边梯度采样算法: 保留 a ∗ 100 % a*100\% a100%训练不足的样本 (梯度大的),对小梯度样本采样 b ∗ 100 % b*100\% b100%,为了尽可能小的改变样本分布,将小梯度样本的权重扩大 ( 1 − a ) / b (1-a)/b (1a)/b
  • 提出了互斥特征捆绑算法: 将稀疏的高维数据进行降维,不丢失信息的同时减少了特征的数量,降低内存消耗
  • 直接支持类别特征

缺点:

  • 特征被离散化后,找到的不是很精确的分割点,有时会对结果产生影响,但这是一种防止过拟合
  • leaf-wise策略可能会过拟合
4.Stacking
  • 基本思想: 使用训练数据训练多个模型,然后将多个模型的训练结果作为特征,去训练第二层模型,最后输出结果
  • 第二层一般用比较简单的模型,防止模型过拟合。分类用逻辑回归,回归用线性回归

Stacking流程:

  • 以XGBoost举例,首先数据分为训练集和测试集。我们采用五折交叉验证的方式,将训练集分为五份,分别拿出其中的一折作为验证集,用于训练模型,同时每次训练好的模型在验证集部分的预测结果将作为最终在训练集上预测结果的1/5。五次组装起来就成了最终对训练集的预测结果。这将用于第二层模型的训练集的一个特征(一列),同时每次训练好的模型都会在测试集上预测,五次的平均值作为第二层模型测试集的一个特征(一列)
  • 其他的模型训练同上,最终第二层模型的训练集就是所有第一层模型训练集的预测结果(有几个模型就有几列)+训练集的真实标签,测试集就是所有第一层模型的测试集的预测结果拼接起来

Stacking优点

  • 提高模型预测精度: 通过组合多个模型的预测结果,可以获得更准确和稳定的预测结果。Stacking通常比单个模型更准确,因为它可以利用不同模型的优点。因为每个模型都可能注重于不同的特征,通过Stacking可以将这些特征都利用起来,效果可能更好,也有可能变差

  • 减少过拟合风险: 由于Stacking结合了多个模型的预测结果,它通常比单个模型更具有泛化能力,因此过拟合的风险更小

5.leaf-wise和level-wise的区别和特点
  • Level-wise:基于层进行生长,直到达到停止条件;
  • Leaf-wise:每次分裂增益最大的叶子节点,直到达到停止条件。

XGBoost 采用 Level-wise 的增长策略,方便并行计算每一层的分裂节点,提高了训练速度,但同时也因为节点增益过小增加了很多不必要的分裂,降低了计算量;LightGBM 采用 Leaf-wise 的增长策略减少了计算量,配合最大深度的限制防止过拟合,由于每次都需要计算增益最大的节点,所以无法并行分裂。


http://www.kler.cn/a/2079.html

相关文章:

  • 2.4 网络概念(分层、TCP)
  • 全志H618 Android12修改doucmentsui选中图片资源详情信息
  • CTF学习24.12.21[隐写术进阶]
  • harmony UI组件学习(1)
  • 【C#】Ctrl+ 组合键的使用
  • 堆【Lecode_HOT100】
  • 栈、队列、优先级队列的模拟实现
  • 【计算机组成原理】:计算机系统概述
  • 鸟哥的Linux私房菜 Shell脚本
  • 【Leetcode】队列实现栈和栈实现队列
  • 【三维几何学习】从零开始网格上的深度学习-3:Transformer篇(Pytorch)
  • 【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台
  • 【C++初阶】四、类和对象(下)
  • 沁恒CH32V307使用记录:使用TIM输出PWM信号
  • C++笔记——第六篇 list的简介和使用
  • 多线程 (六) 单例模式
  • 蓝桥杯备赛经验 pythonA组(非科班选手)
  • 拯救会议纪要!快用这三个音频转文字方法,让领导对你刮目相看
  • FLEXPART拉格朗日粒子扩散模式建模技术及研究大气污染物源-汇关系中的实践经验
  • 【Java】i++和++i的实现原理
  • 函数(上)——“Python”
  • 金三银四Java面试题及答案整理(2023最新版) 持续更新
  • 知识点16--k8s资源配置清单入门
  • 使用sqlalchemy-gbasedbt连接GBase 8s数据库
  • 使用旧电脑玩Linux
  • spring2