文章目錄[隱藏]
時間序列是一係列按照時間順序排列的數據,這些數據之間的間隔可以是等距的,也可以是不等距的。 時間序列的預測過程包括通過對時間序列的過去行為(wei) 進行建模(自回歸)或使用其他外部變量來預測時間序列的未來值。
本文介紹了如何使用Scikit-learn回歸模型來進行時間序列的預測。具體(ti) 而言,它介紹了Skforecast,一個(ge) 簡單的庫,包含了將任何Scikit-learn回歸模型適應於(yu) 預測問題所需的類和函數。
本文源碼地址:https://www.cienciadedatos.net/documentos/py27-time-series-forecasting-python-scikitlearn.html
時序預測基礎
為(wei) 了將機器學習(xi) 模型應用於(yu) 預測問題,需要將時間序列轉換為(wei) 一個(ge) 矩陣,其中每個(ge) 值與(yu) 其之前的時間窗口(滯後)相關(guan) 聯。
在時間序列的背景下,滯後是指相對於(yu) 時間步長 ? 的值,即係列在之前時間步長上的取值。例如,滯後1是指時間步長 ?−1 的值,而滯後 ? 是指時間步長 ?−? 的值。這種轉換還允許包含額外的變量。
一旦數據被重新排列成新的形式,任何回歸模型都可以被訓練來預測係列的下一個(ge) 值(步長)。在模型訓練過程中,每一行被視為(wei) 一個(ge) 獨立的數據實例,其中滯後1、2、... ? 的值被視為(wei) 時間步長 ?+1 上目標時間序列的預測變量。
多步時間序列預測
在處理時間序列時,很少隻需要預測係列中的下一個(ge) 元素 (?+1)。相反,最常見的目標是預測整個(ge) 未來的時間間隔 (?+1, ..., ?+?) 或者一個(ge) 較遠的時間點 (?+?)。有幾種策略可以生成這種類型的預測。
遞歸多步預測
由於(yu) 預測 需要知道值 ,而 是未知的,因此采用遞歸過程,每個(ge) 新的預測都基於(yu) 前一個(ge) 預測。這個(ge) 過程被稱為(wei) 遞歸預測或遞歸多步預測,可以通過ForecasterAutoreg和ForecasterAutoregCustom類輕鬆生成。
直接多步預測
直接多步預測包括針對預測時間跨度的每個(ge) 步驟訓練一個(ge) 不同的模型。例如,要預測時間序列的接下來的5個(ge) 值,需要訓練5個(ge) 不同的模型,每個(ge) 步驟一個(ge) 模型。因此,預測是相互獨立的。
這種方法的主要複雜性在於(yu) 為(wei) 每個(ge) 模型生成正確的標簽矩陣。skforecast庫中的ForecasterAutoregDirect類自動化了這個(ge) 過程。同時需要注意的是,這種策略的計算成本較高,因為(wei) 需要訓練多個(ge) 模型。下麵的圖示展示了一個(ge) 具有響應變量和兩(liang) 個(ge) 外生變量的情況下的過程。
多輸出預測
某些機器學習(xi) 模型,例如長短期記憶(LSTM)神經網絡,可以同時預測一個(ge) 序列的多個(ge) 值(一次性預測)。目前skforecast庫尚未實現這種策略。
案例1:遞歸自回歸預測
數據集記錄了1991年至2008年期間澳大利亞(ya) 衛生係統在皮質類固醇藥物上的月度支出(以百萬(wan) 美元為(wei) 單位)。目標是創建一個(ge) 自回歸模型,能夠預測未來的月度支出。
使用ForecasterAutoreg類,可以創建一個(ge) 模型,並使用RandomForestRegressor回歸器進行訓練,時間窗口為(wei) 6個(ge) 滯後值。這意味著模型使用前6個(ge) 月的數據作為(wei) 自變量。
forecaster = ForecasterAutoreg( regressor = RandomForestRegressor(random_state=123), lags = 6 )
forecaster.fit(y=data_train['y'])
forecaster
也可以設置模型超參數進行調參:
steps = 36 forecaster = ForecasterAutoreg( regressor = RandomForestRegressor(random_state=123), lags = 12 # This value will be replaced in the grid search )
# Lags used as predictors lags_grid = [10, 20]
# Regressor's hyperparameters param_grid = {'n_estimators': [100, 500], 'max_depth': [3, 5, 10]}
results_grid = grid_search_forecaster(
forecaster = forecaster,
y = data_train['y'],
param_grid = param_grid,
lags_grid = lags_grid,
steps = steps,
refit = True,
metric = 'mean_squared_error',
initial_train_size = int(len(data_train)*0.5),
fixed_train_size = False,
return_best = True,
verbose = False
)
回測是建模中的一個(ge) 術語,指對曆史數據上進行預測模型的測試。回測涉及向過去逐步移動,根據需要進行多個(ge) 階段的測試。回測是一種特殊類型的交叉驗證,應用於(yu) 之前的時間段。
案例2:外部特征多元回歸
在前麵的例子中,隻使用了預測變量本身的滯後值作為(wei) 預測變量。在某些情況下,可能會(hui) 有關(guan) 於(yu) 其他變量的信息,其未來值是已知的,因此可以作為(wei) 模型中的額外預測變量。
forecaster = ForecasterAutoreg( regressor = RandomForestRegressor(random_state=123), lags = 8 )
forecaster.fit(y=data_train['y'], exog=data_train['exog_1'])
forecaster
案例3:模型多步預測
ForecasterAutoreg和ForecasterAutoregCustom模型采用遞歸預測策略,每個(ge) 新的預測都建立在前一個(ge) 預測的基礎上。另一種方法是為(wei) 要預測的每個(ge) 步驟訓練一個(ge) 模型。
這種策略通常被稱為(wei) 直接多步預測,它在計算上比遞歸更昂貴,因為(wei) 需要訓練多個(ge) 模型。然而,在某些情況下,它可以獲得更好的結果。使用ForecasterAutoregDirect類可以獲得這種類型的模型,並且可以包括一個(ge) 或多個(ge) 外生變量。
forecaster = ForecasterAutoregDirect( regressor = Lasso(random_state=123), transformer_y = StandardScaler(), steps = 36, lags = 8 )
forecaster
其他案例
skforecast提供了太多的功能,其他典型案例包括:
- 多係列預測
https://skforecast.org/0.8.1/user_guides/independent-multi-time-series-forecasting.html
- 多變量預測
https://skforecast.org/0.8.1/user_guides/dependent-multi-series-multivariate-forecasting.html
- 加權時間序列預測
https://skforecast.org/0.8.1/user_guides/weighted-time-series-forecasting.html
- 帶有缺失值的時間序列預測
https://skforecast.org/0.8.1/faq/forecasting-time-series-with-missing-values.html
評論已經被關(guan) 閉。