自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自回歸滯后模型進(jìn)行多變量時(shí)間序列預(yù)測

開發(fā) 前端
下圖顯示了關(guān)于不同類型葡萄酒銷量的月度多元時(shí)間序列。每種葡萄酒類型都是時(shí)間序列中的一個(gè)變量。

下圖顯示了關(guān)于不同類型葡萄酒銷量的月度多元時(shí)間序列。每種葡萄酒類型都是時(shí)間序列中的一個(gè)變量。

圖片

假設(shè)要預(yù)測其中一個(gè)變量。比如,sparkling wine。如何建立一個(gè)模型來進(jìn)行預(yù)測呢?

一種常見的方法是將該變量其視為單變量時(shí)間序列。這樣就有很多方法可以用來模擬這些系列。比如 ARIMA、指數(shù)平滑或 Facebook 的 Prophet,還有自回歸的機(jī)器學(xué)習(xí)方法也可以使用。

但是其他變量可能包含sparkling wine未來銷售的重要線索??纯聪旅娴南嚓P(guān)矩陣。

可以看到sparkling wine的銷量(第二排)與其他葡萄酒的銷量有相當(dāng)?shù)南嚓P(guān)性。所以在模型中包含這些變量可能是一個(gè)好主意。

本文將介紹可以通過一種稱為自回歸分布滯后(ARDL)的方法來做到這一點(diǎn)。

Auto-Regressive Distributed Lag

ARDL模型采用自回歸。自回歸是大多數(shù)單變量時(shí)間序列模型的基礎(chǔ)。它主要分為兩個(gè)步驟。

首先將(單變量)時(shí)間序列從一個(gè)值序列轉(zhuǎn)換為一個(gè)矩陣。可以用用延時(shí)嵌入法(time delay embedding)來做到這一點(diǎn)。盡管名字很花哨,但這種方法非常簡單。它基于之前的最近值對每個(gè)值進(jìn)行建模。然后建立一個(gè)回歸模型。未來值表示目標(biāo)變量。解釋變量是過去最近的值。

多元時(shí)間序列的思路與此類似,我們可以將其他變量的過去值添加到解釋變量中。這就是了被稱為自回歸分布式滯后方法。分布式滯后的意思指的是使用額外變量的滯后。

現(xiàn)在我們把他們進(jìn)行整合,時(shí)間序列中一個(gè)變量的未來值取決于它自身的滯后值以及其他變量的滯后值。

代碼實(shí)現(xiàn)

多變量時(shí)間序列通常是指許多相關(guān)產(chǎn)品的銷售數(shù)據(jù)。我們這里以葡萄酒銷售時(shí)間序列為例。當(dāng)然ARDL方法也適用于零售以外的其他領(lǐng)域。

轉(zhuǎn)換時(shí)間序列

首先使用下面的腳本轉(zhuǎn)換時(shí)間序列。

import pandas as pd

# https://github.com/vcerqueira/blog/
from src.tde import time_delay_embedding

wine = pd.read_csv('data/wine_sales.csv', parse_dates=['date'])

# setting date as index
wine.set_index('date', inplace=True)

# you can simulate some data with the following code
# wine = pd.DataFrame(np.random.random((100, 6)),
# columns=['Fortified','Drywhite','Sweetwhite',
# 'Red','Rose','Sparkling'])

# create data set with lagged features using time delay embedding
wine_ds = []
for col in wine:



# concatenating all variables
wine_df = pd.concat(wine_ds, axis=1).dropna()

# defining target (Y) and explanatory variables (X)
predictor_variables = wine_df.columns.str.contains('\(t\-')
target_variables = wine_df.columns.str.contains('Sparkling\(t\+')

X = wine_df.iloc[:, predictor_variables]
Y = wine_df.iloc[:, target_variables]

將 time_delay_embedding 函數(shù)應(yīng)用于時(shí)間序列中的每個(gè)變量(第 18-22 行)。第 23 行將結(jié)果與我們的數(shù)據(jù)集進(jìn)行合并。

解釋變量 (X) 是每個(gè)變量在每個(gè)時(shí)間步長的最后 12 個(gè)已知值(第 29 行)。以下是它們?nèi)绾尾檎覝?t-1(為簡潔起見省略了其他滯后值):

圖片

目標(biāo)變量在第30行中定義。這指的是未來銷售的6個(gè)值:

圖片

建立模型

準(zhǔn)備好數(shù)據(jù)之后,就可以構(gòu)建模型了。使用隨機(jī)森林進(jìn)行一個(gè)簡單的訓(xùn)練和測試循環(huán)。

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error as mae
from sklearn.ensemble import RandomForestRegressor


# train/test split
X_tr, X_ts, Y_tr, Y_ts = train_test_split(X, Y, test_size=0.3, shuffle=False)

# fitting a RF model
model = RandomForestRegressor()
model.fit(X_tr, Y_tr)

# getting forecasts for the test set
preds = model.predict(X_ts)

