# <h1>Time Series Prediction</h1> ###### tags: `深度學習` `Python` `大三` ## 目錄 <ul> <li>目錄</li> <li> 問題 <ul> <li>問題內容</li> <li>問題限制</li> <li>提交資料</li> </ul> </li> <li> 解決過程 <ul> <li>產生訓練資料</li> <li>建立模型</li> <li>訓練模型</li> <li>繪製loss圖以及val_loss圖</li> <li>顯示預測後的結果</li> </ul> </li> </ul> ## 問題 ### 問題內容 需要設計一個RNN,會獲得時間序列的第一部分t=1~t=1000,目標是設計一個RNN來預測第二部分{x(t)} ,測試t=1001~t=1500 ### 問題限制 - 可以使用任何類型的RNN(SimpleRNN,LSTM,GRU)來預測,其他都不行。 - 題目中要進行交叉驗證,避免overfit測試資料。 - 無法使用測試的數據集。 ### 提交資料 要提交預測結果,並存放在out.txt中,格式是預測數據的列表,以逗號分隔。 將原始程式碼和out.txt放入zip中。 放一個HackMD連結已存入報告的連結。 ## 解決過程 ### 產生訓練資料 x_train代表訓練的資料 y_train代表x_train的答案,為x_train[i]的下一個 total_train為所有的資料 ``` count = 0 #紀錄已經數到第幾個了 for i in f: #紀錄train_data,不取最後一個是為了去掉換行 count+=1 total_train.append(float(i[:-1])) if count < 1000: predict_data.append(float(i[:-1])) x_train.append(float(i[:-1])) if count > 1: y_train.append(float(i[:-1])) f.close() ``` 使用txt開檔,將資料放入x_train和y_train中 ### 建立模型 會用到三層,兩層的LSTM,和一層的Dense ``` model = models.Sequential() model.add(LSTM(100,input_shape=(None,1),return_sequences=True)) #第一層LSTM model.add(LSTM(100)) #第二層LSTM用100個神經元 model.add(layers.Dense(1)) #最後一層用Dense ``` ### 訓練模型 訓練模型,並且把資料放入history中 ``` model.compile(optimizer='rmsprop', #用mse,rmsprop進行compile loss='mse') history = model.fit(x_train, y_train, #將train的結果放入history中 epochs=25, batch_size=128, validation_split=0.2) ``` ### 繪製loss圖以及val_loss圖 ``` loss = history.history['loss'] #紀錄Loss值 val_loss = history.history['val_loss'] #紀錄val_loss值 plt.plot(loss,label='loss') #對loss畫圖 plt.plot(val_loss,label='val_loss') #對val_loss畫圖 plt.legend() #顯示名 plt.show() #印出圖 plt.plot(total_train,label='original_data') #對原始資料畫圖 plt.plot(model.predict(x_train),label='predict_data') #對x_train的預測畫圖 plt.legend() #顯示名 plt.show() #印出圖 ``` ![](https://i.imgur.com/IN7HZKZ.png) ![](https://i.imgur.com/Zu7pJgh.png) ### 顯示預測後的結果 將預測結果[1:1000]會直接放入out.txt中 ``` a = model.predict(predict_array) #預測資料 for i in range(0,999,1): if i == 1: f1=open('out.txt','w') f1.write(str(a[i])) f1.write(',') f1.close() #關閉檔案 if i >1 and i < 998: f1=open('out.txt','a') f1.write(str(a[i])) f1.write(',') f1.close() #關閉檔案 if i == 999: f1=open('out.txt','a') f1.write(str(a[i])) f1.close() #關閉檔案 ```