原文鏈接:http://tecdat.cn/?p=22632
原文出處:拓端數據部落公眾號
這篇文章描述了一種對涉及季節性和趨勢成分的時間序列的中點進行建模的方法。我們將對一種叫做STL的算法進行研究,STL是 "使用LOESS(局部加權回歸)的季節-趨勢分解 "的縮寫,以及如何將其應用於異常檢測。
其基本思想是,如果你有一個有規律的時間序列,你可以通過STL算法運行該序列,並分離出規律的模式。剩下的是 "不規則的",而異常檢測相當於判定不規則性是否足夠大。
例子:航空乘客,1949-1960
讓我們在數據集上運行該算法,該數據集給出了1949-1960年期間每月的航空公司乘客數量。首先,這是未經修改的時間序列。
plot(y)
這里顯然有一個規律性的模式,但是在這個序列中沒有任何明顯的下降,無法在異常檢測中顯示出來。所以我們將設置一個。
y[40] = 150
跌幅足夠大,我們希望異常檢測能發現它,但又不至於大到你只看一眼圖就會發現。現在讓我們通過STL檢查它。
plot(fit)
首先,我不是在y上運行STL,而是在log(y)上。
該算法將序列分解為三個部分:季節性、趨勢和剩余成分。季節性是周期性成分,趨勢是一般的上升/下降,剩余成分是剩下的趨勢成分。季節性和趨勢共同構成了序列的 "常規 "部分,因此是我們在異常檢測過程中要剔除的部分。
剩余部分基本上是原始序列的正常化版本,所以這是我們監測異常情況的部分。剩余序列的下降是很明顯的。我們在1952年初設置的異常下降很可能算在內。
我們還可以調整每一時期的觀測值數量,負責分離季節性和趨勢成分的平滑方法,擬合模型的 "穩健性"(即對異常值不敏感)等等。這些參數中的大多數需要對基礎算法的工作原理有一定的了解。
下面是一些顯示實際數據與閾值的代碼。
-
-
data <- merge(df, ba, by.x='x')
-
ggplot(data) +
-
geom(aes(x=x, ymin=ymin, ymax=ymax))
-
再次,聰明如你可能會注意到通過exp()進行的逆變換。我們現在討論這個問題。
為什么要進行對數和逆變換?
並非所有的分解都涉及對數變換,但這個分解卻涉及。其原因與分解的性質有關。STL的分解總是加法的。
y = s + t + r
但對於某些時間序列,乘法分解更適合。
y = str
這種情況發生在銷售數據中,季節性成分的振幅隨着趨勢的增加而增加。這實際上是乘法序列的標志,航空旅客序列也表現出這種模式。為了處理這個問題,我們對原始值進行對數轉換,這使我們進入加法領域,在那里我們可以進行STL分解。當我們完成后,我們再進行逆變換,回到原始序列。
多重季節性的情況如何?
一些時間序列有一個以上的季節性。例如,在酒店預訂時間序列有三個季節性:每日、每周和每年。
雖然有一些程序可以生成具有多個季節性成分的分解,但STL並沒有這樣做。最高頻率的季節性被作為季節性成分,而任何較低頻率的季節性都被吸收到趨勢中。
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短期記憶模型lstm進行時間序列預測分析