LightGBM(LGB)

article/2025/9/24 8:53:05

转载自littlemichelle

LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

背景

常用的机器学习算法,例如神经网络等算法,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。

原生形式使用lightgbm(import lightgbm as lgb)

import lightgbm as lgb
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加载数据
iris = load_iris()
data = iris.data
target = iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)
print("Train data length:", len(X_train))
print("Test data length:", len(X_test))# 转换为Dataset数据格式
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)# 参数
params = {'task': 'train','boosting_type': 'gbdt',  # 设置提升类型'objective': 'regression',  # 目标函数'metric': {'l2', 'auc'},  # 评估函数'num_leaves': 31,  # 叶子节点数'learning_rate': 0.05,  # 学习速率'feature_fraction': 0.9,  # 建树的特征选择比例'bagging_fraction': 0.8,  # 建树的样本采样比例'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging'verbose': 1  # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
}# 模型训练
gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5)# 模型保存
gbm.save_model('model.txt')# 模型加载
gbm = lgb.Booster(model_file='model.txt')# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)# 模型评估
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)

Sklearn接口形式使用lightgbm(from lightgbm import LGBMRegressor)


from lightgbm import LGBMRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import joblib# 加载数据
iris = load_iris()
data = iris.data
target = iris.target# 划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)# 模型训练
gbm = LGBMRegressor(objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='l1', early_stopping_rounds=5)# 模型存储
joblib.dump(gbm, 'loan_model.pkl')
# 模型加载
gbm = joblib.load('loan_model.pkl')# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)# 模型评估
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)# 特征重要度
print('Feature importances:', list(gbm.feature_importances_))# 网格搜索,参数优化
estimator = LGBMRegressor(num_leaves=31)
param_grid = {'learning_rate': [0.01, 0.1, 1],'n_estimators': [20, 40]
}
gbm = GridSearchCV(estimator, param_grid)
gbm.fit(X_train, y_train)
print('Best parameters found by grid search are:', gbm.best_params_)

第二种接口实现,个人感觉比第一种好记

import datetime
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.datasets import load_breast_cancer#加载经典的乳腺癌数据
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt#加载数据集
breast=load_breast_cancer()
#获取特征值和目标值
X,y=breast.data,breast.target
#获取目标名称
feature_name=breast.feature_names#数据集划分
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)#数据格式转换
lgb_train=lgb.Dataset(X_train,y_train)
lgb_eval=lgb.Dataset(X_test,y_test,reference=lgb_train)#参数设置
boost_round=50#迭代次数
early_stop_rounds=10#验证数据如果在early_stop_rounds轮中未提高,则提前停止params={'boost_type':'gbdt',#设置提升类型'objective': 'regression',  # 目标函数'metric': {'l2', 'auc'},  # 评估函数'num_leaves': 31,  # 叶子节点数'learning_rate': 0.05,  # 学习速率'feature_fraction': 0.9,  # 建树的特征选择比例'bagging_fraction': 0.8,  # 建树的样本采样比例'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging'verbose': 1  # <0 显示致命的, =0 显示错误 (警告), >0 显示信息}
result={}
gbm=lgb.train(params,lgb_train,num_boost_round=boost_round,valid_sets=(lgb_train,lgb_eval),valid_names=('validata','train'),early_stopping_rounds=early_stop_rounds,evals_result=result
)

