欧美中文字幕第一页-欧美中文字幕一区-欧美中文字幕一区二区三区-欧美中文字幕在线-欧美中文字幕在线播放-欧美中文字幕在线视频

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

我是創(chuàng)始人李巖:很抱歉!給自己產(chǎn)品做個(gè)廣告,點(diǎn)擊進(jìn)來(lái)看看。  

雷鋒網(wǎng) (公眾號(hào):雷鋒網(wǎng)) 按:本文作者 何之源 ,原文載于知乎專欄 AI Insight ,雷鋒網(wǎng)獲其授權(quán)發(fā)布。

前言

如何用TensorFlow結(jié)合LSTM來(lái)做時(shí)間序列預(yù)測(cè)其實(shí)是一個(gè)很老的話題,然而卻一直沒(méi)有得到比較好的解決。如果在Github上搜索“tensorflow time series”,會(huì)發(fā)現(xiàn)star數(shù)最高的 tgjeon/TensorFlow-Tutorials-for-Time-Series 已經(jīng)和TF 1.0版本不兼容了,并且其他的項(xiàng)目使用的方法也各有不同,比較混亂。

在剛剛發(fā)布的TensorFlow 1.3版本中,引入了一個(gè)TensorFlow Time Series模塊(源碼地址為: tensorflow/tensorflow ,以下簡(jiǎn)稱為T(mén)FTS)。TFTS專門(mén)設(shè)計(jì)了一套針對(duì)時(shí)間序列預(yù)測(cè)問(wèn)題的API,目前提供AR、Anomaly Mixture AR、LSTM三種預(yù)測(cè)模型。

由于是剛剛發(fā)布的庫(kù),文檔還是比較缺乏的,我通過(guò)研究源碼,大體搞清楚了這個(gè)庫(kù)的設(shè)計(jì)邏輯和使用方法,這篇文章是一篇教程帖,會(huì)詳細(xì)的介紹TFTS庫(kù)的以下幾個(gè)功能:

  • 讀入時(shí)間序列數(shù)據(jù)(分為從numpy數(shù)組和csv文件兩種方式)

  • 用AR模型對(duì)時(shí)間序列進(jìn)行預(yù)測(cè)

  • 用LSTM模型對(duì)時(shí)間序列進(jìn)行預(yù)測(cè)(包含單變量和多變量)

先上效果圖,使用AR模型預(yù)測(cè)的效果如下圖所示,藍(lán)色線是訓(xùn)練數(shù)據(jù),綠色為模型擬合數(shù)據(jù),紅色線為預(yù)測(cè)值:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

使用LSTM進(jìn)行單變量時(shí)間序列預(yù)測(cè):

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

使用LSTM進(jìn)行多變量時(shí)間序列預(yù)測(cè)(每一條線代表一個(gè)變量):

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

文中涉及的所有代碼已經(jīng)保存在Github上了,地址是: hzy46/TensorFlow-Time-Series-Examples ,以下提到的所有代碼和文件都是相對(duì)于這個(gè)項(xiàng)目的根目錄來(lái)說(shuō)的。

時(shí)間序列問(wèn)題的一般形式

一般地,時(shí)間序列數(shù)據(jù)可以看做由兩部分組成: 觀察的時(shí)間點(diǎn)觀察到的值 。以商品價(jià)格為例,某年一月的價(jià)格為120元,二月的價(jià)格為130元,三月的價(jià)格為135元,四月的價(jià)格為132元。那么觀察的時(shí)間點(diǎn)可以看做是1,2,3,4,而在各時(shí)間點(diǎn)上觀察到的數(shù)據(jù)的值為120,130,135,132。

從Numpy數(shù)組中讀入時(shí)間序列數(shù)據(jù)

如何將這樣的時(shí)間序列數(shù)據(jù)讀入進(jìn)來(lái)?TFTS庫(kù)中提供了兩個(gè)方便的讀取器NumpyReader和CSVReader。前者用于從Numpy數(shù)組中讀入數(shù)據(jù),后者則可以從CSV文件中讀取數(shù)據(jù)。

