KDD Cup 2021:时间序列异常检测问题开源方案
KDD Cup 2021:時間序列異常檢測
本次賽題的數據為時序數據,針對每條時序記錄,需要選手完成具體的異常點定位。
文件的命名即分割了訓練集和測試集,如下所示
<id>_<name>_<split-number>.txt
e.g. 004_UCR_Anomaly_2500.txt.
例子中,訓練集和測試集的分割點為2500。
評測:如上圖異常區域為2759至2820,最后答案定位的位置,在前后100的區間內都算正確。比如這里答案只要在2659 和 2920 區間內都算正確。
時序異常檢測算法非常多,這里介紹一些,有興趣的同學可以嘗試一波。
- ARIMA
- 基于聚類檢測
- 基于序列建模型的RNN、LSTM
- Local Outlier Factor
- One-Class SVM
- Deep-SVDD
- First Hour Average
- Stddev from Moving Average
- Mean Subtraction Cumulation
本文開源主要使用的是基于AutoEncoder模型的時間序列異常檢測算法。
原始的時間序列往往面臨維度高,存在噪聲等情況,通過特征提取,對原始數據進行清洗和豐富等,會比直接將原始數據扔給神經網絡要好。
AutoEncoder是一種典型的無監督方法,可以將其擴展為Variational AutoEncoder,或者引入情景信息,從而擴展為Conditional Variational AutoEncoder。
訓練集中的數據(無異常點的數據):
測試集中的數據(有異常點的數據):
自編碼模型一般的神經網絡,其內部結構呈現一定對稱性。
激活函數,一般會優先選擇Relu,當Relu無法滿足需求的時候,再去考慮其他激活函數,比如Relu的一些衍生版本Elu,它是Relu的其中一個優化版本,可以避免出現神經元無法更新的情況。
訓練模型很簡單,只需要調用model.fit函數。雖然簡單但是需要注意的是,對于AutoEncoder來說,輸入和輸出都是X_train特征, 除此之外在建模時劃分出20%的數據集作為驗證集,來驗證模型的泛化性。
查看訓練的Loss歷史曲線,發現訓練集和驗證集都很好的進行擬合,而且訓練集并沒有出現“反彈”,也就是沒有過擬合的現象。
當自編碼器訓練好后,它應該能夠學習到原始訓練數據集的內在編碼,然后根據學習到的編碼,在一定程度內還原原始訓練數據集中的數據。
因為AutoEncoder學習到了“正常數據周期模式”的編碼格式,所以當一個數據集提供給該自編碼器時,它會按照訓練集中的“正常數據周期模式”的編碼格式去編碼和解碼。如果解碼后的數據集和輸入數據集的誤差在一定范圍內,則表明輸入的數據集是“正常的”,否則是“異常的"。
第一個Sequence的擬合情況如下:
異常節點為[1683,1684,,1685],因為point分割的原因,最后提交的結果,在此基礎上+point之后即可。
總結
本賽題的方法很多,此處開源的版本為基于卷積的AutoEncoder版本,同時基于統計的異常相關方法,線上提交也能取的不錯的成績。
KDD Cup 2021:時間序列異常檢測問題開源Baseline 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的KDD Cup 2021:时间序列异常检测问题开源方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统里的那些坑
- 下一篇: 搜推广遇上用户画像:Lookalike相