> **参数:**
> 
> boosting_type (string__, optional (default="gbdt")) – ‘gbdt’,
> traditional Gradient Boosting Decision Tree. ‘dart’, Dropouts meet
> Multiple Additive Regression Trees. ‘goss’, Gradient-based One-Side
> Sampling. ‘rf’, Random Forest. 默认的就挺好
> 
> num_leaves (int__, optional (default=31)) – Maximum tree leaves for
> base learners. 每个基学习器的最大叶子节点。LightGBM 使用的是 leaf-wise
> 的算法,因此在调节树的复杂程度时使用的是 num_leaves,它的值的设置应该小于 2^(max_depth)
> 
> max_depth (int__, optional (default=-1)) – Maximum tree depth for base
> learners, -1 means no limit. 每个基学习器的最大深度。当模型过拟合,首先降低max_depth 
> 
> learning_rate (float__, optional (default=0.1)) – Boosting learning
> rate. 梯度下降的步长。常用 0.1, 0.001, 0.003
> 
> n_estimators (int__, optional (default=10)) – Number of boosted trees
> to fit. 基学习器的数量 
> 
> max_bin (int__, optional (default=255)) – Number of bucketed bins for
> feature values. 存储feature的bin的最大数量,对应的是直方图的组数k  
> 
> subsample_for_bin (int__, optional (default=50000)) – Number of
> samples for constructing bins. 用来构建直方图的数据的样本数量
> 
> objective (string__, callable or None__, optional (default=None)) –
> Specify the learning task and the corresponding learning objective or
> a custom objective function to be used (see note below). default:
> ‘regression’ for LGBMRegressor, ‘binary’ or ‘multiclass’ for
> LGBMClassifier, ‘lambdarank’ for LGBMRanker.
> 
> min_split_gain(= min_gain_to_split) (float__, optional (default=0.)) –
> Minimum loss reduction required to make a further partition on a leaf
> node of the tree. 最小切分的信息增益值
> 
> min_child_weight(= min_sum_hessian_in_leaf) (float__, optional
> (default=1e-3)) – Minimum sum of instance weight(hessian) needed in a
> child(leaf).
> 决定最小叶子节点样本权重和(hessian)的最小阈值,若是基学习器切分后得到的叶节点中样本权重和低于该阈值则不会进一步切分,在线性模型中该阈值就对应每个节点的最小样本数。当它的值较大时,可以避免模型学习到局部的特殊样本,防止模型过拟合。但如果这个值过高,又会导致欠拟合
> 
> min_child_samples(= min_data_in_leaf) (int__, optional (default=20)) –
> Minimum number of data need in a child(leaf). 一个叶子节点中最小的数据量,调大可以防止过拟合
> 
> subsample (= bagging_fraction)(float__, optional (default=1.)) –
> Subsample ratio of the training instance.
> 这个参数控制对于每棵树,在非重复采样的情况下随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合,加快运算速度。但是这个值设置的过小,它可能会导致欠拟合
> 
> subsample_freq(= bagging_freq) (int__, optional (default=1)) –
> Frequence of subsample, <=0 means no enable. bagging 的频率, 0 意味着禁用
> bagging. k 意味着每 k 次迭代执行bagging
> 
> colsample_bytree(= feature_fraction) (float__, optional (default=1.))
> – Subsample ratio of columns when constructing each tree.
> 用来控制每棵随机采样的列数的占比(每一列是一个特征)。 调小可以防止过拟合,加快运算速度。典型值:0.5-1范围:
> (0,1]。一般设置成0.8左右。
> 
> reg_alpha(= lambda_l1)(float__, optional (default=0.)) – L1
> regularization term on weights. L1 正则化项的权重系数,越大模型越保守。防止过拟合,提高泛化能力
> 
> reg_lambda(= lambda_l2) (float__, optional (default=0.)) – L2
> regularization term on weights. L2 正则化项的权重系数,越大模型越保守。防止过拟合,提高泛化能力
> 
> random_state (int or None__, optional (default=None)) – Random number
> seed. Will use default seeds in c++ code if set to None.
> 计算机不能产生绝对的随机数,只能产生伪随机数。伪就是有规律的意思。如果每次使用一样的 随机种子,生成的随机数列就是一样的了
> 
> n_jobs (int__, optional (default=-1)) – Number of parallel threads.
> 多线程,表示可以在机器的多个核上并行的构造树以及计算预测值。不过受限于通信成本,可能效率并不会说分为k个线程就得到k倍的提升,不过整体而言相对需要构造大量的树或者构建一棵复杂的树而言还是高效的
> 
> silent (bool__, optional (default=True)) – Whether to print messages
> while running boosting. 在运行过程中是否打印流程
> 
>  
> 
> 官方参数优化建议 针对 Leaf-wise (最佳优先) 树的参数优化
> 
> num_leaves. 这是控制树模型复杂度的主要参数. 理论上, 借鉴 depth-wise 树, 我们可以设置 num_leaves =
> 2^(max_depth) 但是, 这种简单的转化在实际应用中表现不佳. 这是因为, 当叶子数目相同时, leaf-wise 树要比
> depth-wise 树深得多, 这就有可能导致过拟合. 因此, 当我们试着调整 num_leaves 的取值时, 应该让其小于
> 2^(max_depth). 举个例子, 当 max_depth=6 时(这里译者认为例子中, 树的最大深度应为7), depth-wise
> 树可以达到较高的准确率.但是如果设置 num_leaves 为 127 时, 有可能会导致过拟合, 而将其设置为 70 或 80
> 时可能会得到比 depth-wise 树更高的准确率. 其实, depth 的概念在 leaf-wise 树中并没有多大作用,
> 因为并不存在一个从 leaves 到 depth 的合理映射. min_child_samples(min_data_in_leaf).
> 这是处理 leaf-wise 树的过拟合问题中一个非常重要的参数. 它的值取决于训练数据的样本个树和 num_leaves.
> 将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合. 实际应用中, 对于大数据集, 设置其为几百或几千就足够了.
> max_depth. 你也可以利用 max_depth 来显式地限制树的深度 针对更快的训练速度
> 
> 通过设置 subsample(bagging_fraction) 和 subsample_freq(= bagging_freq)
> 参数来使用 bagging 方法进行采样提升训练速度(减小了数据集) 通过设置 colsample_bytree(=
> feature_fraction)参数来使用特征的子抽样 使用较小的 max_bin,较少的直方图数目 使用 save_binary
> 将数据集被保存为二进制文件,下次加载数据时速度会变快 通过并行训练来提速 针对更好的准确率
> 
> 使用较大的直方图数目 max_bin,这样会牺牲训练速度 使用较小的学习率 learning_rate,这样会增加迭代次数 使用较大的
> num_leaves,可能导致过拟合 使用更大的训练数据 尝试 dart 模型(Dropouts meet Multiple
> Additive Regression Trees) 处理过拟合
> 
> 设置较少的直方图数目 max_bin 设置较小的叶节点数 num_leaves 使用
> min_child_samples(min_data_in_leaf) 和  min_child_weight(=
> min_sum_hessian_in_leaf) 通过设置  subsample(bagging_fraction) 和 
> subsample_freq(= bagging_freq)来使用 bagging 通过设置
> colsample_bytree(feature_fraction) 来使用特征子抽样 使用更大的训练数据 使用
> reg_alpha(lambda_l1), reg_lambda(lambda_l2) 和
> min_split_gain(min_gain_to_split) 来使用正则 尝试 max_depth 来避免生成过深的树

