詳細(xì)模型解釋參考論文:
https://arxiv.org/pdf/2404.14197
接下來將著重進(jìn)行代碼實現(xiàn)講解,在進(jìn)行代碼編譯前請先安裝相關(guān)庫
pip install git+https://github.com/Nixtla/neuralforecast.git
數(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)行模型代碼熟悉)
# 定義驗證集和測試集的大小
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é)果的誤差
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