最近在做時間序列異常值檢測,除了常規的統計學算法以外,也想嘗試通過機器學習或深度學習的方式去解決問題。
於是想,可不可以直接使用一個擬合效果非常棒的模型先去預測該時間序列的未來走勢,再將預測后的值(predict_value)當前值(value)做對比,只要超過一定閾值就判定該值為異常值。
嘗試了xgboost、ARIMA 和 LSTM 三者中,擬合效果最好的是LSTM,簡單記錄一下建模和調參過程。
1.加載數據:源數據結構如下,只要 y 值。
2.加載數據,由於我這里代表時間的字段是從piontStart里面拿出去,並且需要去掉最后'000'再用time.localtime()轉換成時間戳,不是重點,簡單看一下就行。
3.准備訓練和測試數據
4.建模階段
5.訓練階段
這里有我之前調參時的Train_Score 和 Test_Score 對比記錄
可以看到,使用雙層結構的 LSTM 有非常嚴重的過擬合現象發生,單層LSTM已經可以很好的對時間序列進行擬合
batch_size 的大小也會對模型的收斂產生不小的影響
look_back(即 time_step) 的大小會對過擬合的程度造成很大影響,如果步長取的太短也會造成過擬合
6.畫圖查看訓練集和測試集擬合效果
7. 雙向LSTM 增量學習
可以看到雙向 LSTM 在 訓練集和測試集的擬合能力都非常出色。
但即便如此,LSTM在時序預測的問題上仍然存在很多不足(無法預測沒有在Train_Data出出現過的值)。
而且LSTM的誤差會隨着時間的推移越來越大(前N個值每個值都存在一定的誤差,再用前N個帶有誤差的預測值去預測第N+1個,結果可想而知)
為了嘗試解決上述問題,嘗試增量學習的方式。
LSTM 中 增量方法非常簡單。
8.我嘗試使用一個新的數據集 zhengbao2.json 來對比原始model(mod1) 和 增量后的模型(mod2) 分別對同一份數據進行預測,對比它們的MSE
可以看到,單從測試集來看,增量后模型能擬合更多情況的發生,但是總體誤差也隨之上升。
模型的訓練也可以看出,雖然經過了5000輪的epochs,但是loss基本沒有下降,這可能需要我們動態的調整batch_size,但是如果模型需要部署在客戶的環境中,而不是在本地,就很難實現
手動調整參數,需要根據業務場景和數據的分布情況指定通用性更強的參數。
第一次寫的比較潦草,希望對異常檢測感興趣的朋友多提寶貴意見。