如何使用最流行框架Tensorflow進行時序預測和時間序列分析
一、看深度學習框架排名第一的TensorFlow如何進行時序預測
摘要: 2017年深度學習框架關注度排名tensorflow以絕對的優勢佔領榜首,本文通過一個小例子介紹了TensorFlow在時序預測上的應用。
TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平台上展開計算,例如台式計算機中的一個或多個CPU(或GPU),伺服器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。
時間序列分析在計量經濟學和財務分析中具有重要意義,但也可以應用於了解趨勢做決策和對行為模式的變化做出反應的領域。其中例如,作為主要石油和天然氣供應商的MapR融合數據平台客戶將感測器放在井上,將數據發送到MapR Streams,然後將其用於趨勢監測井的狀況,如體積和溫度。在金融方面,時間序列分析用於股票價格,資產和商品的價格的預測。計量經濟學家長期利用「差分自回歸移動平均模型」(ARIMA)模型進行單變數預測。
ARIMA模型已經使用了幾十年,並且很好理解。然而,隨著機器學習的興起,以及最近的深度學習,其他模式正在被探索和利用。
深度學習(DL)是基於一組演算法的機器學習的分支,它通過使用由多個非線性變換組成的人造神經網路(ANN)架構來嘗試對數據進行高級抽象然後建模。更為流行的DL神經網路之一是循環神經網路(RNN)。RNN是依賴於其輸入的順序性質的一類神經網路。這樣的輸入可以是文本,語音,時間序列,以及序列中的元素的出現取決於在它之前出現的元素。例如,一句話中的下一個字,如果有人寫「雜貨」最有可能是「商店」而不是「學校」。在這種情況下,給定這個序列,RNN可能預測是商店而不是學校。
人工神經網路
實際上,事實證明,雖然神經網路有時是令人畏懼的結構,但使它們工作的機制出奇地簡單:隨機梯度下降。對於我們網路中的每個參數(如權重或偏差),我們所要做的就是計算相對於損耗的參數的導數,並在相反方向微調一點。
ANNs使用稱為反向傳播(有想了解BP演算法的可以參考BP演算法雙向傳,鏈式求導最纏綿)的方法來調整和優化結果。反向傳播是一個兩步過程,其中輸入通過正向傳播饋送到神經網路中,並且在通過激活函數變換之前與(最初隨機的)權重和偏差相乘。你的神經網路的深度將取決於你的輸入應該經過多少變換。一旦正向傳播完成,反向傳播步驟通過計算產生誤差的權重的偏導數來調整誤差。一旦調整權重,模型將重複正向和反向傳播步驟的過程,以最小化誤差率直到收斂。下圖中你看到這是一個只有一個隱藏層的ANN,所以反向傳播不需要執行多個梯度下降計算。
循環神經網路
循環神經網路(RNN)被稱為循環是因為它們對輸入序列中的所有元素執行相同的計算。由於RNN的廣泛應用,RNN正在變得非常受歡迎。它們可以分析時間序列數據,如股票價格,並提供預測。在自動駕駛系統中,他們可以預測汽車軌跡並幫助避免事故。他們可以將句子,文檔或音頻樣本作為輸入,它們也可以應用於自然語言處理(NLP)系統,如自動翻譯,語音對文本或情感分析。
上圖是RNN架構的示例,並且我們看到xt是時間步長t的輸入。例如,x1可能是時間段1中的股票的第一個價格。st是在時間步長tn處的隱藏狀態,並且使用激活函數基於先前的隱藏狀態和當前步驟的輸入來計算。St-1通常被初始化為零。ot是步驟t的輸出。例如,如果我們想預測序列中的下一個值,那麼它將是我們時間序列中概率的向量。
RNN隱藏層的成長是依賴於先前輸入的隱藏狀態或記憶,捕獲到目前為止所看到的內容。任何時間點的隱藏狀態的值都是前一時間步驟中的隱藏狀態值和當前時間的輸入值進行函數計算的結果。RNN具有與ANN不同的結構,並且通過時間(BPTT)使用反向傳播來計算每次迭代之後的梯度下降。
一個小例子:
此示例使用3個節點的小型MapR群集完成。此示例將使用以下內容:
- Python 3.5
- TensorFlow 1.0.1
- Red Hat 6.9
如果你使用Anaconda,你需要保證你能夠安裝TensorFlow 1.0.1版本在你本地的機器上。此代碼將不能在TensorFlow <1.0版本上使用。如果TensorFlow版本相同,則可以在本地機器上運行並傳輸到集群。其他需要考慮的深度學習庫是MXNet,Caffe2,Torch和Theano。Keras是另一個為TensorFlow或Theano提供python包的深度學習庫。
MapR提供了用戶喜好的集成Jupyter Notebook(或Zeppelin)的功能。我們將在這裡顯示的是數據管道的尾端。在分散式環境中運行RNN時間序列模型的真正價值是你可以構建的數據流水線,將聚合的系列數據推送到可以饋送到TensorFlow計算圖中的格式。
如果我正在聚合來自多個設備(IDS,syslogs等)的網路流,並且我想預測未來的網路流量模式行為,我可以使用MapR Streams建立一個實時數據管道,將這些數據聚合成一個隊列,進入我的TensorFlow模型。對於這個例子,我在集群上只使用一個節點,但是我可以在其他兩個節點上安裝TensorFlow,並且可以有三個TF模型運行不同的超參數。
對於這個例子,我生成了一些虛擬數據。
我們在我們的數據中有209個觀察結果。我want確保我對每個批次輸入都有相同的觀察次數。
我們看到的是我們的訓練數據集由10個批次組成,包含20個觀測值。每個觀察值是單個值的序列。
現在我們有了我們的數據,我們來創建一個將執行計算的TensorFlow圖。
這裡有很多事情需要處理。例如我們正在指定我們用來預測的周期數。我們指定我們的變數佔位符。我們初始化一種使用的RNN單元格(大小100)和我們想要的激活函數的類型。ReLU代表「整流線性單元」,是默認的激活功能,但如果需要,可以更改為Sigmoid,Hyberbolic Tangent(Tanh)等。
我們希望我們的輸出與我們的輸入格式相同,我們可以使用損失函數來比較我們的結果。在這種情況下,我們使用均方誤差(MSE),因為這是一個回歸問題,我們的目標是最小化實際和預測之間的差異。如果我們處理分類結果,我們可能會使用交叉熵。現在我們定義了這個損失函數,可以定義TensorFlow中的訓練操作,這將優化我們的輸入和輸出網路。要執行優化,我們將使用Adam優化器。Adam優化器是一個很好的通用優化器,可以通過反向傳播實現漸變下降。
現在是時候在我們的訓練數據上實施這個模型了。
我們將指定我們的批次訓練序列循環的迭代/紀元的數量。接著,我們創建我們的圖形對象(tf.Session()),並初始化我們的數據,以便在我們遍歷曆元時被饋送到模型中。縮寫輸出顯示每100個紀元後的MSE。隨著我們的模型提供數據向前和反向傳播運行,它調整應用於輸入的權重並運行另一個訓練時期,我們的MSE得到了持續改善(減少)。最後,一旦模型完成,它將接受參數並將其應用於測試數據中,以Y的預測輸出。
我們來看看我們的預測跟實際相差多少。對於我們的測試數據,我們集中在整個209個周期的最後20個時期。
看來這還有一些改進的空間。這可以通過改變隱藏的神經元的數量或增加迭代的數量來完成。優化我們的模式是一個試錯的過程,但我們有一個好的開始。這是隨機數據,所以我們期待著很好的結果,但是也許將這個模型應用到實時系列中會給ARIMA模型帶來一些競爭壓力。
數據科學家因為RNN(和深度學習)的出現,有了更多可用的選項以此來解決更多有趣的問題。許多數據科學家面臨的一個問題是,一旦我們進行了優化,我們如何自動化我們的分析運行?擁有像MapR這樣的平台允許這種能力,因為你可以在大型數據環境中構建,訓練,測試和優化你的模型。在這個例子中,我們只使用了10個訓練批次。如果我的數據允許我利用數百批次,而不僅僅是20個時期,我想我一定能改進這種模式。一旦我做到了,我可以把它打包成一個自動化腳本,在一個單獨的節點,一個GPU節點,一個Docker容器中運行。這就是在融合數據平台上進行數據科學和深度學習的力量。
希望上述的文章能夠幫到你理解TensorFlow。
更多閱讀:
- 閱讀博客「TensorFlow on MapR教程:一個完美的地方開始」
- 閱讀博客「深度學習:我的選項是什麼?「
- 閱讀博客「通過SparkR和H2O的MapR融合數據平台上的可擴展機器學習」
希望上述的介紹能夠幫助到你!
本文由北郵@愛可可-愛生活老師推薦,阿里云云棲社區組織翻譯。
文章原標題《Applying Deep Learning to Time Series Forecasting with TensorFlow》,
作者:Justin Brandenburg 譯者:袁虎 審閱:董昭男
------------------------------------------------------------------------------------
二、如何使用最流行框架Tensorflow進行時間序列分析
時間序列分析是一種動態數據處理的統計方法。根據對系統進行觀測得到的時間序列數據,用曲線擬合的方法對系統進行客觀的描述。
如今,時間序列數據出現在金融,信號處理,語音識別和醫學等諸多領域。解決時間序列問題的標準方法通常需要手動提煉數據特徵,然後才能將其輸入到機器學習演算法中。這通常還要求開發設計人員掌握數據所屬學科領域的知識特徵,以便在演算法中加入特徵過濾。例如,如果處理信號(即EEG信號的分類),則需要掌握的知識特徵涉及各種頻帶的功率譜及Hjorth參數。對於認真鑽研本領域的程序猿來說,這簡直就是噩夢。
那麼是不是不掌握這些學科領域的知識特徵,我們就沒有辦法進行模型設計了呢?
其實答案不然,在圖像分類領域也出現了類似的情況。但是,隨著深度學習的出現,卷積神經網路(CNN)的性能已經可以勝過這種人工提取特徵的方法。CNN不需要任何手動設置任何的圖像特徵。在訓練過程中,隨著層次越來越深,CNN越來越複雜,進而它自己會學習得到許多「過濾器」,並在最終的分類器中使用它們。
在這篇博客文章中,我將討論使用深度學習的方法對時間序列數據進行分類,而無需手動設計特徵。我在本文中將使用到的例子是UCI存儲庫中經典的人類活動識別(HAR)數據集。該數據集包含原始時間序列數據,以及具有561個預處理數據的工程特徵。在博客中我會比較使用工程特徵與深度學習這兩種方法(卷積和復現神經網路),並表明深度學習可以超越前者的性能。
在本文中我將使用Tensorflow來實現和訓練博客中所用到的模型。在下面的討論中,提供了代碼片段來解釋實現過程。有關完整的代碼,請參閱我的Github資源庫。
卷積神經網路(CNN)
第一步是將數據投射到具有一定形狀的numpy數組中:(batch_size, seq_len, n_channels),其中batch_size是訓練期間批次中的示例數,seq_len是時間序列的長度(在我們的情況下n_channels為128),並且是進行測量的通道的數量。在本文的小例子中,有9個通道,每3個坐標軸包括3個不同的加速度測量。每次觀察有6類活動LAYING, STANDING, SITTING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS, WALKING。
首先,我們為輸入到計算圖的數據創建佔位符:
inputs是將輸入的張量饋送到計算圖,並將其數組第一個位置設置為None,以便允許可變的批量大小。labels_是要預測的一個熱編碼的標籤,keep_prob的作用是在退出正則化中保持概率來防止過度擬合,並且learning_rate_是Adam優化器中使用的學習率。
我們將通過使用移動序列的一維內核構造卷積層(與使用2d卷積的圖像不同)來構造卷積層,這些內核作為在訓練過程中的過濾器。像許多CNN架構一樣,層越深,過濾器數越多。每個卷積之後是彙集層,以此減少序列長度。下面是可能可以使用的CNN架構的簡單圖片:
上面描述的卷積層如下實現:
一旦達到最後一層,我們需要張量平坦化並將其輸送到具有正確數量的神經元的分類器中(上圖中的144個)。模型功能:
- 計算softmax交叉熵,這是多類問題中使用的標準損失度量。
- 從最大概率以及精度預測類標籤。
功能實現代碼如下:
其餘的實施部分涉及向圖表饋送批次的訓練數據並評估驗證集的性能。最後,對測試集進行評估。採用上述架構batch_size=600,learning_rate =0.001(默認值),keep_prob= 0.5,500訓練次數,我們得到98%的測試精度。下面的圖表顯示了訓練/驗證精度如何通過訓練次數演變:
長短期記憶網路(LSTM)
LSTM在處理基於文本的數據方面非常受歡迎,在情感分析,語言翻譯和文本生成方面也相當成功。今天我們就用LSTM來解決我們今天的問題。
以下是可以在我們的問題中使用的示例架構:
為了將數據傳送到網路中,我們需要將數組分成128個,每個的形狀我們定義為:(batch_size, n_channels)。然後,單層神經元將把這些輸入轉換成LSTM細胞,每一個都具有維度lstm_size。該參數的大小選擇要大於通道數。這是一種類似於在文本應用程序中嵌入圖層的方式。為了實現,佔位符與上述相同。以下代碼段實現了LSTM層:
上面的代碼段中有一個重要的技術細節。我將陣列重新整形(batch_size, seq_len, n_channels)到(seq_len, batch_size, n_channels),這樣tf.split就可以在每個步驟中將數據(由第零個索引)正確地分割成數組列表。其餘的是LSTM實現的標準,包括構建層(包括正則化的退出),然後是定義初始狀態。
下一步是通過網路實現前向傳遞和成本函數。一個重要的技術方面利用梯度剪輯,因為它通過防止反向傳播期間的爆炸梯度來改善訓練。
請注意,僅使用LSTM輸出頂部序列的最後一個成員,因為我們正在嘗試每個序列預測一個數字。其餘的類似CNN,我們只需要將數據提供給圖表進行訓練。lstm_size=27,lstm_layers=2,batch_size=600,learning_rate=0.0005,和keep_prob=0.5,我獲得95%的準確度的測試集。這比CNN的結果還差,但還是不錯的。這些超參數的更好選擇會改進的結果。
與工程特徵進行比較
在此之前,我已經使用561個預先設計的特徵測試了一些關於這個問題的機器學習方法。性能最好的模型之一是梯度提升樹(gradient booster)(樹形或線性),其結果是96%的精確度(您可以從這本筆記本中了解更多信息)。CNN架構優於梯度提升樹,但LSTM的性能相較於梯度提升樹(gradient booster)就稍差一些。
總結:
在這篇博客文章中,我已經說明了如何使用CNN和LSTM進行時間序列分類,並證明深層架構可以勝過預先設計的功能特徵訓練的模型。除了達到更好的準確性外,深度學習模式還「培養」了自己的功能。這是非常可取的,因為人們不需要具有來自數據來源的領域專長,能夠訓練準確的模型。
我們在這篇文章中使用的序列相當小(128步)。人們可能會想,如果步驟數量很多,那麼今天我討論的這些架構的可訓練性是否還有?如果有?會發生什麼。我認為一種可能的架構將涉及LSTM和CNN的組合,其對於較大的序列(即> 1000,對於LSTM是有問題的)可以更好地工作。因為在這種情況下,具有彙集作用的幾個卷積就可以有效地減少前幾個層中的步數,並且得到的較短的序列可以被反饋送到LSTM層。這種結構的一個例子最近被用於從移動設備記錄的心房顫動檢測。如果你有興趣了解這種長序列的方法可以去研究它。
本文由北郵@愛可可-愛生活老師推薦,阿里云云棲社區組織翻譯。
文章原標題《time-series-classification-with-tensorflow》,
作者:burakhimmetoglu 作者博客:https://burakhimmetoglu.com/
譯者:袁虎 審閱:主題曲
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※乾脆面君,你給我站住!你已經被TensorFlow盯上了
※【博客存檔】TensorFlow之深入理解Neural Style
※TensorFlow小試牛刀(1):CNN圖像分類
※2.2 RNN入門
TAG:神经网络 | 深度学习DeepLearning | TensorFlow |