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

分类算法——LightGBM 详解

        LightGBM(Light Gradient Boosting Machine)是 Microsoft 提出的基于决策树算法的梯度提升框架。它具有高效、准确和高可扩展性的特点,能够在海量数据上快速训练模型,并在不牺牲精度的前提下提高处理速度。下面将从底层原理到源代码的实现方面全面讲解 LightGBM 的工作原理和其在 Python 中的实现。

1. LightGBM 的核心原理

1.1 梯度提升树(GBDT)概述

        梯度提升树(Gradient Boosting Decision Tree, GBDT)是一种基于加法模型和前向分步算法的提升方法。GBDT 通过迭代地构建决策树来优化目标函数,其中每一棵树都拟合上一个模型的残差或负梯度。GBDT 在分类问题中通常使用交叉熵作为目标函数,而在回归问题中使用平方误差损失。

1.2 LightGBM 的独特之处

LightGBM 相较传统的 GBDT 框架进行了多项改进,主要包括:

  • 基于叶子节点的增长策略(Leaf-wise Growth):不同于传统的按层生长(Level-wise)方式,LightGBM 采用叶子节点增长,即在每次迭代中选取所有叶子节点中增益最大的节点进行分裂,从而生成一个非对称的树结构。
  • 基于直方图的算法(Histogram-based Algorithm):将连续的特征离散化为有限的直方图桶,加快了计算速度并降低内存占用。
  • 基于特征的单边梯度采样(Gradient-based One-Side Sampling, GOSS):保留较大梯度的样本,同时随机采样较小梯度的样本,以达到加速模型训练的目的。
  • 独特的特征互斥机制(Exclusive Feature Bundling, EFB):将稀疏特征进行捆绑处理,进一步减少特征维度。

2. LightGBM 训练过程的底层原理

2.1 叶子节点的增长策略(Leaf-wise Growth)

        在决策树中,叶子节点增长策略会优先选择增益最大的叶子节点进行分裂,使模型更加精确。虽然叶子节点增长策略在理论上比层级增长策略(Level-wise)更容易过拟合,但其在性能和准确性上优于传统的 GBDT 方法。

数学公式
对于每一棵树,目标是最小化以下目标函数:

        其中,l(y,f(x_{i})) 是预测误差损失,Ω(f) 是正则化项,用于防止过拟合。每次计算增益(Gain)时,都会计算增益最大的位置并在此位置分裂节点,从而使目标函数的值最小化。

2.2 直方图算法

        传统的 GBDT 需要对所有特征的每个分裂点计算增益,这一过程的时间复杂度较高。而 LightGBM 的直方图算法会将连续特征离散化,将其划分为 k 个区间,每个区间的值为这些值的均值。

        在训练过程中,LightGBM 仅需计算 k 个区间的增益,而不必针对每个特征值都计算增益,这显著减少了计算量。

2.3 单边梯度采样(GOSS)

        单边梯度采样(GOSS)通过保留较大的梯度样本并对小梯度样本进行随机采样,减少了样本数量,从而降低了计算成本。假设 a% 的样本有较大梯度,b% 的样本有较小梯度,GOSS 将保留所有大的梯度样本,并从小梯度样本中随机采样一个子集,以加速计算过程。

2.4 特征互斥捆绑(EFB)

        稀疏特征在高维数据中常见,而这些稀疏特征的非零值通常不会出现在同一个样本中。LightGBM 利用这一特点将稀疏特征捆绑成一个新的组合特征,以减少特征的维数。通过 EFB,算法可以减少计算量,而不会对模型精度产生明显的影响。

3. LightGBM 源代码结构与实现

        在 Python 中,LightGBM 的核心实现是基于 C++ 的,Python API 提供了简单易用的接口。以下是 LightGBM 在 Python 中的代码实现流程。

3.1 安装 LightGBM

在安装时,LightGBM 需要编译,因此最好使用 pip 或者从源码安装:

pip install lightgbm
3.2 数据准备

        在使用 LightGBM 进行训练之前,我们需要将数据加载并转换为 Dataset 对象。Dataset 对象包含了特征、标签和其他元数据信息,并用于构建直方图。

import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 转换为 LightGBM 的 Dataset 格式
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

3.3 模型训练

LightGBM 支持多种参数来控制训练过程。在 Python 中,可以通过定义一个包含参数的字典来设置模型的各项超参数。

