交通量預測——極端狀況下的預測算法

1.背景介紹

在高方差時段(如節假日和體育賽事等等)準確的預測交通量,對於異常檢測、資源分配、預算規劃和其餘相關的任務都是相當重要,這些任務有助於網約車大規模優化用戶體驗,然而,預測這些變量極具挑戰性,由於這種極端事件預測取決於天氣、城市人口增加和其餘致使預測不肯定性的外部因素。近幾年來,長短時間記憶網絡技術以其端到端建模,易於映入外生變量和自動特徵抽取的特色,成爲了一種流行的時間序列建模框架。LSTM方法利用多個維度的大量數據,能夠對複雜的非線性特徵相互做用進行建模,這對於預測極端事件是相當重要的。在Lingxue Zhu和Nikolay Laptev發表在IEEE的一篇論文Deep and Confident Prediction for Time Series at Uber中,介紹一種新的端到端貝葉斯神經網絡(BNN)結構,它能在大規模的狀況下更精準地預測時間序列結果和不肯定性預測。前端

2.概述

2.1不肯定性預測

首先,咱們用函數python

來表示一個神經網絡,其中f表示是網絡的結構,用** W**來表示模型參數的集合。在BNN模型中,引入了權重參數的先驗,而且模型的目標是去擬合最優的後驗分佈。好比,高斯先驗一般假設:
。而後,咱們進一步數據生成分佈定爲 
。在迴歸問題中,咱們一般假設: 
(其中具備必定的噪聲
)。接着,給定N個觀測值
 和
,貝葉斯推理的目標是找到模型參數的後驗分佈
。最後給定一個新的數據點
,在經過將後驗分佈邊緣化以後,能夠獲得預測分佈
。其中,方差量化了預測的不肯定性,能夠用 總方差定律進行分解:
 ,咱們馬上看到方差被分解爲兩項, 
(反映了咱們對模型參數_ W_的規格的不肯定性,被稱爲模型不肯定性)和
(表示固有的噪聲)。對於上述分解公式的一個基本假設是
由相同的過程產生的,可是在實際狀況中,每每並不是如此。特別是在異常檢測,若是某些時間序列具備不一樣尋常的模式,那麼會使訓練後的模型有很大的不一樣。因此,咱們要結合如下三個方面來測量預測的不肯定性:

  1. 模型的不肯定性
  2. 模型的錯誤識別
  3. 固有噪聲

接下來就詳細介紹這三個方面。算法

2.1.1模型的不肯定性

模型不肯定性估計的關鍵就是後驗分佈 c#

(即貝葉斯推理)。因爲非線性所致使的非共軛性,後驗分佈在神經網絡中是極其具備挑戰性的。在深度學習中,相似推理的研究已經有了不少,在仔細對比後,咱們選用蒙特卡羅丟失法(MC dropout)來模擬模型的不肯定性。具體算法以下:給定一個新的輸入
,而後咱們在每層神經網絡上隨機拋棄掉一部分輸出
,即以必定的機率** p**隨機拋棄掉每一個隱藏層單元。而後隨機前饋重複B次,獲得
image.png
。這樣就能夠把模型的不肯定性近似看爲樣本方差
image.png
(其中
image.png
)。近幾年來,已經在將最優拋棄率p做爲模型參數的一部分進行自適應選擇方面有了不少研究,可是這種方法須要去修改訓練階段。實際上,咱們發現模型的不肯定性估計一般在_ p_的合理範圍是魯棒的。

2.1.2模型的錯誤識別

接下來,咱們要經過BNN模型去解決潛在的模型錯誤識別的問題。咱們解決這一問題的方法是,在訓練數據集中去預測那些具備徹底不一樣模式的未知樣本時獲取的不肯定性,和經過訓練一個從時間序列中自動抽取表明性特徵編碼器來肯定這種不肯定性的來源。在測試時,每個樣本的編碼效果都將會有助於計算樣本集與訓練集之間的距離。計算它們之間距離的另外一種方式是,使用一個encoder-decoder框架爲全部訓練集的時間序列擬合出一個潛在的embedding空間。這樣,咱們就能夠在這個embedding空間來測量測試樣本和訓練樣本之間的距離。接下來,咱們須要解決的問題就是如何將這種錯誤識別和模型不肯定性結合起來。在這裏,咱們採用了一個方法是,將encoder-decoder網絡與一個預測網絡鏈接起來,在推理時將其是爲一個大網絡,算法如圖一所示:網絡

