異常監測②——lstm時間序列預測&lstm簡易原理

Table of Contents

 

利用LSTM進行時間序列預測流程

lstm滯後性

理解lstm原理

原理示例

lstm參數

各參數的定義解釋:

batch_size

如何選擇batch_size的大小:

epoch

預測滯後問題

損失函數的選擇

1、Mean Squared Error Loss(MSE)

2、Mean Squared Logarithmic Error Loss(MSLE)

3、Mean Absolute Error Loss (MAE)

4、Binary Classification Loss Functions

5、Binary Cross-Entropy Loss

6、Hinge Loss

7、Squared HInge Loss

8、Multi-Class Classification Loss Functions

如何選擇優化器Optimizer

dropout層

1、什麼時候應該加dropout層?

2、放在哪幾個層之間?


 

利用LSTM進行時間序列預測流程

在用統計學方法(3σ原則、四分位距法)等對異常數據進行監測後 異常監測①——統計學方法判斷 ,由於業務特點,導致時序數據的規律趨勢會變化。下方爲舉例:

時間點 原來的count 現在的count
2020-01-01 13:00:00 267 1000
2020-01-01 13:10:00 300 0
2020-01-01 13:20:00 261 0
2020-01-01 13:30:00 289 1023
2020-01-01 13:40:00 235 0
2020-01-01 13:50:00 273 0
2020-01-01 14:00:00 309 1014

此時原統計學方法可能不再適用,可以重新觀察新的數據分佈規律,手動修改代碼邏輯。

但考慮到後續規律仍可能發生變動,爲避免後續需要繼續改異常監測邏輯,選擇使用一個深度學習模型——lstm 對時序數據的分佈進行預測。並且增添 模型更新 邏輯,使得模型不需要再人工更改。

