【时间序列】时序预测竞赛之异常检测算法综述
本文將介紹在時間序列預(yù)測相關(guān)問題中常見的異常檢測算法,可以很大程度上幫助改善最終預(yù)測效果。
異常分類
時間序列的異常檢測問題通常表示為相對于某些標(biāo)準(zhǔn)信號或常見信號的離群點。雖然有很多的異常類型,但是我們只關(guān)注業(yè)務(wù)角度中最重要的類型,比如意外的峰值、下降、趨勢變化以及等級轉(zhuǎn)換(level shifts)。
常見的異常有如下幾種:
革新性異常:innovational outlier (IO),造成離群點干擾不僅作用于X(T),而且影響T時刻以后序列的所有觀察值。
附加性異常:additive outlier (AO),造成這種離群點的干擾,只影響該干擾發(fā)生的那一個時刻T上的序列值,而不影響該時刻以后的序列值。
水平移位異常:level shift (LS),造成這種離群點的干擾是在某一時刻T,系統(tǒng)的結(jié)構(gòu)發(fā)生了變化,并持續(xù)影響T時刻以后的所有行為,在數(shù)列上往往表現(xiàn)出T時刻前后的序列均值發(fā)生水平位移。
暫時變更異常temporary change (TC):造成這種離群點的干擾是在T時刻干擾發(fā)生時具有一定初始效應(yīng),以后隨時間根據(jù)衰減因子的大小呈指數(shù)衰減。
上面的解釋可能不太容易理解,我們結(jié)合圖片來看一下:
通常,異常檢測算法應(yīng)該將每個時間點標(biāo)記為異常/非異常,或者預(yù)測某個點的信號,并衡量這個點的真實值與預(yù)測值的差值是否足夠大,從而將其視為異常。使用后面的方法,你將能夠得到一個可視化的置信區(qū)間,這有助于理解為什么會出現(xiàn)異常并進(jìn)行驗證。
常見異常檢測方法
從分類看,當(dāng)前發(fā)展階段的時序異常檢測算法和模型可以分為一下幾類:
統(tǒng)計模型:優(yōu)點是復(fù)雜度低,計算速度快,泛化能力強悍。因為沒有訓(xùn)練過程,即使沒有前期的數(shù)據(jù)積累,也可以快速的投入生產(chǎn)使用。缺點是準(zhǔn)確率一般。但是這個其實是看場景的,并且也有簡單的方法來提高業(yè)務(wù)層面的準(zhǔn)確率。這個后面會提到。
機器學(xué)習(xí)模型:魯棒性較好,準(zhǔn)確率較高。需要訓(xùn)練模型,泛化能力一般。
深度學(xué)習(xí)模型:普遍需要喂大量的數(shù)據(jù),計算復(fù)雜度高。整體看,準(zhǔn)確性高,尤其是近段時間,強化學(xué)習(xí)的引入,進(jìn)一步鞏固其準(zhǔn)確性方面的領(lǐng)先優(yōu)勢。
3-Sigma
3-Sigma原則又稱為拉依達(dá)準(zhǔn)則,該準(zhǔn)則定義如下:假設(shè)一組檢測數(shù)據(jù)只含有隨機誤差,對原始數(shù)據(jù)進(jìn)行計算處理得到標(biāo)準(zhǔn)差,然后按一定的概率確定一個區(qū)間,認(rèn)為誤差超過這個區(qū)間的就屬于異常值。
使用3-Sigma的前提是數(shù)據(jù)服從正態(tài)分布,滿足這個條件之后,在3-Sigma范圍(μ–3σ,μ+3σ)內(nèi)99.73%的為正常數(shù)據(jù),其中σ代表標(biāo)準(zhǔn)差,μ代表均值,x=μ為圖形的對稱軸。下面是3-Sigma的Python實現(xiàn):
import numpy as np def three_sigma(df_col):'''df_col:DataFrame數(shù)據(jù)的某一列'''rule = (df_col.mean() - 3 * df_col.std() > df_col) | (df_col.mean() + 3 * df_col.std() < df_col)index = np.arange(df_col.shape[0])[rule]out_range = df_col.iloc[index]return out_range對于異常值檢測出來的結(jié)果,有多種處理方式,如果是時間序列中的值,那么我們可以認(rèn)為這個時刻的操作屬于異常的;如果是將異常值檢測用于數(shù)據(jù)預(yù)處理階段,處理方法有以下四種:
刪除帶有異常值的數(shù)據(jù);
將異常值視為缺失值,交給缺失值處理方法來處理;
用平均值進(jìn)行修正;
當(dāng)然我們也可以選擇不處理。
Grubbs測試
Grubbs’Test為一種假設(shè)檢驗的方法,常被用來檢驗服從正太分布的單變量數(shù)據(jù)集(univariate data set)Y 中的單個異常值。若有異常值,則其必為數(shù)據(jù)集中的最大值或最小值。原假設(shè)與備擇假設(shè)如下:
H0: 數(shù)據(jù)集中沒有異常值
H1: 數(shù)據(jù)集中有一個異常值
使用Grubbs測試需要總體是正態(tài)分布的。算法流程:
樣本從小到大排序
求樣本的mean和dev
計算min/max與mean的差距,更大的那個為可疑值
求可疑值的z-score (standard score),如果大于Grubbs臨界值,那么就是outlier
Grubbs臨界值可以查表得到,它由兩個值決定:檢出水平α(越嚴(yán)格越小),樣本數(shù)量n,排除outlier,對剩余序列循環(huán)做 1-4 步驟。由于這里需要的是異常判定,只需要判斷tail_avg是否outlier即可。
from outliers import smirnov_grubbs as grubbs print(grubbs.test([8, 9, 10, 1, 9], alpha=0.05)) print(grubbs.min_test_outliers([8, 9, 10, 1, 9], alpha=0.05)) print(grubbs.max_test_outliers([8, 9, 10, 1, 9], alpha=0.05)) print(grubbs.max_test_indices([8, 9, 10, 50, 9], alpha=0.05))S-ESD與S-H-ESD
鑒于時間序列數(shù)據(jù)具有周期性(seasonal)、趨勢性(trend),異常檢測時不能作為孤立的樣本點處理;故而Twitter的工程師提出了S- ESD (Seasonal ESD)與S-H-ESD (Seasonal Hybrid ESD)算法,將ESD擴展到時間序列數(shù)據(jù)。
STL分解
STL (Seasonal-Trend decomposition procedure based on Loess) 為時序分解中一種常見的算法,基于LOESS將某時刻的數(shù)據(jù)Yv分解為趨勢分量(trend component)、季節(jié)性分量(seasonal component)和殘差(remainder component):
?
由上到下依次為:原始時間序列和使用 STL 分解得到的季節(jié)變化部分、趨勢變化部分以及殘差部分。
STL分為內(nèi)循環(huán)(inner loop)與外循環(huán)(outer loop),其中內(nèi)循環(huán)主要做了趨勢擬合與周期分量的計算。假定T(k)v、Sv(k)為內(nèi)循環(huán)中第k-1次pass結(jié)束時的趨勢分量、周期分量,初始時T(k)v=0;并有以下參數(shù):
n(i)內(nèi)層循環(huán)數(shù)
n(o)外層循環(huán)數(shù)
n(p)為一個周期的樣本數(shù)
n(s)為Step 2中LOESS平滑參數(shù)
n(l)為Step 3中LOESS平滑參數(shù)
n(t)為Step 6中LOESS平滑參數(shù)
每個周期相同位置的樣本點組成一個子序列(subseries),容易知道這樣的子序列共有共有n(p)個,我們稱其為cycle-subseries。
Python的statsmodels實現(xiàn)了一個簡單版的時序分解,通過加權(quán)滑動平均提取趨勢分量,然后對cycle-subseries每個時間點數(shù)據(jù)求平均組成周期分量:
使用示例:
import numpy as np import pandas as pd from statsmodels.tsa.seasonal import seasonal_decompose import matplotlib.pyplot as plt # Generate some data np.random.seed(0) n = 1500 dates = np.array('2019-01-01', dtype=np.datetime64) + np.arange(n) data = 12 * np.sin(2 * np.pi * np.arange(n) / 365) + np.random.normal(12, 2, 1500) df = pd.DataFrame({'data': data}, index=dates) # Reproduce the example in OP seasonal_decompose(df, model='additive', period=1).plot() plt.show()S-ESD
STL將時間序列數(shù)據(jù)分解為趨勢分量、周期分量和余項分量。想當(dāng)然的解法——將ESD運用于STL分解后的余項分量中,即可得到時間序列上的異常點。但是,我們會發(fā)現(xiàn)在余項分量中存在著部分假異常點(spurious anomalies)。如下圖所示:
在紅色矩形方框中,向下突起點被誤報為異常點。為了解決這種假陽性降低準(zhǔn)確率的問題,S-ESD算法用中位數(shù)(median)替換掉趨勢分量;
使用示例:
import numpy as np import sesd ts = np.random.random(100) # Introduce artificial anomalies ts[14] = 9 ts[83] = 10 outliers_indices = sesd.seasonal_esd(ts, periodicity=20, hybrid=True, max_anomalies=2) for idx in outliers_indices:print(f'Anomaly index: {idx}, anomaly value: {ts[idx]}')移動平均/加權(quán)移動平均/指數(shù)加權(quán)移動平均
移動平均 moving average
給定一個時間序列和窗口長度N,moving average等于當(dāng)前data point之前N個點(包括當(dāng)前點)的平均值。不停地移動這個窗口,就得到移動平均曲線。
累加移動平均 cumulative moving average
設(shè){xi:i≥1}是觀察到的數(shù)據(jù)序列。累積移動平均線是所有數(shù)據(jù)的未加權(quán)平均值。如果若干天的值是x1,…,xi,那么:
加權(quán)移動平均 weighted moving average
加權(quán)移動平均值是先前w個數(shù)據(jù)的加權(quán)平均值
指數(shù)加權(quán)移動平均 exponential weighted moving average
指數(shù)移動與移動平均有些不同:
并沒有時間窗口,用的是從時間序列第一個data point到當(dāng)前data point之間的所有點。
每個data point的權(quán)重不同,離當(dāng)前時間點越近的點的權(quán)重越大,歷史時間點的權(quán)重隨著離當(dāng)前時間點的距離呈指數(shù)衰減,從當(dāng)前data point往前的data point,權(quán)重依次為
該算法可以檢測一個異常較短時間后發(fā)生另外一個異常的情況,異常持續(xù)一段時間后可能被判定為正常。
ARIMA 模型
自回歸移動平均模型(ARIMA)是一種設(shè)計上非常簡單的方法,但其效果足夠強大,可以預(yù)測信號并發(fā)現(xiàn)其中的異常。該方法的思路是從過去的幾個數(shù)據(jù)點來生成下一個數(shù)據(jù)點的預(yù)測,在過程中添加一些隨機變量(通常是添加白噪聲)。以此類推,預(yù)測得到的數(shù)據(jù)點可以用來生成新的預(yù)測。很明顯:它會使得后續(xù)預(yù)測信號數(shù)據(jù)更平滑。使用這種方法最困難的部分是選擇差異數(shù)量、自回歸數(shù)量和預(yù)測誤差系數(shù)。另一個障礙是信號經(jīng)過差分后應(yīng)該是固定的。也就是說,這意味著信號不應(yīng)該依賴于時間,這是一個比較顯著的限制。
異常檢測是利用離群點來建立一個經(jīng)過調(diào)整的信號模型,然后利用t-統(tǒng)計量來檢驗該模型是否比原模型能更好的擬合數(shù)據(jù)。
在這種情況下,你可以找到適合信號的 ARIMA 模型,它可以檢測出所有類型的異常。
神經(jīng)網(wǎng)絡(luò)
與CART方法一樣,神經(jīng)網(wǎng)絡(luò)有兩種應(yīng)用方式:監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。我們處理的數(shù)據(jù)是時間序列,所以最適合的神經(jīng)網(wǎng)絡(luò)類型是 LSTM。如果構(gòu)建得當(dāng),這種循環(huán)神經(jīng)網(wǎng)絡(luò)將可以建模實現(xiàn)時間序列中最復(fù)雜的依賴關(guān)系,包括高級的季節(jié)性依賴關(guān)系。如果存在多個時間序列相互耦合,該方法也非常有用。該領(lǐng)域還在研究中,可以參考這里,構(gòu)建時序模型需要大量的工作。構(gòu)建成功完成后,就可能在精確度方面取得優(yōu)異的成績。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 獲取本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【时间序列】时序预测竞赛之异常检测算法综述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精通C++之前,你必须知道的几件事!
- 下一篇: 【深度强化学习】DQN训练超级玛丽闯关