---
# System prepended metadata

title: 期末紙本報告草稿
tags: [報告]

---

# 期末紙本報告草稿
###### tags: `報告`

## 預期
1. **(很重要)** 測試各種缺失值添補方法
    1. 上下值填補
    2. 插值添補
    3. 平均值填補
    4. 中位數填補
    5. 補 0
2. 運用 DL 的方來添補缺失值
    1. Denoising AutoEncoder **(很重要)** 
3. 要解釋哪個模型好，需要比較的模型有
    1. Multi-model LSTM
        - Many to many
        - Many to one
    2. Single-model LSTM
        - Many to many
        - Many to one
4. 要解釋哪個**缺失值添補方法**好
    ex: 插值添補方法 loss 低
5. 要解釋哪個**輸出格式設計**好
    ex: 輸出格式選擇使用所有特徵好
6. 要解釋選擇哪些**特徵**好
    ex: 選擇XX特徵與 Target 具有高度相關
7. 要解釋選擇哪些**超參數**好
    ex:

## 可能須做的測試
### 1. 缺失值添補方法
用單一個模型比較哪個缺失值方法好，我們只看 validation loss 低
ex. Single-model LSTM (Many to one，超參數都一樣) 來比較各個方法
### 2. Denoising AutoEncoder
記憶體不夠，不能做，掰
### 3. 需要比較的模型
總共有 2X2 種模型，用 Grid Search 來找最好的結果。
- scaler 統一 Standardscaler
- Times series step 須測試 `5、10、15`
- 我們統一固定每一層神經元的大小都是 n，n 都是 2 的倍數，
    n 值(每層的神經元數)會有 `32、128、512、1024`
- LSTM 須測試層數 `1~3` 層
- Learning rate 統一 `10e-4`，optimizer 用 `Adam`
- Activation 看需求，不特別強制
    - 不同 scaler 要對應不同的 Activation

## 筆記
1. 可以在本地端測試，不需一定要提交到 kaggle
2. 比較模型的好壞，設立時間範圍為 `2021.06.01` 開始，最後生成的資料，後 10% 當作 validation，觀察 loss 判斷好壞。
3. 減少記憶體的方法
    - 擷取 training data 的某部分時間範圍後，從記憶體中刪除。

## 回報
### 1. 缺失值添補方法
請用 Single-model 比較即可
(兩者模型設定的超參數應該一致)

- 使用版本一參數測試
    | 方法名稱    | 模型 Score |
    | ----------- | --------- |
    | interpolate |0.348|
    | zero        | 0.2515          |
    | fbfill      |0.4001|
    | bffill      |  0.1509         |
    | mean        | 0.4157          |
    | median      |0.3295|

    | 方法名稱    | 模型 Score | 模型 Loss |
    | ----------- | ---------- | --- |
    | interpolate | 0.3696      |0.2408|
    | zero        | 0.3898    | 0.2407 |
    | fbfill      | 0.3949    | 0.2561 |
    | fbfill      | 0.5808    | 0.2427 |
    | bffill      | 0.2817    | 0.2517 |
    | mean        | 0.521     | 0.2546 |
    | median      | 0.455     | 0.2484 |

- 使用版本二參數測試
    | 方法名稱    | 模型 Score | 模型 Loss |
    | ----------- | ---------- | --------- |
    | interpolate | 0.2769     | 0.2864    |
    | zero        | 0.1918     | 0.3002    |
    | fbfill      | 0.203      | 0.2891    |
    | bffill      | 0.1606     | 0.2970    |
    | mean        | 0.3168     | 0.2745    |
    | median      | 0.5056     | 0.2787    |
<!-- ### 2. 輸出格式設計
請用 Single-model 比較即可
(兩者模型設定的超參數應該一致)
| 方法名稱   | 模型 Loss |
| ---------- | -------- |
| 僅 target |      |
| 所有特徵   |          | -->

### 3. 選擇哪些特徵好
解釋各個特徵，並敘述這些特徵是有助於模型做預測的。

### 4. 解釋哪個模型好
請用 Many to one 比較 Multi-model 和 Single-model 即可
(兩者模型設定的超參數應該一致)
- 使用版本一參數測試
    | 方法名稱     | 模型 Score | 模型訓練時間 |單一筆Sample預測時間|
    | ------------ | ---------- | ------------ | --- |
    | Multi-model  | 0.4824 | 2418.3s | 0.638s |
    | Single-model | 0.4402 | 205.4s  | 0.137s |

- 使用版本二參數測試
  不測試，因為參數設的太重記憶體不夠

請說明:
雖然 Multi-model 的 Score 可能比較高，但因為訓練時間長，再加上 單一筆Sample預測時間 大於 0.25s，kaggle 無法提交(說明無法提交的理由，如算出如何計算出 0.25s 的原因)，因此後續將改由 Single-model。

### 5. Many to one 和 Many to many 哪個好
請用 Single-model 比較即可
(比較的超參數應該一致)
- 使用版本一參數測試
    | 方法名稱   | 模型 Loss |
    | ---------- | -------- |
    | Many to one |  0.3569    |
    | Many to many |  0.4157    |

- 使用版本二參數測試 (此處額外設定 n_steps = 5)
    | 方法名稱     | 模型 Score | 模型 Loss |
    | ------------ | --- | --------- |
    | Many to one  |0.0055| 0.2726 |
    | Many to many |0.338| 0.3612    |

