時(shí)間序列結(jié)構(gòu)變化分析:Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)
平穩(wěn)性是時(shí)間序列分析與預(yù)測(cè)的核心概念。在平穩(wěn)條件下,時(shí)間序列的統(tǒng)計(jì)特性(如均值)在時(shí)間維度上保持不變,僅存在隨機(jī)波動(dòng)。
但是實(shí)際數(shù)據(jù)集中很少觀察到完全的平穩(wěn)性。時(shí)間序列通常會(huì)經(jīng)歷結(jié)構(gòu)性斷裂或變化。這些變化會(huì)引入非平穩(wěn)性,從而改變時(shí)間序列的整體分布,這些標(biāo)志著變化開始的時(shí)間點(diǎn)被稱為變化點(diǎn)。
在時(shí)間序列分析和預(yù)測(cè)中,準(zhǔn)確檢測(cè)結(jié)構(gòu)變化至關(guān)重要。新出現(xiàn)的分布模式往往會(huì)導(dǎo)致歷史數(shù)據(jù)失去代表性,進(jìn)而影響基于這些數(shù)據(jù)訓(xùn)練的模型的有效性。因此需要采用最新數(shù)據(jù)更新模型或采取其他適當(dāng)策略。對(duì)于歷史數(shù)據(jù)中的變化點(diǎn),可以通過特征工程方法(如干預(yù)分析)進(jìn)行處理。
但需要注意的是,結(jié)構(gòu)變化與異常值是兩個(gè)不同的概念。異常值是指與時(shí)間序列的基本結(jié)構(gòu)或分布所定義的正常行為顯著偏離的觀測(cè)值。而變化點(diǎn)則是指時(shí)間序列的整體結(jié)構(gòu)發(fā)生轉(zhuǎn)變,導(dǎo)致分布特性的改變。
接下來,我們首先詳細(xì)探討不同類型的結(jié)構(gòu)變化。
結(jié)構(gòu)變化的類型
結(jié)構(gòu)變化可以分為多種類型。深入理解這些變化的性質(zhì)對(duì)于選擇適當(dāng)?shù)奶幚聿呗灾陵P(guān)重要。
水平變化
水平變化主要體現(xiàn)在序列的均值或方差上。均值的變化表現(xiàn)為平均水平的移動(dòng),可以是永久性的,也可以是暫時(shí)性的。
永久性水平移動(dòng)是指序列的平均值永久性地轉(zhuǎn)移到一個(gè)新的水平。例如當(dāng)一家零售企業(yè)開設(shè)新店時(shí),銷售時(shí)間序列可能會(huì)轉(zhuǎn)移到一個(gè)更高的水平,反映出擴(kuò)大的客戶基礎(chǔ)。
暫時(shí)性水平移動(dòng)是指平均值在一段時(shí)間后恢復(fù)到原有水平。例如制造工廠的一臺(tái)機(jī)器因維修而臨時(shí)停機(jī),生產(chǎn)時(shí)間序列在維修期間會(huì)出現(xiàn)暫時(shí)性的低值。一旦機(jī)器恢復(fù)運(yùn)行,生產(chǎn)水平預(yù)計(jì)會(huì)回到正常狀態(tài)。
方差變化
方差的變化會(huì)導(dǎo)致時(shí)間序列離散程度的增加或減少,具有非恒定方差的時(shí)間序列通常被稱為異方差序列。方差的變化同樣可以是永久性的或暫時(shí)性的。
方差的周期性變化是波動(dòng)聚類現(xiàn)象的典型特征。波動(dòng)聚類指的是時(shí)間序列呈現(xiàn)出低方差期和高方差期交替出現(xiàn)的模式。換言之,大(小)幅度變化往往會(huì)連續(xù)出現(xiàn)。
以下是表示每小時(shí)風(fēng)速變化的時(shí)間序列示例,展示了波動(dòng)聚類現(xiàn)象:
具有波動(dòng)聚類特征的時(shí)間序列示例。
波動(dòng)聚類在氣象學(xué)(如風(fēng)速分析)和金融學(xué)(如資產(chǎn)價(jià)格研究)等領(lǐng)域中較為常見。
基于Python的變化點(diǎn)檢測(cè)代碼實(shí)現(xiàn)
變化點(diǎn)檢測(cè)算法旨在精確識(shí)別時(shí)間序列分布發(fā)生顯著變化的時(shí)間點(diǎn)。本節(jié)將詳細(xì)探討多種變化點(diǎn)檢測(cè)方法的實(shí)際應(yīng)用。
我們從 datasetsforecast 庫中加載一個(gè)示例時(shí)間序列數(shù)據(jù):
from datasetsforecast.m4 import M4
dataset, *_ = M4.load('./data', 'Monthly')
series = dataset.query(f'unique_id=="M1430"').reset_index(drop=True)
series['time'] = pd.date_range(end='2023-12-01', periods=series.shape[0], freq='M')
此數(shù)據(jù)集是非常有名的銷量預(yù)測(cè)比賽M4
利用kats進(jìn)行變化點(diǎn)檢測(cè)
kats是Meta開發(fā)的一個(gè)功能強(qiáng)大的時(shí)間序列分析庫。它提供了多種變化檢測(cè)方法,包括CUSUM(累積和)和貝葉斯在線變化點(diǎn)檢測(cè)等。
kats要求使用特定的數(shù)據(jù)結(jié)構(gòu),可以按以下方式進(jìn)行設(shè)置:
from kats.consts import TimeSeriesData
ts = TimeSeriesData(df=series[['time', 'y']])
CUSUM(累積和)是一種廣泛應(yīng)用于檢測(cè)時(shí)間序列均值變化的方法。其原理是計(jì)算相對(duì)于預(yù)期值的偏差累積和。如果序列的均值保持穩(wěn)定,累積和將呈現(xiàn)圍繞零的隨機(jī)波動(dòng)。累積和的持續(xù)正向(或負(fù)向)變化則表明均值發(fā)生了上升(或下降)移動(dòng)。
以下代碼展示了如何使用kats中的CUSUM方法:
from kats.tests.detectors.test_cusum_detection import CUSUMDetector
model = CUSUMDetector(ts)
change_points = model.detector(direction=['decrease', 'increase'])
model.plot(change_points)
detector方法的 direction 參數(shù)用于指定需要監(jiān)測(cè)的變化方向。在本例中我們同時(shí)監(jiān)測(cè)序列的上升和下降變化。
CUSUM方法實(shí)現(xiàn)了對(duì)變化點(diǎn)的準(zhǔn)確檢測(cè):
另一種與CUSUM相似的方法是在移動(dòng)平均的基礎(chǔ)上計(jì)算z分?jǐn)?shù)。kats中的 RobustStatDetector 就采用了這種方法:
from kats.tests.detectors.test_robust_stat_detection import RobustStatDetector
model = RobustStatDetector(ts)
change_points = model.detector(p_value_cutoff=0.001, comparison_window=12)
model.plot(change_points)
在這個(gè)方法中,我們將p值閾值設(shè)置為0.001,窗口大小設(shè)置為12(對(duì)應(yīng)于一年的數(shù)據(jù),因?yàn)樵撔蛄惺前丛率占模?/span>
使用kats中的RobustStatDetector檢測(cè)變化點(diǎn)。RobustStatDetector在這個(gè)例子中檢測(cè)到了幾個(gè)相互靠近的變化點(diǎn)。
利用ruptures進(jìn)行變化點(diǎn)檢測(cè)
ruptures庫同樣提供了多種變化點(diǎn)檢測(cè)算法的實(shí)現(xiàn),包括PELT(修剪精確線性時(shí)間)、基于核的算法和動(dòng)態(tài)規(guī)劃算法等。
以下是使用PELT算法檢測(cè)均值變化的示例:
import ruptures as rpt
# 將時(shí)間序列轉(zhuǎn)換為numpy數(shù)組
signal = series['y'].values
# 擬合PELT模型
model = rpt.Pelt(model="rbf").fit(signal)
# 獲取變化點(diǎn)
result = model.predict(pen=10)
PELT算法的核心思想是將時(shí)間序列分割成具有不同統(tǒng)計(jì)特性(如均值)的多個(gè)片段。它通過最小化一個(gè)用戶定義的成本函數(shù)來實(shí)現(xiàn)這一目標(biāo),該函數(shù)的具體形式取決于需要檢測(cè)的變化類型。在這個(gè)例子中我們使用了基于徑向基函數(shù)的模型(model="rbf")。
以下是PELT模型的檢測(cè)結(jié)果:
變化點(diǎn)的處理策略
在識(shí)別出變化點(diǎn)后,下一步就是采取適當(dāng)?shù)奶幚泶胧?。以下是幾種常用的處理方法:
差分法
對(duì)時(shí)間序列進(jìn)行差分是處理均值變化的一種有效方法。這種技術(shù)通過計(jì)算連續(xù)觀測(cè)值之間的差值來穩(wěn)定序列的平均水平。
以下是示例序列的一階差分結(jié)果:
差分法能夠有效消除許多類型的非平穩(wěn)性,使得后續(xù)的分析和建模工作更加可靠。
虛擬變量法
另一種處理變化點(diǎn)的方法是引入虛擬變量。這種方法在變化點(diǎn)之前賦值為0,之后賦值為1,從而在模型中顯式地表示結(jié)構(gòu)變化。
虛擬變量法允許模型捕捉變化前后的不同行為,提高了模型的靈活性和準(zhǔn)確性。
區(qū)制轉(zhuǎn)換模型
對(duì)于暫時(shí)性變化,區(qū)制轉(zhuǎn)換模型(regime-switching)是一種較為復(fù)雜但有效的建模方法。這類模型能夠根據(jù)當(dāng)前的狀態(tài)或區(qū)制采用不同的參數(shù)設(shè)置。
閾值自回歸(TAR)模型是區(qū)制轉(zhuǎn)換模型的一個(gè)典型例子。TAR模型對(duì)不同范圍的時(shí)間序列值采用不同的參數(shù),從而能夠捕捉復(fù)雜的非線性動(dòng)態(tài)。
總結(jié)結(jié)論
通過本文的分析,我們可以得出以下幾點(diǎn)重要結(jié)論:
- 時(shí)間序列常常受到結(jié)構(gòu)變化的影響,這些變化會(huì)顯著改變序列的統(tǒng)計(jì)分布特性。
- 結(jié)構(gòu)變化可能發(fā)生在均值或方差上,并且可能是永久性的或暫時(shí)性的。準(zhǔn)確識(shí)別變化的性質(zhì)對(duì)于選擇適當(dāng)?shù)奶幚矸椒ㄖ陵P(guān)重要。
- 現(xiàn)代統(tǒng)計(jì)和機(jī)器學(xué)習(xí)提供了多種變化點(diǎn)檢測(cè)方法,如CUSUM和PELT算法。這些方法在kats和ruptures等Python庫中都有實(shí)現(xiàn),為實(shí)踐應(yīng)用提供了便利。
- 對(duì)于檢測(cè)到的變化點(diǎn),可以采用多種處理策略。差分法和引入虛擬變量是處理均值變化的常用方法,而對(duì)于更復(fù)雜的情況,可以考慮使用區(qū)制轉(zhuǎn)換模型。
- 數(shù)據(jù)預(yù)處理在處理結(jié)構(gòu)變化中扮演著關(guān)鍵角色。合適的預(yù)處理不僅可以穩(wěn)定序列的方差,還能為后續(xù)的建模工作奠定基礎(chǔ)。
通過深入理解時(shí)間序列的結(jié)構(gòu)變化,并靈活運(yùn)用各種檢測(cè)和處理方法,分析人員可以顯著提高時(shí)間序列模型的準(zhǔn)確性和可靠性,為決策提供更有力的支持。