0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何基于Keras和Tensorflow用LSTM進(jìn)行時(shí)間序列預(yù)測(cè)

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-09-06 08:53 ? 次閱讀

編者按:本文將介紹如何基于Keras和Tensorflow,用LSTM進(jìn)行時(shí)間序列預(yù)測(cè)。文章數(shù)據(jù)來自股票市場(chǎng)數(shù)據(jù)集,目標(biāo)是提供股票價(jià)格的動(dòng)量指標(biāo)。

GitHub:github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

什么是LSTM?

自提出后,傳統(tǒng)神經(jīng)網(wǎng)絡(luò)架構(gòu)一直沒法解決一些基礎(chǔ)問題,比如解釋依賴于信息和上下文的輸入序列。這些信息可以是句子中的某些單詞,我們能用它們預(yù)測(cè)下一個(gè)單詞是什么;也可以是序列的時(shí)間信息,我們能基于時(shí)間元素分析句子的上下文。

簡(jiǎn)而言之,傳統(tǒng)神經(jīng)網(wǎng)絡(luò)每次只會(huì)采用獨(dú)立的數(shù)據(jù)向量,它沒有一個(gè)類似“記憶”的概念,用來處理和“記憶”有關(guān)各種任務(wù)。

為了解決這個(gè)問題,早期提出的一種方法是在網(wǎng)絡(luò)中添加循環(huán),得到輸出值后,它的輸入信息會(huì)通過循環(huán)被“繼承”到輸出中,這是它最后看到的輸入上下文。這些網(wǎng)絡(luò)被稱為遞歸神經(jīng)網(wǎng)絡(luò)(RNN)。雖然RNN在一定程度上解決了上述問題,但它們還是存在相當(dāng)大的缺陷,比如在處理長(zhǎng)期依賴性問題時(shí)容易出現(xiàn)梯度消失。

這里我們不深入探討RNN的缺陷,我們只需知道,既然RNN這么容易梯度消失,那么它就不適合大多數(shù)現(xiàn)實(shí)問題。在這個(gè)基礎(chǔ)上,Hochreiter&Schmidhuber于1997年提出了長(zhǎng)期短期記憶網(wǎng)絡(luò)(LSTM),這是一種特殊的RNN,它能使神經(jīng)元在其管道中保持上下文記憶,同時(shí)又解決了梯度消失問題。具體工作原理可讀《一文詳解LSTM網(wǎng)絡(luò)》。

上圖是LSTM的一個(gè)典型內(nèi)部示意圖,它由若干節(jié)點(diǎn)和若干操作組成。其中,操作充當(dāng)輸入門、輸出門和遺忘門,為節(jié)點(diǎn)狀態(tài)提供信息。而節(jié)點(diǎn)狀態(tài)負(fù)責(zé)在網(wǎng)絡(luò)中記錄長(zhǎng)期記憶和上下文。

一個(gè)簡(jiǎn)單的正弦曲線示例

為了演示LSTM在預(yù)測(cè)時(shí)間序列中的作用,我們先從最基礎(chǔ)的開始:一個(gè)時(shí)間序列——標(biāo)準(zhǔn)正弦曲線。

代碼數(shù)據(jù)文件夾中提供的數(shù)據(jù)包含我們創(chuàng)建的sinewave.csv文件,該文件包含5001個(gè)正弦曲線時(shí)間段,幅度和頻率為1(角頻率為6.28),時(shí)間差為0.01。它的圖像如下所示:

正弦曲線數(shù)據(jù)集

有了數(shù)據(jù),接下來就是實(shí)現(xiàn)目標(biāo)。在這個(gè)任務(wù)中,我們希望LSTM能根據(jù)提供的數(shù)據(jù)學(xué)習(xí)正弦曲線,并預(yù)測(cè)此后的N步,持續(xù)輸出曲線。

為了做到這一點(diǎn),我們需要先對(duì)CSV文件中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,把處理后的數(shù)據(jù)加載到pandas的數(shù)據(jù)框架中。之后,它會(huì)輸出numpy數(shù)組,饋送進(jìn)LSTM。Keras的LSTM一般輸入(N, W, F)三維numpy數(shù)組,其中N表示訓(xùn)練數(shù)據(jù)中的序列數(shù),W表示序列長(zhǎng)度,F(xiàn)表示每個(gè)序列的特征數(shù)。

