欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)

系統(tǒng) 1670 0

時(shí)間序列模型

時(shí)間序列預(yù)測分析就是利用過去一段時(shí)間內(nèi)某事件時(shí)間的特征來預(yù)測未來一段時(shí)間內(nèi)該事件的特征。這是一類相對比較復(fù)雜的預(yù)測建模問題,和回歸分析模型的預(yù)測不同,時(shí)間序列模型是依賴于事件發(fā)生的先后順序的,同樣大小的值改變順序后輸入模型產(chǎn)生的結(jié)果是不同的。
舉個(gè)栗子:根據(jù)過去兩年某股票的每天的股價(jià)數(shù)據(jù)推測之后一周的股價(jià)變化;根據(jù)過去2年某店鋪每周想消費(fèi)人數(shù)預(yù)測下周來店消費(fèi)的人數(shù)等等

RNN 和 LSTM 模型

時(shí)間序列模型最常用最強(qiáng)大的的工具就是遞歸神經(jīng)網(wǎng)絡(luò)(recurrent neural network, RNN)。相比與普通神經(jīng)網(wǎng)絡(luò)的各計(jì)算結(jié)果之間相互獨(dú)立的特點(diǎn),RNN的每一次隱含層的計(jì)算結(jié)果都與當(dāng)前輸入以及上一次的隱含層結(jié)果相關(guān)。通過這種方法,RNN的計(jì)算結(jié)果便具備了記憶之前幾次結(jié)果的特點(diǎn)。

典型的RNN網(wǎng)路結(jié)構(gòu)如下:

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第1張圖片

右側(cè)為計(jì)算時(shí)便于理解記憶而產(chǎn)開的結(jié)構(gòu)。簡單說,x為輸入層,o為輸出層,s為隱含層,而t指第幾次的計(jì)算;V,W,U為權(quán)重,其中計(jì)算第t次的隱含層狀態(tài)時(shí)為St = f(U*Xt + W*St-1),實(shí)現(xiàn)當(dāng)前輸入結(jié)果與之前的計(jì)算掛鉤的目的。對RNN想要更深入的了解可以戳這里。

RNN的局限:
由于RNN模型如果需要實(shí)現(xiàn)長期記憶的話需要將當(dāng)前的隱含態(tài)的計(jì)算與前n次的計(jì)算掛鉤,即St = f(U*Xt + W1*St-1 + W2*St-2 + ... + Wn*St-n),那樣的話計(jì)算量會(huì)呈指數(shù)式增長,導(dǎo)致模型訓(xùn)練的時(shí)間大幅增加,因此RNN模型一般直接用來進(jìn)行長期記憶計(jì)算。

LSTM模型
LSTM(Long Short-Term Memory)模型是一種RNN的變型,最早由Juergen Schmidhuber提出的。經(jīng)典的LSTM模型結(jié)構(gòu)如下:

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第2張圖片

LSTM的特點(diǎn)就是在RNN結(jié)構(gòu)以外添加了各層的閥門節(jié)點(diǎn)。閥門有3類:遺忘閥門(forget gate),輸入閥門(input gate)和輸出閥門(output gate)。這些閥門可以打開或關(guān)閉,用于將判斷模型網(wǎng)絡(luò)的記憶態(tài)(之前網(wǎng)絡(luò)的狀態(tài))在該層輸出的結(jié)果是否達(dá)到閾值從而加入到當(dāng)前該層的計(jì)算中。如圖中所示,閥門節(jié)點(diǎn)利用sigmoid函數(shù)將網(wǎng)絡(luò)的記憶態(tài)作為輸入計(jì)算;如果輸出結(jié)果達(dá)到閾值則將該閥門輸出與當(dāng)前層的的計(jì)算結(jié)果相乘作為下一層的輸入(PS:這里的相乘是在指矩陣中的逐元素相乘);如果沒有達(dá)到閾值則將該輸出結(jié)果遺忘掉。每一層包括閥門節(jié)點(diǎn)的權(quán)重都會(huì)在每一次模型反向傳播訓(xùn)練過程中更新。更具體的LSTM的判斷計(jì)算過程如下圖所示:

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第3張圖片