我們利用np.sin,生成一個(gè)實(shí)驗(yàn)用的時(shí)間序列數(shù)據(jù),這個(gè)時(shí)間序列數(shù)據(jù)實(shí)際上就是在正弦曲線上加上了上升的趨勢(shì)和一些隨機(jī)的噪聲:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

如圖:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

橫坐標(biāo)對(duì)應(yīng)變量“x”,縱坐標(biāo)對(duì)應(yīng)變量“y”,它們就是我們之前提到過(guò)的“觀察的時(shí)間點(diǎn)”以及“觀察到的值”。TFTS讀入x和y的方式非常簡(jiǎn)單,請(qǐng)看下面的代碼:

data={

? ? tf.contrib.timeseries.TrainEvalFeatures.TIMES:x,

? ? tf.contrib.timeseries.TrainEvalFeatures.VALUES:y,

}


reader=NumpyReader(data)

我們首先把x和y變成python中的詞典(變量data)。變量data中的鍵值tf.contrib.timeseries.TrainEvalFeatures.TIMES實(shí)際就是一個(gè)字符串“times”,而tf.contrib.timeseries.TrainEvalFeatures.VALUES就是字符串”values”。所以上面的定義直接寫(xiě)成“data = {‘times’:x, ‘values’:y}”也是可以的。寫(xiě)成比較復(fù)雜的形式是為了和源碼中的寫(xiě)法保持一致。

得到的reader有一個(gè)read_full()方法,它的返回值就是時(shí)間序列對(duì)應(yīng)的Tensor,我們可以用下面的代碼試驗(yàn)一下:

with tf.Session() as sess:

? ? full_data=reader.read_full()

? ? # 調(diào)用read_full方法會(huì)生成讀取隊(duì)列

? ? # 要用tf.train.start_queue_runners啟動(dòng)隊(duì)列才能正常進(jìn)行讀取

? ? coord=tf.train.Coordinator()

? ? threads=tf.train.start_queue_runners(sess=sess,coord=coord)

? ? print(sess.run(full_data))

? ? coord.request_stop()

不能直接使用sess.run(reader.read_full())來(lái)從reader中取出所有數(shù)據(jù)。原因在于read_full()方法會(huì)產(chǎn)生讀取隊(duì)列,而隊(duì)列的線程此時(shí)還沒(méi)啟動(dòng),我們需要使用tf.train.start_queue_runners啟動(dòng)隊(duì)列,才能使用sess.run()來(lái)獲取值。

我們?cè)谟?xùn)練時(shí),通常不會(huì)使用整個(gè)數(shù)據(jù)集進(jìn)行訓(xùn)練,而是采用batch的形式。從reader出發(fā),建立batch數(shù)據(jù)的方法也很簡(jiǎn)單:

train_input_fn=tf.contrib.timeseries.RandomWindowInputFn(

? ? reader,batch_size=2,window_size=10)

tf.contrib.timeseries.RandomWindowInputFn會(huì)在reader的所有數(shù)據(jù)中,隨機(jī)選取窗口長(zhǎng)度為window_size的序列,并包裝成batch_size大小的batch數(shù)據(jù)。 換句話說(shuō),一個(gè)batch內(nèi)共有batch_size個(gè)序列,每個(gè)序列的長(zhǎng)度為window_size。

以batch_size=2, window_size=10為例,我們可以打出一個(gè)batch內(nèi)的數(shù)據(jù):

with tf.Session() as sess:

? ? batch_data=train_input_fn.create_batch()

? ? coord=tf.train.Coordinator()

? ? threads=tf.train.start_queue_runners(sess=sess,coord=coord)

? ? one_batch=sess.run(batch_data[0])

? ? coord.request_stop()


print('one_batch_data:',one_batch)

