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

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

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

相关文章

六、adb通过Wifi连接

背景 收集是荣耀X40,数据线原装全新的,USB连上之后,老是断,电脑一直叮咚叮咚的响个不停,试试WIFI 连接是否稳定,需要手机和电脑用相同的WIFI. 连接 1.通过 USB 连接手机和电脑(打开USB调试等这些都略过) adb device…

如何理解前端开发中的“换皮“

"换皮"在前端开发中是一个常见的术语,通常指的是在不改变网站或应用核心功能和结构的情况下,只改变其外观和视觉表现。以下是关于前端"换皮"的详细理解: 基本概念 定义:换皮(Skinning)是指保持应用程序功能不…

从 Vue 到 React:深入理解 useState 的异步更新

目录 从 Vue 到 React:深入理解 useState 的异步更新与函数式写法1. Vue 的响应式回顾:每次赋值立即生效2. React 的状态更新是异步且批量的原因解析 3. 函数式更新:唯一的正确写法4. 对比 Vue vs React 状态更新5. React useState 的核心源码…

使用Redis实现分布式限流

一、限流场景与算法选择 1.1 为什么需要分布式限流 在高并发系统中,API接口的突发流量可能导致服务雪崩。传统的单机限流方案在分布式环境下存在局限,需要借助Redis等中间件实现集群级流量控制。 1.2 令牌桶算法优势 允许突发流量:稳定速…

快速搭建WordPress网站的主题

WP快主题(wpkuai.com )是一款由知名WordPress专业团队打造的专业化WordPress主题,旨在让用户使用该wordpress主题快速搭建网站。 WP快主题专注于快速搭建WordPress网站的主题解决方案。其主题设计注重简洁性与高效性,旨在帮助用户快速完成网站的搭建和部…

STM32江科大----------PID算法

声明:本人跟随b站江科大学习,本文章是观看完视频后的一些个人总结和经验分享,也同时为了方便日后的复习,如果有错误请各位大佬指出,如果对你有帮助可以点个赞小小鼓励一下,本文章建议配合原视频使用❤️ 如…

将JSON格式的SQL查询转换为完整SQL语句的实战解析

一、背景与需求 在现代数据处理中,JSON格式因其灵活性和可读性,常被用于定义SQL查询的结构。然而,直接编写JSON格式的SQL指令后,如何将其转换为可执行的SQL语句是开发者常遇到的挑战。本文将通过一个Python函数和多个实际案例,解析如何将JSON结构转换为完整的SQL语句,并…

java CountDownLatch用法简介

CountDownLatch倒计数锁存器 CountDownLatch:用于协同控制一个或多个线程等待在其他线程中执行的一组操作完成,然后再继续执行 CountDownLatch用法 构造方法:CountDownLatch(int count),count指定等待的条件数(任务…

Leetcode - 双周赛135

目录 一、3512. 使数组和能被 K 整除的最少操作次数二、3513. 不同 XOR 三元组的数目 I三、3514. 不同 XOR 三元组的数目 II四、3515. 带权树中的最短路径 一、3512. 使数组和能被 K 整除的最少操作次数 题目链接 本题实际上求的就是数组 nums 和的余数,代码如下&…

【后端】【python】利用反射器----动态设置装饰器

📘 Python 装饰器进阶指南 一、装饰器本质 ✅ 本质概念 Python 装饰器的本质是 函数嵌套 返回函数,它是对已有函数的增强,不修改原函数代码,使用语法糖 decorator 实现包裹效果。 def my_decorator(func):def wrapper(*args, …

Nodejs Express框架

参考:Node.js Express 框架 | 菜鸟教程 第一个 Express 框架实例 接下来我们使用 Express 框架来输出 "Hello World"。 以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 "Hello World" 字符串。 创建 e…

Docker Swarm 集群

Docker Swarm 集群 本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。 1. 什么是 Docker Swarm Docker Swarm 是用于管理 Docker…

充电宝项目中的MQTT(轻量高效的物联网通信协议)

文章目录 补充:HTTP协议MQTT协议MQTT的核心特性MQTT vs HTTP:关键对比 EMQX项目集成EMQX集成配置客户端和回调方法具体接口和方法处理处理类 补充:HTTP协议 HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80…

【iOS】UIPageViewController学习

UIPageViewController学习 前言创建一个UIPageViewController最简单的使用 UIPageViewController的方法说明:效果展示 UIPageViewController的协议方法 前言 笔者最近在写项目时想实现一个翻书效果,上网学习到了UIPageViewController今天写本篇博客总结…

Linux搭建环境:从零开始掌握基础操作(四)

​ ​ 您好,我是程序员小羊! 前言 软件测试第一步就是搭建测试环境,如何搭建好测试环境,需要具备两项的基础知识: 1、Linux 命令: 软件测试第一个任务, 一般都需要进行环境搭建, 一部分,环境搭建内容是在服…

一天一个java知识点----Tomcat与Servlet

认识BS架构 静态资源:服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。比如:HTML、CSS、JS、图片、视频等(负责页面展示) 动态资源:服务器端根据用户请求和其他数据动态生成的,内容可能会在每次请求时都…

YOLOV8 OBB 海思3516训练流程

YOLOV8 OBB 海思3516训练流程 目录 1、 下载带GPU版本的torch(可选) 1 2、 安装 ultralytics 2 3、 下载pycharm 社区版 2 4、安装pycharm 3 5、新建pycharm 工程 3 6、 添加conda 环境 4 7、 训练代码 5 9、配置Ymal 文件 6 10、修改网络结构 9 11、运行train.py 开始训练模…

【深度学习】花书第18章——配分函数

直面配分函数 许多概率模型(通常是无向图模型)由一个未归一化的概率分布 p ~ ( x , θ ) \tilde p(\mathbf x,\theta) p~​(x,θ)定义。我们必须通过除以配分函数 Z ( θ ) Z(\pmb{ \theta}) Z(θ)来归一化 p ~ \tilde p p~​。以获得一个有效的概率分…

工作记录1

日常总结、灵感记录、学习要点。持续记录 学海无涯,再好的记性也比不过烂笔头,记录一下学习日常、灵感、要点。 前言:最近看见一个博文,很有感触,是某个大佬自己运营的网站,分享了他的各种经验文章和自身的一些笔记。本人还没有他这么屌,所以还是先在CSDN上小试牛刀吧…

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

RedisTemplate和StringRedisTemplate的系列文章详见: Spring Boot(十七):集成和使用Redis Spring Boot(十八):RedisTemplate和StringRedisTemplate Spring Boot(十九)…