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 Stars40
作者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 人體試驗倫理訓練:

  1. 前往 PhysioNet 建立帳號
  2. 完成 CITI「Data or Specimens Only Research」課程
  3. 申請 MIMIC-III Clinical Database v1.4 存取權
  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)——給定患者狀態,真實醫師會選擇什麼治療。這作為:

  1. 基準線(baseline):RL agent 的策略要比醫師的好才有價值
  2. 行為策略(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 演算法

本專案實驗了五種演算法:

演算法全名核心特色
DQNDeep Q-Network基礎 Q-learning + 神經網路近似
DDQNDouble DQN雙網路減少 Q 值過估計
DDQN-BCQBatch-Constrained Q-learning限制動作空間於資料分佈內(主力
MMCMixed Monte Carlo結合 TD 與 MC 估計
PALPersistent 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 Views2-4 小時PostgreSQL 運行中
MIMIC_Extract6-12 小時32+ GB RAM
MIMIC_RL notebook1-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 可復現性建議

  1. 固定隨機種子train_test_split 已使用 random_state=RANDOM(RANDOM=0)
  2. 記錄 MIMIC_Extract 參數GAP_TIME=6, SLICE_SIZE=6, PREDICTION_WINDOW=4
  3. 環境版本鎖定:建議使用 pip freeze > requirements_locked.txt
  4. TensorBoard 記錄vis_params=VisualizationParameters(tensorboard=True)

10. 資安掃描與風險評估

10.1 安全發現

嚴重度類別位置說明
exec() 動態執行rl_coach/coach.py:284exec("graph_manager.{}={}".format(key, value)) — 可被惡意輸入利用
pickle.load 無驗證多處(checkpoint 載入)反序列化不受信任的 pickle 檔案可執行任意程式碼
硬編碼測試密碼conftest.pyPostgreSQL 密碼 'postgres'(僅測試用)
subprocess + shell=TrueCoach 測試框架多處使用,但皆為內部測試,非暴露面
os.system()dashboard.pyDashboard 啟動指令
資訊AWS 憑證讀取test_dist_coach.py使用 os.environ.get()(正確做法)
資訊無 License根目錄未標註開源授權,使用前需確認

10.2 風險等級:中低

安全問題主要集中在 vendored 的 Intel Coach 框架(上游程式碼,非本專案作者撰寫)。核心 sepsis RL pipeline(src/ 目錄的 8 個 notebook)無明顯安全疑慮。

10.3 使用建議

  1. 隔離執行:使用 Docker 或 virtualenv,不在宿主環境直接執行
  2. Pin 依賴版本numpy>=1.14.5 等範圍依賴已過時,建議鎖定版本
  3. 不載入不受信任的 checkpoint:pickle 反序列化有 RCE 風險
  4. MIMIC-III 資料保護:遵守 PhysioNet Data Use Agreement,資料不外洩
  5. 勿直接臨床部署:本專案為研究用途,非經過 FDA/TFDA 認證的醫療器材

11. 延伸閱讀與相關專案

11.1 學術參考

主題關鍵文獻
RL for SepsisKomorowski et al. (2018) “The Artificial Intelligence Clinician learns optimal treatment strategies for sepsis in intensive care” — Nature Medicine
MIMIC-IIIJohnson et al. (2016) “MIMIC-III, a freely accessible critical care database” — Scientific Data
MIMIC_ExtractWang et al. (2019) “MIMIC-Extract: A Data Extraction, Preprocessing, and Representation Pipeline for MIMIC-III”
BCQFujimoto et al. (2019) “Off-Policy Deep Reinforcement Learning without Exploration” — ICML
Intel Coach文件:nervanasystems/coach
Doubly Robust OPEJiang & Li (2016) “Doubly Robust Off-policy Value Evaluation for Reinforcement Learning” — ICML

11.2 相關 GitHub 專案

專案說明
MLforHealth/MIMIC_ExtractMIMIC-III 標準化資料擷取(本專案直接使用)
MIT-LCP/mimic-codeMIMIC 官方 SQL 概念表與範例
matthieu-komorowski/AI_ClinicianNature Medicine 論文的官方實作(MATLAB)
NervanaSystems/coachIntel Coach RL 框架(本專案 fork 並 vendor)

11.3 與感染管理(infection management)的關聯

本專案直接解決感染(infection) 管理中最緊急的臨床場景之一:

  1. 敗血症是感染的嚴重併發症 — 當免疫系統對感染產生過度反應,導致器官衰竭
  2. 治療時間窗口極短 — 每延遲一小時開始適當治療,死亡率增加 ~7.6%
  3. RL 的即時決策特性 — 正是為了解決「下一個小時該做什麼」這類 immediate intervention(即時介入)問題
  4. 從資料學習個體化策略 — 不同病原體、不同患者基底狀態,需要不同的升壓劑/輸液/呼吸器組合

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 輔助決策基礎。