這部分讀入代碼的地址為 https://github.com/hzy46/TensorFlow-Time-Series-Examples/blob/master/test_input_array.py

從CSV文件中讀入時(shí)間序列數(shù)據(jù)

有的時(shí)候,時(shí)間序列數(shù)據(jù)是存在CSV文件中的。我們當(dāng)然可以將其先讀入為Numpy數(shù)組,再使用之前的方法處理。更方便的做法是使用tf.contrib.timeseries.CSVReader讀入。項(xiàng)目中提供了一個(gè) test_input_csv.py 代碼,示例如何將文件./data/period_trend.csv中的時(shí)間序列讀入進(jìn)來(lái)。

假設(shè)CSV文件的時(shí)間序列數(shù)據(jù)形式為:

1,-0.6656603714

2,-0.1164380359

3,0.7398626488

4,0.7368633029

5,0.2289480898

6,2.257073255

7,3.023457405

8,2.481161007

9,3.773638612

10,5.059257738

11,3.553186083

CSV文件的第一列為時(shí)間點(diǎn),第二列為該時(shí)間點(diǎn)上觀察到的值。將其讀入的方法為:

#?coding:?utf-8

from__future__import print_function

import tensorflow as tf


csv_file_name='./data/period_trend.csv'

reader=tf.contrib.timeseries.CSVReader(csv_file_name)

從reader建立batch數(shù)據(jù)形成train_input_fn的方法和之前完全一樣。下面我們就利用這個(gè)train_input_fn來(lái)訓(xùn)練模型。

使用AR模型預(yù)測(cè)時(shí)間序列

自回歸模型(Autoregressive model,可以簡(jiǎn)稱為AR模型)是統(tǒng)計(jì)學(xué)上處理時(shí)間序列模型的基本方法之一。在TFTS中,已經(jīng)實(shí)現(xiàn)了一個(gè)自回歸模型。使用AR模型訓(xùn)練、驗(yàn)證并進(jìn)行時(shí)間序列預(yù)測(cè)的示例程序?yàn)? train_array.py 。

先建立一個(gè)train_input_fn:

x=np.array(range(1000))

noise=np.random.uniform(-0.2,0.2,1000)

y=np.sin(np.pi*x/100)+x/200.+noise

plt.plot(x,y)

plt.savefig('timeseries_y.jpg')


data={

? ? tf.contrib.timeseries.TrainEvalFeatures.TIMES:x,

? ? tf.contrib.timeseries.TrainEvalFeatures.VALUES:y,

}


reader=NumpyReader(data)


train_input_fn=tf.contrib.timeseries.RandomWindowInputFn(

? ? reader,batch_size=16,window_size=40)

針對(duì)這個(gè)序列,對(duì)應(yīng)的AR模型的定義就是:

ar=tf.contrib.timeseries.ARRegressor(

? ? periodicities=200,input_window_size=30,output_window_size=10,

? ? num_features=1,

? ? loss=tf.contrib.timeseries.ARModel.NORMAL_LIKELIHOOD_LOSS)

這里的幾個(gè)參數(shù)比較重要,分別給出解釋。第一個(gè)參數(shù)periodicities表示序列的規(guī)律性周期。我們?cè)诙x數(shù)據(jù)時(shí)使用的語(yǔ)句是:“y = np.sin(np.pi * x / 100) + x / 200. + noise”,因此周期為200。input_window_size表示模型每次輸入的值,output_window_size表示模型每次輸出的值。 input_window_size和output_window_size加起來(lái)必須等于train_input_fn中總的window_size 。在這里,我們總的window_size為40,input_window_size為30,output_window_size為10,也就是說(shuō),一個(gè)batch內(nèi)每個(gè)序列的長(zhǎng)度為40,其中前30個(gè)數(shù)被當(dāng)作模型的輸入值,后面10個(gè)數(shù)為這些輸入對(duì)應(yīng)的目標(biāo)輸出值。最后一個(gè)參數(shù)loss指定采取哪一種損失,一共有兩種損失可以選擇,分別是NORMAL_LIKELIHOOD_LOSS和SQUARED_LOSS。

