# 醫院專案 Retrain 架構
###### tags: `國泰專案`
## 流程圖
```mermaid
graph LR
A["DataJoiner"] --> B["DataCleaner"] --> C["DataLabler"] --> D["DataAggregator"] --> E["儲存結果"]
F["DataFilter"] --> G["DAModel <br> (改寫 henry 程式)"] --> H["產出分析的報表"]
D2["DataDescriptor"]
```
## 開發動機
1. 建立自動化的流水線,縮短日後資料分析週期。
2. 降低人為因素,減少錯誤發生。
3. 為日後 **retrain 機制(AirFlow)** 提供模板。
## 精神
根據不同的業務需求,只需要改動配置文件的參數即可,不需要動 code。
## 組件功能描述
1. `DataJoiner(key, columns)`:步驟如下
+ 去除重複的列。
+ 保留所有在 `columns` 中的欄位。
+ 根據 `key`,將多張表(內)連起來。
2. `DataCleaner(filter_row_dict, replace_dict, normal_dict)`:包含下列操作
+ 根據條件去除不需要的列 (ex: 年齡 < 14)。
+ 將某些欄位的特定值換成其他值。
+ 如果某些欄位的值不在範圍內,將其設為 NA。
3. `DataLabler(label_df_path_dict, diag_list)`:進行資料標籤
+ `label_df_path_dict`: 由具有 `DIAGNOSIS` 資料表路徑所構成的字典。
+ `diag_list`: 蒐集所有敗血症類型英文名的欄位。
4. `DataAggregator()`: 將多張表合併 (axis=0)
5. `DataFilter(config_dict)`:根據條件篩選部分的列,輸出為 `dict[(train_df, test_df)]`。`config_dict` 的形式如下。
```python
filter_config_dict = {
'1': ({'division': '1', 'start': '202001', 'end': '202012'}, {'division': '3', 'start': '202001', 'end': '202012'})
}
```
6. `DataDescriptor(config_dict)`:過濾資料,並計算資料的一些特徵,如陽性人數、陰性人數、比例等。`config_dict` 的形式如下。
```python
filter_config_dict = {
'1': {'division': '1', 'start': '202001', 'end': '202012'},
'3': {'division': '3', 'start': '202001', 'end': '202012'},
'4': {'division': '4', 'start': '202001', 'end': '202012'}
```
7. `DAModel(exclude_col, y_col, model_type, task, scorer, encoder='label', normalize=False, auto_fill=False, balance=True)`:訓練 **XGBoost** 模型,並用 `test_df` 評估模型成效。
+ `exclude_col`: 要移除的欄位。
+ `y_col`: 標籤所屬欄位。
+ `model_type`: 模型的類型,目前僅提供 `'XGB'` 這個選項。
+ `task`: 提供 `'classification'`, `'regresssion'` 兩個選項。
+ `scorer`: 做模型選擇時的評估標準。
+ `encoder`
+ `normalize`
+ `auto_fill`: 是否填補缺失值。
+ `balance`: 是否增加少樣本權重使正負樣本總權重一致。
8. **產出分析報表**
## 待辦事項
1. retrain
2. 說明文件
+ 驗證個數 x
+ 驗證 2020 訓練 2021 測試結果與之前算的一致

+ 實驗滑動窗口方式結果會不會比較好 (一年)

+ 驗證 2020 上班年訓練 2021 測試結果與之前算的一致


+ 實驗滑動窗口方式結果會不會比較好 (半年)

3. 個分院敗血症個數
1. **division3**


2. **division4**


4. 使用總院去預測其他兩個院區
+ **division3**: normal 1 year

+ **division4**: normal 1 year

5. 自己預測自己
+ **division3**: normal 1 year

+ **division4**: normal 1 year

6. 使用全部資料來預測
1. **division1**

2. **division3**

3. **division4**
