---
# System prepended metadata

title: Time Series Prediction
tags: [410621240 資工三 徐翊峰]

---

---
title: 'Time Series Prediction'
disqus: hackmd 
---
###### tags: `410621240 資工三 徐翊峰`
# Time Series Prediction

---
#### Table of Contents
---
[TOC]

## 問題描述 
---
- ![](https://i.imgur.com/vzuWJvI.png)

- ![](https://i.imgur.com/29Pwjtm.png)

- 這次問題主要是學習使用上課所教的**keras**來做**RNN**(Simple RNN, LSTM, GRU)的網路構建，還有學習使用基本的序列資料來做訓練**RNN**，藉此來學習一些基本的**keras**操作，還有預測下500筆資料。

## 問題解決步驟
---

### 1. 處理訓練資料
- 藉由下載老師提供的訓練資料，再加上對資料的前處理，包括把資料切成適當的大小，還有**reshape**成**model**好學習的大小，藉此來讓**model**的學習率提高。

```python=
data = np.loadtxt('A3_train.txt', delimiter='\n', dtype = np.float64)

x_train = np.array([data[i:i+50] for i in range(len(data)-50)])
y_train = np.array(data[50:])

x_train = np.reshape(x_train, (x_train.shape[0], 1, x_train.shape[1]))
y_train = np.reshape(y_train, (y_train.shape[0], 1))
```

### 2. 建構神經網路

- 這次我們使用的是**keras.models**中的**Sequential**來建構這一次每一層的神經網路。
- 之中再配合著調整**model**中的一些參數和選擇不同的**RNN**模型和**Dropout**來藉此調高整個**model**的學習表現。

```python=
#buliding model 1
model = Sequential()

model.add(LSTM(64, input_shape = (1, 50)))
model.add(Dense(16, activation = 'relu'))
model.add(Dropout(0.15))
model.add(Dense(1, activation = 'relu'))
model.summary()

model.compile(optimizer = 'adam',
              loss = 'mse',
              metrics = ['mse', 'mae'])
```

- 我這次**RNN**選擇的是由**LSTM**層來做為主要建構與判斷序列資列的方式，後面再接**Dense**與**Dropout**。

### 3. 開始訓練model
- 使用**fit**就可以開始訓練**model**。
- 之後還可以調整**epochs**跟**batch_size**來讓model的學習表現更好。

```python=
train_history = model.fit(x_train, y_train, 
                          epochs = 100,
                          batch_size = 30)
```

### 4. 畫出訓練次數與誤差
- 使用**python**的**matplotlib**來畫出**Training mse, lose, mae**的關係，藉此來查看整個model的訓練情況。
- 並且使用**plot_model**來畫出整個模型的建構。
 
```python=
mse = train_history.history['mean_squared_error']
mae = train_history.history['mean_absolute_error']
loss = train_history.history['loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, mse, label = 'Training mse')
plt.plot(epochs, mae, label = 'Training mae')
plt.plot(epochs, loss, label = 'Training loss')
plt.legend()
plt.grid()
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.title('Traning')
plt.savefig('evaluate model')
plt.show()

# plot model image                          
plot_model(model, to_file = 'model.png', show_layer_names = False, show_shapes = True)
```

- 之後就可以看到模型的訓練成果。

## 實驗結果
---

### 1. LSTM層架構成果
- 模型結構圖 :
![](https://i.imgur.com/RShXSml.png)


- 模型評估變化圖 :
![](https://i.imgur.com/jnxU5rb.png)

## 心得與結論
---

- 在我建完**model**後，不斷的調整裡面神經元個數與每一層**activation function**還有**RNN**的類型與**dropout**的比率的過程中:
  - 我**LSTM**的訓練效果會比其他的訓練效果還要好，因此我會比較傾向用**LSTM**來構建這次的網路。
  - 除此之外如果在**LSTM**後再加上一層**Dropout**會導致整個訓練效果沒有到很好，因此我後來就沒有選擇使用了。
  - **Dropout**在後面的**Dense**也能帶來整體更好的效果。
- 我在這次做作業的過程中也再次更加了解了有關於**keras**的各種操作，與整個**RNN**模型的架構與使用時機，我覺得是一個很棒而且充實的過程。

> [name=徐翊峰]