在這個(gè)例子中,我們使用的序列長(zhǎng)度是50(讀取窗口大?。?,這意味著網(wǎng)絡(luò)能在每個(gè)序列中都觀察到完整的正弦曲線形狀,便于學(xué)習(xí)。

序列本身是滑動(dòng)窗口,因此如果我們每次只移動(dòng)1,所得圖像其實(shí)和先前的圖像是完全一樣的。下面是我們?cè)谑纠薪厝〉拇翱趫D像:

為了加載這些數(shù)據(jù),我們?cè)诖a中創(chuàng)建了一個(gè)DataLoader類。你可能會(huì)注意到,在初始化DataLoader對(duì)象時(shí),會(huì)傳入文件名、傳入確定用于訓(xùn)練與測(cè)試的數(shù)據(jù)百分比的拆分變量,以及允許選擇一列或多列數(shù)據(jù)的列變量用于單維或多維分析。

當(dāng)我們有一個(gè)允許加載數(shù)據(jù)的數(shù)據(jù)對(duì)象之后,就是時(shí)候準(zhǔn)備構(gòu)建深層神經(jīng)網(wǎng)絡(luò)模型了。我們的代碼框架利用模型類型和config.json文件,再加上存儲(chǔ)在配置文件中的架構(gòu)和超參數(shù),可以輕松構(gòu)建出模型。其中執(zhí)行構(gòu)建命令的主要函數(shù)是build_model(),它負(fù)責(zé)接收解析的配置文件。

這個(gè)函數(shù)的代碼如下所示,它可以輕松擴(kuò)展,以便用于更復(fù)雜的架構(gòu)。

加載數(shù)據(jù)并建立模型后,現(xiàn)在我們可以用訓(xùn)練數(shù)據(jù)訓(xùn)練模型。如下代碼所示,我們創(chuàng)建了一個(gè)單獨(dú)的運(yùn)行模塊,它會(huì)利用我們的模型和DataLoader一起訓(xùn)練,輸出預(yù)測(cè)結(jié)果和可視化。

對(duì)于輸出,我們會(huì)進(jìn)行兩種類型的預(yù)測(cè):一是逐點(diǎn)預(yù)測(cè),即先讓模型預(yù)測(cè)單個(gè)點(diǎn)的值,在圖中繪出位置,然后移動(dòng)滑動(dòng)窗口,用完整的測(cè)試數(shù)據(jù)預(yù)測(cè)下個(gè)點(diǎn)的值。二是預(yù)測(cè)一個(gè)完整序列,即只用訓(xùn)練數(shù)據(jù)的第一部分初始化一次訓(xùn)練窗口,然后就像逐點(diǎn)預(yù)測(cè)一樣,不斷移動(dòng)滑動(dòng)窗口并預(yù)測(cè)下一個(gè)點(diǎn)。

和第一種做法不同的是,第二種做法是在用預(yù)測(cè)所得的數(shù)據(jù)進(jìn)行預(yù)測(cè),即在第二次預(yù)測(cè)時(shí),模型所用數(shù)據(jù)中有一個(gè)數(shù)據(jù)點(diǎn)(最后一個(gè)點(diǎn))來自之前的預(yù)測(cè);第三次預(yù)測(cè)時(shí),數(shù)據(jù)中就有兩個(gè)點(diǎn)來自之前的預(yù)測(cè)……以此類推,到第50次預(yù)測(cè)時(shí),測(cè)試集里的數(shù)據(jù)已經(jīng)完全是預(yù)測(cè)的數(shù)據(jù)。這意味著模型可預(yù)測(cè)的時(shí)間序列被大大延長(zhǎng)。

逐點(diǎn)預(yù)測(cè)結(jié)果

完整序列預(yù)測(cè)結(jié)果

作為參考,你可以在下面的配置文件中看到用于正弦曲線示例的網(wǎng)絡(luò)架構(gòu)和超參數(shù)。

我們可以從上面兩幅圖中發(fā)現(xiàn),如果用第二種方法進(jìn)行預(yù)測(cè),隨著測(cè)試集中被不斷加入新的預(yù)測(cè)數(shù)據(jù)點(diǎn),模型的性能會(huì)漸漸下降,預(yù)測(cè)結(jié)果和真實(shí)結(jié)果的誤差越來越大。但正弦函數(shù)是一個(gè)非常簡(jiǎn)單的零噪聲震蕩函數(shù),總體來看,我們的模型在沒有過擬合的同時(shí)還是能很好的模型曲線大致情況的。

接下來,就讓我們?cè)诠善睌?shù)據(jù)上試試LSTM。

沒那么簡(jiǎn)單的股票市場(chǎng)

