一文速学-LightGBM模型算法原理以及实现+Python项目实战

news2025/1/12 6:04:41

LighGBM

前言

LighGBM作为GBDT算法的衍生模型,在其他论文研究以及数学建模比赛中十分常见。如果不熟悉GBDT算法的可以去看看我的上一篇文章,过多关于GBDT的细节不再过多描述。主要将讲述一下LighGBM较于GBDT算法的改进以及独特算法细节优化,以及比XGBoost和CatBoost算法较好的应用场景。总体而言,LightGBM在性能和效率方面都有很大的优势,特别适用于中小规模的数据集和高维度的特征。

一、LighGBM算法概述

LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升决策树(Gradient Boosting Decision Tree,简称GBDT)算法的机器学习框架。GBDT是一种集成学习方法,它通过逐步训练一系列决策树来提升模型性能。每个新的决策树会尝试纠正前面树的预测误差。LightGBM是一种基于GBDT的算法,但它在构建决策树和训练过程中采用了一些优化策略,以提高效率和性能。下表为GBDT衍生模型优化对比:

算法差异点GBDTXGBoostLightGBMCatBoost
弱学习器CART回归树1.CART回归树2.线性学习器3.Dart树Leaf-wise树对称树
寻找分裂点贪心算法近似算法直方图算法预排序算法
稀疏值处理稀疏感知算法EFB(互斥特征捆绑)
类别特征不直接支持,可自行编码后输入模型同GBDT直接支持,GS编码直接支持,Ordered TS编码
并行支持不可以可以可以可以

一图流展示优化点:
在这里插入图片描述

既然LightGMB算法模型建立的比XGBoost晚,那么其算法必然在XGBoost模型上进行进一步优化。首先XGBoost空间消耗大,因为XGBoost构建决策树的算法基本思想是预排序算法,这样的算法需要保存数据的特征值,还保存了特征排序的结果,这就需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。

因此LightGMB主要着重解决的是构建决策树以及算法开销上的优化。

二、算法改进之处

1.Leaf-wise生长策略

LightGBM采用了leaf-wise的生长策略,与大多数GBDT传统的level-wise策略相比,能够更快地找到更优的分割点。这是因为leaf-wise策略每次选择能够降低损失函数最多的叶子节点进行分裂,从而更快地构建深度树。
在这里插入图片描述

在这里插入图片描述

1.1选择最佳分割点

在每次构建分割节点时,Leaf-wise策略会选择能够最大程度降低损失函数的特征和分割点。这是通过遍历特征的所有可能分割点,并计算分割后的两个子节点上的损失函数来实现的。

1.2贪心选择

Leaf-wise策略是一种贪心算法,每次选择能够最大程度减小损失函数的特征和分割点。这种选择策略使得树能够更快地学习到数据的细节和特征之间的关系。

1.3剪枝

在构建完一个节点后,Leaf-wise策略还会进行剪枝操作,即比较当前节点的损失减小值与一个阈值。如果损失减小值不满足阈值条件,就停止节点的继续分割,从而避免过拟合。

1.4叶子节点分配

Leaf-wise策略中,新的样本会被分配到现有的叶子节点中。如果某个叶子节点的分割后损失函数下降不足,该节点会停止继续分割,成为一个叶子节点。

1.5深度

由于Leaf-wise策略的贪心特性,它能够构建更深的树。然而,由于每次只选择一个分割点,有时候会导致某些叶子节点包含较少样本,可能会引发过拟合问题。因此,在训练时需要通过参数来控制树的最大深度或者其他正则化手段。

2.直方图特征优化

LightGBM中的直方图优化是一种针对特征处理的技术,用于加速决策树的构建过程。它通过将连续的特征值划分为一系列离散的直方块(即直方图),从而减少了计算复杂度和内存占用。

在这里插入图片描述

2.1特征值划分

对于每个连续特征,LightGBM首先会将特征的取值范围按照一定的间隔(bin)划分成离散的区间,形成一个直方图。每个区间被称为一个bin,其中包含了该特征值在这个区间内的样本。这种离散化分桶思路其实有很多优点的, 首先最明显就是内存消耗的降低,xgboost需要用32位的浮点数去存储特征值, 并用32位的整型去存储索引,而Lightgbm的直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

在这里插入图片描述

以下图片来自https://blog.csdn.net/wuzhongqiang/article/details/105350579 推荐阅读。

在这里插入图片描述

2.2统计梯度和Hessian

每个bin中,LightGBM会计算样本的梯度和Hessian的累积值。这些值用于在寻找最佳分割点时评估损失函数的变化。

在这里插入图片描述

2.3选择分割点

