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