num_features參數(shù)表示在一個(gè)時(shí)間點(diǎn)上觀察到的數(shù)的維度。我們這里每一步都是一個(gè)單獨(dú)的值,所以num_features=1。

除了程序中出現(xiàn)的幾個(gè)參數(shù)外,還有一個(gè)比較重要的參數(shù)是model_dir。它表示模型訓(xùn)練好后保存的地址,如果不指定的話,就會(huì)隨機(jī)分配一個(gè)臨時(shí)地址。

使用變量ar的train方法可以直接進(jìn)行訓(xùn)練:

ar.train(input_fn=train_input_fn,?steps=6000)

TFTS中驗(yàn)證(evaluation)的含義是:使用訓(xùn)練好的模型在原先的訓(xùn)練集上進(jìn)行計(jì)算,由此我們可以觀察到模型的擬合效果,對(duì)應(yīng)的程序段是:

evaluation_input_fn=tf.contrib.timeseries.WholeDatasetInputFn(reader)

evaluation=ar.evaluate(input_fn=evaluation_input_fn,steps=1)

如果要理解這里的邏輯,首先要理解之前定義的AR模型:它每次都接收一個(gè)長(zhǎng)度為30的輸入觀測(cè)序列,并輸出長(zhǎng)度為10的預(yù)測(cè)序列。整個(gè)訓(xùn)練集是一個(gè)長(zhǎng)度為1000的序列,前30個(gè)數(shù)首先被當(dāng)作“初始觀測(cè)序列”輸入到模型中,由此就可以計(jì)算出下面10步的預(yù)測(cè)值。接著又會(huì)取30個(gè)數(shù)進(jìn)行預(yù)測(cè),這30個(gè)數(shù)中有10個(gè)數(shù)就是前一步的預(yù)測(cè)值,新得到的預(yù)測(cè)值又會(huì)變成下一步的輸入,以此類推。

最終我們得到970個(gè)預(yù)測(cè)值(970=1000-30,因?yàn)榍?0個(gè)數(shù)是沒(méi)辦法進(jìn)行預(yù)測(cè)的)。這970個(gè)預(yù)測(cè)值就被記錄在evaluation[‘mean’]中。evaluation還有其他幾個(gè)鍵值,如evaluation[‘loss’]表示總的損失,evaluation[‘times’]表示evaluation[‘mean’]對(duì)應(yīng)的時(shí)間點(diǎn)等等。

evaluation[‘start_tuple’]會(huì)被用于之后的預(yù)測(cè)中,它相當(dāng)于最后30步的輸出值和對(duì)應(yīng)的時(shí)間點(diǎn)。以此為起點(diǎn),我們可以對(duì)1000步以后的值進(jìn)行預(yù)測(cè),對(duì)應(yīng)的代碼為:

(predictions,)=tuple(ar.predict(

? ? input_fn=tf.contrib.timeseries.predict_continuation_input_fn(

? ? ? ? evaluation,steps=250)))

這里的代碼在1000步之后又像后預(yù)測(cè)了250個(gè)時(shí)間點(diǎn)。對(duì)應(yīng)的值就保存在predictions[‘mean’]中。我們可以把觀測(cè)到的值、模型擬合的值、預(yù)測(cè)值用下面的代碼畫(huà)出來(lái):

plt.figure(figsize=(15,5))

plt.plot(data['times'].reshape(-1),data['values'].reshape(-1),label='origin')

plt.plot(evaluation['times'].reshape(-1),evaluation['mean'].reshape(-1),label='evaluation')

plt.plot(predictions['times'].reshape(-1),predictions['mean'].reshape(-1),label='prediction')

plt.xlabel('time_step')

plt.ylabel('values')

plt.legend(loc=4)

plt.savefig('predict_result.jpg')