LSTM模型的記憶功能就是由這些閥門節(jié)點(diǎn)實(shí)現(xiàn)的。當(dāng)閥門打開的時(shí)候,前面模型的訓(xùn)練結(jié)果就會(huì)關(guān)聯(lián)到當(dāng)前的模型計(jì)算,而當(dāng)閥門關(guān)閉的時(shí)候之前的計(jì)算結(jié)果就不再影響當(dāng)前的計(jì)算。因此,通過調(diào)節(jié)閥門的開關(guān)我們就可以實(shí)現(xiàn)早期序列對最終結(jié)果的影響。而當(dāng)你不不希望之前結(jié)果對之后產(chǎn)生影響,比如自然語言處理中的開始分析新段落或新章節(jié),那么把閥門關(guān)掉即可。(對LSTM想要更具體的了解可以戳這里)

下圖具體演示了閥門是如何工作的:通過閥門控制使序列第1的輸入的變量影響到了序列第4,6的的變量計(jì)算結(jié)果。

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第4張圖片

黑色實(shí)心圓代表對該節(jié)點(diǎn)的計(jì)算結(jié)果輸出到下一層或下一次計(jì)算;空心圓則表示該節(jié)點(diǎn)的計(jì)算結(jié)果沒有輸入到網(wǎng)絡(luò)或者沒有從上一次收到信號。

Python中實(shí)現(xiàn)LSTM模型搭建

Python中有不少包可以直接調(diào)用來構(gòu)建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳這里)。這里我們選用keras。(PS:如果操作系統(tǒng)用的linux或者mac,強(qiáng)推Tensorflow!!!)

因?yàn)長STM神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練可以通過調(diào)整很多參數(shù)來優(yōu)化,例如activation函數(shù),LSTM層數(shù),輸入輸出的變量維度等,調(diào)節(jié)過程相當(dāng)復(fù)雜。這里只舉一個(gè)最簡單的應(yīng)用例子來描述LSTM的搭建過程。

應(yīng)用實(shí)例

基于某家店的某顧客的歷史消費(fèi)的時(shí)間推測該顧客前下次來店的時(shí)間。具體數(shù)據(jù)如下所示:

            
消費(fèi)時(shí)間
2015-05-15 14:03:51
2015-05-15 15:32:46
2015-06-28 18:00:17
2015-07-16 21:27:18
2015-07-16 22:04:51
2015-09-08 14:59:56
..
..
          

具體操作:

1. 原始數(shù)據(jù)轉(zhuǎn)化

首先需要將時(shí)間點(diǎn)數(shù)據(jù)進(jìn)行數(shù)值化。將具體時(shí)間轉(zhuǎn)化為時(shí)間段用于表示該用戶相鄰兩次消費(fèi)的時(shí)間間隔,然后再導(dǎo)入模型進(jìn)行訓(xùn)練是比較常用的手段。轉(zhuǎn)化后的數(shù)據(jù)如下:

            
消費(fèi)間隔
0
44
18
0
54
..
..
          

2.生成模型訓(xùn)練數(shù)據(jù)集(確定訓(xùn)練集的窗口長度)

這里的窗口指需要幾次消費(fèi)間隔用來預(yù)測下一次的消費(fèi)間隔。這里我們先采用窗口長度為3, 即用t-2, t-1,t次的消費(fèi)間隔進(jìn)行模型訓(xùn)練,然后用t+1次間隔對結(jié)果進(jìn)行驗(yàn)證。數(shù)據(jù)集格式如下:X為訓(xùn)練數(shù)據(jù),Y為驗(yàn)證數(shù)據(jù)。
PS: 這里說確定也不太合適,因?yàn)榇翱陂L度需要根據(jù)模型驗(yàn)證結(jié)果進(jìn)行調(diào)整的。

            
X1  X2  X3  Y
0  44  18  0
44  18  0  54
..
..  
          

注:直接這樣預(yù)測一般精度會(huì)比較差,可以把預(yù)測值Y根據(jù)數(shù)值bin到幾類,然后用轉(zhuǎn)換成one-hot標(biāo)簽再來訓(xùn)練會(huì)比較好。比如如果把Y按數(shù)值范圍分到五類(1:0-20,2:20-40,3:40-60,4:60-80,5:80-100)上式可化為:

            
X1  X2  X3  Y
0  44  18  0
44  18  0  4
... 
          

Y轉(zhuǎn)化成one-hot以后則是(關(guān)于one-hot編碼可以參考這里)

            
1  0  0  0  0
0  0  0  0  1
...
          

3. 網(wǎng)絡(luò)模型結(jié)構(gòu)的確定和調(diào)整

這里我們使用python的keras庫。(用java的同學(xué)可以參考下deeplearning4j這個(gè)庫)。網(wǎng)絡(luò)的訓(xùn)練過程設(shè)計(jì)到許多參數(shù)的調(diào)整:比如