參考以下資料:乾貨 | 攜程實時智能異常檢測平臺的算法及工程實現  (視頻鏈接

簡單粗暴LSTM:LSTM進行時間序列預測

異常檢測在蘇寧的實踐

基於TensorFlow一次簡單的RNN實現

 

確定邏輯:

1、原始數據存儲

    mongodb

2、數據預處理

(去除節假日數據,異常點替換、缺失值填充)

3、模型設計及訓練

LSTM     訓練集:近十天數據(不含近三天);預測集:近三天

多輪超參優化,確定最優超參,及預測範圍(用歷史多長數據預測未來多長)

保存模型

4、異常判斷

     ①https://www.slideshare.net/ssuserbefd12/ss-164777085    異常邊界取90%分位數,持續幾次異常產生告警(郵件、微信)

     ②論文  3σ原則

5、模型更新

數據監控:通過均值、標準差、中位數、IQR等統計指標以天爲粒度監控數據漂移,數據漂移超過閾值

模型監控:每天自動統計模型輸出的全部異常點佔比的概率,概率分佈變化超出閾值後模型自動提取最新數據重新訓練


準備訓練集、測試集數據:訓練集清洗、歸一化(訓練集和測試集一起歸一化,該一起歸一化還是分開歸一化參考:機器學習中,對於數據的預處理是否是測試集和訓練集一起進行?淺談歸一化對於LSTM進行時間序列預測的影響

 

待補充:

捕捉過多的非異常 VS  漏掉真正的異常,怎麼權衡

爲什麼選擇lstm而不是別的算法?

lstm原理理解(各超參數的定義)

算法如何調參(看什麼指標https://www.cnblogs.com/kamekin/p/10163743.html

 


lstm滯後性

1、摘自stackoverflow ——預測值滯後問題是過擬合現象,原因:數據集太小;方法:增加dropout 層

2、摘自CSDN——“滯後性”的原因是LSTM過於重視時間步長中最後一個t-1時刻的數據,導致預測結果就是t-1時刻數據的復現。 

 


理解lstm原理

這篇文章用簡單易懂的方法講解了LSTM原理,以及各類“門”做的工作 : https://brohrer.mcknote.com/zh-Hans/how_machine_learning_works/how_rnns_lstm_work.html

 

我的總結筆記:

模型包含 預測、忽視、遺忘、篩選 四條路徑。
 
一、預測
利用先前的預測(昨天的預測)以及新的信息(昨天的結果)。我們會利用兩者作出新的預測,而這些新的預測會在下一次循環回模型當中。
 
 

二:遺忘
可能出現的錯誤: 模型只有很短期的記憶,只會參考前一步的結果,不會參考更早之前的信息,爲解決這個問題,需要加入記憶/遺忘 路徑
①在這條路徑裏,我們會透過邏輯函數,創建一個回憶或遺忘特定信息的閘門(即圖中的「圈叉」符號),
②此圈叉閘門的輸入是上一輪的預測結果。 
③此閘門的輸出會加到本次的預測當中 (即圖中的「圈加」符號) 。
 
 
圈圈裏包含十字的符號是(矩陣)逐元素加法圈圈裏有個交叉的符號是(矩陣)逐元素乘法
 

三、篩選
現在不一定會直接將這組結果當做最終的預測。所以模型中還要加一個篩選路徑(selection),將一部分的預測結果保留在模型中(從預測結果中選出特定幾項作爲該次循環的預測結果)。
 
①這個篩選路徑也自成一個神經網絡,每次輸入的新信息 和 舊預測 都會影響篩選路徑中 閥門的大小;
②篩選路徑也有一個擠壓函數(邏輯函數),因爲在之前我們做了一次逐元素相加,預測結果可能會比1大、或比-1小,所以這個壓縮函數是用來確保數值大小仍在(-1,1)區間內
 
 
擠壓函數(雙曲正切函數)
預測值作爲x,對應的y爲擠壓過後的數值。
可看出,這是種負反饋(衰減反饋)。
加擠壓函數是爲了避免多次預測循環後,數值被放大成天文數字。
 
 
擠壓函數(邏輯函數)
和雙曲正切函數類似,只是它的輸出值介於0和1之間
 
 

四、忽視
在完成整個模型前,還需要加上一個忽視路徑(ignoring)
忽視路徑可以讓近期內不是很相關的結果先被忽視,避免它們影響之後的路徑。和其他路徑一樣,忽視路徑有自己的神經網絡、邏輯擠壓函數和閘門 (即圖中右下角的「圈叉」符號) 。
 
 

原理示例

童書裏只有三種句子:「道格看見珍(句號)」、「珍看見小點(句號)」、以及「小點看見道格(句號)」。
 
 
one-hot 編碼應用:
如果道格是我最後讀到的單字,那我的信息矢量中,就只有道格的數值爲 1,其他的數值都爲 0。我們也可以按前面的方法,利用昨天(前一次)的預測結果,繼續預測明天(下一次)的結果。經過一定的訓練後,我們應該能從模型中看出一些特定的規律。
 
進行預測:
如果截止目前的故事爲 「珍看見小點(句號),道格⋯⋯」
 
1、本次輸入=道格,上次預測包含 「道格、珍、小點」 (因爲前一次是“句號”爲輸入,所以前一次預測包含所有人的名字)
將兩個向量輸入模型中:
 

 

初步預測結果: 看見、非道格(分別爲正預測 positive prediction 和負預測 negative prediction
 
2、本例子不需考慮忽視路徑,於是進入遺忘路徑,初次預測當做此模型沒有歷史memory,所以進入篩選路徑
 
3、假設篩選路徑學習到的是 「在前一個單字是名字的狀況下,接下來的結果只能是『看見』或句號」這項規則,於是「非道格」這項預測就被擋掉了,剩下「看見」成爲最終預測
 
 
新的一輪循環:
 
1、本次輸入=看見   ,上次預測=看見,「看見」同時是新信息和舊預測。
初步預測結果:「道格、珍、小點」 其中之一
 
2、跳過忽視路徑
3、進入遺忘路徑,前一輪預測結果是 「非道格」和「看見」,
遺忘閘門學習到的是 : 既然前一個單字是『看見』,根據經驗我可以將回憶中的『看見』忘掉,保留名字就好。
於是遺忘路徑輸出的是  「非道格」
 
4、遺忘路徑輸出的「非道格」 和初步預測的 道格、珍、小點」進行逐元素加法,「道格」的預測正負抵消,只留下了「珍」和「小點」繼續前往下條路徑。
 
 
 
5、篩選路徑學習到 :當「看見」是前一個單字時,下個出現的單字應該是一個名字,所以它讓「珍」和「小點」雙雙通過。
於是,在最後的預測結果中,我們得到了 「珍」和「小點」。
 

疑問:①如何控制遺忘門的層數(記憶之前多少次預測結果?) ②遺忘門和篩選門是如何學習規律規則的

 

lstm參數

目錄
各參數的定義解釋
預測滯後問題
損失函數的選擇 loss
如何選擇優化器 optimizer
 
 

各參數的定義解釋:

 
model.add(LSTM(neurons,input_shape=(None,1))) #輸入數據的形狀
model.add(Dropout(dropout_value)) #dropout層
model.add(Dense(1))  
model.compile(loss='mean_squared_error', optimizer='adam')  # 編譯(損失函數、優化器) 
model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size,verbose=verbose)

參數解釋:

1、neurons:LSTM神經元數量
2、input_shape=(timesteps,input_dim)中, input_dim :features/embeddings 的維度
3、dropout_value:爲了抑制過擬合,需要添加dropout層,詳細見《dropout層》
    float between 0 and 1.DEfault:0. 
    This value is the percentage of the considered network connections per epoch/batch.
4、verbose:
    fit中的verbose:日誌顯示
    verbose = 0 爲不在標準輸出流輸出日誌信息
    verbose = 1 爲輸出進度條記錄
    verbose = 2 爲每個epoch輸出一行記錄
    注意: 默認爲 1
 
    evaluate中的verbose:
    verbose:日誌顯示
    verbose = 0 爲不在標準輸出流輸出日誌信息
    verbose = 1 爲輸出進度條記錄
    注意: 只能取 0 和 1;默認爲 1
 
 
  • one epoch = one forward pass and one backward pass of all the training examples
  • batch size = the number of training examples in one forward/backward pass. The higher the batch size, the more memory space you'll need.
  • number of iterations = number of passes, each pass using [batch size] number of examples. To be clear, one pass = one forward pass + one backward pass (we do not count the forward pass and backward pass as two different passes).
Example: if you have 1000 training examples, and your batch size is 500, then it will take 2 iterations to complete 1 epoch.
(爲便於理解,將一次forward/backward 稱作 一次pass)
一次epoch= 所有訓練數據都經歷一次 pass 後更新參數的過程。
batch_size= 一次 pass 用的訓練數據的數量
iteration= pass 的次數。 一個iteration=1個pass=batch_size個訓練數據
另:一般是iteration譯成“迭代”
 
1個iteration * batch_size= 訓練樣本的數量
 
 
 
 

batch_size

若training samples有1050個, batch_size =100。則模型第一次取第 1-100的samples 訓練網絡,第二次取第 101-200 的樣本去訓練網絡。最後一次用最後50個樣本去訓練網絡。
Batch_Size 越大,其確定的下降方向越準,引起訓練震盪越小。且減少訓練時間。但容易陷入局部最小(如鞍點)。小的batch_size 收斂速度慢
 
①batch_size=訓練數據集的長度時,爲批量梯度下降算法——>Gradient is more general, but intractable for huge datasets.
②batch_size=1時就是隨機梯度下降算法(在線學習)——>Gradient can be noisy.
③batch_size介於上述兩者之間
 
 
 
 

如何選擇batch_size的大小:

可以選擇8的倍數,然後是稍微大一點http://www.yebaochen.com/2018/02/05/batch-size-epochs-setting
 
 
 
 

epoch

epoch過大:過擬合;訓練時間長。
epochs過小:欠擬合
需要根據損失函數的減小速率來選定epoch,當loss減小速率趨於平緩時即爲合適的epoch
 
 

預測滯後問題

模型有些參數可以自己手動調一下,看看模型在不同參數下的效果(雖然我估計數據量太少,可能調參帶來的變化不是很大,但是可以體驗調參的過程),下面我就可以調的參數說明:

 

(1)損失函數現在使用的是mean_squared_error,可以調成別的
 
(2)優化器是adam,也可以調,甚至對優化器內的參數進行調整(比如學習率)
 
(3)訓練次數是50,可以調低點(因爲我看後面模型的損失不下降了)
 
(4)基於歷史多少數據的參數look_back可調,你可以設置爲3,5.....
 

損失函數的選擇

 

1、Mean Squared Error Loss(MSE)

是迴歸類問題的默認損失函數;
從數學角度看,當目標變量符合高斯分佈時,此損失函數是最佳的、最應該首先考慮的。只有當有足夠理由時才選別的損失函數。
Mean squared error is calculated as the average of the squared differences between the predicted and actual values. 
model.compile(loss=‘mean_squared_error')
 

2、Mean Squared Logarithmic Error Loss(MSLE)

當目標值較分散,且預測值很大;此時可以先計算每個預測值的自然對數,再計算此對數 和 actual values的mean squared error 
model.compile(loss=‘mean_squared_logarithmic_error’)
 

3、Mean Absolute Error Loss (MAE)

目標值大部分符合高斯分佈,但有一些界外點(原理均值的過大或過小值)
mean_absolute_error
 

4、Binary Classification Loss Functions

二分,預測值是兩種標籤之一的問題。
 

5、Binary Cross-Entropy Loss

交叉熵是用於二元分類問題的默認損失函數。適用於目標值在 {0,1}集合中的二分類問題。
loss=‘binary_crossentropy’
 

6、Hinge Loss

對於二分類問題,交叉熵的另一種替代方法是Hinge Loss(鉸鏈損失函數),它主要用於支持向量機(SVM)模型。
適用於目標值在 {-1,1}集合中的二分類問題。
loss=‘hinge’
 

7、Squared HInge Loss

8、Multi-Class Classification Loss Functions

多類分類是指那些示例被指定爲兩個以上類中的一個的預測建模問題。
 
 
 

如何選擇優化器Optimizer

 
 
 

dropout層

1、什麼時候應該加dropout層?

過擬合時需要加dropout層

過擬合:在訓練集下的表現過於優越,導致在驗證集(測試集)上的表現不佳。

在神經網絡中,有一個普遍現象可以說明是出現了過擬合,驗證集的準確率回載訓練了多個epoch後達到當val_loss達到一個最低值的時候突然回升,val_loss又不斷升高。

防止/降低 過擬合的方法:https://blog.csdn.net/Gary___/article/details/81983235

 

通過model.evaluate計算測試精度判斷 模型是否在訓練集上性能過優:

train_acc = model.evaluate(trainX, trainy, verbose=0)
test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))

模型在訓練數據集上的性能優於測試數據集,這是過度擬合的一個可能標誌。

如:Train: 1.000, Test: 0.757 ,則可能爲過擬合

 

2、放在哪幾個層之間?

可以放任意層之間,但在不同位置,選取的dropout_value值應該採用不同的大小。

經驗法則是,當dropout應用於全連接層時,將保留概率(1 - drop概率)設置爲0.5,而當應用於卷積層時,將其設置爲更大的數字(通常爲0.8、0.9),即(1-dropout_value)=0.8或0.9 (dropout_value=0.1或0.2)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章