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
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- GPT-OSS 模型优化成人自考 AI 客服口语评测 API,3 天落地
- Link支付怎么注册?一站式指南
- Meta AI国内怎么用
- 手把手教你用Python调用本地Ollama API
- 2025年提供LLM API的17家顶尖AI公司 – Apidog
- 如何使用 DeepSeek 构建 AI Agent:终极指南
- 如何获取Microsoft API Key 密钥实现bing搜索分步指南
- API和微服务:构筑现代软件架构的基石
- 如何免费调用高德经纬度定位API实现地理定位
- AI 驱动的 API 如何改变招聘:2024 年国内外顶级招聘相关API
- API治理:有效API管理的优秀实践和策略
- 企业 API 安全全解析:责任归属、最佳实践与 Boomi 控制平面管理