image.png
圖一:用MC dropout算法來近似模型的不肯定性和模型的錯誤識別上述算法1使用MC dropout算法展現了這樣一個推理網絡。具體來講,給定一個輸入時間序列
 ,encoder構造了所學到的embedding向量
,並將其做爲特徵輸入到預測網絡_ h_中。在這個前饋過程當中,MC dropout應用於encoder和預測網絡的全部層。因此,encoder層重的隨機拋棄會智能地去幹擾embedding空間中的輸入,從而致使潛在的模型錯誤識別,而且經過預測網絡進一步傳播。

2.1.3固有噪聲

最後,咱們來估計一下固有的噪聲架構

。在這個場景下,咱們提出了一種簡單但自適應的方法,即經過殘差平方和和評估一個獨立的驗證集來估計噪聲水平。具體地說, 
是在訓練集上擬合好的模型, 
是獨立的驗證集,而後,咱們經過公式
來估計 
。注意
 是獨立於 
的。若是咱們進一步假設
是一個真實模型的無偏估計,那麼咱們就會有
 ,其中偏置項是
,而且它會隨着訓練樣本數量的增長而下降,尤爲是當訓練集樣本N趨於∞時偏置項會趨於0。所以,假如模型是無偏的,
就提供了一個對固有噪聲水平接近的無偏估計。在樣本有限的狀況下,
只能高估噪聲水平而且趨於更加保守。   咱們的BNN模型最終的推理算法結合了固有噪聲估計和MC dropout,算法2給出了最終的推理算法,如圖二所示:
image.png
圖二:推理算法結合了固有噪聲估計和MC dropout算法

3.實驗

該論文中的實驗結果,是以lstm網絡+全鏈接爲基礎產生的。該神經網絡的完整結構主要包括兩部分:(i)encoder-decoder框架,用於獲得時間序列中的自有關係,而且在預訓練期間就學習好(ii)預測網絡,他的輸入來自於encoder-decoder框架所學習到embedding層以及潛在的外部特性(如天氣事件等)。這個魯棒的體系結構以下圖三所示:app

image.png
圖三:完整的體系結構在擬合預測模型以前,咱們首先要進行預訓練,以擬合出一個可以從時間序列中抽取有用且具備表明性的embedding的encoder。其目標有兩個方向:(i)確保所學習的embedding爲預測提供有用的特徵;(ii)證實能夠在embedding中捕獲異常輸入,從而進一步傳播到預測網絡中。

3.1實驗數據

這裏咱們從kaggle上找到數據集NYC Uber Pickups with Weather and Holidays,這個數據集有不少咱們須要的特徵,可是咱們仍是須要對其處理一下,把區域字段合併,將節假日字段改成0-1數字表示,合併出來的數據如圖四所示:框架

image.png
圖四:處理事後的實驗數據因爲要使用LSTM網絡做爲一個encoder-decoder框架,因此咱們將上述處理以後的數據讀出成時序數據,而後在將其轉化爲監督問題數據。參考代碼:

def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = pd.DataFrame(data)
    cols, names = list(), list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
        else:
            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    # put it all together
    agg = pd.concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg
複製代碼

3.2實驗模型

給定一個時間序列 yii

,encoder的LSTM去讀取前T個時間戳數據
來構造一個固定維度的embedding狀態向量。而後decoder的LSTM根據這個embedding狀態向量和
去構造接下來F個時間戳數據
。爲了從embedding狀態向量中構建接下來的時間戳數據,embedding狀態向量必定要包含來自輸入時間序列中最具備表明性和意義的元素。在對encoder-decoder結構預處理以後,咱們就將這個結構做爲一個能智能提取特徵的黑盒。具體來講,LSTM節點狀態被抽取爲固定維度的embedding向量。而後,用這個embedding向量做爲特徵來訓練模型去預測接下里幾個時間段的數據。在外部特性可用的場景中,能夠將這些特性鏈接到embedding向量並一塊兒傳遞到最終的預測網絡。有兩個超參數須要被特別說明一下:丟棄率_ P 和迭代次數 B 。對於丟棄率來講,不肯定性估計在一系列 P 上相對穩定,因此咱們要選擇一個在驗證集上表現的最好的一個 P_。對於迭代次數來講,估計的預測不肯定性的標準差是與
成正比。在對不一樣迭代次數測量了標準差以後,發現幾百次迭代就足以實現穩定的估計。該模型的encoder-decoder框架是由兩層LSTM單元構成,分別包含128和32個隱狀態,預測網絡由三個全鏈接層組成,分別包含12八、64和16個隱藏單元。咱們的輸入樣本是使用一個滑動窗口構成的,其中每一個樣本都是之前15個小時做爲輸入,來預測將來一小時的數據。而且對原始數據進行MinMaxScaler標準化,把數據放縮到0~1之間,以減輕指數效應。參考代碼:

encoder_inputs = Input(shape=(train_X.shape[1], train_X.shape[2]))

encoder_lstm1 = LSTM((128), return_state=True,return_sequences=True)
encoder_outputs1, state_h1, state_c1 = encoder_lstm1(encoder_inputs)

drop_out1 = Dropout(0.05)

encoder_lstm2 = LSTM((64), return_state=True,return_sequences=False)
encoder_outputs2, state_h2, state_c2 = encoder_lstm2(encoder_outputs1)

drop_out2 = Dropout(0.05)

external_features = Input(shape=(6,))
print(external_features)

dense1 = Dense(128,activation='tanh')
temp = Concatenate(axis=1)([state_c2,external_features])
dense1_output = dense1(temp)

drop_out3 = Dropout(0.05)

dense2 = Dense(64,activation='tanh')
dense2_output = dense2(dense1_output)

drop_out4 = Dropout(0.05)

dense3 = Dense(16,activation='tanh')
dense3_output = dense3(dense2_output)

drop_out5 = Dropout(0.05)

dense4 = Dense(1,activation='tanh')
dense4_output = dense4(dense3_output)
model = Model(inputs=[encoder_inputs,external_features], outputs=dense4_output)
model.compile(loss='mse', optimizer='adam')


## fit network
input_list = []
input_list.append(train_X)
input_list.append(temp_train)
history = model.fit(input_list, train_y, epochs=1000, batch_size=10, validation_data=([test_X,temp_test], test_y), verbose=2,shuffle=False)
複製代碼

3.3實驗結果

咱們用LSTM模型和這個模型分別來預測咱們的數據,咱們使用前15024個小時的數據做爲咱們的訓練集合,剩下3024個小時的數據做爲咱們的驗證集,實驗結果如圖五(LSTM模型)和圖六(論文模型)下:機器學習

image.png
圖五:LSTM模型預測狀況
image.png
圖六:上述模型預測狀況咱們能夠看到很明顯的看到,LSTM模型預測的效果明顯沒有該篇文章所展現的論文模型效果好,尤爲在峯值預測的時候更爲明顯,咱們所展現的模型近乎徹底擬合了。

4.總結

這篇文章展現了一種用於Uber不肯定性估計的端到端神經網絡結構。利用MC dropout和固有噪聲估計,給出了一種爲神經網絡預測提供不肯定性估計的簡單方法,它覆蓋率大部分的不肯定性因素。這個框架的一個關鍵特性在於它不用修改底層架構的狀況下適用於任何神經網絡。用這種提出的不肯定性估計方法來對特殊事件(如假日,體育賽事,天氣等等)的不肯定度進行了估計,提升了異常檢測的精度。對於一些高不肯定性事件中,咱們能夠對內部異常檢測模型的置信區間進行調整,準確度能相應的提高,這有時能夠爲實際運營帶來很大的提高。項目源碼地址:https://momodel.cn/explore/5d3fb3121afd943289223b91?&tab=1&type=app

5.參考資料

論文:Deep and Confident Prediction for Time Series at Uber論文:Long short-term memory 博客:Engineering Uncertainty Estimation in Neural Networks for Time Series Prediction at Uber論文:Learning phrase representations using rnn encoder-decoder for statistical machine translation博客:深度學習如何估計模型不肯定性(epistemic uncertainty)

關於咱們

Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。


Mo 人工智能俱樂部 是由網站的研發與產品設計團隊發起、致力於下降人工智能開發與使用門檻的俱樂部。團隊具有大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具有從底層到前端的全線設計開發能力。主要研究方向爲大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。

目前俱樂部每週六在杭州舉辦以機器學習爲主題的線下技術沙龍活動,不按期進行論文分享與學術交流。但願能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推進人工智能民主化、應用普及化。

image.png
相關文章
相關標籤/搜索