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.pswp.cn/diannao/79283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79283.shtml
英文地址,請注明出處:http://en.pswp.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(十九)…