詳細(xì)模型解釋參考論文:

https://arxiv.org/pdf/2404.14197

接下來將著重進(jìn)行代碼實現(xiàn)講解,在進(jìn)行代碼編譯前請先安裝相關(guān)庫

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

代碼實現(xiàn)

數(shù)據(jù)導(dǎo)入

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

數(shù)據(jù)集為’LongHorizon’模塊中的’ETTm1’的數(shù)據(jù)集,只選擇 ‘OT’ 數(shù)據(jù)進(jìn)行單序列建模(SOFTS最主要運用在多變量預(yù)測任務(wù)中,這里先通過單序列進(jìn)行模型代碼熟悉)

數(shù)據(jù)定義

# 定義驗證集和測試集的大小
val_size = int(0.1*len(df)) # 驗證集大小
test_size = int(0.2*len(df)) # 測試集大小

# 定義數(shù)據(jù)的頻率
freq = '15T' # 數(shù)據(jù)的頻率,例如每15分鐘記錄一次
horizon = 96 # 預(yù)測的時間跨度,即模型要預(yù)測的未來時間點數(shù)量

定義時間序列數(shù)據(jù)集的驗證集大小、測試集大小以及數(shù)據(jù)的頻率和預(yù)測時間跨度,為后續(xù)做準(zhǔn)備

模型構(gòu)建

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)

# 執(zhí)行交叉驗證
nf_preds = nf.cross_validation(df=df, val_size=val_size, test_size=test_size, n_windows=None)

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

這里創(chuàng)建了一個列表 models,其中包含一個 SOFTS 模型的實例

SOFTS 模型的參數(shù)解釋:

h=horizon:預(yù)測的時間跨度,即模型要預(yù)測的未來時間點數(shù)量

input_size=3*horizon:輸入數(shù)據(jù)的大小,這里假設(shè)每個時間點有3個預(yù)測時間跨度的數(shù)據(jù)

n_series=1:序列的數(shù)量,這里只有一個序列,單序列預(yù)測

max_steps=1000:訓(xùn)練的最大步數(shù)early_stop_patience_steps=3:用于提前停止訓(xùn)練的步數(shù),如果三次后驗證損失沒有改善,則停止訓(xùn)練

測試集預(yù)測結(jié)果輸出

# 計算每個預(yù)測結(jié)果的誤差
nf_preds['error'] = (nf_preds['y'] - nf_preds['SOFTS']).abs()
# 獲取誤差最小的預(yù)測結(jié)果
best_preds = nf_preds.loc[nf_preds.groupby('ds')['error'].idxmin()].reset_index(drop=True)
best_preds

交叉驗證輸出的預(yù)測結(jié)果:交叉驗證通常會對數(shù)據(jù)進(jìn)行多次劃分,每次劃分得到一個模型,并對驗證集進(jìn)行預(yù)測,因此,nf_preds 中包含了多次預(yù)測的結(jié)果,每次預(yù)測結(jié)果可能會略有不同,這里選擇最佳預(yù)測結(jié)果:通過計算每個時間點的預(yù)測誤差,并選擇誤差最小的預(yù)測結(jié)果,可以提高模型在驗證集上的表現(xiàn)評估,這里的DataFrame各指標(biāo)的含義為:單個時間點的唯一標(biāo)識符、時間戳、預(yù)測截止時間、模型預(yù)測值、實際觀測值以及它們之間的誤差

模型評價指標(biāo)

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}%")

模型預(yù)測可視化

plt.figure(figsize=(15, 5))
plt.style.use('ggplot') # 使用 'ggplot' 樣式,或者選擇其他內(nèi)置樣式
plt.plot(df['ds'], df['y'], color='c', alpha=0.7, label='原始數(shù)據(jù)')
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='測試集預(yù)測')
plt.title('時間序列預(yù)測可視化')
plt.xlabel('時間')
plt.ylabel('數(shù)值')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

本文章轉(zhuǎn)載微信公眾號@Python機(jī)器學(xué)習(xí)AI

上一篇:

KAN:Kolmogorov–Arnold Networks分類模型實現(xiàn)

下一篇:

突破最強(qiáng)時間序列模型,向量自回歸!!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費