2019deeplearn hw3 DeeplearnHW03 410535020 資管四 葉松 ###### tags: `Fundamental Deep Learning Assignments 2019` # Time Series Prediction --- # 目錄 [TOC] # 1.問題 --- In this assignment, you are given the first part of a time series, {x(t)} .1000,t=1 The goal is to design a recurrent neural network to predict the second part of the series {x(t)} which will be used for testing your network by 1500,t=1001the teacher. This testing data set would not be available to you. # 2.解決步驟 --- 由於我們想透過前面的1000筆資料去預測後面500筆資料的數值,這裡我使用了LSTM遞歸神經望網絡去解決,從第一筆資料開始,每次抓取包含其後99筆資料作為訓練資料,其後第100筆資料的值作為該訓練資料對應的數值,將這些訓練資料丟進,模型中進行學習,最終達到預測的效果 以下是我解決的步驟 **資料預處理->建立模型->訓練模型->預測->評估** ### 資料預處理 首先安裝跟匯入需要用到的模組 ```python= import keras from keras import layers from keras.layers.embeddings import Embedding from keras.layers.recurrent import SimpleRNN import numpy as np ``` 接著從雲端把我們的訓練資料下載下來 ```python= path=keras.utils.get_file('A3_train.txt', origin='https://drive.google.com/uc?export=download&id=184ipV1dPL8tEW_SgXJqDcngOOKNRN4Lx') text = open(path) ``` 把TXT中讀到的資料先放到time陣列中方便等一下使用 ```python= times=[] # 把1000筆資料讀取到time陣列中 for i in range (1000): s=text.readline().rstrip() s=float(s) #print (s) times.append(s) ``` 接著從第一筆資料開始每100筆資料作為訓練資料 而後將資料分成訓練資料跟測試資料 ```python= result = [] # 設定一次取99筆資料預測第100筆資料 sequence_length=100 for index in range(len(times) - sequence_length): result.append(times[index: index + sequence_length]) result = np.array(result) row = 500 train = result[:row, :] np.random.shuffle(train) X_train = train[:, :-1] y_train = train[:, -1] X_test = result[row:, :-1] y_test = result[row:, -1] ``` ### 建立模型 ```python= from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten, LSTM, TimeDistributed, RepeatVector,Input model = Sequential() model.add(LSTM(20, input_shape=(sequence_length-1,1), return_sequences=True)) model.add(LSTM(25, return_sequences=True)) model.add(TimeDistributed(Dense(1))) model.add(Flatten()) model.add(Dense(20,activation='linear')) model.add(Dense(1)) model.summary() ``` ### 訓練模型 選擇好loss Function 就可以開始訓練了! ```python= optimizer="adam",metrics=['mean_absolute_error']) model.compile(loss="mse", optimizer="adam",metrics=['mean_absolute_error']) epochs=50 model.fit(X_train, y_train,batch_size=50, nb_epoch=epochs, validation_split=0) ``` ### 預測後500筆資料的值 接著就是將剛剛訓練好的的模型,拿來開始進行預測囉~ ```python= last_test=np.array(times[-1*(sequence_length-1)::]) s1=[] for i in range (sequence_length-1): s1.append(last_test[i]) predictedset=[] for i in range (500): x=np.array(s1) x=x.reshape(1,sequence_length-1,1) predicted = model.predict(x) out=predicted[0,0] predictedset.append(out) if i!=499: print(str(out)+",",end='') else: print(str(out),end='') s1.append(out) s1=s1[1:120] ``` ### 顯示預測的曲線圖 將剛剛預測出來的結果繪製成圖形 ```python= import matplotlib.pyplot as plt try: fig = plt.figure() ax = fig.add_subplot(111) plt.plot(predictedset) plt.show() except Exception as e: print(str(e)) ``` # 3.效能評估 ![](https://i.imgur.com/OPhsrzc.png) 訓練的LOSS結果還不錯的有降到0.04以下,整體看上去也與前1000筆的走勢較為接近,不過一些較細微的地方還是跟原本的圖有些不同 當中有遇到的問題是,若不是每次抓100筆資料當訓練資料,而是50筆或者更小的數字時,蠻容易導致預測出來的數值曲線圖,波鋒跟波谷都與前1000筆的小了快2倍,跑到近500筆資料時,曲線甚至逐漸變平,我認為可能是因為學習的訓練資料每次抓的範圍較小,預測的數值便沒辦法脫離那個小區間的區域,因此數值在那個區域來回跳導致的