LightGBM的python实现及参数优化

文章目录

  • 1. LightGBM模型参数介绍
  • 2. 核心优势
  • 3. python实现LightGBM
    • 3.1 基础实现
      • 3.1.1 Scikit-learn接口示例
      • 3.1.2 Python API示例
    • 3.2 模型调优
      • 3.2.1 GridSearchCV简介
      • 3.2.2 LightGBM超参调优
      • 3.2.3 GridSearchCV寻优结果

在之前的文章 Boosting算法【AdaBoost、GBDT 、XGBoost 、LightGBM】理论介绍及python代码实现 中重点介绍了AdaBoost算法的理论及实现,今天对LightGBM 如何实现以及如何调参,着重分析一下。

LightGBM是基于决策树算法的分布式梯度提升框架,属于GBDT(Gradient Boosting Decision Tree)家族,与XGBoost、CatBoost并称为三大主流GBDT工具。

1. LightGBM模型参数介绍

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

2. 核心优势

在这里插入图片描述
与XGBoost相比较
在这里插入图片描述

3. python实现LightGBM

3.1 基础实现

3.1.1 Scikit-learn接口示例

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号#导入数据
data = load_breast_cancer()
X = data.data
y = data.target# 分割数据集,80%作为训练集,20%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)# 创建Dataset
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)# 设置参数
params = {'objective': 'binary', #目标函数,决定了任务的类型(二分类  regression 回归)'metric': 'binary_logloss',   #二分类对数损失(Binary Logarithmic Loss)'num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9
}# 训练模型
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)# 评估
rmse = mean_squared_error(y_test, y_pred)
print(f'Test RMSE: {rmse}')

在这里插入图片描述

3.1.2 Python API示例

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号#导入数据
data = load_breast_cancer()
X = data.data
y = data.target# 分割数据集,80%作为训练集,20%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)model = LGBMClassifier(num_leaves=31,learning_rate=0.1,n_estimators=100
)model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

在这里插入图片描述

3.2 模型调优

模型调优也参考之前自己写过的文档
Python模型优化超参寻优过程
GridSearchCV是scikit-learn库中用于超参数调优的重要工具,它通过网格搜索和交叉验证的方式寻找最优的模型参数组合,下面介绍使用GridSearchCV对LGBM参数调优。

3.2.1 GridSearchCV简介

关于GridSearchCV简单再介绍一下
在这里插入图片描述
在这里插入图片描述
机器学习-GridSearchCV scoring 参数设置!

3.2.2 LightGBM超参调优

(三)提升树模型:Lightgbm原理深入探究 这篇文章里的关于Lightgbm优化比较深入,感兴趣的可以仔细阅读。

本部分的实现即对LightGBM介绍的参数使用GridSearchCV进行调优,python代码见下

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号#导入数据
breast_cancer = load_breast_cancer()
breast_cancer_df = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
breast_cancer_df['target'] = breast_cancer.targetdaoshu = 20
X = breast_cancer_df.iloc[:,:-1]
y = breast_cancer_df.iloc[:,-1]
XGB_X = X[:-daoshu]
XGB_y = y[:-daoshu]
# 分割数据集,80%作为训练集,20%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)lgb_class = lgb.LGBMClassifier()
# GridSearchCV 参数网格-----------------------------------------------------------
param_grid = {'max_depth': [5,7],'learning_rate': [0.1, 0.5],'n_estimators': [100, 500],'num_leaves':[31,51],'reg_alpha':[0.5,0.8,1],'reg_lambda':[0.5,1]
}grid_search = GridSearchCV(estimator=lgb_class, param_grid=param_grid, scoring='neg_mean_squared_error', cv=2, verbose=2)
grid_search.fit(X_train, y_train)
#网格查找每个参数时的-MSE
par =[]
par_mses = []
for i, par_mse in zip(grid_search.cv_results_['params'],grid_search.cv_results_['mean_test_score']):# print(i, par_mse)par.append(i)par_data = pd.DataFrame(par) par_mses.append(par_mse)par_rmsedata = pd.DataFrame(par_mses) 
search_data = pd.concat([par_data,par_rmsedata],axis=1)
search_data = search_data.rename(columns={0:"neg_mean_squared_error"})
# 输出最优参数信息
best_params = grid_search.best_params_
print('best_score:',grid_search.best_score_)
print(f"best_params: {best_params}")
print('best_index:',grid_search.best_index_)
print('best_estimator:',grid_search.best_estimator_)# 使用最优参数训练模型
lgb_class_optimized = lgb.LGBMClassifier(**best_params)
lgb_class_optimized.fit(XGB_X, XGB_y)  
# 预测
y_pred_optimized = lgb_class_optimized.predict(X)
rmse_optimized = np.sqrt(mean_squared_error(y, y_pred_optimized))
print(f"Optimized RMSE: {rmse_optimized:.4f}")   #最终预测结果的 RMSE #可视化展示
pre_target = pd.DataFrame(y_pred_optimized)
predata= pd.concat([breast_cancer_df,pre_target],axis=1)
plt.figure(figsize=(6,3))
plt.plot(range(len(predata['target'])),predata['target'],c='blue')
plt.scatter(range(len(predata['target'])),predata.iloc[:,-1:],ls=':',c='red',lw=3)
plt.title('预测值与真实值对比', size= 20)
plt.legend(['真实目标值','预测值'])
plt.show()predata.tail()