很多股民都做過這樣一個(gè)夢(mèng):如果我能準(zhǔn)確預(yù)測(cè)大盤走向,那一夜暴富豈不是手到擒來?但一覺醒來,現(xiàn)實(shí)是殘酷的,預(yù)測(cè)這件事并不像數(shù)字模擬那么簡(jiǎn)單。

和正弦曲線不同,股票市場(chǎng)的時(shí)間序列并不是某個(gè)特定靜態(tài)函數(shù)的映射,它最明顯的屬性是隨機(jī)性。真正的隨機(jī)是不可預(yù)測(cè)的,也沒有預(yù)測(cè)的價(jià)值,但是,很多人相信股票市場(chǎng)不是一個(gè)純粹的隨機(jī)市場(chǎng),它的時(shí)間序列可能存在某種隱藏模式。而根據(jù)上文的介紹,LSTM無疑是捕捉這種長(zhǎng)期依賴關(guān)系的一個(gè)好方法。

下文使用的數(shù)據(jù)是Github數(shù)據(jù)文件夾中的sp500.csv文件。此文件包含2000年1月至2018年9月的標(biāo)準(zhǔn)普爾500股票指數(shù)的開盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)以及每日交易量。

在第一個(gè)例子中,正弦曲線的取值范圍是-1到1,這和股票市場(chǎng)不同,收盤價(jià)是個(gè)不斷變化的絕對(duì)價(jià)格,這意味著如果我們不做歸一化處理就直接訓(xùn)練模型,它永遠(yuǎn)不會(huì)收斂。

為了解決這個(gè)問題,我們?cè)O(shè)訓(xùn)練/測(cè)試的滑動(dòng)窗口大小為n,對(duì)每個(gè)窗口進(jìn)行歸一化,以反映從該窗口開始的百分比變化。

n = 價(jià)格變化的歸一化列表[滑動(dòng)窗口]

p = 調(diào)整后每日利潤(rùn)的原始列表[滑動(dòng)窗口]

歸一化:ni= pi/p0- 1

反歸一化:pi= p0( ni+ 1)

處理完數(shù)據(jù)后,我們就可以和之前一樣運(yùn)行模型。但是,我們做了一個(gè)重要的修改:不使用model.train() ,而是用model.traingenerator()。這樣做是為了在處理大型數(shù)據(jù)集時(shí)節(jié)約內(nèi)存,前者會(huì)把完整數(shù)據(jù)集全部加載到內(nèi)存中,然后一個(gè)窗口一個(gè)窗口歸一化,容易內(nèi)存溢出。此外,我們還調(diào)用了Keras的fitgenerator()函數(shù),用python生成器動(dòng)態(tài)訓(xùn)練數(shù)據(jù)集來繪制數(shù)據(jù),進(jìn)一步降低內(nèi)存負(fù)擔(dān)。

在之前的例子中,逐點(diǎn)預(yù)測(cè)的結(jié)果比完整序列預(yù)測(cè)更精確,但這有點(diǎn)欺騙性。在這種情況下,除了預(yù)測(cè)點(diǎn)和最后一次預(yù)測(cè)的數(shù)據(jù)點(diǎn)之間的距離,神經(jīng)網(wǎng)絡(luò)其實(shí)不需要了解時(shí)間序列本身,因?yàn)榧幢闼@次預(yù)測(cè)錯(cuò)誤了,在進(jìn)行下一次預(yù)測(cè)時(shí),它也只會(huì)考慮真實(shí)結(jié)果,完全無視自己的錯(cuò)誤,然后繼續(xù)產(chǎn)生錯(cuò)誤預(yù)測(cè)。

雖然這聽起來不太妙,但其實(shí)這種方法還是有用的,它至少能反映下一個(gè)點(diǎn)的范圍,可用于波動(dòng)率預(yù)測(cè)等應(yīng)用。

逐點(diǎn)預(yù)測(cè)結(jié)果

接著是完整序列預(yù)測(cè),在正弦曲線那個(gè)例子中,這種方法的偏差雖然越來越大,但它還是保留了整體波動(dòng)形狀。如下圖所示,在復(fù)雜的股票價(jià)格預(yù)測(cè)中,它連這個(gè)優(yōu)勢(shì)都沒了,除了剛開始橙線略有波動(dòng),它預(yù)測(cè)的整體趨勢(shì)是一條水平線。

完整序列預(yù)測(cè)結(jié)果