一个上午的个人学习笔记,用了一些草稿纸,害怕丢,就放到博客上了,我这字迹和作图.。。。。。。哈哈,看不懂就别看了,这里面我自己不会的也有好多,等我完全搞明白了再好好整理一份。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/V2ZaE0b9.shtml

相关文章

lgbm参数分析及回归超参数寻找

参考&#xff1a;lgbm的github: https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst 代码来源参见我另一篇博客&#xff1a; https://blog.csdn.net/ssswill/article/details/85217702 网格搜索寻找超参数&#xff1a; from sklearn.model_selection imp…

LGBM 模型结果 图形展示

一、LGBM 模型结果 图形展示&#xff1a; 1、模型训练 train_x train[feas_x] train_y train[target].astype(int).copy() test_x, test_y test[feas_x], test[target] lgb_clf lgb.LGBMClassifier(objectivebinary,metricauc,num_leaves20,max_depth2,learning_rate0.06,…

Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)

参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量&#xff0c;在统计学里面叫做协变量也叫自变量&#xff0c;在量化投资里面则叫做因子&#xff0c;所谓多因子就是有很多的特征变量。 本次带来的就是多因子模型&#xff0c;并且使用的是机器学习的强大的非…

LightGBM(lgb)详解

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

[机器学习] 模型融合GBDT(xgb/lgbm/rf)+LR 的原理及实践

目录 一、原理 GBDT LR 是什么,用在哪 二、说明 GBDT LR 的结构 RF LR ? Xgb LR? GBDT LR 模型提升 三、实践 1 如何获得样本落在哪个叶子节点 2 举例 2.2.1 训练集准备 2.2.2 RFLR 2.2.3 GBDTLR 2.2.4 XgboostLR 2.2.5 单独使用RF, GBDT和Xgboost 2.2.6 …

xgboost 与 lgbm

相关性分析模型可行性报告 基于数值的模型-xgboost 简介 XGBoost是一个优化的分布式梯度提升库&#xff0c;旨在高效&#xff0c;灵活和便携。它在梯度提升框架下实现机器学习算法。XGBoost提供了一个并行树提升&#xff08;也称为GBDT&#xff0c;GBM&#xff09;&#xff…

一文彻底看懂LightGBM

本文适合有集成学习与XGBoost基础的读者了解LightGBM算法。 序 LightGBM是基于XGBoost的改进版&#xff0c;在处理样本量大、特征纬度高的数据时&#xff0c;XGBoost效率和可扩展性也不够理想&#xff0c;因为其在对树节点分裂时&#xff0c;需要扫描每一个特征的每一个特征值…

LGBM算法

LGBM 算法定义算法实践其他 算法概念 Light GBM is a gradient boosting framework that uses tree based learning algorithm。 传统的GBDT算法存在的问题&#xff1a; 如何减少训练数据 常用的减少训练数据量的方式是down sample。例如在[5]中&#xff0c;权重小于阈值的…

