
TimesNet模型与Crossformer一样都是2023年的模型,由清华大学提出,主要将时间序列数据转换为二维来消除周期内和周期间的变化,对于想水论文的同学也可以水个论文毕业。这里同样不具体解释模型的原理结构(新手小白也看不懂,也不愿意浪费时间看)对于需要了解或者写论文引用的同学可以自行搜索模型原文,或者关注下面公众号私信我发送原文后,自行查看原文。同样的对于这类模型的代码通常都会十分复杂,对于新手小白来说可能参数都不知道在哪里改,因此我基于开源代码对模型进行了简化,保留了主要的预测部分,使得小白至少可以清晰的知道在哪里改参数!同样为了保证文章的创新性,依然增加了对于未来值的预测部分,并不是“伪预测”,下面就是模型的部分代码,有需要完整代码的可以咸鱼咨询,或者私信。

有想要其它相关模型的话可以咸鱼搜索“清朝简单的饮料”、“安仁坊天蝎座果”和“黉门街打球的生姜”,除这三个号外其它均为我的二次销售盗版(有些盗版连文案都不改一下直接复制我的就离谱),出了问题无法保障!!!此外csdn上也有较多我的盗版模型!!!!我的模型均使用焦作市的空气质量数据!!!注意甄别!!!!!老版本模型可能存在些许问题!!!!!还有最新的XLSTM、KAN-LSTM等等模型。也会陆续更新模型,欢迎关注!!!!!!
import torch
import pandas as pd
import math
import torch.nn as nn
from times_dataset import TimesNetDataset
from torch.optim.lr_scheduler import CosineAnnealingLR
from timesmodel import TimesNet
from tqdm import tqdm
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error
from sklearn.preprocessing import MinMaxScaler
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
df = pd.read_excel('多变量.xlsx')
df.set_index(df.columns[0], inplace=True)
target_var = 'canopy'#需要预测的目标列
col_ = df.pop(target_var)
df.insert(0, target_var, col_)
train = df[:int(0.6 * len(df))]
val = df[int(0.6 * len(df)): int(0.8 * len(df))]
test = df[int(0.8 * len(df)):]
scaler = MinMaxScaler(feature_range=(-1, 1))
train = scaler.fit_transform(train)
test = scaler.transform(test)
val = scaler.transform(val)
seq_len=96
label_len=48
pred_len=1
d_model=512
d_ff=2048
e_layers=3
dropout=0.1
num_kernels=2
top_k=2
task_name='short_term_forecast' #'long_term_forecast'
batch_size = 32
learning_rate = 0.001
num_epochs = 20
train_dataset = TimesNetDataset(ds=train, seq_len=seq_len, pred_len=pred_len)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=False)
val_dataset = TimesNetDataset(ds=val, seq_len=seq_len, pred_len=pred_len)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
test_dataset = TimesNetDataset(ds=test, seq_len=seq_len, pred_len=pred_len)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
model = TimesNet(seq_len=seq_len, label_len=label_len, pred_len=pred_len, d_model=d_model,
d_ff=d_ff, enc_in=df.shape[1], c_out=df.shape[1], e_layers=e_layers, dropout=dropout,
num_kernels=num_kernels, top_k=top_k, task_name=task_name).to(device)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
scheduler = CosineAnnealingLR(optimizer, T_max=num_epochs)
for epoch in range(num_epochs):
model.train()
total_loss = 0
for batch_data, batch_target in tqdm(train_loader, desc=f"Epoch {epoch + 1}/{num_epochs}"):
outputs = model(batch_data)
loss = criterion(outputs, batch_target)
loss.backward()
optimizer.step()
total_loss += loss.item()
model.eval()
val_loss = 0
with torch.no_grad():
for batch_data, batch_target in val_loader:
batch_data, batch_target = batch_data.to(device), batch_target.to(device)
outputs = model(batch_data)
loss = criterion(outputs, batch_target)
val_loss += loss.item()
print(f"Epoch {epoch + 1}/{num_epochs}, Training Loss: {total_loss / len(train_loader)}, Validation Loss: {val_loss / len(val_loader)}")
scheduler.step()
model.eval()
test_loss = 0
predictions = []
true_values = []
with torch.no_grad():
for batch_data, batch_target in test_loader:
batch_data, batch_target = batch_data.to(device), batch_target.to(device)
outputs = model(batch_data)
loss = criterion(outputs, batch_target)
test_loss += loss.item()
predictions.extend(outputs.cpu().numpy())
true_values.extend(batch_target.cpu().numpy())
trues, preds = np.array(true_values), np.array(predictions)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(trues[:, pred_len-1, 0], label='真实值', color='blue')
for i in range(pred_len):
plt.plot(preds[:, i, 0], label=f'Step {i+1} Prediction')
plt.title('真实值 vs 预测值')
plt.xlabel('样本序号')
plt.ylabel('目标值')
plt.legend()
plt.show()
for i in range(pred_len):
r2 = r2_score(trues[:, i, 0], preds[:, i, 0])
rmse = math.sqrt(mean_squared_error(trues[:, i, 0], preds[:, i, 0]))
mae = mean_absolute_error(trues[:, i, 0], preds[:, i, 0])
mape = mean_absolute_percentage_error(trues[:, i, 0], preds[:, i, 0])
print(f'Step {i+1} - RMSE: {rmse}, MAE: {mae}, R2: {r2}, MAPE: {mape}')
# 定义要预测的步数
future_steps = 300
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(trues[:, pred_len-1, 0], label='测试集', color='blue')
plt.plot(range(len(trues), len(trues) + len(future_predictions)), future_predictions[:, 0], label='预测值', color='orange')
plt.title('测试集和未来预测值')
plt.xlabel('时间步数')
plt.ylabel('目标值')
plt.legend()
plt.show()
模型使用的示例数据与Crossformer模型的数据相同,可以自行前往Crossformer预测模型,可以预测未来值!!!查看数据。下面也给出了对于示例数据的预测效果图,从图中看拟合效果还是十分优秀的。

此外对于未来300个值的预测如下图所示。从预测的结果来看,模型对于未来的近两百个数据的预测效果还是比较符合原始数据的趋势的,对于更多的未来值预测效果衰减比较严重。同学们可以尝试将模型与分解算法进行结合来对未来值进行预测,查看效果是否有所改进,不会的同学我这边也可以进行付费添加!!!!!!!!


6658

被折叠的 条评论
为什么被折叠?



