~projectsicd10-drcamlClinical NLP2025/04 — 現在
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 個推薦代碼

Micro F1 · baseline29.35%
Micro F1 · DR-CAML67.27%
Macro F1 · baseline0.66%
Macro F1 · DR-CAML38.42%

互動:標籤探索

切換 Baseline 與 DR-CAML,看看同一段合成病歷在兩種模型下的標籤預測差異。也可以搜尋 ICD-10 代碼或名稱。

icd10-explorer
合成病歷sample_discharge_note.txt
72M呼吸急促發燒 3 天

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 均使用合成文字;實驗數值取自專案實驗結果。
ycair@space:~$ help