# 期末紙本報告草稿
###### 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
放程式碼,解釋作用