所有文章 > AI驱动 > SOFTS模型的单特征时间序列预测实现

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

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()

本文章转载微信公众号@Python机器学习AI