部分结果展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
红色框为最优组合。
在这里插入图片描述

3.2.3 GridSearchCV寻优结果

在这里插入图片描述

# 最佳参数组合的详细信息
best_idx = grid_search.best_index_  # 即search_data表里的索引为 3
print(f"最佳参数组合: {grid_search.cv_results_['params'][best_idx]}")
print(f"平均验证分数: {grid_search.cv_results_['mean_test_score'][best_idx]:.4f}")
print(f"各折验证分数: {grid_search.cv_results_['split0_test_score'][best_idx]:.4f}, "f"{grid_search.cv_results_['split1_test_score'][best_idx]:.4f}, ...")

在这里插入图片描述

best_results = pd.DataFrame(grid_search.cv_results_).sort_values('rank_test_score')print("Top 5参数组合:")
print(best_results[['params', 'mean_test_score', 'std_test_score', 'rank_test_score']].head(5))print("\n训练时间分析:")
print(f"平均总训练时间: {best_results['mean_fit_time'].sum():.2f}秒")
print(f"最快组合训练时间: {best_results['mean_fit_time'].min():.2f}秒")
print(f"最慢组合训练时间: {best_results['mean_fit_time'].max():.2f}秒")
best_results.head(4)

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

在这里插入图片描述

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

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

相关文章

Map集合(双列集合)

Map结合也称为“键值对集合”,格式:{key1value1,key2value2....} Map集合的特点: 键唯一:在Map集合中,键(key)是唯一的,不能有重复的键。如果尝试插入一个已经存在的键…

springBoot项目测试时浏览器返回406问题解决方案

1. 如果基于最新版本的SpringBoot官方骨架创建的SpringBoot项目,在勾选了lombok的依赖之后,会在pom.xml中引入如下两个插件: 2. 由于第一个插件 maven-compiler-plugin 的引入导致了这个问题,解决这个问题的方案呢,就是…

21.享元模式:思考与解读

原文地址:享元模式:思考与解读 更多内容请关注:深入思考与解读设计模式 引言 在软件开发中,特别是当你处理大量相似对象时,是否会遇到一个问题:大量的对象会占用大量的内存,而这些对象有许多相同的状态&…

java方法重写学习笔记