需要確定LSTM模塊的激活函數(shù)(activation fucntion)(keras中默認(rèn)的是tanh);

確定接收LSTM輸出的完全連接人工神經(jīng)網(wǎng)絡(luò)(fully-connected artificial neural network)的激活函數(shù)(keras中默認(rèn)為linear);

確定每一層網(wǎng)絡(luò)節(jié)點(diǎn)的舍棄率(為了防止過度擬合(overfit)),這里我們默認(rèn)值設(shè)定為0.2;

確定誤差的計(jì)算方式,這里我們使用均方誤差(mean squared error);

確定權(quán)重參數(shù)的迭代更新方式,這里我們采用RMSprop算法,通常用于RNN網(wǎng)絡(luò)。確定模型訓(xùn)練的epoch和batch size(關(guān)于模型的這兩個(gè)參數(shù)具體解釋戳這里)

一般來說LSTM模塊的層數(shù)越多(一般不超過3層,再多訓(xùn)練的時(shí)候就比較難收斂),對高級別的時(shí)間表示的學(xué)習(xí)能力越強(qiáng);同時(shí),最后會(huì)加一層普通的神經(jīng)網(wǎng)路層用于輸出結(jié)果的降維。典型結(jié)構(gòu)如下:

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第5張圖片

如果需要將多個(gè)序列進(jìn)行同一個(gè)模型的訓(xùn)練,可以將序列分別輸入到獨(dú)立的LSTM模塊然后輸出結(jié)果合并后輸入到普通層。結(jié)構(gòu)如下:

Python中利用LSTM模型進(jìn)行時(shí)間序列預(yù)測分析的實(shí)現(xiàn)_第6張圖片

4. 模型訓(xùn)練和結(jié)果預(yù)測

將上述數(shù)據(jù)集按4:1的比例隨機(jī)拆分為訓(xùn)練集和驗(yàn)證集,這是為了防止過度擬合。訓(xùn)練模型。然后將數(shù)據(jù)的X列作為參數(shù)導(dǎo)入模型便可得到預(yù)測值,與實(shí)際的Y值相比便可得到該模型的優(yōu)劣。

實(shí)現(xiàn)代碼

時(shí)間間隔序列格式化成所需的訓(xùn)練集格式

            
import pandas as pd
import numpy as np

def create_interval_dataset(dataset, look_back):
  """
  :param dataset: input array of time intervals
  :param look_back: each training set feature length
  :return: convert an array of values into a dataset matrix.
  """
  dataX, dataY = [], []
  for i in range(len(dataset) - look_back):
    dataX.append(dataset[i:i+look_back])
    dataY.append(dataset[i+look_back])
  return np.asarray(dataX), np.asarray(dataY)

df = pd.read_csv("path-to-your-time-interval-file")  
dataset_init = np.asarray(df)  # if only 1 column
dataX, dataY = create_interval_dataset(dataset, lookback=3)  # look back if the training set sequence length
          

這里的輸入數(shù)據(jù)來源是csv文件,如果輸入數(shù)據(jù)是來自數(shù)據(jù)庫的話可以參考這里

LSTM網(wǎng)絡(luò)結(jié)構(gòu)搭建

            
import pandas as pd
import numpy as np
import random
from keras.models import Sequential, model_from_json
from keras.layers import Dense, LSTM, Dropout

