詳解一個算法,AutoARIMAProphet
今天給大家分享一個強大的算法模型,AutoARIMAProphet
AutoARIMAProphet (AAP) 是一種混合模型,旨在結(jié)合兩種突出的時間序列預測技術(shù)的優(yōu)勢:AutoARIMA (AA) 和 Facebook Prophet (FBP)。
它由 Nixtla 開發(fā),旨在通過利用 AutoARIMA 的「自動超參數(shù)選擇功能」和 Facebook Prophet 的趨勢季節(jié)性分解方法提供更穩(wěn)健、更準確、更靈活的預測解決方案。
關鍵概念和組成部分
1.AutoARIMA
AutoARIMA 是 ARIMA(自回歸移動平均)模型的高級實現(xiàn),可自動選擇最佳的參數(shù)組合,以優(yōu)化模型的預測性能。
傳統(tǒng)的 ARIMA(p, d, q) 模型是一種強大的統(tǒng)計工具,通過結(jié)合三個組成部分來預測時間序列數(shù)據(jù)。
ARIMA 模型組成
- 自回歸 (AR) 部分
這部分模型是一個回歸模型,使用前 p 個時刻的觀測值作為自變量來預測當前值。
其中,??? 是模型參數(shù),ε 是誤差項。 - 差分 (I) 部分
為了使時間序列數(shù)據(jù)穩(wěn)定,可能需要對原始數(shù)據(jù)進行一次或多次差分。d 是差分次數(shù)。 - 移動平均 (MA) 部分
這部分模型用前幾個時間點的預測誤差來做預測。q 是MA部分的階數(shù)。
其中,θθθ 是模型參數(shù)。
AutoARIMA 的優(yōu)點
- 參數(shù)選擇
AutoARIMA 的主要優(yōu)點是它可以自動選擇最合適的 p、d 和 q 參數(shù)。 - 交叉驗證
為防止過擬合,AutoARIMA 可以使用時間序列的交叉驗證方法,例如滾動預測起點,來確保模型在未見數(shù)據(jù)上也表現(xiàn)良好。 - 模型優(yōu)化
自動化的過程不僅試圖找到最佳的超參數(shù),還會嘗試不同的模型組合和轉(zhuǎn)換方法,如對數(shù)轉(zhuǎn)換或去趨勢方法,以找到最佳的模型。
在 Python 中,可以通過 pmdarima 庫中的 auto_arima 函數(shù)輕松實現(xiàn) AutoARIMA 模型。這使得它在商業(yè)分析、財務預測、天氣預測等領域得到廣泛應用。
2.Prophet
Prophet 是一個由 Facebook 開發(fā)的開源時間序列預測庫,專門設計用于處理表現(xiàn)出強烈季節(jié)性影響和趨勢的時間序列數(shù)據(jù)。
基本原理
Prophet 模型基于一個可加模型,其中時間序列被假設為三個主要組成部分的和:趨勢、季節(jié)性和節(jié)假日效應。
數(shù)學上可以表示為:
其中
- 是預測值。
- 是趨勢組件,用于模擬時間序列的非周期性變化。
- 是季節(jié)性組件,捕捉周期性變化如日季節(jié)性、周季節(jié)性等。
- 是節(jié)假日組件,用于模擬節(jié)假日對時間序列的影響。
- 是誤差項,通常假設為正態(tài)分布。
主要特點
- 易于使用
- 靈活性,可以定制處理各種類型的時間序列數(shù)據(jù)和特定業(yè)務場景。
- 穩(wěn)健性,有效管理異常值和缺失數(shù)據(jù),在各種條件下提供可靠的預測。
- 加法模型,它將時間序列數(shù)據(jù)建模為趨勢、季節(jié)性和假期的加法組合。
- 處理缺失數(shù)據(jù),它對缺失數(shù)據(jù)點具有很強的魯棒性,并且可以處理趨勢或季節(jié)性的變化。
3.AutoARIMAProphet 模型
AutoARIMAProphet 結(jié)合了 AutoARIMA 和 Facebook Prophet 的優(yōu)勢,創(chuàng)建了一個強大的混合預測模型。
這種集成旨在利用 AutoARIMA 的自動參數(shù)選擇和 Facebook Prophet 的趨勢季節(jié)性分解功能。
圖片
如上圖所示,它說明了 AutoARIMAProphet (AAP) 算法的一般工作流程。
以下是算法中每個步驟的詳細說明。
- 輸入歷史數(shù)據(jù)
AutoARIMAProphet 算法的第一步是輸入歷史時間序列數(shù)據(jù)。該數(shù)據(jù)通常包括需要預測的變量的過去觀測值以及任何相關日期或時間戳。 - 使用 Prophet 模型檢測時間序列特征
Facebook 的 Prophet 模型用于分析和檢測時間序列數(shù)據(jù)的關鍵特征。
這包括識別趨勢、季節(jié)性以及可能影響數(shù)據(jù)的假期或其他事件。 - 生成一組 ARIMA 模型
基于 Prophet 模型檢測到的特征,生成一系列 ARIMA 模型。
每個模型代表 ARIMA 參數(shù)(p、d、q)和潛在季節(jié)性成分的不同組合。 - 在時間序列數(shù)據(jù)上評估每個模型
評估每個生成的 ARIMA 模型以確定其在時間序列數(shù)據(jù)上的性能。 - 選擇性能最佳的模型
根據(jù)評估指標選擇性能最佳的 ARIMA 模型。 - 將選定的模型與數(shù)據(jù)擬合
然后將選定的 ARIMA 模型擬合到整個時間序列數(shù)據(jù),以優(yōu)化其預測參數(shù)。 - 使用擬合模型進行預測
擬合模型用于生成時間序列未來值的預測。 - 輸出預測和關鍵模型參數(shù)
最后一步輸出預測值和模型的關鍵參數(shù)。
案例分享
首先加載數(shù)據(jù)并切分為訓練集和測試集。
from sklearn.model_selection import train_test_split as TTS
import pandas as pd
import time
data_full = pd.read_csv('test.csv',index_col=0)
data_full['ds'] = pd.to_datetime(data_full['ds'])
df_dataCol = data_full.drop('y', axis = 1)
X = data_full[df_dataCol.columns]
Y = data_full['y']
# Y = df["Closing Price"] / df["Closing Price"].max()
X_train, X_test, Y_train, Y_test = TTS(X, Y,
test_size = 0.05,
random_state = 0,
shuffle=False)
df_train = X_train.join(Y_train)
df_test = X_test.join(Y_test)
接下來,構(gòu)建模型并訓練。
from statsforecast.adapters.prophet import AutoARIMAProphet
from tqdm import tqdm
start = time.time()
# Initialize the AutoARIMAProphet model configurations
model_config = {
"growth": "logistic",
"yearly_seasonality": True,
"seasonality_mode": "multiplicative",
"seasonality_prior_scale": 10,
"holidays_prior_scale": 10,
"changepoint_prior_scale": 0.05,
"interval_width": 0.75,
"uncertainty_samples": 1000
}
cap = 10
floor = 5.5
# Instantiate models
aap = AutoARIMAProphet(**model_config)
aapM2 = AutoARIMAProphet(**model_config)
df_train['cap'] = cap
df_train['floor'] = floor
# Fit the first model
with tqdm(total=1, desc="Fitting First Model") as pbar:
aap1 = aap.fit(df_train, disable_seasonal_features=False)
pbar.update(1)
# aap = aap.fit(df_train)
print("Train:", time.time() - start)
combined_df = pd.concat([df_train, df_test])
df_train['cap'] = cap
df_train['floor'] = floor
df_test['cap'] = cap
df_test['floor'] = floor
combined_df['cap'] = cap
combined_df['floor'] = floor
# Fit the second model
with tqdm(total=1, desc="Fitting Second Model") as pbar:
aap2 = aapM2.fit(combined_df, disable_seasonal_features=False)
pbar.update(1)
aap_pred_forecast = aap2.make_future_dataframe(periods = 1826, freq = 'D', include_history = True)
aap_pred_forecast['cap'] = cap
aap_pred_forecast['floor'] = floor
# Making predictions
with tqdm(total=2, desc="Making Predictions") as pbar:
aap_pred_test = aap1.predict(df_test)
aap_pred_train = aap1.predict(df_train)
aap_pred_forecast = aap2.predict(aap_pred_forecast)
pbar.update(2)
print("Pred:", time.time() - start)
最后,我們來看一下預測的結(jié)果。
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(df_train['ds'], df_train['y'], label='Train Data')
plt.plot(aap_pred_train['ds'], aap_pred_train['yhat'], label='Train Validation - Prediction')
plt.plot(df_test['ds'], df_test['y'], label='Test Data')
plt.plot(aap_pred_test['ds'], aap_pred_test['yhat'], label='Test Validation Data - Prediction')
plt.fill_between(aap_pred_forecast['ds'], aap_pred_forecast['yhat_lower'], aap_pred_forecast['yhat_upper'], color='gray', alpha=0.2)
plt.legend()
plt.xlabel('Date')
plt.ylabel('IDX KOMPAS 100 Stock Price')
plt.show()
圖片