Tensorflow進行時間序列分析

摘要:2017年深度學習框架關注度排名tensorflow以絕對的優點佔領榜首,本文經過使用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。函數

首先,咱們爲輸入到計算圖的數據建立佔位符:性能

clipboard.png

inputs是將輸入的張量饋送到計算圖,並將其數組第一個位置設置爲None,以便容許可變的批量大小。labels_是要預測的一個熱編碼的標籤,keep_prob的做用是在退出正則化中保持機率來防止過分擬合,而且learning_rate_是Adam優化器中使用的學習率。學習

咱們將經過使用移動序列的一維內核構造卷積層(與使用2d卷積的圖像不一樣)來構造卷積層,這些內核做爲在訓練過程當中的過濾器。像許多CNN架構同樣,層越深,過濾器數越多。每一個卷積以後是聚集層,以此減小序列長度。下面是可能可使用的CNN架構的簡單圖片:測試

圖片描述

上面描述的卷積層以下實現:

clipboard.png

一旦達到最後一層,咱們須要張量平坦化並將其輸送到具備正確數量的神經元的分類器中(上圖中的144個)。模型功能:

  1. 計算softmax交叉熵,這是多類問題中使用的標準損失度量。
  2. 從最大機率以及精度預測類標籤。

功能實現代碼以下:

clipboard.png

其他的實施部分涉及向圖表饋送批次的訓練數據並評估驗證集的性能。最後,對測試集進行評估。採用上述架構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層:

clipboard.png

上面的代碼段中有一個重要的技術細節。我將陣列從新整形(batch_size, seq_len, n_channels)到(seq_len, batch_size, n_channels),這樣tf.split就能夠在每一個步驟中將數據(由第零個索引)正確地分割成數組列表。其他的是LSTM實現的標準,包括構建層(包括正則化的退出),而後是定義初始狀態。

下一步是經過網絡實現前向傳遞和成本函數。一個重要的技術方面利用梯度剪輯,由於它經過防止反向傳播期間的爆炸梯度來改善訓練。

clipboard.png

請注意,僅使用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層。這種結構的一個例子最近被用於從移動設備記錄的心房顫動檢測。若是你有興趣瞭解這種長序列的方法能夠去研究它。

相關文章
相關標籤/搜索