在寻找最佳分割点时,LightGBM会遍历每个bin之间的边界,以及每个bin内部的候选分割点。它使用累积的梯度和Hessian值来评估在这些分割点上的损失减小情况,从而选择最优的分割点。直方图优化还能够直接处理类别特征和缺失值。对于类别特征,LightGBM会将不同类别分配到不同的bin中。对于缺失值,LightGBM会将缺失值分配到一个特殊的bin中,从而有效地处理缺失信息。

3.单边梯度抽样算法(GOSS)

一般来说我们会在数据预处理部分就会开始做数据均衡工程,但是LightGBM内置GOSS算法的主要目标是加速训练过程,同时保持模型性能。它通过保留梯度较大的样本来减少数据集的大小,以便在每次迭代中更有效地更新模型。而数据均衡算法主要关注处理样本不平衡问题,通过调整样本权重或采样策略来平衡不同类别的影响。

GBDT中每个数据都会有不同的梯度值,即梯度小的样本,训练误差也比较小,梯度比较小的样本对于降低残差的作用效果不是太大,所以我们可以关注梯度高的样本

算法流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgfE7kN0-1692751421156)(C:\Users\10799\AppData\Roaming\Typora\typora-user-images\image-20230822114728503.png)]

通过GOSS算法,LightGBM能够在保持模型性能的同时,降低训练数据集的大小,从而加速训练过程。这对于大规模数据集尤其有用,可以减少每次迭代所需的计算和存储资源。需要注意的是,GOSS算法可能会引入一些噪声,因为它会丢弃一部分样本,但通常情况下,这种噪声的影响可以通过调整超参数来控制。
在这里插入图片描述

4.互斥特征捆绑算法(EFB)

“互斥特征捆绑算法”(Exclusive Feature Bundling,EFB)是LightGBM中用于处理高维度数据中特征相关性问题的一种技术。其思想是将高度相关的特征捆绑在一起,将它们视为一个整体进行处理,以降低模型的复杂性和过拟合风险。

4.1特征相关性捆绑

在高维度数据中,有时会存在许多高度相关的特征。这些特征可能会导致模型过拟合,因为它们提供了类似的信息,但会增加模型的复杂性。EFB的思想是将这些高度相关的特征捆绑在一起,视为一个特征组。

极端稀疏数据如下图就可以比较直观的看到效果,当然实际算法和PCA降维算法类似。

在这里插入图片描述

4.2特征组代表

在每个特征组中,EFB会选择一个特征作为代表性特征。这个代表性特征在特征组内与其他特征的相关性较低,因此它可以被视为特征组的代表。
在这里插入图片描述

EFB 算法利用特征和特征间的关系构造一个加权无向图,并将其转换为图着色的问题来求解,求解过程中采用的贪心策略。

  • 首先将所有的特征看成图的各个顶点,将不相互独立的特征用一条边连起来,边的权重就是两个相连接的特征的总冲突值(也就是这两个特征上同时不为0的样本个数)。
  • 然后按照节点的度对特征降序排序, 度越大,说明与其他特征的冲突越大
  • 对于每一个特征, 遍历已有的特征簇,如果发现该特征加入到特征簇中的矛盾数不超过某一个阈值,则将该特征加入到该簇中。 如果该特征不能加入任何一个已有的特征簇,则新建一个簇,将该特征加入到新建的簇中。

在这里插入图片描述

4.3特征转换

在训练过程中,EFB会将特征组内的特征进行转换,使其与代表性特征之间的相关性最小化。这有助于减少特征捆绑对模型性能的影响。通过将高度相关的特征捆绑在一起,EFB减少了模型中的特征数量,从而降低了模型的复杂性。这有助于减少过拟合风险,提高模型的泛化能力。

讲了太多理论内容怕大家一时半会消化不过来,直接上实例展示一下lightgbm算法的强大。

三、基于LightGBM用户购买意愿预测模型搭建

经过了上面的学习我们清楚LightGBM模型的几个要点,不需要再对数据进行数据均衡处理,也不需要额外的缺失值处理,并且还不需要特征降维操作,能够直接处理类别特征,直接免去了大量的数据工程。

那么我们首先预览一下数据集:
在这里插入图片描述

这是2021 华数杯全国大学生数学建模竞赛C题数据集,列表每一个维度特征对应着客户个人特征调查表中收集的维度数据。

在这里插入图片描述