# computing MAE error
print(mae(Y_ts, preds))
# 288.13

擬合模型之后(第11行),得到了測試集中的預(yù)測(第14行)。該模型的平均絕對誤差為288.13。

滯后參數(shù)的選擇

上面的基線使用每個(gè)變量的 12 個(gè)滯后作為解釋變量。這是在函數(shù) time_delay_embedding 的參數(shù) n_lags 中定義的。那么應(yīng)該如何設(shè)置這個(gè)參數(shù)的值呢?

很難先驗(yàn)地說應(yīng)該包括多少值,因?yàn)?這取決于輸入數(shù)據(jù)和特定變量。

解決這個(gè)問題的一種簡單方法是使用特征選擇。從相當(dāng)數(shù)量的值開始,然后根據(jù)重要性評(píng)分或預(yù)測性能來修改這個(gè)數(shù)字,或者直接使用GridSearch進(jìn)行超參數(shù)的搜索。

我們這里將簡單的演示一個(gè)判斷的過程:根據(jù)隨機(jī)森林的重要性得分選擇前 10 個(gè)特征。

# getting importance scores from previous model
importance_scores = pd.Series(dict(zip(X_tr.columns, model.feature_importances_)))

# getting top 10 features
top_10_features = importance_scores.sort_values(ascending=False)[:10]
top_10_features_nm = top_10_features.index

X_tr_top = X_tr[top_10_features_nm]
X_ts_top = X_ts[top_10_features_nm]

# re-fitting the model
model_top_features = RandomForestRegressor()
model_top_features.fit(X_tr_top, Y_tr)

# getting forecasts for the test set
preds_topf = model_top_features.predict(X_ts_top)

# computing MAE error
print(mae(Y_ts, preds_topf))
# 274.36

前10個(gè)特征比原始預(yù)測顯示出更好的預(yù)測性能。以下是這些功能的重要性:

圖片

目標(biāo)變量(Sparkling)的滯后是最重要的。但是其他變量的一些滯后也是相關(guān)的。

ARDL 的擴(kuò)展

多個(gè)目標(biāo)變量預(yù)測,目前為止,我們都在預(yù)測單個(gè)變量(sparkling wine)。如果我們想要同時(shí)預(yù)測幾個(gè)變量呢?

這種方法被稱為:向量自回歸 (VAR)

就像在 ARDL 中一樣,每個(gè)變量都是根據(jù)其滯后和其他變量的滯后建模的。當(dāng)想要預(yù)測多個(gè)變量而不僅僅是一個(gè)變量時(shí),將使用 VAR。

與全局預(yù)測模型的關(guān)系

值得注意的是,ARDL并不等同于全局預(yù)測模型(Global Forecasting Models)。

在ARDL的前提下,每個(gè)變量的信息被添加到解釋變量中。變量的數(shù)量通常很少,且大小相同。

全局預(yù)測模型匯集了許多時(shí)間序列的歷史觀測結(jié)果。模型通過這些所有觀察結(jié)果進(jìn)行建模。每一個(gè)新的時(shí)間序列都是作為新的觀察結(jié)果加入到數(shù)據(jù)中。全局預(yù)測模型通常涉及多達(dá)數(shù)千個(gè)時(shí)間序列量級(jí)也很大。

總結(jié)

本文的主要內(nèi)容如下:多變量時(shí)間序列包含兩個(gè)或多個(gè)變量;ARDL 方法可用于多變量時(shí)間序列的監(jiān)督學(xué)習(xí);使用特征選擇策略優(yōu)化滯后數(shù)。如果要預(yù)測多個(gè)變量,可以使用 VAR 方法。

最后本文的數(shù)據(jù)集在這里:

https://rdrr.io/cran/Rssa/man/AustralianWine.html

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2017-11-20 11:51:40

KerasLSTM深度學(xué)習(xí)

2024-12-23 13:30:00

2021-04-07 10:02:00

XGBoostPython代碼

2024-07-18 13:13:58

2025-01-14 13:32:47

2023-10-13 15:34:55

時(shí)間序列TimesNet

2024-01-30 01:12:37

自然語言時(shí)間序列預(yù)測Pytorch

2024-02-04 09:34:56

時(shí)間序列傳感器MTS

2023-03-16 18:09:00

機(jī)器學(xué)習(xí)數(shù)據(jù)集

2024-05-07 11:46:50

時(shí)間序列概率預(yù)測

2023-03-16 07:27:30

CnosDB數(shù)據(jù)庫

2023-01-30 17:10:23

DeepTime元學(xué)習(xí)

2023-03-27 07:34:28

XGBoostInluxDB時(shí)間序列

2024-05-10 11:57:02

時(shí)間序列概率

2024-01-29 00:24:07

圖像模型預(yù)訓(xùn)練

2024-05-09 16:23:14

2024-06-17 16:02:58

2024-09-03 08:16:08

2022-07-15 16:14:39

深度學(xué)習(xí)時(shí)間序列理論

2024-06-27 16:38:57

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)