最后,我們對(duì)該模型進(jìn)行了第三種預(yù)測(cè),我將其稱為多序列預(yù)測(cè)。這是完整序列預(yù)測(cè)的混合產(chǎn)物,因?yàn)樗匀皇褂脺y(cè)試數(shù)據(jù)初始化測(cè)試窗口,預(yù)測(cè)下一個(gè)點(diǎn),然后用下一個(gè)點(diǎn)創(chuàng)建一個(gè)新窗口。但是,一旦輸入窗口完全由過去預(yù)測(cè)點(diǎn)組成,它就會(huì)停止,向前移動(dòng)一個(gè)完整的窗口長(zhǎng)度,用真實(shí)的測(cè)試數(shù)據(jù)重置窗口,然后再次啟動(dòng)該過程。

實(shí)質(zhì)上,這為測(cè)試數(shù)據(jù)提供了多個(gè)趨勢(shì)線預(yù)測(cè),以便我們?cè)u(píng)估模型對(duì)未知數(shù)據(jù)的預(yù)測(cè)性能。

多序列預(yù)測(cè)結(jié)果

如上圖所示,神經(jīng)網(wǎng)絡(luò)似乎正確地預(yù)測(cè)了絕大多數(shù)時(shí)間序列的趨勢(shì)(和趨勢(shì)幅度),雖然不完美,但它確實(shí)表明LSTM在時(shí)間序列問題中確實(shí)有用武之地。

結(jié)論

雖然本文給出了LSTM應(yīng)用的一個(gè)示例,但它只觸及時(shí)間序列預(yù)測(cè)問題的表面。現(xiàn)如今,LSTM已成功應(yīng)用于眾多現(xiàn)實(shí)問題,從文本自動(dòng)糾正、異常檢測(cè)、欺詐檢測(cè)到自動(dòng)駕駛汽車技術(shù)開發(fā)。

它還存在一些局限性,特別是在金融時(shí)間序列任務(wù)上,通常這類任務(wù)很難建模。此外,一些基于注意力機(jī)制的神經(jīng)網(wǎng)絡(luò)也開始在其他任務(wù)上表現(xiàn)出超越LSTM的性能。

但截至目前,LSTM相比傳統(tǒng)神經(jīng)網(wǎng)絡(luò)還是進(jìn)步明顯,它能夠非線性地建模關(guān)系并以非線性方式處理具有多個(gè)維度的數(shù)據(jù),這是幾十年前的人們夢(mèng)寐以求的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4795

    瀏覽量

    102139
  • keras
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    6147
  • rnn
    rnn
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    7031

