SOFTS模型的单特征时间序列预测实现

由于复制粘贴会损失图片dpi请移步公众号原文观看获得更好的观感效果(关注公众号获得更多优质文章及数据)

SOFTS模型的单特征时间序列预测实现 (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=Mzk0NDM4OTYyOQ==&mid=2247485344&idx=1&sn=a2181dc27e10c12b77c4e79c6f1929bd&chksm=c3242b32f453a224b8bf66a6f0fcb478db3468e7bff117b316ea51725c6fd3358450d6b2a7f3&token=1010973939&lang=zh_CN#rd

SOFTS 

2024年4月《SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion》中提出的新模型,采用集中策略来学习不同序列之间的交互,从而在多变量预测任务中获得最先进的性能,SOFTS架构如下:

详细模型解释参考论文:

https://arxiv.org/pdf/2404.14197

接下来将着重进行代码实现讲解,在进行代码编译前请先安装相关库


pip install git+https://github.com/Nixtla/neuralforecast.git

代码实现

数据导入


import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' 
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('时间序列.xlsx')
df['ds'] = pd.to_datetime(df['ds'])

plt.figure(figsize=(15, 5))
plt.plot(df['ds'], df['y'], color='c',  alpha=0.3)
plt.title('时序图')
plt.show()

该数据集为'LongHorizon'模块中的'ETTm1'的数据集,只选择 'OT' 数据进行单序列建模(SOFTS最主要运用在多变量预测任务中,这里先通过单序列进行模型代码熟悉)

数据定义

# 定义验证集和测试集的大小
val_size = int(0.1*len(df)) # 验证集大小
test_size = int(0.2*len(df))  # 测试集大小

# 定义数据的频率
freq = '15T'  # 数据的频率,例如每15分钟记录一次
horizon = 96 # 预测的时间跨度,即模型要预测的未来时间点数量

定义时间序列数据集的验证集大小、测试集大小以及数据的频率和预测时间跨度,为后续做准备

模型构建

from neuralforecast.models import SOFTS
from neuralforecast.core import NeuralForecast
# 定义 SOFTS 模型
models = [
    SOFTS(h=horizon, input_size=3*horizon, n_series=1, max_steps=1000, early_stop_patience_steps=3)
]

# 实例化 NeuralForecast
nf = NeuralForecast(models=models, freq=freq)

# 执行交叉验证
nf_preds = nf.cross_validation(df=df, val_size=val_size, test_size=test_size, n_windows=None)

# 重置索引以便更好地查看结果
nf_preds = nf_preds.reset_index()

这里创建了一个列表 models,其中包含一个 SOFTS 模型的实例

SOFTS 模型的参数解释:

h=horizon:预测的时间跨度,即模型要预测的未来时间点数量

input_size=3*horizon:输入数据的大小,这里假设每个时间点有3个预测时间跨度的数据

n_series=1:序列的数量,这里只有一个序列,单序列预测

max_steps=1000:训练的最大步数

early_stop_patience_steps=3:用于提前停止训练的步数,如果三次后验证损失没有改善,则停止训练

测试集预测结果输出

# 计算每个预测结果的误差
nf_preds['error'] = (nf_preds['y'] - nf_preds['SOFTS']).abs()
# 获取误差最小的预测结果
best_preds = nf_preds.loc[nf_preds.groupby('ds')['error'].idxmin()].reset_index(drop=True)
best_preds

交叉验证输出的预测结果:交叉验证通常会对数据进行多次划分,每次划分得到一个模型,并对验证集进行预测,因此,nf_preds 中包含了多次预测的结果,每次预测结果可能会略有不同,这里选择最佳预测结果:通过计算每个时间点的预测误差,并选择误差最小的预测结果,可以提高模型在验证集上的表现评估,这里的DataFrame各指标的含义为:单个时间点的唯一标识符、时间戳、预测截止时间、模型预测值、实际观测值以及它们之间的误差

模型评价指标

from sklearn import metrics
import numpy as np
mse = metrics.mean_squared_error(best_preds['y'], best_preds['SOFTS'])
rmse = np.sqrt(mse)
mae = metrics.mean_absolute_error(best_preds['y'], best_preds['SOFTS'])
r2 = metrics.r2_score(best_preds['y'], best_preds['SOFTS'])
def mean_absolute_percentage_error(y_true, y_pred):
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
mape = mean_absolute_percentage_error(best_preds['y'], best_preds['SOFTS'])

print(f"Mean Squared Error (MSE): {mse:.4f}")
print(f"Root Mean Squared Error (RMSE): {rmse:.4f}")
print(f"Mean Absolute Error (MAE): {mae:.4f}")
print(f"R-squared (R2): {r2:.4f}")
print(f"Mean Absolute Percentage Error (MAPE): {mape:.4f}%")

 

模型预测可视化

plt.figure(figsize=(15, 5))
plt.style.use('ggplot')  # 使用 'ggplot' 样式,或者选择其他内置样式
plt.plot(df['ds'], df['y'], color='c', alpha=0.7, label='原始数据')
plt.plot(best_preds['ds'], best_preds['y'], color='r', alpha=0.7, label='测试集实际值')
plt.plot(best_preds['ds'], best_preds['SOFTS'], color='b', alpha=0.7, label='测试集预测')
plt.title('时间序列预测可视化')
plt.xlabel('时间')
plt.ylabel('数值')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

往期推荐

KAN:Kolmogorov–Arnold Networks分类模型实现

Pythorch框架构建Attention-lstm时序模型

论文可视化设计:掌握 Seaborn 15 种精美数据可视化

PDP(部分依赖图)、ICE(个体条件期望)解释机器学习模型保姆级教程

SHAP全解析:机器学习、深度学习模型解释保姆级教程

梯度提升集成:LightGBM与XGBoost组合预测

ARIMA与Prophet的完美结合:AutoARIMAProphet时序模型

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

Python机器学习AI 个人观点,仅供参考

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python机器学习AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值