畫(huà)好的圖片會(huì)被保存為“predict_result.jpg”

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

使用LSTM預(yù)測(cè)單變量時(shí)間序列

注意:以下LSTM模型的例子必須使用TensorFlow最新的開(kāi)發(fā)版的源碼。具體來(lái)說(shuō),要保證“from tensorflow.contrib.timeseries.python.timeseries.estimators import TimeSeriesRegressor”可以成功執(zhí)行。

給出兩個(gè)用LSTM預(yù)測(cè)時(shí)間序列模型的例子,分別是 train_lstm.py 和 train_lstm_multivariate.py 。前者是在LSTM中進(jìn)行單變量的時(shí)間序列預(yù)測(cè),后者是使用LSTM進(jìn)行多變量時(shí)間序列預(yù)測(cè)。為了使用LSTM模型,我們需要先使用TFTS庫(kù)對(duì)其進(jìn)行定義,定義模型的代碼來(lái)源于 TFTS的示例源碼 ,在train_lstm.py和train_lstm_multivariate.py中分別拷貝了一份。

我們同樣用函數(shù)加噪聲的方法生成一個(gè)模擬的時(shí)間序列數(shù)據(jù):

x=np.array(range(1000))

noise=np.random.uniform(-0.2,0.2,1000)

y=np.sin(np.pi*x/50)+np.cos(np.pi*x/50)+np.sin(np.pi*x/25)+noise


data={

? ? tf.contrib.timeseries.TrainEvalFeatures.TIMES:x,

? ? tf.contrib.timeseries.TrainEvalFeatures.VALUES:y,

}


reader=NumpyReader(data)


train_input_fn=tf.contrib.timeseries.RandomWindowInputFn(

? ? reader,batch_size=4,window_size=100)

此處y對(duì)x的函數(shù)關(guān)系比之前復(fù)雜,因此更適合用LSTM這樣的模型找出其中的規(guī)律。得到y(tǒng)和x后,使用NumpyReader讀入為T(mén)ensor形式,接著用tf.contrib.timeseries.RandomWindowInputFn將其變?yōu)閎atch訓(xùn)練數(shù)據(jù)。一個(gè)batch中有4個(gè)隨機(jī)選取的序列,每個(gè)序列的長(zhǎng)度為100。

接下來(lái)我們定義一個(gè)LSTM模型:

estimator=ts_estimators.TimeSeriesRegressor(

? ? model=_LSTMModel(num_features=1,num_units=128),

? ? optimizer=tf.train.AdamOptimizer(0.001))

num_features = 1表示單變量時(shí)間序列,即每個(gè)時(shí)間點(diǎn)上觀察到的量只是一個(gè)單獨(dú)的數(shù)值。num_units=128表示使用隱層為128大小的LSTM模型。

訓(xùn)練、驗(yàn)證和預(yù)測(cè)的方法都和之前類似。在訓(xùn)練時(shí),我們?cè)谝延械?000步的觀察量的基礎(chǔ)上向后預(yù)測(cè)200步:

estimator.train(input_fn=train_input_fn,steps=2000)

evaluation_input_fn=tf.contrib.timeseries.WholeDatasetInputFn(reader)

evaluation=estimator.evaluate(input_fn=evaluation_input_fn,steps=1)

#?Predict?starting?after?the?evaluation

(predictions,)=tuple(estimator.predict(

? ? input_fn=tf.contrib.timeseries.predict_continuation_input_fn(

? ? ? ? evaluation,steps=200)))

將驗(yàn)證、預(yù)測(cè)的結(jié)果取出并畫(huà)成示意圖,畫(huà)出的圖像會(huì)保存成“predict_result.jpg”文件:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

使用LSTM預(yù)測(cè)多變量時(shí)間序列

所謂多變量時(shí)間序列,就是指在每個(gè)時(shí)間點(diǎn)上的觀測(cè)量有多個(gè)值。在data/multivariate_periods.csv文件中,保存了一個(gè)多變量時(shí)間序列的數(shù)據(jù):

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

