MIMIC_RL_COACH 完整教學
從概念理解到實作:如何用 Batch Reinforcement Learning 從真實加護病房資料學習敗血症最佳治療策略。
1. 專案定位
什麼是 MIMIC_RL_COACH?
MIMIC_RL_COACH 是一個 batch reinforcement learning(批次強化學習) pipeline,利用 MIMIC-III(Medical Information Mart for Intensive Care) 加護病房臨床資料庫的真實病歷資料,訓練 RL agent 學習敗血症(sepsis;感染)患者的最佳治療策略(optimal treatment policy)。
用一個比喻理解
想像你是一位 ICU 住院醫師(intensivist),面對敗血症患者:
- 你有數十萬筆過去患者的逐時治療紀錄(「某個時刻給了什麼藥、病人後來怎樣了」)
- 你想從這些紀錄中找出「什麼情況下應該做什麼治療」的最佳模式
- 但你不能拿真人做實驗(倫理限制),只能從歷史資料離線學習
MIMIC_RL_COACH 就是這個「從歷史病歷自動歸納最佳治療策略」的 AI 系統。它不是取代醫師,而是提供 decision support(決策輔助)——告訴醫師「根據這位患者目前的狀態,資料顯示怎麼做可能最好」。
核心數據
| 指標 | 數值 |
|---|---|
| GitHub Stars | 40 |
| 作者 | asjad99 |
| License | 未標註 |
| 資料來源 | MIMIC-III v1.4(PhysioNet) |
| 資料規模 | ~2,200,954 筆 transitions |
| 狀態維度 | 23 維(生命徵象 + 實驗室值 + 靜態特徵) |
| 動作空間 | 21 種離散治療組合 |
| RL 框架 | Intel Coach |
| 主力演算法 | DDQN-BCQ(Batch-Constrained Q-learning) |
Pipeline 全景
flowchart TD
subgraph DataAcq ["第一階段:資料取得"]
A1["PhysioNet 申請
MIMIC-III v1.4 存取權"] --> A2["下載 CSV
(~6 GB 壓縮)"]
A2 --> A3["PostgreSQL 建庫
匯入 26 張資料表"]
A3 --> A4["建立 Materialized Views
(MIT-LCP mimic-code)"]
end
subgraph PreProc ["第二階段:前處理"]
B1["MIMIC_Extract
擷取 vitals + labs +
interventions + patients"] --> B2["缺值填補
(Simple Imputer)"]
B2 --> B3["特徵標準化
(MinMax + Z-score)"]
B3 --> B4["靜態特徵編碼
(年齡/性別/種族/科別)"]
end
subgraph Traj ["第三階段:軌跡建構"]
C1["合併時序+靜態特徵"] --> C2["離散化治療動作
(5 種介入 → 21 類)"]
C2 --> C3["建立 Episode
(per ICU stay)"]
C3 --> C4["輸出 RL 軌跡 CSV
(state, action, reward...)"]
end
subgraph Train ["第四階段:模型訓練"]
D1["Intel Coach
BatchRLGraphManager"] --> D2["DDQN-BCQ Agent
(主力演算法)"]
D2 --> D3["100 Epochs 訓練
(batch_size=128)"]
D3 --> D4["TensorBoard 監控"]
end
subgraph Eval ["第五階段:離線評估"]
E1["Off-Policy Evaluation"] --> E2["Doubly Robust
Estimator"]
E1 --> E3["醫師策略對比
(Physician Policy)"]
E1 --> E4["Q-network
策略評估"]
end
DataAcq --> PreProc --> Traj --> Train --> Eval
2. 核心概念淺解
2.1 為什麼用強化學習處理敗血症?
敗血症(sepsis) 是 ICU 最致命的疾病之一,全球每年約 1,100 萬人死於敗血症。治療的核心挑戰:
- 時序決策(sequential decision-making):不是一次性開藥,而是每小時都要根據患者變化調整治療
- 個體差異巨大:同樣的治療對不同患者效果截然不同
- 治療組合爆炸:升壓劑(vasopressor)、輸液(IV fluid)、呼吸器(ventilation)等介入的組合非常多
- 延遲獎勵(delayed reward):現在的治療決定可能要數小時後才知道好壞
這正是 reinforcement learning 擅長的問題:在序列決策中,考慮長期累積效果,找出最佳策略。
flowchart LR
subgraph Traditional ["傳統臨床決策"]
T1["醫師經驗
+ 臨床指引"] --> T2["逐時判斷
要不要給藥/調劑量"]
T2 --> T3["觀察反應
再調整"]
end
subgraph RLBased ["RL 輔助決策"]
R1["歷史資料中
學習最佳模式"] --> R2["根據當前狀態
推薦最佳治療"]
R2 --> R3["搭配醫師判斷
做最終決策"]
end
Traditional -.->|"加入 AI 輔助"| RLBased
2.2 什麼是 Batch RL?與一般 RL 的差異
在一般 RL 中(如 AlphaGo),agent 可以不斷嘗試、從環境得到回饋、調整策略。但在醫療場景中:
| 面向 | 一般 RL(Online) | Batch RL(Offline) |
|---|---|---|
| 環境互動 | 可以,邊做邊學 | 不可以,只有歷史資料 |
| 探索 | 允許嘗試新動作 | 禁止,只能學已有的動作 |
| 安全性 | 可能犯危險錯誤 | 不會直接影響患者 |
| 資料來源 | 即時產生 | 固定的歷史資料集 |
| 適用情境 | 遊戲、模擬 | 醫療、金融等高風險場景 |
Batch RL 的核心限制:因為不能探索,agent 只能在「歷史資料中出現過的動作」裡面選擇最好的。這就是為什麼本專案使用 BCQ(Batch-Constrained Q-learning)——它明確禁止 agent 選擇從未在資料中出現的動作組合。
2.3 MDP 建模:把 ICU 治療變成數學問題
RL 的核心是把問題建模為 MDP(Markov Decision Process;馬可夫決策過程):
flowchart LR
S["State s_t
患者當前狀態
(23 維向量)"]
A["Action a_t
治療決定
(21 種之一)"]
R["Reward r_t
獎勵信號
(存活/死亡)"]
S2["State s_{t+1}
下一時刻狀態"]
S -->|"根據狀態
選擇動作"| A
A -->|"環境轉移"| S2
A -->|"即時回饋"| R
S2 -->|"下一輪
決策"| S
State(狀態;23 維向量)包含:
| 類別 | 特徵 | 數量 |
|---|---|---|
| 生命徵象均值 | 心率、收縮壓、舒張壓、平均血壓、血氧飽和度、呼吸率、體溫 | ~7 |
| 實驗室數值均值 | 血糖、乳酸、肌酸酐、BUN、白血球、血紅素、血小板等 | ~10 |
| 時間特徵 | 各指標距上次量測的時間、絕對時間(小時) | ~3 |
| 靜態特徵 | 年齡(分級)、性別、種族(分級)、首入科別 | ~3 |
Action(動作;21 種離散組合):
5 種二元介入的組合(部分組合在真實資料中未出現,被重新映射為 0-20):
| 介入 | 說明 |
|---|---|
| Ventilation(vent) | 機械通氣(呼吸器) |
| Vasopressor(vaso) | 升壓劑 |
| Adenosine | 腺苷(心律不整用藥) |
| Dobutamine | 強心劑 |
| Dopamine | 多巴胺(升壓/強心) |
Reward(獎勵):
以 hospital_expire_flag(住院期間是否死亡)為基礎。存活 = 正獎勵,死亡 = 負獎勵。獎勵估計器(reward_estimator_new.ipynb)進一步學習 Rhat = f(s, a) 作為更細緻的獎勵信號。
2.4 DDQN-BCQ:為什麼選這個演算法?
flowchart TD
DQN["DQN
Deep Q-Network
用神經網路估計 Q(s,a)"]
DQN -->|"問題:Q 值過估計"| DDQN["DDQN
Double DQN
用兩個網路交叉驗證
減少過估計"]
DDQN -->|"問題:Batch RL 中
會選到未見過的動作"| BCQ["DDQN-BCQ
Batch-Constrained Q-learning
只在資料分佈內的
動作中做選擇"]
BCQ -->|"使用 kNN 或 NN
過濾不合理的動作"| SAFE["安全的離線策略
適合醫療場景"]
為什麼 BCQ 對醫療至關重要?
想像 agent 學到「在某種罕見狀態下,給一個從未有醫師使用過的藥物組合效果最好」——但這可能只是 Q 值估計的雜訊。BCQ 透過 kNN 或神經網路模型,確保 agent 只推薦在真實資料中「有足夠多先例」的動作。
3. 資料取得與資料庫建置
3.1 申請 MIMIC-III 存取權
MIMIC-III 是受保護的醫療資料,需要完成 CITI 人體試驗倫理訓練:
- 前往 PhysioNet 建立帳號
- 完成 CITI「Data or Specimens Only Research」課程
- 申請 MIMIC-III Clinical Database v1.4 存取權
- 等待審核(通常 1-3 個工作天)
3.2 環境準備
README 建議使用 AWS EC2 instance(適合沒有本地運算資源時):
1# SSH 連線到 EC2
2ssh -i "mimic2.pem" ubuntu@<your-ec2-instance-address>
3
4# 安裝 screen(避免長時間任務因斷線中止)
5sudo apt-get update && sudo apt-get install screen
6screen
3.3 下載 MIMIC-III 資料
1# Clone MIMIC_Extract(本專案用的擷取工具)
2git clone https://github.com/MLforHealth/MIMIC_Extract.git
3cd ~/MIMIC_Extract/data
4
5# 下載 MIMIC-III 資料(需要 PhysioNet 帳密)
6wget -r -N -c -np \
7 --user <your-username> --ask-password \
8 https://physionet.org/files/mimiciii/1.4/
9
10# 解壓縮
11gunzip *.gz
3.4 PostgreSQL 資料庫建置
1# 安裝 PostgreSQL
2sudo apt-get install postgresql
3
4# 建立使用者與資料庫
5sudo -u postgres createuser --interactive
6createdb mimic
7
8# 連線並建立 schema
9psql -U ubuntu -d mimic
10\c mimic;
11CREATE SCHEMA mimiciii;
12SET search_path TO mimiciii;
3.5 匯入資料
1# Clone MIT-LCP 官方 mimic-code
2git clone https://github.com/MIT-LCP/mimic-code/
3
4# 建立表格結構
5psql 'dbname=mimic user=mimicuser options=--search_path=mimiciii' \
6 -f postgres_create_tables.sql
7
8# 匯入資料
9psql 'dbname=mimic user=mimicuser options=--search_path=mimiciii' \
10 -f postgres_load_data.sql \
11 -v mimic_data_dir='<path_to_data>'
12
13# 建立 materialized views(SQL 概念表)
14# 先執行 postgres-functions.sql,再執行:
15bash concepts/postgres_make_concepts.sh
注意:本步驟產生的 materialized views 包含敗血症辨識(Sepsis-3 定義)、嚴重度評分(SOFA / SAPS / APACHE)、人口統計等臨床概念,是後續分析的基礎。
4. 資料前處理:從原始紀錄到乾淨特徵
4.1 MIMIC_Extract Pipeline
MIMIC_Extract(Wang et al., 2019)是一個標準化的 MIMIC-III 資料擷取框架:
1# 安裝 Anaconda 環境
2conda env create --force -f mimic_extract_env.yml
3source activate mimic_data_extraction
4
5# 執行擷取
6make build_curated_from_psql
產出為 HDF5 檔案,包含三個 DataFrame:
| DataFrame | 內容 | 格式 |
|---|---|---|
vitals_labs | 逐時生命徵象與實驗室值 | MultiIndex:(subject_id, icustay_id, hadm_id, hours_in) |
interventions | 介入標記(vent, vaso, adenosine, dobutamine, dopamine) | 同上 |
patients | 靜態資訊(年齡、性別、種族、科別、死亡旗標) | Index:(subject_id, icustay_id, hadm_id) |
4.2 缺值處理
1from simple_impute import simple_imputer
2X_clean = simple_imputer(X, train_ids['subject_id'])
使用 simple imputer(根據訓練集統計量填補),避免 data leakage。
4.3 特徵標準化
1# 連續特徵 → MinMax 正規化到 [0, 1]
2X_std.loc[:, idx[:, 'mean']] = X_std.loc[:, idx[:, 'mean']].apply(
3 lambda x: (x - x.min()) / (x.max() - x.min())
4)
5
6# 時間特徵 → Z-score 標準化
7X_std.loc[:, idx[:, 'time_since_measured']] = X_std.loc[:, idx[:, 'time_since_measured']].apply(
8 lambda x: (x - x.mean()) / x.std()
9)
4.4 靜態特徵編碼
1# 年齡分級
2def categorize_age(age):
3 if age > 10 and age <= 30: return 1
4 elif age > 30 and age <= 50: return 2
5 elif age > 50 and age <= 70: return 3
6 else: return 4
7
8# 種族分級
9def categorize_ethnicity(ethnicity):
10 if 'AMERICAN INDIAN' in ethnicity: ...
11 # 簡化為少數類別
最終 merge 時序特徵與靜態特徵,加入 absolute_time(入院時間 + 住院時數,取 mod 24),形成 23 維狀態向量。
5. 軌跡建構:把臨床紀錄變成 RL 訓練資料
5.1 動作離散化
5 種二元介入的組合,理論上有 2^5 = 32 種。但很多組合在真實資料中從未出現,需要重新映射:
1# 原始編碼:二進位加權
2count = 0
3if row['vent'] == 1: count += 16
4if row['vaso'] == 1: count += 8
5if row['adenosine'] == 1: count += 4
6if row['dobutamine'] == 1: count += 2
7if row['dopamine'] == 1: count += 1
8
9# 重新映射:把未出現的組合壓縮,最終 21 種
10mylist_rearranged = []
11for item in mylist:
12 if item == 8: mylist_rearranged.append(5)
13 elif item == 9: mylist_rearranged.append(6)
14 # ... 依此類推
5.2 Episode 與 Transition 建構
每個 ICU 住院(icustay)是一個 episode,每筆逐時紀錄是一個 transition:
1# 加入 episode_id(= subject_id)
2X_merge_copy.insert(2, "episode_id", mylist_2, True)
3
4# 加入 episode_name
5X_merge_copy.insert(2, "episode_name", ['mimic_RL'] * 2200954, True)
6
7# 加入 transition_number(episode 內的時間步序號)
8# ... 逐列計算
5.3 輸出 RL 軌跡 CSV
最終格式符合 Intel Coach 的 CsvDataset 規範:
1action, all_action_probabilities, episode_id, episode_name, reward,
2transition_number, state_feature_0, ..., state_feature_22
其中 all_action_probabilities 設為均勻分佈 [0.04761904761] * 21(表示行為策略為隨機策略,這是保守假設)。
flowchart LR
subgraph Input ["輸入:HDF5"]
V["vitals_labs
逐時生理數據"]
I["interventions
介入旗標"]
P["patients
靜態資訊"]
end
subgraph Process ["處理"]
IMP["缺值填補"] --> NORM["標準化"]
NORM --> MERGE["合併特徵"]
MERGE --> ACT["動作離散化
(21 類)"]
ACT --> EP["Episode 建構"]
end
subgraph Output ["輸出:CSV"]
CSV["RL 軌跡
action, reward,
state_feature_0..22,
episode_id,
transition_number"]
end
Input --> Process --> Output
6. 模型訓練:Intel Coach 框架
6.1 Intel Coach 簡介
Intel Coach(現為 Intel AI Lab 維護)是一個 RL 框架,特色是支援 Batch RL——從預錄的離線資料訓練 agent,不需要即時環境互動。本專案 vendored(內嵌)了整個 Coach 框架的原始碼。
6.2 主訓練腳本解析
核心設定在 mimic_intel_coach.py:
1# 排程:100 epoch,每 epoch 遍歷全部資料
2schedule_params.improve_steps = TrainingSteps(100)
3schedule_params.steps_between_evaluation_periods = TrainingSteps(1)
4
5# Agent:DDQN-BCQ
6agent_params = DDQNBCQAgentParameters()
7agent_params.network_wrappers['main'].batch_size = 128
8agent_params.algorithm.discount = 0.99 # 折扣因子 gamma
9
10# Q 網路初始化:偏差設為 -100(接近隨機策略的折扣獎勵)
11agent_params.network_wrappers['main'].heads_parameters = \
12 [QHeadParameters(output_bias_initializer=tf.constant_initializer(-100))]
13
14# 學習率
15agent_params.network_wrappers['main'].learning_rate = 0.0001
16
17# 禁用探索(Batch RL 不需要 E-Greedy)
18agent_params.exploration.epsilon_schedule = LinearSchedule(
19 initial_value=0, final_value=0, decay_steps=1
20)
21
22# BCQ 使用 kNN 過濾不合理的動作
23agent_params.algorithm.action_drop_method_parameters = KNNParameters()
24
25# 狀態空間:23 維,動作空間:21 種
26spaces = SpacesDefinition(
27 state=StateSpace({'observation': VectorObservationSpace(shape=23)}),
28 goal=None,
29 action=DiscreteActionSpace(21),
30 reward=RewardSpace(1)
31)
6.3 訓練流程
1graph_manager = BatchRLGraphManager(
2 agent_params=agent_params,
3 env_params=None, # 無環境(純 batch)
4 spaces_definition=spaces,
5 schedule_params=schedule_params,
6 vis_params=VisualizationParameters(
7 tensorboard=True,
8 dump_csv=True,
9 dump_signals_to_csv_every_x_episodes=1
10 ),
11 reward_model_num_epochs=10, # 獎勵模型訓練 10 epoch
12 train_to_eval_ratio=0.4 # 40% 資料用於評估
13)
14
15graph_manager.create_graph(task_parameters)
16graph_manager.improve() # 開始訓練
6.4 安裝 Intel Coach 環境
1# 系統依賴
2sudo -E apt-get install python3-pip cmake zlib1g-dev python3-tk \
3 libboost-all-dev libblas-dev liblapack-dev libatlas-base-dev gfortran
4
5# 建立虛擬環境
6sudo -E pip3 install virtualenv
7virtualenv -p python3 coach_env
8. coach_env/bin/activate
9
10# 從 vendored source 安裝
11cd sepsis_main/mimic_RL_intel_coach
12pip3 install -e .
注意:Intel Coach 依賴 TensorFlow 1.x,現代環境可能需要使用 tensorflow==1.15 或 Docker 容器。
7. 離線策略評估(Off-Policy Evaluation)
7.1 為什麼需要 OPE?
在醫療 RL 中,我們不能直接部署學到的策略來測試效果(倫理風險太高)。Off-Policy Evaluation(OPE) 使用歷史資料來估計如果按照新策略行動,結果會如何。
flowchart TD
subgraph OPE ["Off-Policy Evaluation 方法"]
DR["Doubly Robust
Estimator
(主要方法)"]
PP["Physician Policy
Comparison
(基準比較)"]
QE["Q-Network
Evaluation
(Q 值評估)"]
TM["Transition Matrix
Analysis
(MDP 結構分析)"]
end
subgraph DR_Detail ["Doubly Robust 原理"]
IS["Importance Sampling
加權校正
行為策略 vs 評估策略"]
DM["Direct Method
用獎勵模型
直接預測結果"]
IS --> COMBINE["結合兩者
降低變異數 + 偏差"]
DM --> COMBINE
end
DR --> DR_Detail
7.2 Doubly Robust Estimator
doubly_robust.ipynb 實作此方法。Doubly Robust 結合兩種 OPE 方法的優點:
- Importance Sampling(IS):用行為策略(醫師實際做了什麼)與目標策略(RL agent 會怎麼做)的比值來加權
- Direct Method(DM):直接用模型預測每個 (state, action) 的期望獎勵
只要 IS 或 DM 其中一個正確,Doubly Robust 就能給出不偏估計。
7.3 醫師策略學習
physician_policy.ipynb 學習 pi_physician(a|s)——給定患者狀態,真實醫師會選擇什麼治療。這作為:
- 基準線(baseline):RL agent 的策略要比醫師的好才有價值
- 行為策略(behavior policy):IS 計算所需
7.4 獎勵函數估計
reward_estimator_new.ipynb 學習 Rhat = f(s, a)——根據狀態和動作預測獎勵。這為 Direct Method OPE 提供基礎,也讓訓練過程中的獎勵信號更精細。
7.5 MDP 轉移矩陣
find_transition_matrix.ipynb 從訓練集計算 P(s'|s, a)——給定狀態和動作,下一個狀態的分佈。用於驗證 MDP 假設是否合理。
8. 演算法比較
8.1 五種 RL 演算法
本專案實驗了五種演算法:
| 演算法 | 全名 | 核心特色 |
|---|---|---|
| DQN | Deep Q-Network | 基礎 Q-learning + 神經網路近似 |
| DDQN | Double DQN | 雙網路減少 Q 值過估計 |
| DDQN-BCQ | Batch-Constrained Q-learning | 限制動作空間於資料分佈內(主力) |
| MMC | Mixed Monte Carlo | 結合 TD 與 MC 估計 |
| PAL | Persistent Advantage Learning | 增加 gap between best/second-best action |
8.2 為什麼 DDQN-BCQ 是主力?
flowchart TD
A["Batch RL 特有問題"] --> B["Extrapolation Error
(外推誤差)"]
B --> B1["agent 對未見過的
(s,a) pair 的 Q 值
可能嚴重高估"]
B1 --> C["BCQ 解法"]
C --> C1["用 kNN 建模
資料分佈"]
C --> C2["只允許 agent 選擇
kNN 認為
「在資料中常見」的動作"]
C --> C3["減少 Bellman backup
中的 max 操作
對不合理動作的依賴"]
實務影響:在 ICU 場景中,extrapolation error 可能導致 agent 推薦一個「理論上 Q 值很高但從未有醫師使用過」的危險治療組合。BCQ 從根本上避免這個風險。
8.3 DQN vs BCQ 的設定差異
1# DQN 實驗(mimic_intel_coach_experiment.py)
2agent_params = DQNAgentParameters()
3# 無 action_drop_method(不限制動作選擇)
4# state shape=6, action=3(用 Acrobot 測試環境驗證)
5
6# BCQ 實驗(mimic_intel_coach.py)
7agent_params = DDQNBCQAgentParameters()
8agent_params.algorithm.action_drop_method_parameters = KNNParameters()
9# state shape=23, action=21(真實 MIMIC 敗血症資料)
9. 實作注意事項
9.1 運算資源需求
| 階段 | 估計時間 | 資源需求 |
|---|---|---|
| MIMIC-III 下載 | 2-4 小時 | 高速網路 + ~50 GB 磁碟 |
| PostgreSQL 匯入 | 4-8 小時 | 16+ GB RAM |
| Materialized Views | 2-4 小時 | PostgreSQL 運行中 |
| MIMIC_Extract | 6-12 小時 | 32+ GB RAM |
| MIMIC_RL notebook | 1-2 小時 | 16+ GB RAM |
| Intel Coach 訓練 | 2-8 小時 | GPU 建議(非必需) |
9.2 常見問題與解決
Q: TensorFlow 1.x 在現代環境無法安裝?
1# 方法 A:使用 Docker
2docker pull tensorflow/tensorflow:1.15.5-gpu
3docker run -it -v $(pwd):/workspace tensorflow/tensorflow:1.15.5-gpu bash
4
5# 方法 B:使用 conda
6conda create -n mimic_rl python=3.7
7conda activate mimic_rl
8pip install tensorflow==1.15
Q: MIMIC_Extract 記憶體不足?
1# 檢查磁碟空間
2lsblk
3# 擴展(AWS EC2)
4sudo growpart /dev/nvme0n1 1
Q: action 數量不對?
原始碼中有三組 SpacesDefinition(被註解切換):
shape=6, action=3:Acrobot 測試用shape=23, action=31:完整 5 介入組合(理論值)shape=23, action=21:實際使用(排除從未出現的組合)
確認使用 action=21 配合正確的重映射邏輯。
9.3 可復現性建議
- 固定隨機種子:
train_test_split已使用random_state=RANDOM(RANDOM=0) - 記錄 MIMIC_Extract 參數:
GAP_TIME=6,SLICE_SIZE=6,PREDICTION_WINDOW=4 - 環境版本鎖定:建議使用
pip freeze > requirements_locked.txt - TensorBoard 記錄:
vis_params=VisualizationParameters(tensorboard=True)
10. 資安掃描與風險評估
10.1 安全發現
| 嚴重度 | 類別 | 位置 | 說明 |
|---|---|---|---|
| 中 | exec() 動態執行 | rl_coach/coach.py:284 | exec("graph_manager.{}={}".format(key, value)) — 可被惡意輸入利用 |
| 中 | pickle.load 無驗證 | 多處(checkpoint 載入) | 反序列化不受信任的 pickle 檔案可執行任意程式碼 |
| 低 | 硬編碼測試密碼 | conftest.py | PostgreSQL 密碼 'postgres'(僅測試用) |
| 低 | subprocess + shell=True | Coach 測試框架 | 多處使用,但皆為內部測試,非暴露面 |
| 低 | os.system() | dashboard.py | Dashboard 啟動指令 |
| 資訊 | AWS 憑證讀取 | test_dist_coach.py | 使用 os.environ.get()(正確做法) |
| 資訊 | 無 License | 根目錄 | 未標註開源授權,使用前需確認 |
10.2 風險等級:中低
安全問題主要集中在 vendored 的 Intel Coach 框架(上游程式碼,非本專案作者撰寫)。核心 sepsis RL pipeline(src/ 目錄的 8 個 notebook)無明顯安全疑慮。
10.3 使用建議
- 隔離執行:使用 Docker 或 virtualenv,不在宿主環境直接執行
- Pin 依賴版本:
numpy>=1.14.5等範圍依賴已過時,建議鎖定版本 - 不載入不受信任的 checkpoint:pickle 反序列化有 RCE 風險
- MIMIC-III 資料保護:遵守 PhysioNet Data Use Agreement,資料不外洩
- 勿直接臨床部署:本專案為研究用途,非經過 FDA/TFDA 認證的醫療器材
11. 延伸閱讀與相關專案
11.1 學術參考
| 主題 | 關鍵文獻 |
|---|---|
| RL for Sepsis | Komorowski et al. (2018) “The Artificial Intelligence Clinician learns optimal treatment strategies for sepsis in intensive care” — Nature Medicine |
| MIMIC-III | Johnson et al. (2016) “MIMIC-III, a freely accessible critical care database” — Scientific Data |
| MIMIC_Extract | Wang et al. (2019) “MIMIC-Extract: A Data Extraction, Preprocessing, and Representation Pipeline for MIMIC-III” |
| BCQ | Fujimoto et al. (2019) “Off-Policy Deep Reinforcement Learning without Exploration” — ICML |
| Intel Coach | 文件:nervanasystems/coach |
| Doubly Robust OPE | Jiang & Li (2016) “Doubly Robust Off-policy Value Evaluation for Reinforcement Learning” — ICML |
11.2 相關 GitHub 專案
| 專案 | 說明 |
|---|---|
| MLforHealth/MIMIC_Extract | MIMIC-III 標準化資料擷取(本專案直接使用) |
| MIT-LCP/mimic-code | MIMIC 官方 SQL 概念表與範例 |
| matthieu-komorowski/AI_Clinician | Nature Medicine 論文的官方實作(MATLAB) |
| NervanaSystems/coach | Intel Coach RL 框架(本專案 fork 並 vendor) |
11.3 與感染管理(infection management)的關聯
本專案直接解決感染(infection) 管理中最緊急的臨床場景之一:
- 敗血症是感染的嚴重併發症 — 當免疫系統對感染產生過度反應,導致器官衰竭
- 治療時間窗口極短 — 每延遲一小時開始適當治療,死亡率增加 ~7.6%
- RL 的即時決策特性 — 正是為了解決「下一個小時該做什麼」這類 immediate intervention(即時介入)問題
- 從資料學習個體化策略 — 不同病原體、不同患者基底狀態,需要不同的升壓劑/輸液/呼吸器組合
flowchart TD
INF["感染發生
(Infection)"] --> SEP["進展為敗血症
(Sepsis)"]
SEP --> ICU["收治加護病房
(ICU Admission)"]
ICU --> MON["逐時監測
生命徵象 + 實驗室值"]
MON --> RL["RL Agent 分析
當前 23 維狀態"]
RL --> REC["推薦治療
(21 種組合之一)"]
REC --> MD["醫師最終決策
(Decision Support)"]
MD --> MON
style RL fill:#e1f5fe,stroke:#0288d1
style REC fill:#e8f5e9,stroke:#388e3c
style MD fill:#fff3e0,stroke:#f57c00
對我們團隊的啟示:此專案展示了如何將真實臨床資料轉化為 RL 訓練素材的完整流程。雖然 MIMIC-III 是美國資料,但相同的 pipeline 架構可以應用於台灣的健保資料庫或醫學中心的電子病歷系統,為感染管理提供 AI 輔助決策基礎。
Comments