日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【时间序列】时序预测竞赛之异常检测算法综述

發(fā)布時間:2025/3/8 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【时间序列】时序预测竞赛之异常检测算法综述 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文將介紹在時間序列預(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。