這個(gè)CSV文件的第一列是觀察時(shí)間點(diǎn),除此之外,每一行還有5個(gè)數(shù),表示在這個(gè)時(shí)間點(diǎn)上的觀察到的數(shù)據(jù)。換句話說(shuō),時(shí)間序列上每一步都是一個(gè)5維的向量。

使用TFTS讀入該CSV文件的方法為:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

與之前的讀入相比,唯一的區(qū)別就是column_names參數(shù)。它告訴TFTS在CSV文件中,哪些列表示時(shí)間,哪些列表示觀測(cè)量。

接下來(lái)定義LSTM模型:

estimator=ts_estimators.TimeSeriesRegressor(

? ? model=_LSTMModel(num_features=5,num_units=128),

? ? optimizer=tf.train.AdamOptimizer(0.001))

區(qū)別在于使用num_features=5而不是1,原因在于我們?cè)诿總€(gè)時(shí)間點(diǎn)上的觀測(cè)量是一個(gè)5維向量。

訓(xùn)練、驗(yàn)證、預(yù)測(cè)以及畫(huà)圖的代碼與之前比較類似,可以參考代碼 train_lstm_multivariate.py ,此處直接給出最后的運(yùn)行結(jié)果:

如何優(yōu)雅地用TensorFlow預(yù)測(cè)時(shí)間序列:TFTS庫(kù)詳細(xì)教程

圖中前100步是訓(xùn)練數(shù)據(jù),一條線就代表觀測(cè)量在一個(gè)維度上的取值。100步之后為預(yù)測(cè)值。

總結(jié)

這篇文章詳細(xì)介紹了TensorFlow Time Series(TFTS)庫(kù)的使用方法。主要包含三個(gè)部分:數(shù)據(jù)讀入、AR模型的訓(xùn)練、LSTM模型的訓(xùn)練。文章里使用的所有代碼都保存在Github上了,地址是: hzy46/TensorFlow-Time-Series-Examples 。如果覺(jué)得有幫助,歡迎點(diǎn)贊或star~~~

雷鋒網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)。

本文被轉(zhuǎn)載1次

首發(fā)媒體 雷鋒網(wǎng) | 轉(zhuǎn)發(fā)媒體

隨意打賞

tensorflow使用tensorflow教程tensorflow庫(kù)
提交建議
微信掃一掃,分享給好友吧。
主站蜘蛛池模板: 日本免费的一级v一片 | 黄色综合网站 | 亚洲香蕉在线 | 亚洲一区高清 | 国产欧美在线观看一区二区 | 99re免费视频精品全部 | 性生活视频网址 | 成人免费国产欧美日韩你懂的 | 亚洲欧洲国产精品久久 | 久久做| 香蕉视频国产在线观看 | a毛片免费全部播放完整成 a毛片免费全部在线播放毛 | 久久精品视频2 | 一二三区 | 97se亚洲综合 | 国产免费人成在线视频视频 | 亚洲天天操| 国产婷婷高清在线观看免费 | 狠狠色丁香久久婷婷综合丁香 | 国产一级毛片午夜 | 国产综合色在线视频播放线视 | 人成精品视频三区二区一区 | 国产在线视频资源 | 国产福利在线观看永久免费 | 久久综合九色综合亚洲 | 91福利在线免费观看 | 99在线热播精品免费 | 一级毛片毛片毛片毛毛片 | 欧美夜夜 | 一本影院 | 国产精品亚洲综合久久 | 成人免费淫片免费观看 | 色综合图区| 99热国产这里只有精品99 | 日韩不卡视频在线观看 | 成人国产精品一级毛片了 | 久久久精品一区二区三区 | 久久国产一久久高清 | 一本色道久久综合亚洲精品 | 吃奶japanesevideo 处videossex第一次中 | 婷婷丁香亚洲 |