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

LSTM结合LightGBM高纬时序预测

1. LSTM 时间序列预测

LSTM 是 RNN(Recurrent Neural Network)的一种变体,它解决了普通 RNN 训练时的梯度消失和梯度爆炸问题,适用于长期依赖的时间序列建模。

LSTM 结构

LSTM 由 输入门(Input Gate)遗忘门(Forget Gate)输出门(Output Gate) 以及 细胞状态(Cell State) 组成。

LSTM 数学公式

对于给定的时间步 ,LSTM 的计算公式如下:

1. 遗忘门(Forget Gate):决定哪些信息应该被遗忘

其中:

  • :遗忘门的激活值(取值在 之间)
  • 、:可学习参数
  • :上一个时间步的隐藏状态
  • :当前时间步的输入
  • 为 Sigmoid 激活函数

2. 输入门(Input Gate):决定哪些新信息需要加入到细胞状态

  • 是输入门的激活值
  • 是候选细胞状态的更新

3. 更新细胞状态(Cell State):结合旧状态和新信息

其中 表示逐元素相乘。

4. 输出门(Output Gate)和隐藏状态更新

其中:

  • 是输出门的激活值
  • 是 LSTM 单元的最终输出

2. LightGBM 在时间序列预测中的原理

LightGBM 是基于梯度提升决策树(GBDT)的高效实现,能够在高维数据上快速训练,同时保留决策树模型的可解释性。

LightGBM 基本公式

LightGBM 的目标是最小化损失函数 ,通常使用平方误差:

其中:

  • 是真实值
  • 是模型预测值
  • 是样本数量

梯度提升决策树(GBDT)采用加法模型进行学习:

其中:

  • 是第 轮迭代的模型
  • 是当前轮学习的弱分类器(决策树)
  • 是学习率

3. 结合 LSTM 和 LightGBM 高维时序预测

由于 LSTM 适用于处理时间序列依赖,而 LightGBM 擅长学习复杂特征,因此可以采用 LSTM + LightGBM的组合方式:

方案 1:LSTM 作为特征提取器,LightGBM 进行最终预测

1. 使用 LSTM 处理时间序列,得到高维特征表示

  • 通过 LSTM 提取隐藏状态 作为特征:

2. 利用 LightGBM 进行最终预测

  • 训练 LightGBM 使用 LSTM 提取的特征进行回归:

方案 2:LSTM 进行短期预测,LightGBM 进行长期趋势建模

  • 短期预测(LSTM):

    • 采用 LSTM 直接预测短期趋势
    • 目标:预测下一时间步的值
  • 长期预测(LightGBM):

    • 结合 LSTM 输出和额外的时间序列特征(如趋势、周期性等)进行预测
    • 目标:提高长期预测能力

其中:

  • 是 LSTM 预测值
  • 是 LightGBM 预测值
  • 是加权系数,可通过交叉验证优化

总之呢,LSTM 适合提取时间序列的长期依赖关系,而 LightGBM 能够处理高维特征并进行快速预测。两者结合可以充分利用 LSTM 的时序建模能力和 LightGBM 的高维特征学习能力,在高维时间序列预测任务中取得更好的效果。

完整案例

这个任务涉及 LSTM(长短时记忆网络)LightGBM(梯度提升树模型) 结合进行高维时间序列预测。

