时间序列预测方法:传统统计方法、机器学习方法、深度学习方法、Transformer、大语言模型方法、多模态方法
【代码】时间序列预测方法:传统统计方法、机器学习方法、深度学习方法、Transformer、大语言模型方法、多模态方法。
·
1. 传统统计预测方法
时间序列分析
# ARIMA模型示例
from statsmodels.tsa.arima.model import ARIMA
import pandas as pd
# 能源负荷预测
def arima_forecast(data, order=(1,1,1)):
model = ARIMA(data, order=order)
fitted_model = model.fit()
forecast = fitted_model.forecast(steps=24) # 预测未来24小时
return forecast
# 季节性分解
from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(energy_data, model='additive', period=24)
回归分析
# 多元线性回归
from sklearn.linear_model import LinearRegression
import numpy as np
# 特征:温度、湿度、风速、历史负荷
X = np.array([[temp, humidity, wind_speed, lag_load] for ...])
y = energy_demand
model = LinearRegression()
model.fit(X, y)
predictions = model.predict(X_test)
2. 机器学习预测方法
支持向量机(SVM)
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# SVM回归
svr_model = SVR(kernel='rbf', C=100, gamma=0.1)
svr_model.fit(X_scaled, y)
predictions = svr_model.predict(X_test_scaled)
随机森林
from sklearn.ensemble import RandomForestRegressor
# 随机森林预测
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X, y)
# 特征重要性分析
feature_importance = rf_model.feature_importances_
predictions = rf_model.predict(X_test)
3. 深度学习预测方法
LSTM循环神经网络
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
def create_lstm_model(input_shape):
model = Sequential([
LSTM(50, return_sequences=True, input_shape=input_shape),
Dropout(0.2),
LSTM(50, return_sequences=True),
Dropout(0.2),
LSTM(50),
Dropout(0.2),
Dense(25),
Dense(1)
])
model.compile(optimizer='adam', loss='mean_squared_error')
return model
# 训练模型
model = create_lstm_model((60, 1)) # 60个时间步
model.fit(X_train, y_train, epochs=100, batch_size=32)
CNN-LSTM混合模型
from tensorflow.keras.layers import Conv1D, MaxPooling1D
def create_cnn_lstm_model(input_shape):
model = Sequential([
Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=input_shape),
MaxPooling1D(pool_size=2),
LSTM(50, return_sequences=True),
LSTM(50),
Dense(50),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
return model
4. Transformer注意力机制
能源需求预测的Transformer
import torch
import torch.nn as nn
import torch.nn.functional as F
class EnergyTransformer(nn.Module):
def __init__(self, input_dim, d_model, nhead, num_layers):
super(EnergyTransformer, self).__init__()
self.input_projection = nn.Linear(input_dim, d_model)
self.positional_encoding = PositionalEncoding(d_model)
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
dim_feedforward=512,
dropout=0.1
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)
self.output_layer = nn.Linear(d_model, 1)
def forward(self, x):
x = self.input_projection(x)
x = self.positional_encoding(x)
x = self.transformer(x)
x = self.output_layer(x[-1]) # 取最后一个时间步
return x
# 训练示例
model = EnergyTransformer(input_dim=5, d_model=128, nhead=8, num_layers=6)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
5. 大模型预测方法
基于LLM的时间序列预测
# 使用预训练语言模型进行时间序列预测
from transformers import GPT2LMHeadModel, GPT2Tokenizer
class LLMEnergyPredictor:
def __init__(self, model_name='gpt2'):
self.tokenizer = GPT2Tokenizer.from_pretrained(model_name)
self.model = GPT2LMHeadModel.from_pretrained(model_name)
def time_series_to_text(self, ts_data):
# 将时间序列转换为文本格式
text = "Energy consumption pattern: "
for i, value in enumerate(ts_data):
text += f"Hour {i}: {value:.2f}kWh, "
text += "Next hour prediction:"
return text
def predict(self, historical_data):
input_text = self.time_series_to_text(historical_data)
inputs = self.tokenizer.encode(input_text, return_tensors='pt')
with torch.no_grad():
outputs = self.model.generate(
inputs,
max_length=inputs.shape[1] + 10,
temperature=0.7,
do_sample=True
)
prediction_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
return self.extract_prediction(prediction_text)
6. 多模态预测方法
融合多种数据源的预测
import torch.nn as nn
from torchvision import models
class MultimodalEnergyPredictor(nn.Module):
def __init__(self):
super(MultimodalEnergyPredictor, self).__init__()
# 时间序列分支
self.ts_lstm = nn.LSTM(input_size=1, hidden_size=64, num_layers=2, batch_first=True)
# 天气图像分支(卫星图像)
self.image_cnn = models.resnet18(pretrained=True)
self.image_cnn.fc = nn.Linear(512, 64)
# 文本特征分支(天气描述、新闻等)
self.text_embedding = nn.Embedding(vocab_size=10000, embedding_dim=64)
self.text_lstm = nn.LSTM(64, 64, batch_first=True)
# 融合层
self.fusion = nn.Linear(64 * 3, 128)
self.predictor = nn.Linear(128, 24) # 预测未来24小时
def forward(self, ts_data, image_data, text_data):
# 时间序列特征
ts_out, _ = self.ts_lstm(ts_data)
ts_features = ts_out[:, -1, :] # 取最后时间步
# 图像特征
image_features = self.image_cnn(image_data)
# 文本特征
text_embedded = self.text_embedding(text_data)
text_out, _ = self.text_lstm(text_embedded)
text_features = text_out[:, -1, :]
# 特征融合
combined = torch.cat([ts_features, image_features, text_features], dim=1)
fused = F.relu(self.fusion(combined))
prediction = self.predictor(fused)
return prediction
7. 实时预测系统架构
流式数据处理
import asyncio
from kafka import KafkaConsumer
import json
class RealTimePredictor:
def __init__(self, model, update_interval=300): # 5分钟更新
self.model = model
self.update_interval = update_interval
self.data_buffer = []
async def consume_data(self):
consumer = KafkaConsumer(
'energy_data',
bootstrap_servers=['localhost:9092'],
value_deserializer=lambda x: json.loads(x.decode('utf-8'))
)
for message in consumer:
data = message.value
self.data_buffer.append(data)
if len(self.data_buffer) >= 60: # 60个数据点
prediction = await self.predict()
await self.publish_prediction(prediction)
async def predict(self):
# 使用缓冲区数据进行预测
input_data = torch.tensor(self.data_buffer[-60:]).unsqueeze(0)
with torch.no_grad():
prediction = self.model(input_data)
return prediction.item()
async def publish_prediction(self, prediction):
# 发布预测结果
print(f"Predicted energy demand: {prediction:.2f} kWh")
8. 预测模型评估
性能指标计算
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
def evaluate_predictions(y_true, y_pred):
"""评估预测性能"""
mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
# 平均绝对百分比误差
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
# 对称平均绝对百分比误差
smape = np.mean(2 * np.abs(y_true - y_pred) / (np.abs(y_true) + np.abs(y_pred))) * 100
return {
'MAE': mae,
'MSE': mse,
'RMSE': rmse,
'MAPE': mape,
'SMAPE': smape
}
# 可视化预测结果
import matplotlib.pyplot as plt
def plot_predictions(y_true, y_pred, title="Energy Demand Prediction"):
plt.figure(figsize=(12, 6))
plt.plot(y_true, label='Actual', color='blue')
plt.plot(y_pred, label='Predicted', color='red', alpha=0.7)
plt.title(title)
plt.xlabel('Time (hours)')
plt.ylabel('Energy Demand (kWh)')
plt.legend()
plt.grid(True)
plt.show()
预测方法选择指南
短期预测(1-24小时)
- 推荐:LSTM、Transformer、CNN-LSTM
- 特点:高精度,适合实时调度
中期预测(1-7天)
- 推荐:Random Forest、SVR、多模态融合
- 特点:平衡精度和计算复杂度
长期预测(1周-1年)
- 推荐:ARIMA、Prophet、大模型
- 特点:捕捉季节性和趋势
不确定性量化
# 贝叶斯神经网络示例
import torch.distributions as dist
class BayesianPredictor(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, output_size * 2) # 均值和方差
def forward(self, x):
x = F.relu(self.fc1(x))
params = self.fc2(x)
mean = params[:, :output_size]
log_var = params[:, output_size:]
std = torch.exp(0.5 * log_var)
return mean, std
def sample_prediction(self, x, n_samples=100):
mean, std = self.forward(x)
distribution = dist.Normal(mean, std)
samples = distribution.sample((n_samples,))
return samples
更多推荐


所有评论(0)