摘要:總的來說,是一種采用數(shù)據(jù)流圖,用于數(shù)值計算的開源軟件庫。其中代表傳遞的數(shù)據(jù)為張量多維數(shù)組,代表使用計算圖進行運算。數(shù)據(jù)流圖用結(jié)點和邊組成的有向圖來描述數(shù)學運算。
本文非常適合初學者了解如何使用 TensorFlow 構(gòu)建基本的神經(jīng)網(wǎng)絡,它全面展示了構(gòu)建一個 TensorFlow 模型所涉及的概念與模塊。本文所使用的數(shù)據(jù)集可以直接下載,所以有一定基礎的讀者也可以嘗試使用更強的循環(huán)神經(jīng)網(wǎng)絡處理這一類時序數(shù)據(jù)。
數(shù)據(jù)集地址:http://files.statworx.com/sp500.zip
導入和預處理數(shù)據(jù)
STATWORX 團隊從服務器爬取股票數(shù)據(jù),并將它們保存為 csv 格式的文件。該數(shù)據(jù)集包含 n=41266 分鐘的記錄,范圍從 2017 年的 4 月到 8 月的 500 支股票和 S&P 500 指數(shù),股票和股指的范圍分布十分廣。
該數(shù)據(jù)集已經(jīng)經(jīng)過了清理與預處理,即損失的股票和股指都通過 LOCF"ed 處理(下一個觀測數(shù)據(jù)復制前面的),所以該數(shù)據(jù)集沒有任何缺損值。
我們可以使用 pyplot.plot("SP500") 語句繪出 S&P 時序數(shù)據(jù)。
S&P 500 股指時序繪圖
預備訓練和測試數(shù)據(jù)
該數(shù)據(jù)集需要被分割為訓練和測試數(shù)據(jù),訓練數(shù)據(jù)包含總數(shù)據(jù)集 80% 的記錄。該數(shù)據(jù)集并不需要擾亂而只需要序列地進行切片。訓練數(shù)據(jù)可以從 2017 年 4 月選取到 2017 年 7 月底,而測試數(shù)據(jù)再選取剩下到 2017 年 8 月的數(shù)據(jù)。
時序交叉驗證有很多不同的方式,例如有或沒有再擬合(refitting)而執(zhí)行滾動式預測、或者如時序 bootstrap 重采樣等更加詳細的策略等。后者涉及時間序列周期性分解的重復樣本,以便模擬與原時間序列相同周期性模式的樣本,但這并不不是簡單的復制他們的值。
數(shù)據(jù)標準化
大多數(shù)神經(jīng)網(wǎng)絡架構(gòu)都需要標準化數(shù)據(jù),因為 tanh 和 sigmoid 等大多數(shù)神經(jīng)元的激活函數(shù)都定義在 [-1, 1] 或 [0, 1] 區(qū)間內(nèi)。目前線性修正單元 ReLU 激活函數(shù)是最常用的,但它的值域有下界無上界。不過無論如何我們都應該重新縮放輸入和目標值的范圍,這對于我們使用梯度下降算法也很有幫助??s放取值可以使用 sklearn 的 MinMaxScaler 輕松地實現(xiàn)。
注意,我們必須謹慎地確定什么時候該縮放哪一部分數(shù)據(jù)。比較常見的錯誤就是在拆分測試和訓練數(shù)據(jù)集之前縮放整個數(shù)據(jù)集。因為我們在執(zhí)行縮放時會涉及到計算統(tǒng)計數(shù)據(jù),例如一個變量的較大和最小值。但在現(xiàn)實世界中我們并沒有來自未來的觀測信息,所以必須對訓練數(shù)據(jù)按比例進行統(tǒng)計計算,并將統(tǒng)計結(jié)果應用于測試數(shù)據(jù)中。不然的話我們就使用了未來的時序預測信息,這常常令預測度量偏向于正向。
TensorFlow 簡介
TensorFlow 是一個十分優(yōu)秀的框架,目前是深度學習和神經(jīng)網(wǎng)絡方面用戶最多的框架。它基于 C++的底層后端,但通常通過 Python 進行控制。TensorFlow 利用強大的靜態(tài)圖表征我們需要設計的算法與運算。這種方法允許用戶指定運算為圖中的結(jié)點,并以張量的形式傳輸數(shù)據(jù)而實現(xiàn)高效的算法設計。由于神經(jīng)網(wǎng)絡實際上是數(shù)據(jù)和數(shù)學運算的計算圖,所以 TensorFlow 能很好地支持神經(jīng)網(wǎng)絡和深度學習。
總的來說,TensorFlow 是一種采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計算的開源軟件庫。其中 Tensor 代表傳遞的數(shù)據(jù)為張量(多維數(shù)組),F(xiàn)low 代表使用計算圖進行運算。數(shù)據(jù)流圖用「結(jié)點」(nodes)和「邊」(edges)組成的有向圖來描述數(shù)學運算。「結(jié)點」一般用來表示施加的數(shù)學操作,但也可以表示數(shù)據(jù)輸入的起點和輸出的終點,或者是讀取/寫入持久變量(persistent variable)的終點。邊表示結(jié)點之間的輸入/輸出關(guān)系。這些數(shù)據(jù)邊可以傳送維度可動態(tài)調(diào)整的多維數(shù)據(jù)數(shù)組,即張量(tensor)。
執(zhí)行加法的簡單計算圖
在上圖中,兩個零維張量(標量)將執(zhí)行相加任務,這兩個張量儲存在兩個變量 a 和 b 中。這兩個值流過圖形在到達正方形結(jié)點時被執(zhí)行相加任務,相加的結(jié)果被儲存在變量 c 中。實際上,a、b 和 c 可以被看作占位符,任何輸入到 a 和 b 的值都將會相加到 c。這正是 TensorFlow 的基本原理,用戶可以通過占位符和變量定義模型的抽象表示,然后再用實際的數(shù)據(jù)填充占位符以產(chǎn)生實際的運算,下面的代碼實現(xiàn)了上圖簡單的計算圖:
如上在導入 TensorFlow 庫后,使用 tf.placeholder() 定義兩個占位符來預儲存張量 a 和 b。隨后定義運算后就能執(zhí)行運算圖得出結(jié)果。
占位符
正如前面所提到的,神經(jīng)網(wǎng)絡的初始源自占位符。所以現(xiàn)在我們先要定義兩個占位符以擬合模型,X 包含神經(jīng)網(wǎng)絡的輸入(所有 S&P 500 在時間 T=t 的股票價格),Y 包含神經(jīng)網(wǎng)絡的輸出(S&P 500 在時間 T=t+1 的指數(shù)值)。
因此輸入數(shù)據(jù)占位符的維度可定義為 [None, n_stocks],輸出占位符的維度為 [None],它們分別代表二維張量和一維張量。理解輸入和輸出張量的維度對于構(gòu)建整個神經(jīng)網(wǎng)絡十分重要。
以上代碼中的 None 指代我們暫時不知道每個批量傳遞到神經(jīng)網(wǎng)絡的數(shù)量,所以使用 None 可以保持靈活性。我們后面會定義控制每次訓練時使用的批量大小 batch_size。
變量
除了占位符,變量是 TensorFlow 表征數(shù)據(jù)和運算的另一個重要元素。雖然占位符在計算圖內(nèi)通常用于儲存輸入和輸出數(shù)據(jù),但變量在計算圖內(nèi)部是非常靈活的容器,它可以在執(zhí)行中進行修改與傳遞。神經(jīng)網(wǎng)絡的權(quán)重和偏置項一般都使用變量定義,以便在訓練中可以方便地進行調(diào)整,變量需要進行初始化,后文將詳細解釋這一點。
該模型由四個隱藏層組成,第一層包含 1024 個神經(jīng)元,然后后面三層依次以 2 的倍數(shù)減少,即 512、256 和 128 個神經(jīng)元。后面的層級的神經(jīng)元依次減少就壓縮了前面層級中抽取的特征。當然,我們還能使用其它神經(jīng)網(wǎng)絡架構(gòu)和神經(jīng)元配置以更好地處理數(shù)據(jù),例如卷積神經(jīng)網(wǎng)絡架構(gòu)適合處理圖像數(shù)據(jù)、循環(huán)神經(jīng)網(wǎng)絡適合處理時序數(shù)據(jù),但本文只是為入門者簡要地介紹如何使用全連接網(wǎng)絡處理時序數(shù)據(jù),所以那些復雜的架構(gòu)本文并不會討論。
理解輸入層、隱藏層和輸出層之間變量的維度變換對于理解整個網(wǎng)絡是十分重要的。作為多層感知機的一個經(jīng)驗性法則,后面層級的第一個維度對應于前面層級權(quán)重變量的第二個維度。這可能聽起來比較復雜,但實際上只是將每一層的輸出作為輸入傳遞給下一層。偏置項的維度等于當前層級權(quán)重的第二個維度,也等于該層中的神經(jīng)元數(shù)量。
設計神經(jīng)網(wǎng)絡的架構(gòu)
在定義完神經(jīng)網(wǎng)絡所需要的權(quán)重矩陣與偏置項向量后,我們需要指定神經(jīng)網(wǎng)絡的拓撲結(jié)構(gòu)或網(wǎng)絡架構(gòu)。因此占位符(數(shù)據(jù))和變量(權(quán)重和偏置項)需要組合成一個連續(xù)的矩陣乘法系統(tǒng)。
此外,網(wǎng)絡隱藏層中的每一個神經(jīng)元還需要有激活函數(shù)進行非線性轉(zhuǎn)換。激活函數(shù)是網(wǎng)絡體系結(jié)構(gòu)非常重要的組成部分,因為它們將非線性引入了系統(tǒng)。目前有非常多的激活函數(shù),其中最常見的就是線性修正單元 ReLU 激活函數(shù),本模型也將使用該激活函數(shù)。
下圖將展示本文構(gòu)建的神經(jīng)網(wǎng)絡架構(gòu),該模型主要由三個構(gòu)建塊組成,即輸入層、隱藏層和輸出層。這種架構(gòu)被稱為前饋網(wǎng)絡或全連接網(wǎng)絡,前饋表示輸入的批量數(shù)據(jù)只會從左向右流動,其它如循環(huán)神經(jīng)網(wǎng)絡等架構(gòu)也允許數(shù)據(jù)向后流動。
前饋網(wǎng)絡的核心架構(gòu)
損失函數(shù)
該網(wǎng)絡的損失函數(shù)主要是用于生成網(wǎng)絡預測與實際觀察到的訓練目標之間的偏差值。對回歸問題而言,均方誤差(MSE)函數(shù)更為常用。MSE 計算預測值與目標值之間的平均平方誤差。
然而,MSE 的特性在常見的優(yōu)化問題上很有優(yōu)勢。
優(yōu)化器
優(yōu)化器處理的是訓練過程中用于適應網(wǎng)絡權(quán)重和偏差變量的必要計算。這些計算調(diào)用梯度計算結(jié)果,指示訓練過程中,權(quán)重和偏差需要改變的方向,從而最小化網(wǎng)絡的代價函數(shù)。穩(wěn)定、快速的優(yōu)化器的開發(fā),一直是神經(jīng)網(wǎng)絡和深度學習領(lǐng)域的重要研究。
以上是用到了 Adam 優(yōu)化器,是目前深度學習中的默認優(yōu)化器。Adam 表示適應性矩估計,可被當作 AdaGrad 和 RMSProp 這兩個優(yōu)化器的結(jié)合。
初始化器
初始化器被用于在訓練之前初始化網(wǎng)絡的變量。因為神經(jīng)網(wǎng)絡是使用數(shù)值優(yōu)化技術(shù)訓練的,優(yōu)化問題的起點是找到好的解決方案的重點。TensorFlow 中有不同的初始化器,每個都有不同的初始化方法。在這篇文章中,我使用的是 tf.variance_scaling_initializer(),是一種默認的初始化策略。
# Initializers
sigma =
weight_initializer = tf.variance_scaling_initializer(mode="fan_avg", distribution="uniform", scale=sigma)
bias_initializer = tf.zeros_initializer()
注意,用 TensorFlow 的計算圖可以對不同的變量定義多個初始化函數(shù)。然而,在大多數(shù)情況下,一個統(tǒng)一的初始化函數(shù)就夠了。
擬合神經(jīng)網(wǎng)絡
完成對網(wǎng)絡的占位符、變量、初始化器、代價函數(shù)和優(yōu)化器的定義之后,就可以開始訓練模型了,通常會使用小批量訓練方法。在小批量訓練過程中,會從訓練數(shù)據(jù)隨機提取數(shù)量為 n=batch_size 的數(shù)據(jù)樣本饋送到網(wǎng)絡中。訓練數(shù)據(jù)集將分成 n/batch_size 個批量按順序饋送到網(wǎng)絡中。此時占位符 X 和 Y 開始起作用,它們保存輸入數(shù)據(jù)和目標數(shù)據(jù),并在網(wǎng)絡中分別表示成輸入和目標。
X 的一個批量數(shù)據(jù)會在網(wǎng)絡中向前流動直到到達輸出層。在輸出層,TensorFlow 將會比較當前批量的模型預測和實際觀察目標 Y。然后,TensorFlow 會進行優(yōu)化,使用選擇的學習方案更新網(wǎng)絡的參數(shù)。更新完權(quán)重和偏差之后,下一個批量被采樣并重復以上過程。這個過程將一直進行,直到所有的批量都被饋送到網(wǎng)絡中去,即完成了一個 epoch。
當訓練達到了 epoch 的較大值或其它的用戶自定義的停止標準的時候,網(wǎng)絡的訓練就會停止。
在訓練過程中,我們在測試集(沒有被網(wǎng)絡學習過的數(shù)據(jù))上評估了網(wǎng)絡的預測能力,每訓練 5 個 batch 進行一次,并展示結(jié)果。此外,這些圖像將被導出到磁盤并組合成一個訓練過程的視頻動畫。模型能迅速學習到測試數(shù)據(jù)中的時間序列的位置和形狀,并在經(jīng)過幾個 epoch 的訓練之后生成準確的預測。太棒了!
可以看到,網(wǎng)絡迅速地適應了時間序列的基本形狀,并能繼續(xù)學習數(shù)據(jù)的更精細的模式。這歸功于 Adam 學習方案,它能在模型訓練過程中降低學習率,以避免錯過最小值。經(jīng)過 10 個 epoch 之后,我們完美地擬合了測試數(shù)據(jù)!最后的測試 MSE 等于 0.00078,這非常低,因為目標被縮放過。測試集的預測的平均百分誤差率等于 5.31%,這是很不錯的結(jié)果。
預測和實際 S&P 價格的散點圖(已縮放)
請注意其實還有很多種方法能進一步優(yōu)化這個結(jié)果:層和神經(jīng)元的設計、不同的初始化和激活方案的選擇、引入神經(jīng)元的 dropout 層、早期停止法的應用,等等。此外,其它不同類型的深度學習模型,比如循環(huán)神經(jīng)網(wǎng)絡也許能在這個任務中達到更好的結(jié)果。不過,這在我們的討論范圍之外。
結(jié)論和展望
TensorFlow 的發(fā)布是深度學習研究的里程碑事件,其高度的靈活性和強大的性能使研究者能開發(fā)所有種類的復雜神經(jīng)網(wǎng)絡架構(gòu)以及其它機器學習算法。然而,相比使用高級 API 如 Keras 或 MxNet,靈活性的代價是更長的建模時間。盡管如此,我相信 TensorFlow 將繼續(xù)發(fā)展,并成為神經(jīng)網(wǎng)路和和深度學習開發(fā)的研究和實際應用的現(xiàn)實標準。我們很多客戶都已經(jīng)在使用 TensorFlow,或正在開發(fā)應用 TensorFlow 模型的項目。我們的 STATWORX 的數(shù)據(jù)科學顧問(https://www.statworx.com/de/data-science/)基本都是用 TensorFlow 研究課開發(fā)深度學習以及神經(jīng)網(wǎng)絡。
谷歌未來針對 TensorFlow 的計劃會是什么呢?至少在我看來,TensorFlow 缺少一個簡潔的圖形用戶界面,用于在 TensorFlow 后端設計和開發(fā)神經(jīng)網(wǎng)絡架構(gòu)。也許這就是谷歌未來的一個目標:)
原文鏈接:https://medium.com/mlreview/a-simple-deep-learning-model-for-stock-price-prediction-using-tensorflow-30505541d877
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報表系統(tǒng)等全方位知識
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4677.html
摘要:對于以比特幣為首的數(shù)字貨幣近期的表現(xiàn),只能用瘋狂來形容。比特幣的成交記錄就是事件序列上的加個數(shù)據(jù),可以基于過去的成交記錄序列來對未來的價格作出預測,和的模型比較合適。最后采用了,用爬取,它包含比特幣的個交易記錄。 簡介 TensorFlow-Bitcoin-Robot:一個基于 TensorFlow LSTM 模型的 Bitcoin 價格預測機器人。 文章包括一下幾個部分:1.為什么要...
閱讀 2805·2021-11-17 09:33
閱讀 2185·2021-09-03 10:40
閱讀 548·2019-08-29 18:45
閱讀 2969·2019-08-29 16:21
閱讀 622·2019-08-29 11:11
閱讀 3406·2019-08-26 12:00
閱讀 2959·2019-08-23 18:19
閱讀 1101·2019-08-23 12:18