---
# System prepended metadata

title: <h1>Time Series Prediction</h1>
tags: [大三, Python, 深度學習]

---

# <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() #關閉檔案
```
    
    