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

机器学习(12)——LGBM(1)

文章目录

  • LightGBM算法详解
    • 1. 算法背景
    • 2. 核心创新
      • 2.1 基于直方图的决策树算法
      • 2.2 单边梯度采样(GOSS)
      • 2.3 互斥特征捆绑(EFB)
    • 3. 算法细节
      • 3.1 树生长策略
      • 3.2 特征并行与数据并行
      • 3.3 类别特征处理
    • 4. 关键参数说明
      • 4.1 核心参数
      • 4.2 控制速度参数
      • 4.3 控制过拟合参数
    • 5. 与XGBoost对比
    • 6. 实践建议
    • 7. 代码示例
    • 8. 适用场景
    • 9. 局限性

LightGBM算法详解

LightGBM(Light Gradient Boosting Machine)是微软开发的一个基于决策树算法的分布式梯度提升框架,专为高效性和可扩展性设计。

1. 算法背景

LightGBM属于梯度提升决策树(GBDT)家族,是XGBoost之后的一个重要改进。它于2017年由微软团队提出,主要解决了以下问题:

  • 传统GBDT在大规模数据上效率低
  • 内存消耗大
  • 训练速度慢

2. 核心创新

2.1 基于直方图的决策树算法

LightGBM将连续特征值离散化为k个整数(默认255),构造特征直方图。训练时基于这些直方图寻找最优分割点,带来以下优势:

  • 内存消耗降低:从O(#data * #features)降到O(k * #features)
  • 计算代价降低:从O(#data * #features)降到O(k * #features)

2.2 单边梯度采样(GOSS)

传统GBDT计算信息增益时需要对所有数据点的梯度进行统计。GOSS通过以下方式优化:

  1. 保留梯度较大的前a%样本
  2. 从剩余样本中随机抽取b%样本
  3. 在计算信息增益时,对小梯度样本的权重乘以常数(1-a)/b

2.3 互斥特征捆绑(EFB)

高维特征通常是稀疏的,许多特征互斥(不会同时取非零值)。EFB将这些特征捆绑在一起,将复杂度从O(#features)降到O(#bundle),同时不影响准确性。

3. 算法细节

3.1 树生长策略

LightGBM采用leaf-wise生长策略(区别于level-wise):

  • 每次从当前所有叶子中,选择分裂增益最大的叶子进行分裂
  • 能更有效地降低损失,但可能导致较深的树
  • 可通过max_depth参数限制深度防止过拟合

3.2 特征并行与数据并行

  • 特征并行:不同机器处理不同特征,寻找最佳分割点
  • 数据并行:数据分散到不同机器,每台机器构建局部直方图后合并

3.3 类别特征处理

LightGBM原生支持类别特征,无需独热编码:

  • 直接按类别值排序后寻找最优分割
  • 通过max_cat_threshold控制分裂数
  • 比独热编码更高效且通常效果更好

4. 关键参数说明

4.1 核心参数

  • boosting_type: 提升类型,默认gbdt
  • objective: 目标函数,如regression、binary、multiclass等
  • metric: 评估指标

4.2 控制速度参数

  • num_iterations: 迭代次数
  • learning_rate: 学习率
  • num_leaves: 叶子数(主要控制复杂度)
  • max_depth: 树的最大深度

4.3 控制过拟合参数

  • lambda_l1: L1正则化
  • lambda_l2: L2正则化
  • min_data_in_leaf: 叶子最小样本数
  • feature_fraction: 特征采样比例
  • bagging_fraction: 数据采样比例

5. 与XGBoost对比

特性LightGBMXGBoost
树生长策略leaf-wiselevel-wise
特征离散化直方图算法预排序算法
内存使用更低较高
训练速度更快较慢
类别特征处理原生支持需要编码
并行方式特征+数据并行主要特征并行
小数据集表现可能过拟合通常更好

6. 实践建议

  1. 参数调优顺序

    • 首先设置较大的num_leaves和较小的learning_rate
    • 调整num_iterations使用早停法
    • 然后调节min_data_in_leafmax_depth防止过拟合
    • 最后调整正则化参数
  2. 类别特征处理

    • 直接指定为类别类型比独热编码更高效
    • 对高基数类别特征可考虑目标编码
  3. 不平衡数据

    • 使用is_unbalance参数或设置scale_pos_weight
    • 也可调整class_weight参数
  4. 并行加速

    • 设置feature_fractionbagging_fraction小于1
    • 使用bagging_freq启用随机采样

7. 代码示例

import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split# 加载数据
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)# 创建数据集
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)# 设置参数
params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss','num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9,'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 0
}# 训练模型
gbm = lgb.train(params,train_data,num_boost_round=100,valid_sets=[test_data],early_stopping_rounds=10)# 预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)

8. 适用场景

LightGBM特别适合以下场景:

  • 大规模数据集(百万级样本以上)
  • 高维特征数据
  • 需要快速迭代的实验环境
  • 对预测延迟要求不严格的场景

9. 局限性

  1. 在小数据集上可能容易过拟合
  2. leaf-wise生长策略可能导致模型复杂度较高
  3. 对噪声数据较为敏感
  4. 相比线性模型可解释性较差

LightGBM因其高效性和优秀的性能,已成为许多机器学习竞赛和工业界应用的首选工具之一。理解其核心原理和参数调优技巧,能够帮助在实际问题中更好地应用这一强大算法。

http://www.xdnf.cn/news/7049.html

相关文章:

  • Python爬虫基础
  • 选择合适的AI模型:解析Trae编辑器中的多款模型及其应用场景
  • Go 语言中的一等公民(First-Class Citizens)
  • Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析
  • STM32单片机开发环境搭建 keil/proteus仿真/STM32CubeMX
  • 【OpenGL学习】(三)元素缓冲对象(EBO)的使用
  • Limesurvay系统“48核心92GB服务器”优化方案
  • uniapp的适配方式
  • PDF批量合并拆分+加水印转换 编辑 加密 OCR 识别
  • 软件架构之-论软件系统架构评估以及应用
  • Zookeeper入门(三)
  • 《Vite 报错》ReferenceError: module is not defined in ES module scope
  • 影刀处理 Excel:智能工具带来的高效变革
  • 广域网学习
  • 数据结构与算法——栈和队列
  • Python字符串格式化(一):三种经典格式化方法
  • 从零开始实现大语言模型(十六):加载开源大语言模型参数
  • 《Python星球日记》 第87天:什么是大语言模型 LLM?
  • 1_Spring 【IOC容器的创建】
  • 深入了解linux系统—— 基础IO(下)
  • 【QGIS二次开发】地图编辑-08
  • tauri2项目使用sidcar嵌入可执行文件并使用命令行调用
  • 实战设计模式之状态模式
  • 互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨
  • 十一、STM32入门学习之FREERTOS移植
  • React 19 中的useRef得到了进一步加强。
  • ngx_http_proxy_protocol_vendor_module 模块
  • 【Linux】进程的基本概念
  • 虚幻引擎5-Unreal Engine笔记之Pawn与胶囊体的关系
  • 【android bluetooth 协议分析 01】【HCI 层介绍 5】【SetEventMask命令介绍】