Clinical NLP進行中
ICD-10 自動化臨床編碼
針對病歷文字截斷與 ICD-10 極端長尾分布,導入 DR-CAML 標籤語意補償,讓 2,099 個疾病標籤具備主動特徵檢索能力。
問題
臨床病歷往往超過語言模型可處理的 512 tokens,直接被截斷;而 ICD-10 疾病代碼又呈現極端的長尾分布,少數常見代碼佔掉大部分訓練訊號,大量稀疏標籤幾乎沒有足夠樣本。
這不是單一的模型問題,而是「文字長度」與「標籤不平衡」同時發生。只換更大的模型,並沒有解決標籤表徵不足的核心瓶頸。
方法
- 以 Bio_ClinicalBERT 萃取病歷的底層語意特徵,作為多標籤分類的共享編碼器。
- 導入 DR-CAML 的標籤語意補償機制,讓 2,099 個核心疾病標籤具備主動特徵檢索能力,而不是被動等待分類頭學習。
- 將原始 14,789 個標籤收斂到 2,099 個核心標籤,降低極端長尾對訓練的干擾。
- 使用 Gradient Checkpointing 在有限硬體資源下完成訓練,並針對多標籤長尾分類調整損失與評估方式。
實驗結果
67.27%
Micro F1
baseline 29.35%
38.42%
Macro F1
baseline 0.66%
98.9%
Micro AUC
實驗結果
86.7%
Recall@15
前 15 個推薦代碼
互動:標籤探索
切換 Baseline 與 DR-CAML,看看同一段合成病歷在兩種模型下的標籤預測差異。也可以搜尋 ICD-10 代碼或名稱。
icd10-explorer
合成病歷sample_discharge_note.txt
72 歲男性,因呼吸急促、發燒 3 天入院。胸部 X 光顯示右下肺浸潤,白血球 14,200/µL,CRP 18.6 mg/dL。既往高血壓、第二型糖尿病,長期服用 metformin。
住院期間出現急性腎損傷,creatinine 由 1.1 升至 2.4 mg/dL。給予 ceftriaxone 與 azithromycin,並補充輸液。
67.27%
Micro F1
38.42%
Macro F1
predicted labels
互動示意:病歷為合成文字,非真實病人資料;數值取自專案實驗結果(Micro F1 29.35% → 67.27%、Macro F1 0.66% → 38.42%)。
技術筆記
- 長文本:病歷超過 512 tokens 時,單純截斷會丟掉後半段的重要診斷線索;需要在資料前處理與模型輸入兩層一起處理。
- 長尾標籤:Macro F1 從 0.66% 提升到 38.42%,代表稀疏標籤的識別能力有實質改善,而不是只靠常見標籤拉高分數。
- 硬體限制:在有限 GPU 資源下,以 Gradient Checkpointing 換取可訓練的批次大小,是這個專案能完成的重要因素。
- 評估:同時看 Micro / Macro / AUC / Recall@15,避免只看單一指標而忽略長尾表現。
下一步
目前持續整理實驗結果與可重現的訓練流程,並評估把標籤語意補償延伸到更多臨床編碼場景。程式碼與實驗細節放在 GitHub。
病歷資料受隱私與授權限制,頁面與 demo 均使用合成文字;實驗數值取自專案實驗結果。