原文標(biāo)題:基于LSTM深層神經(jīng)網(wǎng)絡(luò)的時(shí)間序列預(yù)測(cè)

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    TensorFlow常用Python擴(kuò)展包

    TensorFlow 能夠?qū)崿F(xiàn)大部分神經(jīng)網(wǎng)絡(luò)的功能。但是,這還是不夠的。對(duì)于預(yù)處理任務(wù)、序列化甚至繪圖任務(wù),還需要更多的 Python 包。下面列出了一些常用的 Python 包:Numpy:這是
    發(fā)表于 07-28 14:35

    介紹有關(guān)時(shí)間序列預(yù)測(cè)時(shí)間序列分類

    通過之前有關(guān)LSTM的8遍基礎(chǔ)教程和10篇處理時(shí)間序列預(yù)測(cè)任務(wù)的教程介紹,使用簡(jiǎn)單的序列數(shù)據(jù)示例,已經(jīng)把
    發(fā)表于 07-12 09:18

    怎樣去搭建一套用于多步時(shí)間序列預(yù)測(cè)LSTM架構(gòu)?

    如何開發(fā)和評(píng)估家庭電力數(shù)據(jù)集的預(yù)測(cè)模型?LSTM在多步時(shí)間序列預(yù)測(cè)方面具有哪些優(yōu)勢(shì)?怎樣去搭建一套用于多步
    發(fā)表于 07-22 06:19

    自回歸滯后模型進(jìn)行多變量時(shí)間序列預(yù)測(cè)案例分享

    1、如何建立一個(gè)模型來進(jìn)行多元時(shí)間序列預(yù)測(cè)呢?  下圖顯示了關(guān)于不同類型葡萄酒銷量的月度多元時(shí)間序列。每種葡萄酒類型都是時(shí)間
    發(fā)表于 11-30 15:33

    基于SARIMA、XGBoost和CNN-LSTM時(shí)間序列預(yù)測(cè)對(duì)比

    1、基于SARIMA、XGBoost和CNN-LSTM時(shí)間序列預(yù)測(cè)對(duì)比  時(shí)間序列
    發(fā)表于 12-20 16:34

    小波回聲狀態(tài)網(wǎng)絡(luò)的時(shí)間序列預(yù)測(cè)

    為了更好的對(duì)具有多尺度特性的時(shí)間序列進(jìn)行預(yù)測(cè),運(yùn)用小波分析方法與回聲狀態(tài)網(wǎng)絡(luò)模型相結(jié)合來創(chuàng)建小波回聲狀態(tài)網(wǎng)絡(luò)預(yù)測(cè)模型。利用小波方法對(duì)原始
    發(fā)表于 01-13 11:40 ?0次下載
    小波回聲狀態(tài)網(wǎng)絡(luò)的<b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b><b class='flag-5'>預(yù)測(cè)</b>

    KerasTensorFlow究竟哪個(gè)會(huì)更好?

    Keras 依然作為一個(gè)庫,與 TensorFlow 分開,進(jìn)行獨(dú)立操作,所以仍存在未來兩者會(huì)分開的可能性;然而,我們知道 Google 官方同時(shí)支持 Keras
    的頭像 發(fā)表于 10-11 10:05 ?2.2w次閱讀

    TensorFlowKeras哪個(gè)更好用?

    作為一個(gè)庫,Keras 仍然可以單獨(dú)使用,因此未來兩者可能會(huì)分道揚(yáng)鑣。不過,因?yàn)楣雀韫俜街С?KerasTensorFlow,所以似乎不太可能出現(xiàn)這種情況。
    的頭像 發(fā)表于 10-31 09:40 ?1.1w次閱讀

    如何用Python進(jìn)行時(shí)間序列分解和預(yù)測(cè)?

    預(yù)測(cè)是一件復(fù)雜的事情,在這方面做得好的企業(yè)會(huì)在同行業(yè)中出類拔萃。時(shí)間序列預(yù)測(cè)的需求不僅存在于各類業(yè)務(wù)場(chǎng)景當(dāng)中,而且通常需要對(duì)未來幾年甚至幾分鐘之后的
    的頭像 發(fā)表于 02-14 11:34 ?2672次閱讀
    如何用Python<b class='flag-5'>進(jìn)行時(shí)間</b><b class='flag-5'>序列</b>分解和<b class='flag-5'>預(yù)測(cè)</b>?

    基于TensorFlowKeras的圖像識(shí)別

    TensorFlowKeras最常見的用途之一是圖像識(shí)別/分類。通過本文,您將了解如何使用Keras達(dá)到這一目的。定義如果您不了解圖像識(shí)別的基本概念,將很難完全理解本文的內(nèi)容。因此在正文開始之前
    的頭像 發(fā)表于 01-13 08:27 ?1030次閱讀
    基于<b class='flag-5'>TensorFlow</b>和<b class='flag-5'>Keras</b>的圖像識(shí)別

    keras模型轉(zhuǎn)tensorflow session

    在這篇文章中,我們將討論如何將Keras模型轉(zhuǎn)換為TensorFlow session。 KerasTensorFlow簡(jiǎn)介 Keras
    的頭像 發(fā)表于 07-05 09:36 ?728次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)在時(shí)間序列預(yù)測(cè)中的應(yīng)用

    時(shí)間序列預(yù)測(cè)是數(shù)據(jù)分析中的一個(gè)重要領(lǐng)域,它涉及到基于歷史數(shù)據(jù)預(yù)測(cè)未來值。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)因其在處理
    的頭像 發(fā)表于 11-13 09:54 ?1582次閱讀

    如何使用Python構(gòu)建LSTM神經(jīng)網(wǎng)絡(luò)模型

    numpy tensorflow 2. 準(zhǔn)備數(shù)據(jù) LSTM模型通常用于序列數(shù)據(jù),比如時(shí)間序列預(yù)測(cè)
    的頭像 發(fā)表于 11-13 10:10 ?1149次閱讀

    如何使用RNN進(jìn)行時(shí)間序列預(yù)測(cè)

    一種強(qiáng)大的替代方案,能夠?qū)W習(xí)數(shù)據(jù)中的復(fù)雜模式,并進(jìn)行準(zhǔn)確的預(yù)測(cè)。 RNN的基本原理 RNN是一種具有循環(huán)結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),它能夠處理序列數(shù)據(jù)。在RNN中,每個(gè)輸入序列的元素都會(huì)通過一個(gè)或
    的頭像 發(fā)表于 11-15 09:45 ?699次閱讀

    使用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè)

    使用BP(Backpropagation)神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè)是一種常見且有效的方法。以下是一個(gè)基于BP神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列
    的頭像 發(fā)表于 02-12 16:44 ?448次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品