# 定义模型参数
params = {
    'objective': 'multiclass',      # 多分类任务
    'num_class': 3,                 # 类别数
    'metric': 'multi_logloss',      # 评价指标
    'boosting_type': 'gbdt',        # 梯度提升树
    'num_leaves': 31,               # 叶子节点数
    'learning_rate': 0.05,          # 学习率
    'feature_fraction': 0.9         # 特征采样
}

# 模型训练
model = lgb.train(params,
                  train_data,
                  num_boost_round=100,
                  valid_sets=[train_data, test_data],
                  early_stopping_rounds=10)

        在 lgb.train() 函数中,num_boost_round 参数决定了模型的训练轮数,而 early_stopping_rounds 可以防止模型过拟合,通过监测验证集的误差,如果连续 10 次迭代误差没有降低,训练将会提前停止。

3.4 预测与评估

模型训练完成后,可以使用模型进行预测并评估其在测试集上的性能。

# 模型预测
y_pred = model.predict(X_test)
y_pred = [list(x).index(max(x)) for x in y_pred]  # 将概率转换为预测类别

# 评估预测准确性
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

3.5 特征重要性

LightGBM 提供了便捷的方法来查看每个特征的重要性,可以通过绘图来展示。

import matplotlib.pyplot as plt

lgb.plot_importance(model, max_num_features=10)
plt.show()

4. LightGBM 的代码实现细节

在 lightgbm 源码中,C++ 实现是核心部分,以下是核心模块的说明:

  • 数据处理模块(Data Partitioning):负责将输入数据按特征划分为不同的桶,以实现直方图算法。
  • 梯度计算模块(Gradient Computation):根据 GOSS 算法,计算每一轮的梯度和残差。
  • 分裂与叶节点生长模块(Split and Leaf-wise Growth):每轮计算中都会根据当前增益选择最佳分裂点,同时决定是否继续对叶节点进行扩展。
  • 特征互斥模块(Exclusive Feature Bundling, EFB):将稀疏特征打包,减少维度,并对打包特征构建直方图。

5. LightGBM 的优缺点

优点
  • 速度快:基于叶子节点增长和直方图算法使得 LightGBM 比传统的 GBDT 训练速度更快。
  • 低内存消耗:LightGBM 的直方图算法和特征捆绑技术有效减少了内存占用。
  • 高精度:通过高效的增益计算和更深的树结构,LightGBM 在精度上往往优于其他 GBDT 实现。
  • 良好的扩展性:LightGBM 适合大规模数据处理,支持多线程和分布式计算。
缺点
  • 易过拟合:Leaf-wise 的生长策略可能导致深树结构,从而易于过拟合。
  • 参数敏感:LightGBM 需要调参以获得最佳效果,尤其在树的深度、叶子节点数和采样比例上对结果影响较大。

总结

        LightGBM 通过多项优化使得 GBDT 在性能和效率上有了大幅提升。其基于叶节点的生长策略和直方图算法的创新设计,显著提高了模型的训练速度和精度。在 Python 中,LightGBM 提供了丰富的 API,支持灵活的调参和高效的模型训练。掌握 LightGBM 的底层原理和实现细节,有助于在实际项目中更好地使用和优化该算法。


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

相关文章:

  • SQLite从入门到精通面试题及参考答案
  • SQLI LABS | Less-20 POST-Cookie Injections-Uagent field-error based
  • 未来之维,陈欣的智能CAD
  • 沈阳乐晟睿浩科技有限公司抖音小店新篇章
  • 大学必考的三个证书
  • 大模型面试题63题(1-11)
  • 基于SSM+微信小程序的汽车维修管理系统(汽车5)
  • 使用Python批量合并多个PDF文档
  • 使用 Flask 实现简单的登录注册功能
  • Unity计算二维向量夹角余弦值和正弦值的优化方法参考
  • cmake学习笔记
  • 什么是目标检测?
  • P1037 [NOIP2002 普及组] 产生数
  • Mybatis-18.动态SQL-sqlinclude
  • 【从零开始的LeetCode-算法】3216. 交换后字典序最小的字符串
  • MaskGCT,零样本语音克隆,TTS语音合成,多语言支持(WIN/MAC)
  • mac|maven项目在idea中连接redis
  • 智能合约分享
  • CSS浮雕效果
  • C++: String容器的使用和实现
  • 【MySQL】日志
  • QT中使用图表之QChart概述
  • 排查公网NAT网关中高流量ECS实例
  • 想要分离人声,来试试看这几个方法
  • 使用PE工具箱进行系统安装
  • 企业新闻及产品宣传稿怎么写?有哪些商业财经类报纸杂志或媒体发布?