方法重写介绍 子类和父类有两个返回值,参数,名称都一样的方法, 子类的方法会覆盖父类的方法。 调用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal类 public class Animal {…

什么是ESLint?它有什么作用?

ESLint 是一个用于 静态代码分析 的工具,专门检测 JavaScript/TypeScript 代码中的潜在问题和风格违规。它通过预定义的规则集帮助开发者保持代码的一致性和质量,是前端工程化的核心工具之一。 一、ESLint 的核心作用 1. 错误检查(Error Detection) 识别语法错误、未定义变…

Docker的网络介绍

网络简单介绍 在介绍 Docker 的网络模式之前,先简单说下我们在使用 Vmware 虚拟机中的网络模式,形成对比,更好理解。 1、Vmware 中的网络模式 1.1、VMnet0(桥接模式) 虚拟机通过宿主机的物理网卡直接连接到外部网络…

Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化

文章目录 前言一、核心参数全景解析1.1 基础网络层参数1.2 内存管理参数1.3 水位线控制1.4 高级参数与系统级优化 二、生产级优化策略2.1 高并发场景优化2.2 低延迟场景优化 总结 前言 在分布式系统和高并发场景中,Netty作为高性能网络通信框架的核心地位无可替代。…

计算机网络学习(六)——UDP

一、UDP UDP(User Datagram Protocol,用户数据报协议)是传输层的一种协议,和 TCP 并列。与 TCP 不同,UDP 是无连接、不可靠、面向报文的协议,它的设计目标是追求更快的数据传输速度和更小的开销。 UDP 为…

vue3文本超出三行显示省略号,点击查看更多显示全部文本

只有一行时&#xff08;不显示展开按钮&#xff09;&#xff1a; 话不多说&#xff0c;上码 ~template <el-col :span"24"><el-form-item :label"$t(warningOrgNames_)"><div class"content-box" ref"contanierRef"…

手写Tomcat(一)

一、Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 1.1 Tomcat基本架构 Servlet接口文件中定义的方法有以下…

第三节_PySide6中Qt Designer 的基础使用_上篇

文章目录 前言一、Qt Designer简介1.什么是 Qt Designer&#xff1f;2.核心功能3.核心优势 二、Qt Designer界面介绍1.主窗口的创建2.窗口五大区域的简单介绍 三、界面布局 Layout1.窗口布局方式介绍2.UI布局技巧概述3.UI布局实战应用 总结 前言 第二节_PySide6项目创建流程介…

行列式的线性性质(仅限于单一行的加法拆分)

当然可以&#xff0c;以下是经过排版优化后的内容&#xff0c;保持了原始内容不变&#xff0c;仅调整了格式以提升可读性&#xff1a; 行列式的线性性质&#xff08;加法拆分&#xff09; 这个性质说的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…

Git使用说明

配置Git 确定已经安装了Git, 通过以下的命令配置全局的邮箱和用户名 git config --global user.email "your@xx.com" git config --global user.name "yourname" 初始化本地仓库 首先,打开终端并切换到存放你代码的项目目录。接着执行以下命令,将该…

【后端高阶面经:缓存篇】36、如何保证Redis分布式锁的高可用和高性能?

一、分布式锁核心挑战:从单机到分布式的跨越 (一)分布式锁的本质需求 互斥性:同一时刻仅一个客户端持有锁容错性:节点故障时锁仍有效(避免单点)原子性:加锁/释放锁操作原子完成可重入性:支持同一客户端多次获取同一把锁(二)Redis天然优势 单线程模型保证操作原子性…

【后端高阶面经:MongoDB篇】40、怎么优化MongoDB的查询性能?

一、索引优化&#xff1a;构建高效查询的基石 &#xff08;一&#xff09;索引类型与适用场景 1. 五大核心索引类型 索引类型适用场景示例代码性能影响单字段索引单条件查询&#xff08;如用户ID、状态字段&#xff09;db.users.createIndex({ user_id: 1 })低复合索引多条件…

Linux wget 常用命令详解

目录 1.1 工具定位 基础下载示例 二、高效下载参数详解 2.1 下载控制类 2.2 文件管理类 2.3 网络优化类 三、高级应用场景 3.1 递归下载与整站镜像 3.2 自动化下载实践 3.3 安全下载配置 四、参数速查手册 4.1 常用参数汇总 1.1 工具定位 基础下载语法 wget [选项…

Pytorch中文文本分类

本文为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 将对中文文本进行分类&#xff0c;示例如下&#xff1a; 文本分类流程图 1.加载数据 import time import pandas as pd import torch from torch.utils.data import DataLoader, random_split impo…

13.「极简」扣子(coze)教程 | 小程序UI设计进阶(三)让界面动起来,实操讲透“聚焦”事件

前一期大师兄介绍了扣子平台组件的两种状态“禁用”和“加载”。这两种方法使控件可以通过简单设置表示出更多的运行状态。今天大师兄将详细介绍控件的一种事件“聚焦”。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 小程序UI设计进阶 II&#xff01;让…

剑指offer11_矩阵中的路径

矩阵中的路径 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移动一个格子。 如…

腾讯2025年校招笔试真题手撕(三)

一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…