整个代码的流程包括:

  1. 数据生成:模拟一个具有多个特征的时间序列数据集。

  2. 特征工程:数据预处理,构建 LSTM 和 LightGBM 需要的特征。

  3. 模型训练

    • 先用 LSTM 学习时间序列特征,提取特征后传入 LightGBM。
    • 使用 LightGBM 进行最终的时间序列预测。
  4. 结果可视化

    • 绘制 时间序列趋势
    • 绘制 LSTM 训练损失曲线
    • 绘制 LightGBM 特征重要性
    • 绘制 预测结果与真实值对比
  5. 超参数调优

    • LSTM 网络结构优化
    • LightGBM 参数调优
    • 结合贝叶斯优化调整超参数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import lightgbm as lgb
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error# 1. 生成虚拟时间序列数据
np.random.seed(42)
days = 500
date_rng = pd.date_range(start='1/1/2020', periods=days, freq='D')
data = {'date': date_rng,'feature1': np.sin(np.linspace(0, 50, days)) + np.random.normal(scale=0.1, size=days),'feature2': np.cos(np.linspace(0, 50, days)) + np.random.normal(scale=0.1, size=days),'target': np.sin(np.linspace(0, 50, days)) + 0.5 * np.cos(np.linspace(0, 50, days)) + np.random.normal(scale=0.1, size=days)
}
df = pd.DataFrame(data)# 2. 数据预处理
scaler = MinMaxScaler()
df[['feature1', 'feature2', 'target']] = scaler.fit_transform(df[['feature1', 'feature2', 'target']])# 3. 构造时间序列数据集
seq_length = 10
X, y = [], []
for i in range(len(df) - seq_length):X.append(df[['feature1', 'feature2']].iloc[i:i+seq_length].values)y.append(df['target'].iloc[i+seq_length])
X, y = np.array(X), np.array(y)# 4. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)# 5. LSTM 模型定义
class LSTMModel(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim, num_layers):super(LSTMModel, self).__init__()self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):lstm_out, _ = self.lstm(x)return self.fc(lstm_out[:, -1, :])# 6. 训练 LSTM
input_dim = 2
hidden_dim = 64
output_dim = 1
num_layers = 2device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
lstm_model = LSTMModel(input_dim, hidden_dim, output_dim, num_layers).to(device)
criterion = nn.MSELoss()
optimizer = optim.Adam(lstm_model.parameters(), lr=0.001)X_train_torch = torch.tensor(X_train, dtype=torch.float32).to(device)
y_train_torch = torch.tensor(y_train, dtype=torch.float32).to(device)
X_test_torch = torch.tensor(X_test, dtype=torch.float32).to(device)
y_test_torch = torch.tensor(y_test, dtype=torch.float32).to(device)# 训练循环
epochs = 100
train_losses = []
for epoch in range(epochs):lstm_model.train()optimizer.zero_grad()output = lstm_model(X_train_torch)loss = criterion(output.squeeze(), y_train_torch)loss.backward()optimizer.step()train_losses.append(loss.item())if epoch % 10 == 0:print(f'Epoch {epoch}: Loss {loss.item():.4f}')# 7. LSTM 特征提取
lstm_model.eval()
lstm_features = lstm_model(X_train_torch).detach().cpu().numpy()
lstm_features_test = lstm_model(X_test_torch).detach().cpu().numpy()# 8. LightGBM 训练
train_features = np.hstack((X_train.reshape(X_train.shape[0], -1), lstm_features))
test_features = np.hstack((X_test.reshape(X_test.shape[0], -1), lstm_features_test))lgb_model = lgb.LGBMRegressor(n_estimators=200, learning_rate=0.05)
lgb_model.fit(train_features, y_train)y_pred = lgb_model.predict(test_features)# 9. 评估
def plot_results():fig, axes = plt.subplots(2, 2, figsize=(14, 10))# (1) 时间序列趋势axes[0, 0].plot(df['date'], df['target'], label='Target', color='blue')axes[0, 0].set_title('Time Series Trend')# (2) LSTM 训练损失axes[0, 1].plot(range(epochs), train_losses, color='red')axes[0, 1].set_title('LSTM Training Loss')# (3) LightGBM 特征重要性lgb.plot_importance(lgb_model, ax=axes[1, 0], importance_type='gain', color='green')axes[1, 0].set_title('LightGBM Feature Importance')# (4) 预测结果 vs 真实值axes[1, 1].plot(y_test, label='Actual Value', color='black')axes[1, 1].plot(y_pred, label='Predicted Value', linestyle='dashed', color='orange')axes[1, 1].legend()axes[1, 1].set_title('Prediction vs Actual')plt.tight_layout()plt.show()plot_results()

在这里插入图片描述

实现了 LSTM 提取特征,再利用 LightGBM 进行时间序列预测,包含:

  1. 时间序列趋势:观察目标变量的长期变化趋势。
  2. LSTM 训练损失曲线:展示 LSTM 训练过程的损失变化。
  3. LightGBM 特征重要性:说明哪些特征贡献最大。
  4. 预测结果 vs 真实值:直观展示预测的准确性。

相关文章:

LSTM结合LightGBM高纬时序预测

1. LSTM 时间序列预测 LSTM 是 RNN(Recurrent Neural Network)的一种变体,它解决了普通 RNN 训练时的梯度消失和梯度爆炸问题,适用于长期依赖的时间序列建模。 LSTM 结构 LSTM 由 输入门(Input Gate)、遗…...

详细解释MCP项目中安装命令 bunx 和 npx区别

详细解释 bunx 和 npx 1. bunx bunx 是 Bun 的一个命令行工具,用于自动安装和运行来自 npm 的包。它是 Bun 生态系统中类似于 npx 或 yarn dlx 的工具。以下是 bunx 的主要特点和使用方法: 自动安装和运行: bunx 会自动从 npm 安装所需的包…...