以及

  • a1、舒适性(环保与空间座椅)整体表现满意度得分
  • a2、经济性(耗能与保值率)整体 满意度得分
  • a3、安全性表现(刹车和行车视野)整体满意度得分
  • a4、动力性表现(爬 坡和加速)整体满意度得分
  • a5、驾驶操控性表现(转弯和高速的稳定性)整体满意度得 分
  • a6、外观内饰整体表现满意度得分
  • a7、配置与质量品质整体满意度得分

如果根据a1到a7正常来推算购买意愿是比较容易的算法,但是结合用户特征表B表的数据,我们还需要根据问题不同来处理每一个对应维度的数据是否定类还是定量。那么这些问题如果采用传统的机器学习来说就会比较麻烦,需要数据清洗和数据均衡,因为有购买意愿的用户是极少的:

在这里插入图片描述

且数据也存在大量空值需要处理:

在这里插入图片描述

但是我们使用LightGBM就可以无视以上这些情况直接训练,以下是一些常用的LightGBM训练参数:

  1. boosting_type(提升类型): 可选值包括’gbdt’(传统的梯度提升树)、‘rf’(随机森林)、‘dart’(Dropouts meet Multiple Additive Regression Trees)和’goss’(Gradient-based One-Side Sampling)等。
  2. num_leaves(叶子节点数): 定义每棵树的叶子节点数量,较大的值可以增加模型的复杂性,但也可能导致过拟合。
  3. learning_rate(学习率): 控制每次迭代中模型参数的更新步长。较小的值会使训练过程更加稳定,但可能需要更多的迭代次数。
  4. n_estimators(迭代次数): 指定训练的树的数量,通常需要根据问题的复杂程度来设置。
  5. max_depth(树的最大深度): 限制每棵树的最大深度,可以用于防止过拟合。
  6. min_child_samples(叶子节点最小样本数): 指定每个叶子节点上的最小样本数,用于控制剪枝,防止生成过深的树。
  7. subsample(子采样比例): 控制每棵树训练时的样本子采样比例,用于防止过拟合。
  8. colsample_bytree(特征子采样比例): 控制每棵树训练时的特征子采样比例,用于防止特征间的强相关性影响。
  9. reg_alpha(L1正则化项)reg_lambda(L2正则化项): 用于控制模型复杂性,防止过拟合。
  10. scale_pos_weight(正负样本权重平衡): 用于处理类别不平衡问题,增加少数类别的样本权重。
  11. objective(目标函数): 定义要最小化的损失函数,例如’regression’(回归问题)或’binary’(二分类问题)等。
  12. metric(评估指标): 用于评估模型性能的指标,如’rmse’(均方根误差)、‘auc’(ROC曲线下面积)等。

这只是一些常用的LightGBM训练参数示例,实际使用中还有很多其他参数可以进行调节。不同的问题和数据集可能需要不同的参数配置,因此在使用LightGBM时,您可以根据问题的特点进行参数调优,以获得最佳的模型性能。可以通过查阅LightGBM的官方文档和相关资源,深入了解每个参数的含义和使用方法。

import lightgbm as lgb
from sklearn.model_selection import train_test_split
import joblib
from sklearn.metrics import mean_squared_error

X_train, X_test, y_train, y_test = train_test_split(X, target, test_size=0.2)

# 创建成lgb特征的数据集格式
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)

# 定义训练参数
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
}

# 训练模型
num_round = 100  # 迭代次数
bst = lgb.train(params, lgb_train, num_round, valid_sets=[lgb_eval], early_stopping_rounds=10)

# 保存模型
model_filename = 'lgb_model.pkl'
joblib.dump(bst, model_filename)

# 预测数据集
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
 
# 评估模型
print('The rmse of prediction is:', mean_squared_error(y_test,y_pred))

在这里插入图片描述

混淆矩阵:

from sklearn.metrics import confusion_matrix
import numpy as np
# 使用 NumPy 将小于 0.5 的值归为 0,大于等于 0.5 的值归为 1
y_pred_binary = (y_pred >= 0.5).astype(int)

labels=[0,1]
cm= confusion_matrix(y_test, y_pred_binary,labels=[0,1])
sns.heatmap(cm,annot=True ,fmt="d",xticklabels=labels,yticklabels=labels)

plt.title('confusion matrix')  # 标题
plt.xlabel('Predict lable')  # x轴
plt.ylabel('True lable')  # y轴
plt.show()

在这里插入图片描述

样本案例的数据不太好,太不均衡了没办法,下次如果有好的数据集再重新跑一遍。

总结

最后还是和上篇算法的XGBoost算法对比一下:

LightGBM的优点:

  1. 更快的训练速度: LightGBM采用了GOSS(Gradient-based One-Side Sampling)和直方图优化等技术,使得它在训练速度上通常比XGBoost更快。这对于处理大规模数据集非常有益。
  2. 更低的内存消耗: LightGBM通过对特征值的离散化处理和直方图优化,减少了内存的使用,尤其适合处理大数据。
  3. 更好的处理高维稀疏数据: LightGBM在处理高维稀疏数据时表现更好,这是因为它可以使用直方图优化技术。
  4. 更好的处理类别特征: LightGBM能够直接处理类别特征,无需进行独热编码等处理。
  5. 支持并行化: LightGBM支持并行化计算,可以有效地利用多核处理器。

LightGBM的缺点:

  1. 对异常值敏感: LightGBM的样本采样技术可能对异常值比较敏感,因此在处理异常值时需要小心。

XGBoost的优点:

  1. 较强的正则化: XGBoost在正则化方面更强,可以有效防止过拟合。
  2. 广泛应用: XGBoost已经存在较长时间,在许多数据科学竞赛和实际应用中得到了广泛应用,有更多的实践经验。

XGBoost的缺点:

  1. 较大的内存消耗: XGBoost在内存消耗方面相对较大,对于大规模数据集可能会受到限制。
  2. 速度相对较慢: 相对于LightGBM,XGBoost的训练速度可能稍慢。

总体来说,LightGBM和XGBoost都是非常出色的梯度提升树算法实现,在不同场景下可能有不同的优势。选择哪个算法取决于数据集的大小、特征的性质、计算资源以及具体的问题需求。在实际使用中,通常需要尝试不同的算法并进行参数调优,以找到最适合问题的算法和配置。

泛应用,有更多的实践经验。

XGBoost的缺点:

  1. 较大的内存消耗: XGBoost在内存消耗方面相对较大,对于大规模数据集可能会受到限制。
  2. 速度相对较慢: 相对于LightGBM,XGBoost的训练速度可能稍慢。

总体来说,LightGBM和XGBoost都是非常出色的梯度提升树算法实现,在不同场景下可能有不同的优势。选择哪个算法取决于数据集的大小、特征的性质、计算资源以及具体的问题需求。在实际使用中,通常需要尝试不同的算法并进行参数调优,以找到最适合问题的算法和配置。

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

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

相关文章

yolov8后处理——DFL卷积如何卷

以 512*288 输入为例,网络输出大小 1*64*3024,其中 1 为 batch size,64为超参数reg_max16 和 bbox 个数 4 的乘积,302416*932*1864*36(其中512/3216,288/329) 首先 DFL 卷积是和 0-15 卷积,下面…

Ros noetic Move_base 监听Move状态 实战使用教程

前言: 承接上一篇文章,在上一文中我们了解到move_base有几种监听的状态,我一文章中我将开源全部监听代码,本文将从0开始建立监听包,并覆上全部的工程代码,和仿真实操结果。 本文,还将解决当临时障碍物与机身相交时,机器人回人为自己被“卡住”,局部规划器规划的速度为…

商业大厦烟感监控,效果出乎意料!

烟感监控是现代安全技术中至关重要的一环,其在预防火灾、保护生命和财产方面发挥着关键作用。通过使用先进的烟雾探测器和智能报警系统,烟感监控能够及早发现烟雾和火源,并在火灾爆发前提供必要的警示和警报。 通过其精密的传感技术和联动装置…

新品如何传播,小红书种草策略分析!

种草是小红书品宣与传播的核心,也是平台的巨大优势。品牌想要在小红书进行快速传播,制定一份可落地实施的种草策略是必不可少的。今天将通过一篇文章,给大家分享一下新品如何传播,小红书种草策略分析! 一、如何进行小红…

6、Spring_Junit与JdbcTemplate整合

Spring 整合 1.Spring 整合 Junit 1.1新建项目结构 1.2导入依赖 导入 junit 与 Spring 依赖 <!-- 添加 spring 依赖--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version…

pdf格式怎么编辑?了解这种编辑方法就可以了

pdf格式怎么编辑&#xff1f;PDF作为一种通用的文档格式&#xff0c;以其跨平台、保真排版等优势在各个领域得到广泛应用。然而&#xff0c;对于许多人来说&#xff0c;PDF文件一直以来都被视为“静态”文件&#xff0c;不易编辑。但现在&#xff0c;有很多编辑器可以帮助我们进…

qt5 TLS initialization failed error

首先打印openssl支持信息 qDebug() << QSslSocket::supportsSsl() << "\n"; qDebug() << QSslSocket::sslLibraryBuildVersionString(); //上述代码打印下面的结果&#xff1a; false "OpenSSL 1.1.1g 21 Apr 2020"更新对应openssl证…

【从零学习python 】74. UDP网络程序:端口问题与绑定信息详解

