1. 程式人生 > 實用技巧 >(一)時間序列模型基礎

(一)時間序列模型基礎

1.1 對傳統時序中的方法進行深入理解
①、通過畫出隨時間變化的銷量,來看資料是否有趨勢、季節、週期等特性
②、再對其進行分解(加法、乘法都需要試一下)。
③、對其進行平穩性分析,主要有觀察法(均值、方差是否隨時間變化而變化)和單位根檢驗法(P值是否小於5%,小於5%才能認為是平
穩,不然需要對其進行差分),比如1階差分能去掉趨勢,12階差分能去掉季節性等,最後在對差分後的資料進行單位根檢驗。
④、資料平穩後,開始確定AR過程和MA過程的階數。AR和MA過程階數的判斷,都可以從1階開始模擬,逐漸增加階數。通過對階數模擬後
的自相關圖和偏自相關圖進行分析,如果發現自相關在模擬的階數開始拖尾、偏自相關開始截尾,說明該階數合適。但如果1階這樣,
2階也這樣,那就說明情況比較複雜,仍不能確定。
⑤、如果實在通過自相關和偏自相關圖找不出合適的階數,那麼可以通過計算AIC值來確定(多找幾個階數進行對比AIC,找出最大的。比
如通過觀察可以認為階數在5階之內,那就可以計算每個階數的AIC值,選出最大的)。
⑥、確定p和q的階數後就可以建立arma模型。或者也可以用Facebook的properhat來做。


擴充套件閱讀:自相關和偏自相關圖解讀:https://www.biaodianfu.com/acf-pacf.html,
AR(p)模型:自相關係數拖尾,偏自相關係數p階截尾。
MA(q)模型:自相關係數q階截尾,偏自相關係數拖尾。
ARMA(p,q)模型:自相關係數拖尾,偏自相關係數拖尾

你給的圖自相關圖一階截尾,偏自相關圖顯示出顯著的不截尾性,可以考慮用MA(1)模型擬合二階差分後的序列。
因為前面已經進行二階差分運算,實際上就是用ARIMA(p,2,q)模型擬合原序列。


1.2 找更多的時序預測例子
例子1(傳統的時序分析過程):https://www.kaggle.com/jagangupta/time-series-basics-exploring-traditional-ts
例子2:(簡單的LSTM方法):https://www.kaggle.com/karanjakhar/simple-and-easy-aprroach-using-lstm
①、首先,需要把資料轉變成 [樣本數,特徵數,1]這樣的格式,比如每一行是一條樣本,每一列是一個時間點。
②、比如時序的長度有100,訓練集可以選擇0~99作為訓練集,它的標籤是100對應的值,測試集就選擇1-100,因為我們要預測第101個值。
③、當然,模型從原始時間序列上隨機抽取固定長度的樣本進行訓練。例如,如果原始時間序列的長度為 600 天,那麼把訓練樣本的長
度設為200天,就可以有400種不同的起始點。--效果,好了一點。排名在45%。

例子3:(MLP、LSTM、CNN、CNN+LSTM各種方法介紹):https://www.kaggle.com/dimitreoliveira/deep-learning-for-time-series-forecasting
假設原資料格式為:X=[樣本數,時間步長],Y=[樣本數,1],每一行就是一條樣本,每一列就是一個時間(比如dt).
①、MLP:輸入格式為 [樣本數,時間步長],直接接dense層,輸出層在接dense降維到1。例如[2000,60]
②、LSTM:輸入格式為 [樣本數,時間步長,特徵],一般特徵為1,也就是單變數時序輸入。例如[2000,60,1]
③、CNN:輸入格式為 [樣本,時間步長,特徵],過完pooling層後,需要過一個flatten層展平,把資料展成一維,再過dense降維。例如[2000,60,1]
④、CNN+LSTM:輸入格式為 [樣本,子序列,時間步長,特徵],比如原先時間步長為60,如果設定子序列為3,則變形後的時間步長為60/3=20,特徵仍為1 ,例如[2000,3,20,1],
CNN+LSTM多了一個子序列,通過TimeDistributed實現,目的是“我們將進一步將每個樣本劃分為更多子序列。CNN模型將解釋每個子序列,而LSTM將彙總來自這些子序列的解釋”

其他:
keras中TimeDistributed和RepeatVector的解釋:https://blog.csdn.net/ChaoFeiLi/article/details/89323078,基本上相當於np的reshape,但是是在model中改變輸入輸出的形狀。
LSTM層中return_sequence和return_statue的解釋:https://blog.csdn.net/Ahead_J/article/details/84671396



例子4:(使用LSTM自動編碼器方法):https://www.kaggle.com/dimitreoliveira/time-series-forecasting-with-lstm-autoencoders/data
①、首先,先構造encode模型,模型的輸入[樣本,時間步長,特徵],我們假定把原時間步長壓縮成一個單值,因此我們的輸出加了一個dense(1)
②、encode模型的輸入資料和標籤,都是它自己encoder_decoder.fit(X_train,X_train,batch_size=batch,epochs=epochs)
③、通過keras中的Model,可以取出訓練好的模型中的某幾層,比如rpt_vector_layer = Model(inputs=encoder_decoder.inputs, outputs=encoder_decoder.layers[3].output),
然後通過rpt_vector_layer.predict(X_train[:1])進行預測輸出。
④、最後,我們通過構建編碼器encoder = Model(inputs=encoder_decoder.inputs, outputs=encoder_decoder.layers[2].output),來進行輸出train_encoded = encoder.predict(X_train)
⑤、一般會把把自編碼出來的值,加到原資料中作為一列新的特徵,再訓練模型。