# <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() #印出圖
```


### 顯示預測後的結果
將預測結果[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() #關閉檔案
```