其中, 表示遺忘門的輸出, 是Sigmoid激活函數(shù), 是權(quán)重矩陣, 是上一時(shí)刻的隱藏狀態(tài), 是當(dāng)前的輸入。

輸入門

其中, 是輸入門的輸出, 是候選記憶單元, 是雙曲正切激活函數(shù)。

更新記憶單元

其中, 是當(dāng)前時(shí)刻的記憶單元。

輸出門

其中, 是輸出門的輸出, 是當(dāng)前時(shí)刻的隱藏狀態(tài),也是LSTM的輸出。

問題定義

本案例的目標(biāo)是基于LSTM模型對(duì)每日消費(fèi)數(shù)據(jù)進(jìn)行預(yù)測,并幫助用戶進(jìn)行預(yù)算管理。用戶可以通過預(yù)測的消費(fèi)數(shù)據(jù)進(jìn)行預(yù)算調(diào)整,以確保每月的支出不超出設(shè)定的預(yù)算上限。

我們假設(shè)有一個(gè)虛擬的消費(fèi)數(shù)據(jù)集,其中包含每日的消費(fèi)記錄,我們將使用該數(shù)據(jù)集訓(xùn)練LSTM模型,預(yù)測未來幾天的消費(fèi)金額。

虛擬數(shù)據(jù)集生成

我們將創(chuàng)建一個(gè)包含每日消費(fèi)的虛擬數(shù)據(jù)集。為了簡化問題,我們假設(shè)每日的消費(fèi)金額受前幾天消費(fèi)的影響,并且存在季節(jié)性和周期性波動(dòng)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 設(shè)置隨機(jī)種子
np.random.seed(42)

# 生成虛擬的每日消費(fèi)數(shù)據(jù)(假設(shè)有365天的數(shù)據(jù))
days = 365
date_range = pd.date_range(start='2023-01-01', periods=days, freq='D')

# 創(chuàng)建消費(fèi)數(shù)據(jù)(包含周期性波動(dòng))
daily_expenses = 50 + 20 * np.sin(np.linspace(0, 10 * np.pi, days)) + np.random.normal(0, 5, days)

# 將數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
df = pd.DataFrame({'date': date_range, 'expense': daily_expenses})

# 繪制消費(fèi)數(shù)據(jù)的折線圖
plt.figure(figsize=(10, 6))
plt.plot(df['date'], df['expense'], label='Daily Expenses')
plt.title('Simulated Daily Expenses over One Year')
plt.xlabel('Date')
plt.ylabel('Expense ($)')
plt.xticks(rotation=45)
plt.legend()
plt.show()

df.to_csv('daily_expenses.csv', index=False)

在這段代碼中,首先生成了365天(代表一年的數(shù)據(jù))每日的消費(fèi)金額。為了模擬消費(fèi)波動(dòng),我們加入了正弦波形(模擬季節(jié)性波動(dòng))以及一些隨機(jī)噪聲。

LSTM模型構(gòu)建與訓(xùn)練

LSTM模型的輸入是歷史消費(fèi)數(shù)據(jù),輸出是未來幾天的消費(fèi)預(yù)測。為了訓(xùn)練LSTM模型,我們需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)歸一化、時(shí)間窗口創(chuàng)建等步驟。

Python代碼:LSTM模型訓(xùn)練

import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# 數(shù)據(jù)預(yù)處理
scaler = MinMaxScaler(feature_range=(-1, 1))
scaled_data = scaler.fit_transform(df['expense'].values.reshape(-1, 1))

# 創(chuàng)建時(shí)間窗口數(shù)據(jù)
def create_dataset(data, time_step=30):
X, y = [], []
for i in range(len(data) - time_step - 1):
X.append(data[i:(i + time_step), 0])
y.append(data[i + time_step, 0])
return np.array(X), np.array(y)

time_step = 30 # 使用過去30天的數(shù)據(jù)預(yù)測未來一天
X, y = create_dataset(scaled_data, time_step)

# 拆分?jǐn)?shù)據(jù)集為訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

# 轉(zhuǎn)換為PyTorch張量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32)

# LSTM模型定義
class LSTMModel(nn.Module):
def __init__(self, input_size=1, hidden_layer_size=64, output_size=1):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_layer_size, batch_first=True)
self.fc = nn.Linear(hidden_layer_size, output_size)

def forward(self, x):
out, _ = self.lstm(x)
out = self.fc(out[:, -1, :])
return out

# 模型初始化
model = LSTMModel(input_size=1, hidden_layer_size=64, output_size=1)

# 損失函數(shù)與優(yōu)化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 訓(xùn)練模型
epochs = 100
train_loss = []