LGBM调参方法学习

一、了解LGBM参数&#xff1a; LGBM是微软发布的轻量梯度提升机&#xff0c;最主要的特点是快&#xff0c;回归和分类树模型。使用LGBM首先需要查看其参数含义&#xff1a; 微软官方github上的说明&#xff1a; https://github.com/Microsoft/LightGBM/blob/master/docs/Param…

使用线性回归、LGBM对二手车价格进行预测

使用线性回归、LGBM对二手车价格进行预测 目录 使用线性回归、LGBM对二手车价格进行预测说明 数据导入、查看和清洗数据说明导入训练集导入测试集合并数据查看数据整体情况处理数据检查并处理缺失变量 EDA年份和价格地区和价格前任里程和价格燃料类型和价格传动装置类型Mileage…

MFC VS2010 Open CASCADE新建自己的工程

最近磕磕绊绊的去尝试用open cascade建立自己需要的工程文件&#xff0c;终于成功了&#xff0c;一直从网上获取方法&#xff0c;今天自己写一点心得&#xff0c;分享给大家。 一、准备&#xff1a; 1、安装 open cascade &#xff0c; 我安装后目录是&#xff1a; C:\OpenCAS…

[C++] OpenCasCade空间几何库的模型展现

OpenCasCade是什么 Open CASCADE&#xff08;简称OCC&#xff09;平台是由法国Matra Datavision公司开发的CAD/CAE/CAM软件平台&#xff0c;可以说是世界上最重要的几何造型基础软件平台之一。开源OCC对象库是一个面向对象C类库&#xff0c;用于快速开发设计领域的专业应用程序…

MFC中使用OpenCasCade示例

目录&#xff1a; 一、OpenCasCade开发环境搭建 二、创建一个MFC应用程序 三、在MFC工程中添加代码 四、画个瓶子 一、OpenCasCade开发环境搭建 参见《OpenCasCade开发环境搭建》&#xff0c;这篇文章最后运行示例前所做的工作为以后开发OpenCasCade工程铺平了路&#xff…

HTML<HBuilder X>

一&#xff1a;网页基本标签元素 HTML常用标签(HTML不是一种编程语言&#xff0c;而是一种标记语言&#xff09;&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head><…

Opencascade 开发 1章

序 这一系列的文章旨在介绍一个方便大家开始开发自己CAD的方法。需要指出的是&#xff0c;本人主要希望通过分享一些相关技术&#xff0c;提升国人软件自主的意识和途径。通过本文构建自己的CAD只是软件自主化的非常非常小的一步&#xff0c;希望大家在不停尝试的过程中有所提…

【OCC学习5】记录最新版本emcc编译occ的bug:opencascade-7.6.0/src/Standard/Standard_Time.hxx:29:25: error: redefinit

1. 在研究OCC与Webassembly结合使用&#xff0c;编译的时候遇到以下问题&#xff1a; C:/workspace/occ_wasm/opencascade-7.6.0/src/Standard/Standard_Integer.hxx:126:25: note: previous definition is here inline Standard_Boolean IsEqual (const Standard_Integer the…

NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突 在UG二次开发中&#xff0c;若使用MFC库&#xff0c;一旦加上#include<Afx.h>头文件&#xff0c;或者使用<windows.h>头文件下面这句话就报错 theDialog GetPoints::theUI->CreateDialog(theDlxF…

HLO--XLA

HLO: high level optimizer 高级优化器 XLA&#xff1a; XLA(Accelerated Linear Algebra)-加速线性代数&#xff0c;Google推出的高性能机器学习领域编译器&#xff08;编译型推理引擎&#xff09;&#xff0c;它可以在不更改源代码的条件下加速Tensorflow模型 提高TensorFlo…

C++:C++编译过程:看完还不懂C++编译过程来捶我

1&#xff1a;先看图 2&#xff1a;一个C源文件从文本到可执行文件经历的过程&#xff1a; gcc Hello.cpp 预处理阶段&#xff1a;gcc -E hello.c -o hello.i 对源代码文件中包含关系&#xff08;头文件&#xff09;&#xff0c;预编译语句&#xff08;宏定义&#xff09…

h计算机软件指什么,HXX 文件扩展名: 它是什么以及如何打开它?

解决难以打开 HXX 文件的问题 打开 HXX 文件过程中所遇到的常见问题 MacroMates TextMate 消失 尝试打开 HXX 时&#xff0c;你会遇到一条错误消息&#xff0c;例如 “%%os%% 无法打开 HXX 文件”。 如果是这种情况&#xff0c;通常是因为 你的计算机上没有安装 MacroMates Tex…