【统信UOS操作系统】python3.11安装numpy库及导入问题解决

一、安装Python3.11.4 首先来安装Python3.11.4。所用操作系统:统信UOS 前提是准备好Python3.11.4的安装包(可从官网下载(链接)),并解压到本地: 右键,选择“在终端中打开”&#xff…...

【中间件】nginx反向代理实操

一、说明 nginx用于做反向代理,其目标是将浏览器中的请求进行转发,应用场景如下: 说明: 1、用户在浏览器中发送请求 2、nginx监听到浏览器中的请求时,将该请求转发到网关 3、网关再将请求转发至对应服务 二、具体操作…...

嵌入式硬件篇---加法减法积分微分器

文章目录 前言1. 加法器(Summing Amplifier)结构反相加法器同相加法器 特点反相输出虚地特性 应用 2. 减法器(差分放大器)结构特点差分放大共模抑制比 应用 3. 积分器结构特点直流漂移问题应用 4. 微分器结构特点应用关键注意事项…...

Spring Cloud Gateway 的执行链路详解

Spring Cloud Gateway 的执行链路详解 🎯 核心目标 明确 Spring Cloud Gateway 的请求处理全过程(从接收到请求 → 到转发 → 到返回响应),方便你在合适的生命周期节点插入你的逻辑。 🧱 核心执行链路图(执…...

鸿蒙应用(医院诊疗系统)开发篇2·Axios网络请求封装全流程解析

一、项目初始化与环境准备 1. 创建鸿蒙工程 src/main/ets/ ├── api/ │ ├── api.ets # 接口聚合入口 │ ├── login.ets # 登录模块接口 │ └── request.ets # 网络请求核心封装 └── pages/ └── login.ets # 登录页面逻辑…...

突发重磅消息!!!CVE项目将被取消?

突发重磅消息!!!CVE项目将被取消?突发!来自可靠消息来源。MITRE 对 CVE 项目的支持将于明天到期。附件信件已发送给 CVE 董事会成员。https://mp.weixin.qq.com/s/N3qkiHaDfzDuBMK3JbBCjw...

详解与FTP服务器相关操作

目录 什么是FTP服务器 搭建FTP服务器相关 ​编辑 Unity中与FTP相关的类 上传文件到FTP服务器 使用FTP服务器上传文件的关键点 开始上传 从FTP服务器下载文件到客户端 使用FTP下载文件的关键点 开始下载 关于FTP服务器的其他操作 将文件的上传,下载&…...

远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?

远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态? 查看Linux发行版信息 查看发行版名称和版本: cat /etc/*-release或 lsb_release -a查看内核版本&#…...

解决 .Net 6.0 项目发布到IIS报错:HTTP Error 500.30

今天在将自己开发许久的项目上线的时候,发现 IIS 发布后请求后端老是报一个 HTTP Error 500.30 的异常,如下图所示。   后来仔细调查了一下发现是自己的程序中写了 UseStaticFiles 的依赖注入,这个的主要作用就是发布后端后,想…...

STM32F103_HAL库+寄存器学习笔记16 - 监控CAN发送失败(轮询方式)

导言 《STM32F103_HAL库寄存器学习笔记15 - 梳理CAN发送失败时,涉及哪些寄存器》从上一章节看到,当CAN消息发送失败时,CAN错误状态寄存器ESR的TEC会持续累加,LEC等于0x03(ACK错误)。本次实验的目的是编写一…...

Java并发-AQS框架原理解析与实现类详解

什么是AQS? AQS(AbstractQueuedSynchronizer)是Java并发包(JUC)的核心基础框架,它为构建锁和同步器提供了高效、灵活的底层支持。本文将从设计原理、核心机制及典型实现类三个维度展开,帮助读者…...

实现定长的内存池

池化技术 所谓的池化技术,就是程序预先向系统申请过量的资源,然后自己管理起来,以备不时之需。这个操作的价值就是,如果申请与释放资源的开销较大,提前申请资源并在使用后并不释放而是重复利用,能够提高程序…...

vs2022使用git方法

1、创建git 2、在cmd下执行 git push -f origin master ,会把本地代码全部推送到远程,同时会覆盖远程代码。 3、需要设置【Git全局设置】,修改的代码才会显示可以提交,否则是灰色的不能提交。 4、创建的分支,只要点击…...

Mysql中表的使用(3)

目录 1.updata的使用 2.delete(删除表中数据)drop(删除表) 数据库的约束 1.NOT NULL 指定列不能为空 2.UNIQUE指定列唯一 3.DEFAULT(默认值) 4.PRIMARY KEY 5.自增主键 1.updata的使用 1.0update 表名 set 列名x where 列名y; 2.0update 表名 s…...

BUUCTF-Web(1-20)

目录 一.SQL注入 (1)[极客大挑战 2019]EasySQL 万能密码 (7)[SUCTF 2019]EasySQL 堆叠注入 解一: 解二: (10)[强网杯 2019]随便注 堆叠注入 解一: 解二: 解三: (8)[极客大挑战 2019]LoveSQL 联…...

Uniapp:确认框

目录 一、 出现场景二、 效果展示三、具体使用 一、 出现场景 在项目的开发中,会经常出现删除数据的情况,如果直接删除的话,可能会存在误删,用户体验不好,所以需要增加一个消息提示,提醒用户是否删除。 二…...

【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程

新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...

力扣热题100—滑动窗口(c++)

3.无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 unordered_set<char> charSet; // 用于保存当前窗口的字符int left 0; // 窗口左指针int maxLength 0; // 最长子串的长度for (int right 0; right < s.siz…...

实验四 中断实验

一、实验目的 掌握中断服务程序的编写。 二、实验电路 三、实验内容 1&#xff0e;实验用PC机内部的中断控制器8259A&#xff0c;中断源用TPC-ZK实验箱上的单脉冲电路&#xff0c;将单脉冲电路的输出接中断请求信号IRQ&#xff0c;每按一次单脉冲按键产生一次…...

腾势品牌欧洲市场冲锋,科技豪华席卷米兰

在时尚与艺术的交汇点&#xff0c;米兰设计周的舞台上&#xff0c;一场汽车界的超级风暴正在酝酿&#xff0c;腾势品牌如一头勇猛无畏的雄狮&#xff0c;以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场&#xff0c;仿佛是一道闪电划破夜空&#xff0c;…...

第五阶段:项目实践与后续学习指引

模块 10&#xff1a;综合项目实践 在这个模块中&#xff0c;我们将通过实际项目来综合运用前面所学的 Python 知识。我们会选择一个命令行记事本应用作为主要示例&#xff0c;同时简要介绍其他项目的思路。 项目&#xff1a;命令行记事本应用 1. 项目规划 良好的项目规划是…...

MoogDB数据库日常维护技巧与常见问题解析

在当今的数据驱动世界中&#xff0c;数据库作为信息存储与管理的核心组件&#xff0c;扮演着举足轻重的角色。MoogDB作为一款高性能、易扩展的数据库解决方案&#xff0c;越来越受到开发者和企业的青睐。为了确保MoogDB的稳定性与高性能&#xff0c;定期的日常维护及对常见问题…...

Java 中的各种锁详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

多店铺商城_多商户商城系统源码_免费开源!

在电商行业快速发展的今天&#xff0c;多店铺商城系统&#xff08;B2B2C模式&#xff09;已成为企业实现平台化运营的核心工具&#xff0c;就像我们平时用的淘宝&#xff0c;京东那样。如果你想做一个电商平台就需要这种多店铺商城系统。 本文将深入探讨多商户商城系统的核心功…...

【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享

目录 2025年泰迪杯数据挖掘挑战赛A题完整论文&#xff1a;建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明&#xff1a;1.1.2统计流程&#xff1a;1.1.3特殊情况的考虑&#xff1a; 1.2 问题一的求解1.2.1代码实现1.2.2 问题一结果代码分…...

NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)

P3385 【模板】负环 - 洛谷 如果图中存在负环&#xff0c;那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作&#xff0c;如果第n轮还存在松弛操作&#xff0c;那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…...

ROS2模块库概览

一、核心通信与基础库&#xff08;最常用&#xff09; 客户端库 rclcpp (ROS Client Library for C) 核心API&#xff1a;create_node(), create_publisher(), create_subscription()高级特性&#xff1a; 生命周期节点&#xff1a;通过rclcpp_lifecycle实现configure/activate…...

在机器视觉检测中为何选择线阵工业相机?

线阵工业相机&#xff0c;顾名思义是成像传感器呈“线”状的。虽然也是二维图像&#xff0c;但极宽&#xff0c;几千个像素的宽度&#xff0c;而高度却只有几个像素的而已。一般在两种情况下使用这种相机&#xff1a; 1. 被测视野为细长的带状&#xff0c;多用于滚筒上检测的问…...