LSTM结合LightGBM高纬时序预测

news2025/4/19 21:25:49

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 = 2

device = 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 真实值:直观展示预测的准确性。

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

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

相关文章

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

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

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

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

鸿蒙应用(医院诊疗系统)开发篇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服务器的其他操作 将文件的上传,下载&…

解决 .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错误)。本次实验的目的是编写一…

实现定长的内存池

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

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:确认框

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

实验四 中断实验

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

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

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

Java 中的各种锁详解

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

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

目录 2025年泰迪杯数据挖掘挑战赛A题完整论文:建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明:1.1.2统计流程:1.1.3特殊情况的考虑: 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…

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

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

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

2025年十六届蓝桥杯Python B组原题及代码解析

相关试题可以在洛谷上测试用例&#xff1a; 2025 十六届 蓝桥杯 Python B组 试题 A&#xff1a;攻击次数 答案&#xff1a;103 print(103)代码&#xff1a; # 初始化敌人的血量 x 2025# 初始化回合数 turn 0# 模拟攻击过程 while x > 0:# 回合数加一turn 1# 第一个英…