文章目录 udp网络程序-端口问题UDP绑定信息总结 进阶案例 udp网络程序-端口问题 在运行 UDP 网络程序时&#xff0c;会遇到端口号会变化的情况。 每次重新运行网络程序后&#xff0c;可以观察到运行中的“网络调试助手”显示的数字是不同的。这是因为该数字标识了网络程序的…

35309-53-6,cyclo(Asp-Asp),氨基酸中间体,环(-天冬氨酰-天冬氨酰),

中文名&#xff1a;CYCLO(-天冬氨酸-ASP) 2,5-哌嗪二乙酸&#xff0c;3,6-二氧基-&#xff08;2S-顺式&#xff09; 环(-天冬氨酰-天冬氨酰) 英文名&#xff1a;cyclo(Asp-Asp)&#xff0c; [(2S)-(3,6-dioxo-piperazine-2r,5c-diyl)-di-acetic acid Cyclo(L-Aspartyl-L-A…

iPhone如何录屏?详细教程大揭秘(最新)

“iphone怎么录屏呀&#xff0c;有人知道吗&#xff1f;用了很久的iphone12了&#xff0c;却不知道录屏功能在哪里&#xff0c;现在需要用来录教程&#xff0c;找也找不到&#xff0c;有人知道iphone录屏在哪里吗&#xff1f;很急&#xff01;” iphone作为一款备受欢迎的智能…

MySQL 主从配置

环境 centos6.7 虚拟机两台 主&#xff1a;192.168.23.160 从&#xff1a;192.168.23.163 准备 在两台机器上分别安装mysql5.6.23&#xff0c;安装完成后利用临时密码登录mysql数据修改root的密码&#xff1b;将my.cnf配置文件放至/etc/my.cnf&#xff0c;重启mysql服务进…

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验2

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验2 01/多旋翼动力系统简介 多旋翼无人机的动力系统通常包括螺旋桨、电机、电调以及电池。动力系统是多旋翼最重要的组成部分&#xff0c;它决定了多旋翼的主要性能&#xff0c;如悬停时间、载重能力、飞行速度和飞行距…

一文学会使用ChatGPT API搭建自己的聊天网站

一文读懂如何搭建自己的ChatGPT聊天网站 在数字时代的浪潮下&#xff0c;人工智能正变得愈发令人惊叹和亲近。ChatGPT&#xff0c;就是这个变革的杰出代表。这项令人兴奋的技术将强大的自然语言处理能力带到您的指尖&#xff0c;让您能够以前所未有的方式与计算机进行互动。 …

langchain ChatGPT AI私有知识库

企业知识库 原理就是把文档变为向量数据库&#xff0c;然后搜索向量数据库&#xff0c;把相似的数据和问题作为prompt&#xff0c; 输入到大模型&#xff0c;再利用GPT强大的自然语言处理、推理和分析等方面的能力将答案返回给用户 什么是langchain? langchain是一个强大的…

自定义VIEW之SeekBar

先放效果 实现代码 import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Rect import android.util.AttributeSet import android…

美团增量数仓建设新进展

摘要&#xff1a;本文整理自美团系统研发工程师汤楚熙&#xff0c;在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 建设背景 2. 核心能力设计与优化 3. 业务实践 4. 未来展望 Tips&#xff1a;点击「阅读原文」免费领取 5000CU*小时…

解决 泛型类型转换出现Unchecked cast: ‘java.lang.Object‘ to ‘T‘怎么解决

文章目录 解决 泛型类型转换出现Unchecked cast: java.lang.Object to T怎么解决场景复现如何解决如何应用demo案例说明 解决 泛型类型转换出现Unchecked cast: java.lang.Object to T怎么解决 场景复现 自定义工具类&#xff0c;编写公共方法&#xff0c;根据不同日期类型&a…

动规算法题:打家劫舍Ⅱ

题目链接&#xff1a;打家劫舍Ⅱ 题目分析 状态表示 从题目分析中可以得知&#xff0c;是有偷和不偷的情况&#xff0c;因此根据做题经验&#xff0c;就使用两个数组来对应着两个情况。 状态转移方程 ①当选择偷第i个位置&#xff0c;那就意味着第i-1个位置的值是不能偷的&a…

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#…

大项与小项

小项 n个命题变元的简单合取式&#xff0c;称作小项&#xff0c;其中每个命题变元与它的否定不能同时存在&#xff0c;但每个命题变元必须出现且仅出现一次。 n个命题变元的小项有2^n个 小项的编码&#xff1a;mi&#xff0c;其中i是使得小项等于1的一组指派的二进制表示。 大项…