for epoch in range(epochs):
model.train()
optimizer.zero_grad()
output = model(X_train.unsqueeze(-1)) # 添加最后一個(gè)維度以符合LSTM的輸入要求
loss = criterion(output, y_train.unsqueeze(-1))
loss.backward()
optimizer.step()

train_loss.append(loss.item())
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 繪制訓(xùn)練過程中的損失曲線
plt.figure(figsize=(10, 6))
plt.plot(range(epochs), train_loss, label='Training Loss')
plt.title('Training Loss over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()

這段代碼定義了LSTM模型,并使用均方誤差(MSE)作為損失函數(shù)來訓(xùn)練模型。訓(xùn)練過程中的損失值也被記錄下來,并以曲線的形式進(jìn)行展示。

模型預(yù)測與評(píng)估

訓(xùn)練完成后,我們可以使用測試集對(duì)模型進(jìn)行預(yù)測,并與實(shí)際值進(jìn)行對(duì)比。通過繪制預(yù)測曲線和真實(shí)消費(fèi)曲線,可以直觀地看出模型的預(yù)測效果。

# 模型預(yù)測
model.eval()
with torch.no_grad():
predicted = model(X_test.unsqueeze(-1)).squeeze().numpy()

# 反歸一化
predicted = scaler.inverse_transform(predicted.reshape(-1, 1))
y_test = scaler.inverse_transform(y_test.reshape(-1, 1))

# 繪制預(yù)測結(jié)果與真實(shí)結(jié)果的對(duì)比圖
plt.figure(figsize=(10, 6))
plt.plot(df['date'].iloc[-len(y_test):], y_test, label='Actual Expenses')
plt.plot(df['date'].iloc[-len(predicted):], predicted, label='Predicted Expenses')
plt.title('Actual vs Predicted Daily Expenses')
plt.xlabel('Date')
plt.ylabel('Expense ($)')
plt.xticks(rotation=45)
plt.legend()
plt.show()

# 計(jì)算模型性能
from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, predicted)
r2 = r2_score(y_test, predicted)
print(f'Mean Squared Error: {mse:.4f}')
print(f'R2 Score: {r2:.4f}')

在這里,我們將模型的預(yù)測結(jié)果與實(shí)際值進(jìn)行了對(duì)比,并計(jì)算了均方誤差(MSE)和R2得分來評(píng)估模型的預(yù)測性能。

算法優(yōu)化點(diǎn)與調(diào)參流程

在訓(xùn)練LSTM模型時(shí),可能會(huì)遇到過擬合或欠擬合等問題。常見的優(yōu)化點(diǎn)包括:

  1. 調(diào)節(jié)學(xué)習(xí)率:學(xué)習(xí)率過大可能導(dǎo)致訓(xùn)練不穩(wěn)定,過小則可能導(dǎo)致收斂過慢。可以使用學(xué)習(xí)率調(diào)度器或使用自適應(yīng)優(yōu)化器(如Adam)。
  2. 調(diào)整隱藏層大小:增加隱藏層大小可能提升模型的表達(dá)能力,但也可能增加計(jì)算復(fù)雜度和過擬合的風(fēng)險(xiǎn)。
  3. 添加Dropout層:在LSTM層之間添加Dropout層,可以防止過擬合。
  4. 數(shù)據(jù)增強(qiáng):通過對(duì)原始數(shù)據(jù)進(jìn)行平滑、去噪等預(yù)處理,提升模型的泛化能力。

調(diào)參流程

  1. 初始調(diào)參:從較小的模型開始,選擇合適的批量大小和學(xué)習(xí)率。
  2. 交叉驗(yàn)證:通過交叉驗(yàn)證選擇最佳的模型超參數(shù)。
  3. 模型正則化:根據(jù)訓(xùn)練過程中的損失曲線和驗(yàn)證集表現(xiàn),使用Dropout、L2正則化等技術(shù)防止過擬合。
  4. 評(píng)估與優(yōu)化:根據(jù)評(píng)估指標(biāo)(如MSE、R2得分)來進(jìn)一步優(yōu)化模型。

通過LSTM模型對(duì)每日消費(fèi)數(shù)據(jù)進(jìn)行預(yù)測,能夠幫助用戶做出合理的預(yù)算管理決策。通過圖形化的分析和模型評(píng)估,能夠更直觀地了解模型的表現(xiàn),并根據(jù)實(shí)際情況進(jìn)行調(diào)整和優(yōu)化。

本文章轉(zhuǎn)載微信公眾號(hào)@深夜努力寫Python

上一篇:

突破最強(qiáng)時(shí)間序列模型,向量自回歸!!

下一篇:

突破K-means,與DTW時(shí)間序列聚類分析 !!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)