### 6. 那些超參數好
用上述得來的最好結果來決定超參數，測試一種時其它超參數就固定

**上述的結果是 Single-model 和 Many to many 比較好**

- 使用版本一參數測試
    | 超參數                     | 模型 Score(越高越好) |
    | -------------------------- | --------- |
    | step [5,10,15]             |0.1496/ 0.4157/ 0.1622|
    | 層數 [1,2,3]               |-0.0771/ 0.528/ 0.4157|
    | 神經元數 [32,128,512,1024] |0.1806/ 0.2622/ 0.4157/ -0.0046|
    
- 使用版本二參數測試
    | 超參數                     | 模型 Score(越高越好) |
    | -------------------------- | -------------------- |
    | step [5,10,15]             |                      |
    | 層數 [1,2,3]               |                      |
    | 神經元數 [32,128,512,1024] |                      |

## 結論
超麻煩

## 報告章節
- Data Pre-processing
- Model
- Code
- Model Training
- Conclusion
    - the name and ranking of your team in Kaggle

## Data Pre-processing
在這個部分，我們會介紹各種用來添補缺失值的方法、應該選擇哪些特徵、如何產生訓練資料、產生時間序列等。
### Missing value
我們有觀察出 training data 內有值缺失的問題，因此需要填補。
以下列出填補的方法
1. 補 0
2. 上下值填補
3. 插值添補
4. 平均值填補
5. 中位數填補

根據這些方法，我們進行實驗比較出結果如同下方表格率所示:
| 方法名稱   | 模型 Loss |
| ---------- | -------- |
| 上下值填補 |      |
| 內插添補   |          |
| 中位數填補 |          |
| 平均值填補 |          |

因此我們選擇用 XXX 方法。

版本一的參數:
```
# 選擇時間範圍
# auxiliary function, from datetime to timestamp
totimestamp = lambda s: np.int32(time.mktime(datetime.strptime(s, "%d/%m/%Y").timetuple()))

# 開始與結束的時間
start_time = totimestamp('01/08/2021')
end_time = 1632181440 #totimestamp('01/09/2021')

# 填補空缺值的方法
fill_method = 'interpolate' # 有 interpolate, zero, fbfill, bffill, mean, median

# 時間序列步長
n_steps = 10

# 使用的 scaler type
scaler_type = 'standard' # 有 'standard' 和 'minmax'

# 切割驗證集大小
valid_rate = 0.01

# 單一或多模型
model_type = 'single' # 有 'single' 和 'multi'

# 輸出格式
output_all = True

# 輸出類型
output_type = 'm2m' # 'm2o' 是 many to one, 'm2m' 是 many to many

# 模型參數設定
epoch = 100
n_width = 512
n_hidddn = 2
dropout_rate = 0.2
```

版本二的參數:
(與版本一的主要不同在於時間範圍，由於記憶體的關係用 m2o)
```
# 選擇時間範圍
# auxiliary function, from datetime to timestamp
totimestamp = lambda s: np.int32(time.mktime(datetime.strptime(s, "%d/%m/%Y").timetuple()))

# 開始與結束的時間
start_time = totimestamp('01/06/2021')
end_time = 1632181440 #totimestamp('01/09/2021')

# 填補空缺值的方法
fill_method = 'interpolate' # 有 interpolate, zero, fbfill, bffill, mean, median

# 時間序列步長
n_steps = 10

# 使用的 scaler type
scaler_type = 'standard' # 有 'standard' 和 'minmax'

# 切割驗證集大小
valid_rate = 0.01

# 單一或多模型
model_type = 'single' # 有 'single' 和 'multi'

# 輸出格式
output_all = True

# 輸出類型
output_type = 'm2o' # 'm2o' 是 many to one, 'm2m' 是 many to many

# 模型參數設定
epoch = 100
n_width = 512
n_hidddn = 2
dropout_rate = 0.2
```

### Generate More Features
我們也嘗試生成一些特徵來增加一些資訊。
- spread : $High - Low$
- mean_trade : $Volume / Count$ 
- log_price_change : $\log(Close-Open)$
- upper_Shadow : $High - max(Close,Open)$
- lower_Shadow : $min(Close,Open) - Low$
- high_div_low : $High / Low$
- trade : $Close - Open$

### Select the Features
透過下圖，可以觀察哪些特徵是與預測的 Target 具有相關
[圖]

我們選用這些特徵([XXX])來訓練模型

### Generate Training Data
我們針對模型的輸出設計兩種格式
1. 包含 Target 的所有特徵
2. 只有 Target 的特徵

我們設計一個實驗，結果如下表，發現 XX 方法比較好。
| 方法名稱   | 模型 Loss |
| ---------- | -------- |
| 包含 Target 的所有特徵 |      |
| 只有 Target 的特徵   |          |

### Generate Time Series Data
我們取用 2021.06 ~ 2021.09 範圍內的資料來做測試
Time step 設置成 5、10、15

## Model
### Type
- Single-model
    - Many to Many
    - Many to One
- Multi-model
    - Many to Many
    - Many to One
### Many to Many or Many to One, which is Best?
### Single-model or Multi-model, which is Best?
### What hpyerparameter is Best?

## Conclusion
### Kaggle 排名

## Code
放程式碼，解釋作用


