首页 > 其他分享 >为什么LightGBM如此之快

为什么LightGBM如此之快

时间:2024-05-30 15:00:40浏览次数:21  
标签:bagging 为什么 LightGBM 之快 train grid model 默认值

为什么LightGBM如此之快

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

模型解释

Light GBM 代表轻量级梯度提升机,因此,它是另一种使用基于树的学习的梯度提升算法,由微软开发:
与任何其他梯度提升算法一样,它主要用 C++ 实现。此外,它还可以与许多其他扩展(Python、R、Java 等)交互。
由于某些独特的特点,它与其他梯度提升算法区别开来。

  1. 它更快、更高效
  2. 它使用更少的内存
  3. 提供更高的准确性
  4. 支持并行计算和GPU学习
  5. 可以处理大数据

树木叶子的生长

决策树的学习过程可以采用两种策略,即逐层(也称为逐深度)或逐叶。
在逐级策略中,树在生长过程中保持平衡,确保每个级别都得到充分发展后再进入下一个级别。相反,在逐叶策略中,重点是分裂叶子,从而最大程度地减少损失,这可能会造成树不平衡。
growth
在 LightGBM 中,树木采用“逐叶”方法生长。
在这里插入图片描述
LightGBM 每次向树中添加一个节点,根据增益选择下一个节点,而不管树的深度如何。此过程会导致树更深且更不平衡。虽然这样的树结构往往具有较低的训练误差,但也可能导致过度拟合,尤其是在较小的数据集中。因此,LightGBM 本质上更适合大型数据集。当将其应用于小型数据集时,仔细调整超参数对于防止过度拟合至关重要。

Bins

LightGBM 速度很快,因为它通过将连续特征值离散化为离散箱来最大限度地降低计算成本,从而有效地将连续特征转换为直方图。
假设一个特征具有许多不同的值。在这种情况下,潜在的分割点数量将非常多。
例如,分割应在 2 和 3 之间进行,还是在 12 和 13 之间进行?
在这里插入图片描述
相反,LightGBM 将连续值分成多个箱,与其他梯度提升算法相比,显著减少了需要探索的潜在分割数量。
在这里插入图片描述

独家功能捆绑

LightGBM 旨在有效管理稀疏特征而不影响准确性。通过独占特征捆绑 (EFB),稀疏特征被组合成更密集的特征,从而降低复杂性。这可以加快训练过程并降低内存消耗。
捆绑功能
假设我们有两个如上所述的特征;它们可以有效地合并为一个向量,而不会丢失任何信息。该算法结合了一种搜索此类组合的机制,并努力创建这些特征的捆绑包。因此,这个过程减少了特征的数量,改善了内存消耗和训练时间。

分布式学习

当需要更多计算能力时,我们可以使用多台机器同时使用LightGBM。
在这里插入图片描述
每个工作者(或等级)持有不同的数据块并负责相应的计算。

参数

  1. objective:这定义了问题的类型。regression表示回归问题。binary表示二元分类问题。
  2. metric:评估指标。默认值为 ’ auto ‘,在这种情况下,算法会自行选择指标。有很多指标选项:’ rmse ’ 是回归问题的均方根误差;’ binary_logloss ’ 用于二分类问题,’ multi_logloss ’ 用于多类分类问题
  3. boosting:可以定义 Boosting 方法。默认为 ’ gbdt '。其他选项包括 ’ rf ‘、’ dart ’ 和 ’ goss '。dart比较有名
  4. lambda_l1:L1正则化参数
  5. lambda_l2:L2正则化参数
  6. feature_fraction:列采样。每次迭代都会选择一个特征子集。默认值 = 0.9
  7. bagging_fraction:类似于“特征分数”,但它会随机选择部分数据而不进行重新采样。默认值为 0.9
  8. bagging_freq:0 表示不装袋。在每个给定值(装袋频率)处装袋。默认值为 1
  9. num_leaves:树中的最大叶子数。默认值为 64
  10. max_depth:你可以限制树的深度。避免过度拟合的重要参数
  11. max_bin:每个 bin 的最大数量。值越小,泛化效果越好。避免过度拟合的重要参数
  12. num_iterations:迭代次数
  13. learning_rate:默认值为 0.1
  14. early_stopping_round:如果经过 n 轮迭代后指标没有改善,则训练将停止
  15. min_data_in_leaf:每个叶子中必须包含的最小数据。避免过度拟合的重要参数。默认值为 3
  16. min_sum_hessian_in_leaf:叶子中 hessian 的最小和。默认值 = 1e-3

过度拟合时应采取的预防措施:

  1. 较小的max_bin
  2. num_leaves较小
  3. 使用min_data_in_leaf和min_sum_hessian_in_leaf
  4. 使用 bagging_fraction 和 bagging_freq
  5. 使用feature_fraction
  6. 扩展你的训练数据量
  7. 使用正则化
  8. 限制深度:max_depth

Python 代码

安装 Python 包;(您可以在此处找到有关如何使用 CUDA 或其他选项安装包的相关信息。)

代码片.

pip install lightgbm
#for Anaconda
conda install -c conda-forge lightgbm

让我们生成一个虚拟的二元分类数据:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码片.

从 sklearn.model_selection 导入 train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=4)

让我们使用** GridSearchCV** 来调整超参数:

代码片.

import lightgbm as lgb
from sklearn.model_selection import GridSearchCV

param_grid = {
    'objective': ["binary"],
    'metric': ['binary_logloss'],
    'boosting': ['gbdt','dart'],
    'lambda_l1': [0, 0.1, 0.01],
    'bagging_fraction': [0.7, 0.9],
    'bagging_freq': [0,1],
    'num_leaves': [32, 64, 128],
    'max_depth': [-1, 10],
    'max_bin': [100, 255],
    'num_iterations': [100, 200],
    'learning_rate':[0.01,0.1],
    'min_data_in_leaf': [3,5]
}

estimator = lgb.LGBMClassifier()

searcher = GridSearchCV(
        estimator=estimator,
        param_grid=param_grid, 
        cv=5, 
        n_jobs=-1, 
        scoring='accuracy',
        verbose=2)

grid_model = searcher.fit(X_train, y_train)

y_pred =grid_model.predict(X_test)
print(grid_model.best_score_)
print(grid_model.best_params_)

标签:bagging,为什么,LightGBM,之快,train,grid,model,默认值
From: https://blog.csdn.net/zy345293721/article/details/139316884

相关文章

  • elementPlus+vue3易踩的坑之el-radio单选框:为什么默认选项都被勾选了?
    出错的效果:选项都被选中了......明明是从elementplus复制过来的代码(如下),怎么会出现这个情况呢?<el-radio-groupv-model="radio"> <el-radiovalue="1">通过</el-radio> <el-radiovalue="2">不通过</el-radio> </el-radio-g......
  • TabControl和TabItem的样式自定义:为什么要使用自定义模板?
    在WPF(WindowsPresentationFoundation)中,控件的外观和行为是通过控件模板(ControlTemplate)来定义的。TabControl和TabItem控件也不例外,它们的默认控件模板定义了这些控件的结构和视觉状态。在实际应用中,开发者可能会发现直接设置TabItem的某些属性(例如Background)时不会生效。这篇......
  • 人为什么要经常出去旅行?
    人要经常出去旅行的原因有很多,这些原因涵盖了个人成长、心理健康、文化体验、人际关系以及生活质量的提升等方面。以下是一些主要的理由:个人成长与自我发现:旅行是一个极好的机会,可以让人走出自己的舒适区,面对新的挑战和经历。这些经历可以促使人思考自己的价值观、目标和......
  • 为什么工控现场会用到Profinet转Modbus网关设备
    为什么工控现场会用到Profinet转Modbus网关设备一、背景:工控现场之所以需要使用Profinet转Modbus网关,是因为工控系统中常常存在不同厂家设备之间通讯协议不一致的问题。而Modbus和Profinet分别代表着两种不同的通信协议,Profinet通常用于较新的设备,而Modbus则是比较老的通讯协议......
  • 为什么算法和数据结构重要?
    算法的重要性 效率提升:优秀的算法可以显著提高程序的执行效率,减少运行时间。解决复杂问题:算法提供了解决复杂问题的系统方法,如排序、大规模数据处理、路径规划等。优化资源使用:通过优化算法,可以更好地利用计算资源,如内存和处理能力。 数据结构的重要性 数据组织:良......
  • 梯度提升机器LightGBM集成学习回归、分类、参数调优可视化实例|附数据代码
    全文链接:https://tecdat.cn/?p=36275原文出处:拓端数据部落公众号LightGradientBoostedMachine(简称LightGBM)是一个开源库,它为梯度提升算法提供了高效且有效的实现。LightGBM通过添加一种自动特征选择的方式,并专注于提升具有较大梯度的样本,来扩展梯度提升算法。这可以显著加速......
  • 为什么在相机进行投影变换前要进行齐次操作?
    https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/95230246#:~:text=这就是引入齐次坐标的作用,把各种变换都统一了起来,即把缩放,旋转,平移等变换都统一起来,都表示成一连串的矩阵相乘的形式。保证了形式上的线性一致性。简短的解释:齐次坐标就是将一个原本是n维的向量......
  • 京东二面:为什么Netty要造FastThreadLocal?
    FastThreadLocal从字面意义上来看,它是“Fast”+“ThreadLocal”的结合体,寓意为快速的ThreadLocal。那么,问题来了,Netty为什么要再造一个FastThreadLocal?FastThreadLocal运行快的原因是啥?除了快之外,它还有其他优势吗?1.先从ThreadLocal说起ThreadLocal线程本地变量,每个线程都......
  • 为什么中国的开发者都喜欢用 vue?
    Vue.js在中国的开发者中非常受欢迎,这主要有以下几个原因:易于学习:Vue.js的学习曲线相对较平缓,对于初学者来说更加友好。它的API和设计都非常直观,使得开发者可以快速上手并开始开发。灵活性:Vue.js设计为渐进式的,这意味着开发者可以根据项目的需要选择使用部分或全部的Vue.js功能......
  • golang为什么chan大部分是发送结构体,而不是其它比如string
     typetokenstruct{}typeGroupstruct{cancelfunc(error)wgsync.WaitGroupsemchantokenerrOncesync.Onceerrerror}func(g*Group)done(){ifg.sem!=nil{<-g.sem}g.wg.Done()}在Go语言中,通道(......