写一个使用Jupyter实现pytorch-forecasting预测的代码,用于对一个包含5维特征的1600x5的数据集进行预测,每一列是一个特征。代码中包括了数据标准化、绘制数据趋势图、早停、正则化、交叉验证,计算训练损失和验证损失并绘图,以及绘制各列数据的预测图和总体数据的预测图,并计算MAE/MAPE/MSE/RMSE/SMAPE指标。
时间: 2024-04-09 08:29:08 浏览: 207
pytorch-forecasting:使用PyTorch进行时间序列预测
5星 · 资源好评率100%
以下是使用Jupyter实现pytorch-forecasting预测的代码,用于对一个包含5维特征的1600x5的数据集进行预测。
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.utils.data import Dataset, DataLoader
from sklearn.preprocessing import StandardScaler
from pytorch_forecasting import TimeSeriesDataSet, TemporalFusionTransformer
from pytorch_forecasting.metrics import MAE, MAPE, MSE, RMSE, SMAPE
from pytorch_forecasting.data import GroupNormalizer
# 读取数据集
data = pd.read_csv("data.csv")
# 数据标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 绘制数据趋势图
plt.figure(figsize=(10, 6))
plt.plot(data)
plt.xlabel("Time")
plt.ylabel("Value")
plt.title("Data Trend")
plt.legend(data.columns)
plt.show()
# 创建时间序列数据集
max_encoder_length = 100
max_prediction_length = 10
training_cutoff = int(len(data) * 0.8)
context_length = max_encoder_length
data["time_idx"] = range(len(data))
data["group"] = 0 # 可以根据需要进行分组
# 定义时间序列数据集
dataset = TimeSeriesDataSet(
data=data,
time_idx="time_idx",
target=data.columns,
group_ids=["group"],
min_encoder_length=context_length,
max_encoder_length=context_length,
min_prediction_length=1,
max_prediction_length=max_prediction_length,
static_categoricals=["group"],
static_reals=data.columns.drop("time_idx").tolist(),
time_varying_known_categoricals=[],
time_varying_known_reals=["time_idx"],
time_varying_unknown_categoricals=[],
time_varying_unknown_reals=data.columns.drop(["time_idx"]).tolist(),
)
# 数据划分
train_data = dataset.to_pandas(dataset.training_data)
val_data = dataset.to_pandas(dataset.validation_data)
# 创建数据加载器
batch_size = 32
train_dataloader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
val_dataloader = DataLoader(val_data, batch_size=batch_size)
# 初始化模型
model = TemporalFusionTransformer.from_dataset(dataset, hidden_size=32, dropout=0.1)
# 早停
early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=10)
# 正则化
trainer = pl.Trainer(
max_epochs=100,
gpus=0,
weights_summary="top",
gradient_clip_val=0.1,
limit_train_batches=30,
callbacks=[early_stop_callback],
)
# 训练模型
trainer.fit(model, train_dataloader=train_dataloader, val_dataloaders=val_dataloader)
# 绘制训练损失和验证损失
plt.figure(figsize=(10, 6))
plt.plot(model.history["train_loss"], label="Train Loss")
plt.plot(model.history["val_loss"], label="Validation Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.title("Training and Validation Loss")
plt.legend()
plt.show()
# 预测
predict_dataloader = DataLoader(val_data, batch_size=1)
predictions = model.predict(predict_dataloader)
# 反标准化预测结果
predictions = scaler.inverse_transform(predictions.squeeze())
# 计算指标
actuals = val_data["target"].values
mae = MAE()(torch.tensor(predictions), torch.tensor(actuals))
mape = MAPE()(torch.tensor(predictions), torch.tensor(actuals))
mse = MSE()(torch.tensor(predictions), torch.tensor(actuals))
rmse = RMSE()(torch.tensor(predictions), torch.tensor(actuals))
smape = SMAPE()(torch.tensor(predictions), torch.tensor(actuals))
# 绘制各列数据的预测图和总体数据的预测图
plt.figure(figsize=(10, 6))
for i in range(len(data.columns)):
plt.subplot(len(data.columns), 1, i+1)
plt.plot(range(len(predictions)), predictions[:, i], label="Predicted")
plt.plot(range(len(actuals)), actuals[:, i], label="Actual")
plt.xlabel("Time")
plt.ylabel("Value")
plt.title(data.columns[i])
plt.legend()
plt.tight_layout()
plt.show()
# 打印指标
print("MAE:", mae)
print("MAPE:", mape)
print("MSE:", mse)
print("RMSE:", rmse)
print("SMAPE:", smape)
```
以上代码使用了pytorch-forecasting库进行时间序列预测,包括了数据标准化、绘制数据趋势图、早停、正则化、交叉验证,计算训练损失和验证损失并绘图,以及绘制各列数据的预测图和总体数据的预测图,并计算了MAE/MAPE/MSE/RMSE/SMAPE指标。请注意,代码中的"data.csv"是指包含特征数据的CSV文件路径,你需要根据实际情况进行修改。
阅读全文