class NeuralNetwork():
  def __init__(self, **kwargs):
    """
    :param **kwargs: output_dim=4: output dimension of LSTM layer; activation_lstm='tanh': activation function for LSTM layers; activation_dense='relu': activation function for Dense layer; activation_last='sigmoid': activation function for last layer; drop_out=0.2: fraction of input units to drop; np_epoch=10, the number of epoches to train the model. epoch is one forward pass and one backward pass of all the training examples; batch_size=32: number of samples per gradient update. The higher the batch size, the more memory space you'll need; loss='mean_square_error': loss function; optimizer='rmsprop'
    """
    self.output_dim = kwargs.get('output_dim', 8)
    self.activation_lstm = kwargs.get('activation_lstm', 'relu')
    self.activation_dense = kwargs.get('activation_dense', 'relu')
    self.activation_last = kwargs.get('activation_last', 'softmax')  # softmax for multiple output
    self.dense_layer = kwargs.get('dense_layer', 2)   # at least 2 layers
    self.lstm_layer = kwargs.get('lstm_layer', 2)
    self.drop_out = kwargs.get('drop_out', 0.2)
    self.nb_epoch = kwargs.get('nb_epoch', 10)
    self.batch_size = kwargs.get('batch_size', 100)
    self.loss = kwargs.get('loss', 'categorical_crossentropy')
    self.optimizer = kwargs.get('optimizer', 'rmsprop')

    def NN_model(self, trainX, trainY, testX, testY):
    """
    :param trainX: training data set
    :param trainY: expect value of training data
    :param testX: test data set
    :param testY: epect value of test data
    :return: model after training
    """
    print "Training model is LSTM network!"
    input_dim = trainX[1].shape[1]
    output_dim = trainY.shape[1] # one-hot label
    # print predefined parameters of current model:
    model = Sequential()
    # applying a LSTM layer with x dim output and y dim input. Use dropout parameter to avoid overfitting
    model.add(LSTM(output_dim=self.output_dim,
            input_dim=input_dim,
            activation=self.activation_lstm,
            dropout_U=self.drop_out,
            return_sequences=True))
    for i in range(self.lstm_layer-2):
      model.add(LSTM(output_dim=self.output_dim,
            input_dim=self.output_dim,
            activation=self.activation_lstm,
            dropout_U=self.drop_out,
            return_sequences=True))
    # argument return_sequences should be false in last lstm layer to avoid input dimension incompatibility with dense layer
    model.add(LSTM(output_dim=self.output_dim,
            input_dim=self.output_dim,
            activation=self.activation_lstm,
            dropout_U=self.drop_out))
    for i in range(self.dense_layer-1):
      model.add(Dense(output_dim=self.output_dim,
            activation=self.activation_last))
    model.add(Dense(output_dim=output_dim,
            input_dim=self.output_dim,
            activation=self.activation_last))
    # configure the learning process
    model.compile(loss=self.loss, optimizer=self.optimizer, metrics=['accuracy'])
    # train the model with fixed number of epoches
    model.fit(x=trainX, y=trainY, nb_epoch=self.nb_epoch, batch_size=self.batch_size, validation_data=(testX, testY))
    # store model to json file
    model_json = model.to_json()
    with open(model_path, "w") as json_file:
      json_file.write(model_json)
    # store model weights to hdf5 file
    if model_weight_path:
      if os.path.exists(model_weight_path):
        os.remove(model_weight_path)
      model.save_weights(model_weight_path) # eg: model_weight.h5
    return model
          

這里寫的只涉及LSTM網(wǎng)絡(luò)的結(jié)構(gòu)搭建,至于如何把數(shù)據(jù)處理規(guī)范化成網(wǎng)絡(luò)所需的結(jié)構(gòu)以及把模型預(yù)測結(jié)果與實(shí)際值比較統(tǒng)計(jì)的可視化,就需要根據(jù)實(shí)際情況做調(diào)整了。具體腳本可以參考下這個(gè)

參考文檔:

[力推]: Understanding LSTMs

Keras Documnet

What is batch size in neural network?

Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras

Save Your Neural Network Model to JSON

RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 ?C INTRODUCTION TO RNNS

A Beginner's Guide to Recurrent Networks and LSTMs

Pybrain time series prediction using LSTM recurrent nets

PyBrain Document

Recurrent neural network for predicting next value in a sequence

What are some good Python libraries that implement LSTM networks?

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成年网站在线观看 | 成人网在线播放 | 在线一区二区三区 | 91精品国产综合久久久久久 | 欧美激情精品久久久久久黑人 | 清纯唯美第一页 | 欧洲a老妇女黄大片 | 欧美亚洲另类在线 | 亚洲第一页在线播放 | 五月婷婷综合激情网 | 极品xxxx欧美一区二区 | 午夜伦4480yy私人影院 | 日韩高清一区二区 | 日本人69视频jizz免费看 | a级欧美片免费观看 | 国产高清在线精品免费 | 日韩福利片| 超级碰碰碰免费视频 | 日本三级2018亚洲视频 | 一区二区三区视频免费 | 亚洲国产精品久久 | 青娱乐免费 | 日韩成人免费av | 色播视频在线播放 | 日韩一区二区在线视频 | 79thz.com| 超级在线牛碰碰视频 | 视频精品久久 | 日本玖玖| 91免费官网 | 可以直接看的毛片 | 古代级a毛片免费观看 | 亚洲国产精品一区 | 欧美a级v片不卡在线观看 | 午夜亚洲国产成人不卡在线 | 一区二区在线 | 亚洲一区二区三区高清 | 久久精品国产久精国产 | 麻豆精品国产自产在线 | 日韩高清一区二区 | 国产高清在线视频 |