下的置信度感知選擇性分診系統(tǒng))
背景與問題不完整臨床證據(jù)下的分診挑戰(zhàn)在急診科、重癥監(jiān)護(hù)室以及基層醫(yī)療場景中臨床分診Clinical Triage是一項(xiàng)高頻且高風(fēng)險(xiǎn)的操作。分診的核心目標(biāo)是在有限的時(shí)間和資源下根據(jù)患者當(dāng)前可獲取的癥狀、體征、病史和檢查結(jié)果快速判斷病情的緊急程度從而決定是立即搶救、優(yōu)先就診、常規(guī)排隊(duì)還是建議回家觀察。過去幾年隨著醫(yī)療信息化和人工智能技術(shù)的發(fā)展越來越多的團(tuán)隊(duì)嘗試用機(jī)器學(xué)習(xí)模型來自動(dòng)化分診流程。常見的做法是訓(xùn)練一個(gè)分類器輸入患者的主訴、生命體征、實(shí)驗(yàn)室指標(biāo)輸出一個(gè)緊急程度標(biāo)簽或者風(fēng)險(xiǎn)分?jǐn)?shù)。這類系統(tǒng)在一定程度上減輕了醫(yī)護(hù)人員的負(fù)擔(dān)但在真實(shí)落地過程中我們遇到了一個(gè)非常棘手的問題臨床證據(jù)往往是不完整的。一個(gè)胸痛患者送到急診時(shí)可能只有主訴和心電圖結(jié)果心肌酶、D-二聚體、超聲心動(dòng)圖等檢查結(jié)果還沒出來一個(gè)發(fā)熱患兒在基層診所就診時(shí)可能只有體溫、精神狀態(tài)描述血常規(guī)、CRP 等指標(biāo)尚未完善。模型的輸入特征大量缺失而且缺失模式并不僅僅是“隨機(jī)缺失”而是與病情、就診路徑、科室分工密切相關(guān)的“非隨機(jī)缺失”。如果模型在這些不完整證據(jù)上強(qiáng)行輸出一個(gè)確定性的分診結(jié)論很容易出現(xiàn)兩種情況一是把高風(fēng)險(xiǎn)患者誤判為低風(fēng)險(xiǎn)導(dǎo)致延誤治療二是為了安全把大量低風(fēng)險(xiǎn)患者也標(biāo)記為高風(fēng)險(xiǎn)造成醫(yī)療資源擠兌。兩種結(jié)果在臨床場景中都是不可接受的。于是問題從“如何提升分診準(zhǔn)確率”轉(zhuǎn)變?yōu)樵谧C據(jù)不完整的前提下模型如何知道自己知道什么、不知道什么什么時(shí)候應(yīng)該堅(jiān)持自動(dòng)分診什么時(shí)候應(yīng)該把決策交還給人類醫(yī)生這正是 CRS-TriageConfidence- and Reliability-Aware Selective Triage under Incomplete Clinical Evidence所嘗試解決的核心問題。簡單來說CRS-Triage 不是一個(gè)單純追求分類精度的模型而是一個(gè)“帶自我認(rèn)知”的分診決策系統(tǒng)。它同時(shí)考慮三個(gè)關(guān)鍵維度Confidence置信度模型對當(dāng)前預(yù)測結(jié)果的自信程度。如果輸入特征缺失嚴(yán)重模型應(yīng)該降低對自身輸出的把握。Reliability可靠性在相似條件下模型的歷史表現(xiàn)是否穩(wěn)定、是否可靠。這比單次置信度更宏觀是對模型能力邊界的一種校準(zhǔn)。Selective Triage選擇性分診在置信度和可靠性都不足時(shí)拒絕給出自動(dòng)結(jié)論轉(zhuǎn)交人工處理。從工程角度看這套思路和機(jī)器學(xué)習(xí)里的 Selective Prediction選擇性預(yù)測、Learning with Reject Option帶拒絕選項(xiàng)的學(xué)習(xí)一脈相承但結(jié)合了臨床場景的特有約束決策主體是人機(jī)協(xié)作而不是單機(jī)自動(dòng)完成錯(cuò)誤代價(jià)不對稱漏掉一個(gè)真陽性患者的損失遠(yuǎn)大于誤報(bào)一個(gè)低風(fēng)險(xiǎn)患者輸入缺失模式是結(jié)構(gòu)化的需要顯式建模。接下來本文會(huì)從概念拆解入手逐步講解 CRS-Triage 的建模思路、核心模塊設(shè)計(jì)、評估方法以及工程落地時(shí)需要注意的關(guān)鍵問題。適合正在做醫(yī)療 AI 算法研究、臨床決策支持系統(tǒng)開發(fā)的工程師也適合想了解“模型如何知道自己在什么時(shí)候不該發(fā)言”的機(jī)器學(xué)習(xí)初學(xué)者。概念拆解Confidence、Reliability 與 Selective Triage這三個(gè)詞在 CRS-Triage 中不是簡單的并列關(guān)系而是層層遞進(jìn)、互為約束的。先分別理解它們才能看懂后續(xù)的整體設(shè)計(jì)。2.1 Confidence預(yù)測置信度置信度在機(jī)器學(xué)習(xí)中有多種理解方式。最直觀的是概率類模型的輸出概率比如 Softmax 分類器輸出的最大類別概率。但在臨床分診場景里直接用 Softmax 概率作為置信度并不可靠。首先神經(jīng)網(wǎng)絡(luò)在輸入分布偏移或特征缺失時(shí)往往會(huì)產(chǎn)生過度自信的預(yù)測。一個(gè)在完整數(shù)據(jù)上訓(xùn)練良好的模型如果強(qiáng)行用均值填充缺失特征輸出的概率分布可能依然很尖銳看不出任何“不確定”的跡象。其次醫(yī)療決策對置信度的要求是“可解釋的、有邊界的”我們不能僅僅給出一個(gè) 0.8 或 0.9 的分?jǐn)?shù)還需要說明這個(gè)分?jǐn)?shù)在多大程度上受到了缺失信息的影響。因此CRS-Triage 中的置信度評估通常不依賴單一模型的輸出概率而是綜合多種信號模型的預(yù)測概率分布比如最大概率和次大概率之間的差距輸入特征完整性程度即當(dāng)前樣本缺失了哪些關(guān)鍵變量模型在缺失特征上的敏感性即該特征在當(dāng)前預(yù)測路徑上的貢獻(xiàn)權(quán)重集成模型Ensemble中多個(gè)基學(xué)習(xí)器之間的預(yù)測一致性如果使用貝葉斯方法還可以引入預(yù)測方差作為不確定性估計(jì)。這里的關(guān)鍵是置信度是“針對當(dāng)前樣本”的動(dòng)態(tài)估計(jì)。它回答的問題是在這個(gè)患者的條件下我有多大把握說出這個(gè)分診結(jié)論2.2 Reliability可靠性與置信度不同可靠性是一個(gè)更偏向“歷史表現(xiàn)”和“跨群體表現(xiàn)”的概念。它回答的問題是在類似條件下模型過去做得有多好在臨床分診場景中這意味著我們需要對模型在不同亞組上的表現(xiàn)做持續(xù)監(jiān)測。例如在不同年齡段兒童、成人、老年人上的 AUC 是否有明顯差異在不同科室來源急診內(nèi)科、心內(nèi)科、呼吸科上的校準(zhǔn)誤差是否可控在特征缺失比例不同的樣本上準(zhǔn)確率是否急劇下降在不同時(shí)間段流感季、節(jié)假日急診高峰上的表現(xiàn)是否穩(wěn)定。這些指標(biāo)的集合構(gòu)成了模型可靠性的畫像。CRS-Triage 的“Reliability-Aware”主要體現(xiàn)在即使當(dāng)前樣本的置信度暫時(shí)較高如果它落在模型歷史表現(xiàn)不佳的區(qū)域系統(tǒng)仍然傾向于轉(zhuǎn)交人工處理。舉個(gè)例子模型在青壯年胸痛患者上的歷史表現(xiàn)很好但對老年女性、癥狀不典型患者的區(qū)分度較差。某次輸入一個(gè)老年女性的樣本雖然模型輸出概率是 0.85顯示較高置信度但可靠性模塊根據(jù)歷史分桶記錄判斷此區(qū)域風(fēng)險(xiǎn)較大于是整體可靠度下調(diào)觸發(fā)人工復(fù)核。這種設(shè)計(jì)思路在工程上并不罕見類似“模型可觀測性”和“數(shù)據(jù)漂移檢測”的結(jié)合但 CRS-Triage 把它嵌入到了決策鏈路中而不是事后分析。2.3 Selective Triage選擇性分診選擇性分診是最終的決策策略。模型不再強(qiáng)制對每個(gè)樣本都輸出一個(gè)分診結(jié)果而是允許“棄權(quán)”Abstain。當(dāng)置信度低于某個(gè)閾值或者可靠性評估不達(dá)標(biāo)時(shí)系統(tǒng)自動(dòng)轉(zhuǎn)入人工分診流程。這里“轉(zhuǎn)交人工”不是簡單的報(bào)錯(cuò)退出而是帶有上下文信息的“輔助交接”。系統(tǒng)應(yīng)該告訴醫(yī)生模型初步傾向于哪個(gè)分診等級模型對當(dāng)前判斷的置信度有多高哪些關(guān)鍵信息缺失導(dǎo)致模型不敢下結(jié)論建議優(yōu)先補(bǔ)充哪些檢查或問詢。這樣一來人工分診不是從零開始而是在模型輔助下更高效地完成決策。這也更符合臨床工作流的實(shí)際需求醫(yī)生不是被系統(tǒng)替代而是被系統(tǒng)支持。從算法角度來看選擇性分診的核心是找到一個(gè)最優(yōu)的“覆蓋范圍”Coverage即在保證高風(fēng)險(xiǎn)患者不漏診的前提下盡可能多地自動(dòng)處理低風(fēng)險(xiǎn)、信息充分的樣本最大化系統(tǒng)的自動(dòng)化收益。這個(gè)最優(yōu)覆蓋范圍可以通過約束優(yōu)化或閾值搜索來確定。2.4 三者的協(xié)同關(guān)系用一個(gè)流程圖來表達(dá)它們的協(xié)作關(guān)系輸入臨床證據(jù)可能不完整 ↓ [Confidence 評估] → 當(dāng)前預(yù)測是否可信 ↓ [Reliability 評估] → 當(dāng)前樣本所在區(qū)域歷史表現(xiàn)是否穩(wěn)定 ↓ [Selective Triage 決策] ├── 置信度與可靠性均達(dá)標(biāo) → 自動(dòng)輸出分診結(jié)果 └── 任一維度不足 → 轉(zhuǎn)交人工分診并附解釋信息這個(gè)流程可以固化成一個(gè)決策函數(shù)給定輸入特征先判斷是否進(jìn)入自動(dòng)分診通道同時(shí)給出置信度分?jǐn)?shù)和可靠性評分二者共同決定最終的拒絕閾值。更有意思的是這個(gè)決策函數(shù)本身也是可學(xué)習(xí)的可以通過優(yōu)化一個(gè)包含誤診代價(jià)和人工成本的目標(biāo)函數(shù)來訓(xùn)練。問題建模與整體架構(gòu)設(shè)計(jì)3.1 形式化定義把 CRS-Triage 抽象成數(shù)學(xué)問題可以用如下方式描述假設(shè)有一個(gè)患者樣本 (x)其特征向量為 (x \in \mathbb{R}^d)同時(shí)存在一個(gè)二元掩碼向量 (m \in {0,1}^d)其中 (m_j 1) 表示第 (j) 個(gè)特征在當(dāng)前樣本中是觀測到的(m_j 0) 表示缺失。分診標(biāo)簽 (y \in {1, 2, 3, 4, 5}) 分別對應(yīng)不同的緊急程度等級或者簡化為二分類“高風(fēng)險(xiǎn) / 低風(fēng)險(xiǎn)”。模型 (f_\theta(x, m)) 輸出兩個(gè)結(jié)果預(yù)測分布 (p(y | x, m))置信度分?jǐn)?shù) (c(x, m))。在此基礎(chǔ)上系統(tǒng)還需要一個(gè)可靠性評估函數(shù) (r(x, m))表示當(dāng)前樣本落入的區(qū)域在歷史數(shù)據(jù)上的可靠程度。最終的決策策略是[ \text{Decision}(x, m) \begin{cases} \hat{y} \arg\max_y p(y|x,m) \text{if } g(c, r) \geq \tau \ \text{Refer to Human} \text{otherwise} \end{cases} ]其中 (g(\cdot)) 是融合函數(shù)(\tau) 是決策閾值。整個(gè) CRS-Triage 的學(xué)習(xí)目標(biāo)可以寫成[ \min_{\theta, \phi} ; \mathbb{E}[\mathcal{L}{\text{cls}} \lambda_1 \mathcal{L}{\text{conf}} \lambda_2 \mathcal{L}{\text{rel}} \lambda_3 \mathcal{L}{\text{tri}}] ]這里的 (\mathcal{L}{\text{cls}}) 是常規(guī)分類損失(\mathcal{L}{\text{conf}}) 是置信度校準(zhǔn)損失(\mathcal{L}{\text{rel}}) 是可靠性一致性損失(\mathcal{L}{\text{tri}}) 是選擇性分診損失比如帶拒絕代價(jià)的損失函數(shù)。3.2 不完整證據(jù)的表征方式CRS-Triage 要處理的第一件事是如何讓模型感知“缺失”這件事而不只是把缺失值填充成一個(gè)默認(rèn)數(shù)。常見的做法有幾種Mask 拼接法將每個(gè)特征的缺失標(biāo)志作為一個(gè)額外通道或額外特征輸入模型讓模型自行學(xué)習(xí)缺失模式與標(biāo)簽之間的關(guān)聯(lián)。這是實(shí)現(xiàn)成本最低、應(yīng)用最廣的方法。缺失模式嵌入用可學(xué)習(xí)的 Embedding 來編碼不同的缺失組合模式而不是逐特征做二值標(biāo)志。比如“體溫缺失 血氧缺失”和“體溫缺失 血氧正?!狈謩e映射到不同的 Embedding 向量。多視圖學(xué)習(xí)將特征按臨床意義分成若干視圖生命體征視圖、實(shí)驗(yàn)室檢查視圖、主訴文本視圖等每個(gè)視圖內(nèi)部先做局部推斷再用注意力機(jī)制整合缺失的視圖直接跳過或置空由注意力權(quán)重自行決定信息貢獻(xiàn)度。對于臨床分診場景我更推薦 Mask 拼接法和多視圖學(xué)習(xí)的結(jié)合。原因在于缺失模式本身攜帶臨床語義。某醫(yī)院沒有提供某項(xiàng)檢查可能不是醫(yī)生忘了開單而是因?yàn)榛颊卟∏椴辉试S、科室診療常規(guī)還沒走到那一步。模型需要學(xué)會(huì)區(qū)分“正常范圍內(nèi)的值”和“根本沒測的值”。3.3 CRS-Triage 的整體架構(gòu)在實(shí)現(xiàn)層面CRS-Triage 可以拆成四個(gè)模塊每個(gè)模塊承擔(dān)獨(dú)立職責(zé)模塊職責(zé)輸出特征補(bǔ)全與表示模塊對缺失特征進(jìn)行初步表示生成完整特征向量特征表示 (h)分診預(yù)測模塊基于特征表示輸出分診概率分布預(yù)測概率 (p)置信度評估模塊估計(jì)當(dāng)前預(yù)測的置信度置信度分?jǐn)?shù) (c)可靠性評估模塊評估當(dāng)前樣本所屬區(qū)域的歷史可靠性可靠性分?jǐn)?shù) (r)這四個(gè)模塊可以聯(lián)合訓(xùn)練也可以分階段訓(xùn)練。聯(lián)合訓(xùn)練的優(yōu)點(diǎn)是置信度模塊和預(yù)測模塊能夠相互約束避免模型在分類上過度自信。分階段訓(xùn)練的優(yōu)點(diǎn)是每個(gè)模塊都可以用不同的數(shù)據(jù)源和驗(yàn)證集單獨(dú)優(yōu)化便于工程排錯(cuò)??紤]到臨床場景中的數(shù)據(jù)規(guī)模通常有限我建議先分階段訓(xùn)練再整體微調(diào)。具體來說先用完整樣本訓(xùn)練預(yù)測模塊固定預(yù)測模塊后用帶缺失的樣本訓(xùn)練置信度模塊可靠性模塊則完全基于歷史評估結(jié)果構(gòu)建不參與端到端反向傳播只作為一個(gè)外掛的決策層。這個(gè)設(shè)計(jì)的好處是可靠性的計(jì)算可以隨時(shí)更新不需要重新訓(xùn)練整個(gè)模型。比如當(dāng)模型部署上線后積累了新的真實(shí)反饋只需要更新可靠性評估模塊的統(tǒng)計(jì)量決策策略就會(huì)立刻受益。3.4 決策邊界與人工介入策略選擇性分診的閾值設(shè)置是直接關(guān)系到臨床安全的關(guān)鍵環(huán)節(jié)。如果閾值設(shè)得太低系統(tǒng)會(huì)把大量低置信度樣本強(qiáng)行自動(dòng)分診模型在證據(jù)不足時(shí)犯錯(cuò)的概率會(huì)顯著上升如果閾值設(shè)得太高系統(tǒng)幾乎都會(huì)轉(zhuǎn)給人工自動(dòng)化的價(jià)值就體現(xiàn)不出來。合理的做法是引入“分診錯(cuò)誤代價(jià)”的概念。假設(shè)把一個(gè)高風(fēng)險(xiǎn)患者誤判為低風(fēng)險(xiǎn)造成的損失為 (C_{\text{miss}})把一個(gè)低風(fēng)險(xiǎn)患者誤判為高風(fēng)險(xiǎn)造成的損失為 (C_{\text{over}})人工處理一個(gè)患者的成本為 (C_{\text{human}})。在臨床場景里通常 (C_{\text{miss}} \gg C_{\text{human}} \gg C_{\text{over}})。基于這些代價(jià)我們可以構(gòu)建一個(gè)風(fēng)險(xiǎn)函數(shù)[ R(\tau) \mathbb{E}[\text{誤診損失}] \mathbb{E}[\text{人工介入成本}] ]然后選擇使 (R(\tau)) 最小化的閾值 (\tau^*)。這個(gè)優(yōu)化過程可以在驗(yàn)證集上完成也可以在部署后定期根據(jù)真實(shí)表現(xiàn)重新校準(zhǔn)。在實(shí)際操作中我還會(huì)建議把閾值做成多個(gè)檔位對應(yīng)不同的人力資源狀況。例如白班有兩名分診護(hù)士值班閾值可以放寬夜間只有一名值班醫(yī)生閾值自動(dòng)收緊。這種“動(dòng)態(tài)閾值”機(jī)制在工程上不難實(shí)現(xiàn)卻對臨床體驗(yàn)改善很大。核心算法設(shè)計(jì)與代碼示例下面我們來拆解 CRS-Triage 各模塊的算法實(shí)現(xiàn)思路。由于這是一個(gè)研究性較強(qiáng)的框架我這里給出的代碼是核心思路級的偽代碼具體實(shí)現(xiàn)需要根據(jù)你的數(shù)據(jù)格式和模型框架做適配。4.1 特征表示模塊Mask 拼接先看最簡單的特征表示方法。假設(shè)原始特征向量是x缺失掩碼是m我們可以把兩者拼接后輸入一個(gè)全連接層import torch import torch.nn as nn class FeatureEncoder(nn.Module): def __init__(self, input_dim, hidden_dim): super(FeatureEncoder, self).__init__() self.fc nn.Sequential( nn.Linear(input_dim * 2, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim) ) def forward(self, x, mask): # x: [batch_size, input_dim] # mask: [batch_size, input_dim], 1observed, 0missing x_with_mask torch.cat([x, mask], dim-1) return self.fc(x_with_mask)這里有一個(gè)細(xì)節(jié)需要注意在構(gòu)建x時(shí)對缺失特征位置的值不要填 0而是填一個(gè)可區(qū)分的中性值。為什么因?yàn)槿绻笔恢帽緛砭吞?0而某些真實(shí)特征的最小值也接近 0模型就難以區(qū)分“缺失”和“真實(shí)值為 0”。我通常在預(yù)處理階段把缺失特征置為一個(gè)特殊常數(shù)比如 -999 或全局均值然后依靠 mask 告訴模型這是缺失的。更高級的做法是使用可學(xué)習(xí)的缺失嵌入class LearnableMissingEncoder(nn.Module): def __init__(self, input_dim, hidden_dim): super(LearnableMissingEncoder, self).__init__() self.value_proj nn.Linear(input_dim, hidden_dim) self.missing_embed nn.Parameter(torch.randn(input_dim, hidden_dim)) self.fusion nn.Linear(hidden_dim * 2, hidden_dim) def forward(self, x, mask): # mask: 1observed, 0missing value_feat self.value_proj(x) missing_feat self.missing_embed.unsqueeze(0) # [1, input_dim, hidden_dim] # 對缺失位置使用可學(xué)習(xí)的 embedding feat torch.where(mask.unsqueeze(-1).bool(), value_feat.unsqueeze(1), missing_feat) # 在特征維度上做聚合 feat feat.sum(dim1) return self.fusion(torch.cat([feat, value_feat], dim-1))這個(gè)實(shí)現(xiàn)的核心思想是對每個(gè)輸入特征模型可以分別計(jì)算“如果觀測到該值”的表征和“如果缺失”的表征缺失時(shí)直接用可學(xué)習(xí)向量替代而不是簡單灌入一個(gè)固定值。4.2 置信度評估模塊置信度評估可以用多種方式實(shí)現(xiàn)。最簡單的是在預(yù)測模塊的輸出層添加一個(gè)額外的頭直接回歸一個(gè)置信度分?jǐn)?shù)class TriageModelWithConfidence(nn.Module): def __init__(self, encoder_dim, num_classes): super(TriageModelWithConfidence, self).__init__() self.classifier nn.Linear(encoder_dim, num_classes) self.confidence_head nn.Sequential( nn.Linear(encoder_dim, 64), nn.ReLU(), nn.Linear(64, 1), nn.Sigmoid() ) def forward(self, h): logits self.classifier(h) confidence self.confidence_head(h).squeeze(-1) return logits, confidence訓(xùn)練時(shí)除了常規(guī)的分類交叉熵?fù)p失還要讓置信度分?jǐn)?shù)與預(yù)測是否正確對齊。一種常用的技巧是構(gòu)造一個(gè)二分類目標(biāo)如果當(dāng)前樣本的預(yù)測標(biāo)簽正確置信度目標(biāo)為 1否則為 0。然后用二元交叉熵訓(xùn)練置信度頭。除此之外還可以引入蒙特卡洛 Dropout 來估計(jì)不確定性。在推理時(shí)多次開啟 Dropout 進(jìn)行前向傳播得到一組預(yù)測分布然后計(jì)算方差作為置信度的補(bǔ)充信號。這種方式對已有模型改動(dòng)最小非常適合快速驗(yàn)證。def predict_with_mc_dropout(model, x, mask, num_samples30): model.train() # 開啟 dropout preds [] for _ in range(num_samples): logits, _ model(x, mask) probs torch.softmax(logits, dim-1) preds.append(probs.detach().cpu().numpy()) preds np.array(preds) # [num_samples, batch, num_classes] mean_pred preds.mean(axis0) uncertainty preds.var(axis0).sum(axis-1) # 方差和作為不確定性 return mean_pred, uncertainty4.3 可靠性評估模塊可靠性評估模塊不參與端到端訓(xùn)練更像是一個(gè)基于歷史統(tǒng)計(jì)的“記憶體”。一個(gè)簡單而有效的實(shí)現(xiàn)方式是對樣本特征空間進(jìn)行分桶然后記錄每個(gè)桶的歷史表現(xiàn)。import numpy as np from collections import defaultdict class ReliabilityMemory: def __init__(self, bin_size0.1): self.bin_size bin_size self.bucket_stats defaultdict(lambda: {total: 0, correct: 0, auc: 0.0}) def discretize(self, value): return round(value / self.bin_size) * self.bin_size def update(self, sample_meta, is_correct, metric_value0.0): # sample_meta 是用于分桶的關(guān)鍵特征比如置信度分?jǐn)?shù)、缺失比例 key ( self.discretize(sample_meta.get(confidence, 0.5)), self.discretize(sample_meta.get(missing_ratio, 0.0)) ) self.bucket_stats[key][total] 1 if is_correct: self.bucket_stats[key][correct] 1 self.bucket_stats[key][auc] metric_value def query(self, sample_meta): key ( self.discretize(sample_meta.get(confidence, 0.5)), self.discretize(sample_meta.get(missing_ratio, 0.0)) ) stat self.bucket_stats.get(key) if stat is None or stat[total] 0: return 0.5 # 未知區(qū)域返回中等可靠性 accuracy stat[correct] / stat[total] # 可以結(jié)合樣本量做置信度收縮 shrink min(1.0, stat[total] / (stat[total] 10)) reliability shrink * accuracy (1 - shrink) * 0.5 return reliability這個(gè)實(shí)現(xiàn)非常輕量適合作為線下基線。實(shí)際在臨床項(xiàng)目中分桶的特征可能更復(fù)雜包括特征缺失模式、患者年齡段、科室來源等需要結(jié)合具體業(yè)務(wù)來設(shè)計(jì)。4.4 選擇性分診決策把置信度和可靠性整合形成最終的分診決策def selective_triage(confidence, reliability, threshold0.6): # 融合函數(shù)這里使用加權(quán)幾何平均 alpha 0.5 fused_score (confidence ** alpha) * (reliability ** (1 - alpha)) if fused_score threshold: return auto, fused_score else: return refer, fused_score這個(gè)融合公式可以替換成任何合理的函數(shù)。關(guān)鍵在于閾值的選擇。下面給一個(gè)在驗(yàn)證集上搜索閾值的示例def search_threshold(valid_df, valid_labels, min_refer_rate0.1): 在驗(yàn)證集上搜索最優(yōu)閾值。 目標(biāo)是在人工轉(zhuǎn)交率不超過 (1 - coverage) 的前提下最大化自動(dòng)分診部分的準(zhǔn)確率。 best_threshold 0.5 best_score -float(inf) for threshold in np.arange(0.3, 0.95, 0.05): auto_mask valid_df[fused_score] threshold refer_rate (~auto_mask).mean() if refer_rate (1 - min_cover_rate : 0.9): continue auto_accuracy (valid_df.loc[auto_mask, pred] valid_labels[auto_mask]).mean() score auto_accuracy - 0.2 * refer_rate if score best_score: best_score score best_threshold threshold return best_threshold在實(shí)際醫(yī)療項(xiàng)目中這個(gè)搜索過程不能只看總體準(zhǔn)確率還必須分高風(fēng)險(xiǎn)患者查看覆蓋率和召回率。比如要求系統(tǒng)對高風(fēng)險(xiǎn)患者的自動(dòng)分診覆蓋率不低于 98%那么閾值搜索就應(yīng)該在高風(fēng)險(xiǎn)亞組上添加硬約束。評估方法與指標(biāo)體系怎么證明 CRS-Triage 有效一個(gè)帶選擇性分診的系統(tǒng)不能用傳統(tǒng)分類指標(biāo)“一刀切”地評估。我們需要覆蓋三個(gè)層面的評估自動(dòng)分診部分的效果、轉(zhuǎn)交人工部分的比例、整體系統(tǒng)風(fēng)險(xiǎn)。5.1 自動(dòng)分診部分的準(zhǔn)確率在自動(dòng)分診覆蓋的樣本上計(jì)算常規(guī)分類指標(biāo)如準(zhǔn)確率、召回率、F1 分?jǐn)?shù)。這部分指標(biāo)反映的是“當(dāng)模型明確表態(tài)時(shí)它說得對不對”。需要注意這部分指標(biāo)天然會(huì)偏高因?yàn)橄到y(tǒng)只選擇了最有把握的樣本。所以不能只用它來宣傳模型性能必須結(jié)合覆蓋率一起看。5.2 覆蓋率與轉(zhuǎn)交率覆蓋率Coverage表示自動(dòng)分診樣本占全部樣本的比例轉(zhuǎn)交率 1 - Coverage。CRS-Triage 的價(jià)值就在于可以通過調(diào)整閾值在覆蓋率和準(zhǔn)確率之間做權(quán)衡。評估時(shí)應(yīng)繪制“準(zhǔn)確率-覆蓋率曲線”Accuracy-Coverage Curve觀察曲線下降是否平緩。一個(gè)健康的模型應(yīng)該具備這樣的特征隨著覆蓋率下降即更嚴(yán)格地選擇自動(dòng)分診樣本準(zhǔn)確率穩(wěn)步上升反之如果覆蓋率降到很低時(shí)準(zhǔn)確率依然沒有明顯提升說明置信度評估模塊沒有提供有效信號。5.3 高風(fēng)險(xiǎn)患者的漏診率這是最關(guān)鍵的臨床安全指標(biāo)。在所有真實(shí)高風(fēng)險(xiǎn)患者中有多少被系統(tǒng)自動(dòng)分診判為了低風(fēng)險(xiǎn)這個(gè)數(shù)字必須被單獨(dú)統(tǒng)計(jì)并且要設(shè)置嚴(yán)格的容忍上限。理想情況下CRS-Triage 應(yīng)該做到零漏診。如果達(dá)不到退而求其次也要保證所有低置信度的樣本都被轉(zhuǎn)交人工而不是直接自動(dòng)定級。5.4 人工分診的效率和效果提升轉(zhuǎn)交人工不等于系統(tǒng)脫責(zé)。評估時(shí)還應(yīng)該關(guān)注系統(tǒng)轉(zhuǎn)交的樣本醫(yī)生處理耗時(shí)是否更短醫(yī)生給出的結(jié)論是否與系統(tǒng)傾向一致系統(tǒng)提供的缺失信息提示是否有效如果人工分診因?yàn)?CRS-Triage 的輔助而變得更快、更準(zhǔn)說明系統(tǒng)的“人機(jī)協(xié)作”設(shè)計(jì)是成功的。這部分評估可以放在上線后的真實(shí)工作流中通過 A/B 測試或前后對比來完成。5.5 消融實(shí)驗(yàn)的設(shè)計(jì)在學(xué)術(shù)研究中消融實(shí)驗(yàn)是證明各模塊必要性的標(biāo)準(zhǔn)做法。對于 CRS-Triage至少應(yīng)該做以下三組對比實(shí)驗(yàn)組說明預(yù)期結(jié)果基線無選擇性分診對所有樣本強(qiáng)制輸出覆蓋率 100%但低置信度樣本錯(cuò)誤較多只用置信度僅根據(jù) Confidence 判斷覆蓋率-準(zhǔn)確率曲線有改善但可能對歷史不可靠區(qū)域失效置信度 可靠性完整 CRS-Triage在高風(fēng)險(xiǎn)亞組上漏診率最低自動(dòng)分診整體收益最穩(wěn)如果置信度模塊和可靠性模塊都有效第三組的“準(zhǔn)確率-覆蓋率曲線”應(yīng)該始終在第一組和第二組的上方。工程落地與技術(shù)挑戰(zhàn)CRS-Triage 從論文走向臨床系統(tǒng)還有相當(dāng)長的路要走。這里整理一些我在類似項(xiàng)目中實(shí)際遇到的工程問題。6.1 數(shù)據(jù)治理與缺失模式記錄模型對缺失模式的感知依賴高質(zhì)量的歷史數(shù)據(jù)。很多醫(yī)院的信息系統(tǒng)雖然保存了患者檢驗(yàn)結(jié)果卻未必保存了“某檢查為什么沒做”的上下文信息。比如一個(gè)患者沒有做凝血功能檢查可能是因?yàn)椴∏榫o急沒來得及也可能是因?yàn)檫@是復(fù)查患者不必再做。這兩種情況對分診決策的含義完全不同。因此在數(shù)據(jù)收集階段就要設(shè)計(jì)好元數(shù)據(jù)字段記錄每個(gè)特征的觀測狀態(tài)、缺失原因、缺失時(shí)機(jī)。這個(gè)工作非?,嵥閰s決定 CRS-Triage 的上限。6.2 模型訓(xùn)練與驗(yàn)證的偏差問題訓(xùn)練 CRS-Triage 時(shí)要特別注意驗(yàn)證集的構(gòu)建方式。不能簡單隨機(jī)劃分因?yàn)榛颊叩木驮\時(shí)間、科室分布、疾病譜變化都會(huì)導(dǎo)致數(shù)據(jù)分布漂移。建議按時(shí)間窗口劃分訓(xùn)練集和驗(yàn)證集例如用前兩年的數(shù)據(jù)訓(xùn)練用最近三個(gè)月的數(shù)據(jù)驗(yàn)證。在驗(yàn)證 CRS-Triage 的選擇性分診策略時(shí)還要注意“反饋循環(huán)”問題如果系統(tǒng)轉(zhuǎn)交人工的樣本最終由醫(yī)生給出了正確標(biāo)簽這些標(biāo)簽是否回流到訓(xùn)練集如果回流就相當(dāng)于系統(tǒng)學(xué)會(huì)了在哪些樣本上可以依賴醫(yī)生糾錯(cuò)這既可能提升系統(tǒng)能力也可能引入對人工的過度依賴。需要設(shè)計(jì)明確的標(biāo)簽回流策略。6.3 醫(yī)療合規(guī)與安全邊界在醫(yī)療場景部署 CRS-Triage必須把安全放在第一位。這里的“安全”不只是模型精度的問題還包括權(quán)限管理只有具備資質(zhì)的醫(yī)護(hù)人員才能處理轉(zhuǎn)交樣本系統(tǒng)需要對操作者做身份認(rèn)證和權(quán)限校驗(yàn)。完整審計(jì)每一次自動(dòng)分診和人工轉(zhuǎn)交都要記錄完整的決策鏈路包括輸入特征、缺失掩碼、置信度分?jǐn)?shù)、可靠性評分、最終決策人和決策時(shí)間。灰度發(fā)布新版本模型上線前必須先以“影子模式”運(yùn)行一段時(shí)間即系統(tǒng)照常生成分診建議但不直接投入使用而是與現(xiàn)行流程并行觀察一段時(shí)間的表現(xiàn)。緊急回退機(jī)制當(dāng)系統(tǒng)檢測到性能嚴(yán)重下降比如某類樣本的可靠性評分大面積低于閾值時(shí)應(yīng)能快速切換回純?nèi)斯し衷\流程。這些要求不是業(yè)務(wù)方的附加需求而是醫(yī)療 AI 系統(tǒng)的基本前提。6.4 性能與可觀測性臨床分診對實(shí)時(shí)性要求很高。雖然在帶拒絕選項(xiàng)的框架下系統(tǒng)可以轉(zhuǎn)交人工但如果每個(gè)樣本都轉(zhuǎn)交系統(tǒng)就沒有存在的意義。為了確保大部分樣本能快速通過自動(dòng)分診通道模塊設(shè)計(jì)上要注意置信度評估和可靠性評估盡量輕量化不要每次都跑一遍蒙特卡洛采樣可靠性記憶體用緩存或者向量數(shù)據(jù)庫保存查詢延遲控制在毫秒級每個(gè)模塊的耗時(shí)和結(jié)果都要寫入日志方便線上實(shí)時(shí)監(jiān)控。可觀測性的目標(biāo)是當(dāng)醫(yī)生或運(yùn)維人員看到一個(gè)自動(dòng)分診結(jié)果時(shí)能快速回答三個(gè)問題——“它依據(jù)什么特征做出的判斷”“它有多自信”“這個(gè)區(qū)域的歷史可靠性如何”把這三點(diǎn)固化到系統(tǒng) UI 和日志里會(huì)極大提升臨床信任度??偨Y(jié)與后續(xù)研究思考CRS-Triage 給我最大的啟發(fā)是在醫(yī)療決策這類高風(fēng)險(xiǎn)場景中模型的價(jià)值不只是“把結(jié)果預(yù)測得更準(zhǔn)”還包括“懂得在什么時(shí)候不預(yù)測”。Confidence 讓模型感知自身對當(dāng)前樣本的把握Reliability 讓模型理解自身能力邊界的歷史規(guī)律Selective Triage 把這兩種感知轉(zhuǎn)化為可執(zhí)行的人機(jī)協(xié)作策略。三者結(jié)合配合合理的閾值化和評估體系才能構(gòu)建出真正適合臨床的分診系統(tǒng)。后續(xù)可持續(xù)探索的方向包括更細(xì)粒度的缺失語義建模例如把缺失原因未開單、結(jié)果未回、設(shè)備故障、患者拒檢顯式融入模型多模態(tài)證據(jù)的融合分診比如把主訴文本、生命體征波形、醫(yī)學(xué)影像報(bào)告統(tǒng)一納入 CRS-Triage 框架在線強(qiáng)化學(xué)習(xí)讓選擇性分診策略可以根據(jù)實(shí)時(shí)反饋動(dòng)態(tài)調(diào)整閾值而不是依賴離線驗(yàn)證集的一次性搜索聯(lián)邦學(xué)習(xí)與隱私保護(hù)讓多家醫(yī)院在不共享原始患者數(shù)據(jù)的前提下共同提升置信度和可靠性評估的泛化能力這是醫(yī)療 AI 落地繞不開的課題。如果你正在做醫(yī)療分診相關(guān)的工作我的建議是先從最簡單的基線開始在現(xiàn)有分診模型上加入缺失掩碼特征再接一個(gè)置信度頭最后用驗(yàn)證集畫出準(zhǔn)確率-覆蓋率曲線。你會(huì)發(fā)現(xiàn)只是這一步就能讓系統(tǒng)在低質(zhì)量數(shù)據(jù)上的表現(xiàn)發(fā)生明顯變化。曲線中的關(guān)鍵拐點(diǎn)往往就是模型在告訴你這個(gè)區(qū)域我不太確定該請醫(yī)生出馬了。這套代碼思路和評估方法也可以平移到其他高風(fēng)險(xiǎn)決策場景例如風(fēng)控審核、法務(wù)輔助、智能運(yùn)維診斷。凡是錯(cuò)誤代價(jià)極高、信息經(jīng)常不完整、人類專家資源稀缺的領(lǐng)域都是 CRS-Triage 這類設(shè)計(jì)方案可以復(fù)用的地方。