器學(xué)習(xí)論文復(fù)現(xiàn)全解析:從傳統(tǒng)模型到圖神經(jīng)網(wǎng)絡(luò))
前陣子一位學(xué)弟跟我吐槽他拿某公開(kāi)腫瘤數(shù)據(jù)倉(cāng)庫(kù)的膀胱癌轉(zhuǎn)錄組數(shù)據(jù)跑了一圈隨機(jī)森林訓(xùn)練集AUC超過(guò)0.95換到外部驗(yàn)證集立刻掉到0.6出頭論文投出去直接被秒拒。我聽(tīng)完一點(diǎn)不意外。這幾年頂著“機(jī)器學(xué)習(xí)”帽子的腫瘤預(yù)后文章越來(lái)越多但真正把代碼吃透、把驗(yàn)證做扎實(shí)的并不多。膀胱癌這個(gè)癌種在腫瘤機(jī)器學(xué)習(xí)里不算最“卷”的卻因?yàn)闃颖玖亢蛿?shù)據(jù)質(zhì)量都“夠用但不太擁擠”特別適合作為入坑和進(jìn)階的試驗(yàn)場(chǎng)。這篇文章就是我從一個(gè)復(fù)現(xiàn)者的視角把連續(xù)啃完三篇頂刊膀胱癌機(jī)器學(xué)習(xí)論文之后的完整手記整理出來(lái)包括選題邏輯、環(huán)境準(zhǔn)備、三套技術(shù)路線、逐行代碼的復(fù)現(xiàn)細(xì)節(jié)、我踩過(guò)的坑以及如何把這些方法遷移到自己課題里。三篇論文覆蓋了三條差異很大的技術(shù)路線第一篇是轉(zhuǎn)錄組加傳統(tǒng)機(jī)器學(xué)習(xí)做預(yù)后模型第二篇是醫(yī)學(xué)影像組學(xué)和深度特征融合做分類診斷第三篇用多組學(xué)數(shù)據(jù)加圖神經(jīng)網(wǎng)絡(luò)做藥物敏感性回歸預(yù)測(cè)。你把它拆開(kāi)看其實(shí)就是“傳統(tǒng)機(jī)器學(xué)習(xí)—圖像深度學(xué)習(xí)—結(jié)構(gòu)化圖學(xué)習(xí)”三件套。這也是我當(dāng)初選它們來(lái)復(fù)現(xiàn)的核心原因三篇合在一起等于把當(dāng)前腫瘤AI的主流建模方式過(guò)了一遍任何一篇單獨(dú)拿出來(lái)都不算難但連在一起復(fù)現(xiàn)完你對(duì)整個(gè)科研流程的理解會(huì)上一個(gè)臺(tái)階。1. 復(fù)現(xiàn)前的整體設(shè)計(jì)與選型思路1.1 為什么是這三篇論文我當(dāng)時(shí)把近幾年的膀胱癌機(jī)器學(xué)習(xí)文獻(xiàn)大概掃了一遍發(fā)現(xiàn)高頻場(chǎng)景就三類預(yù)后風(fēng)險(xiǎn)分層、肌層浸潤(rùn)狀態(tài)識(shí)別、治療反應(yīng)預(yù)測(cè)。這三類分別對(duì)應(yīng)臨床上的真實(shí)痛點(diǎn)膀胱癌患者預(yù)后差異很大需要量化風(fēng)險(xiǎn)來(lái)指導(dǎo)隨訪強(qiáng)度肌層浸潤(rùn)狀態(tài)直接決定是否要切膀胱藥物敏感性預(yù)測(cè)則服務(wù)于個(gè)體化用藥。我選的三篇論文剛好落在這三個(gè)場(chǎng)景里而且建模策略層層遞進(jìn)。論文A用轉(zhuǎn)錄組數(shù)據(jù)加LASSO回歸篩選基因再套隨機(jī)森林和CoxBoost做整合模型屬于標(biāo)準(zhǔn)生信套路。論文B用CT/MRI影像先提傳統(tǒng)放射組學(xué)特征一階統(tǒng)計(jì)量、紋理特征再用預(yù)訓(xùn)練ResNet提深度特征最后做了特征拼接層面的融合模型這屬于“手工特征深度特征”的經(jīng)典混合路線。論文C最復(fù)雜把mRNA表達(dá)、突變、甲基化、拷貝數(shù)變異四種組學(xué)拼在一起構(gòu)建患者相似性圖用圖卷積網(wǎng)絡(luò)和圖注意力網(wǎng)絡(luò)預(yù)測(cè)一組化療藥物的IC50值。從復(fù)現(xiàn)角度講論文A最重要的事情是“特征篩選別過(guò)擬合”論文B最重要的事情是“影像預(yù)處理必須干凈”論文C最重要的事情是“圖數(shù)據(jù)劃分不能泄漏”。這三句話就是我整個(gè)復(fù)現(xiàn)過(guò)程的核心主線。1.2 環(huán)境配置與工具鏈選擇我先說(shuō)硬件和軟件這是復(fù)現(xiàn)的第一個(gè)坑。論文A純CPU就能跑完但LASSO的交叉驗(yàn)證和后續(xù)bootstrap重采樣對(duì)內(nèi)存有一定要求建議至少16G內(nèi)存。論文B如果只是想復(fù)現(xiàn)結(jié)果一張8G顯存的GPU就夠了但如果你要自己把預(yù)訓(xùn)練模型在影像數(shù)據(jù)上微調(diào)24G顯存會(huì)更舒服。論文C的數(shù)據(jù)規(guī)模不大主要是圖的構(gòu)建和多次訓(xùn)練迭代耗時(shí)GPU有6-8G就可以跑。軟件環(huán)境我用的是conda隔離Python版本統(tǒng)一用3.9。圖像組學(xué)部分需要配套安裝界面程序來(lái)處理DICOM數(shù)據(jù)。傳統(tǒng)機(jī)器學(xué)習(xí)部分用到生存分析專用庫(kù)、常規(guī)機(jī)器學(xué)習(xí)庫(kù)、生物信息學(xué)差異分析庫(kù)。影像組學(xué)特征提取用到放射組學(xué)特征庫(kù)。深度學(xué)習(xí)部分用到深度學(xué)習(xí)框架和圖神經(jīng)網(wǎng)絡(luò)庫(kù)。另外藥物敏感性預(yù)測(cè)需要加載預(yù)訓(xùn)練權(quán)重圖神經(jīng)網(wǎng)絡(luò)庫(kù)要和深度學(xué)習(xí)框架版本匹配好這個(gè)我后面會(huì)細(xì)講。環(huán)境裝好之后建議把所有依賴固定版本號(hào)導(dǎo)出一份文件因?yàn)榘肽旰竽慊仡^再跑這些代碼時(shí)很可能就是某個(gè)庫(kù)的小版本更新讓你的結(jié)果對(duì)不上了。1.3 數(shù)據(jù)準(zhǔn)備階段的三個(gè)關(guān)鍵動(dòng)作數(shù)據(jù)這塊是復(fù)現(xiàn)中最容易翻車的地方我強(qiáng)烈建議你先把補(bǔ)充材料里的表格全部讀一遍。很多論文正文寫的很簡(jiǎn)潔但補(bǔ)充表格里才有真正的樣本入排標(biāo)準(zhǔn)、訓(xùn)練集和驗(yàn)證集的具體樣本編號(hào)、隨訪時(shí)間字段的格式說(shuō)明。我復(fù)現(xiàn)第一篇論文時(shí)就因?yàn)樯鏁r(shí)間單位搞錯(cuò)天和月混用折騰了兩天才發(fā)現(xiàn)。第一基因表達(dá)數(shù)據(jù)要做ID轉(zhuǎn)換和去重。同一基因可能對(duì)應(yīng)多個(gè)探針取均值或取最大方差都可以但必須寫清楚你用的策略否則后續(xù)結(jié)果別人沒(méi)法復(fù)現(xiàn)。第二臨床字段要對(duì)齊。尤其是生存數(shù)據(jù)里“刪失”的編碼方式有的數(shù)據(jù)集用0表示刪失有的是1這個(gè)必須看數(shù)據(jù)字典不能想當(dāng)然。第三多組學(xué)數(shù)據(jù)要按患者ID對(duì)齊。不同組學(xué)平臺(tái)對(duì)同一患者的命名規(guī)則可能不同比如一個(gè)帶“-01A”后綴一個(gè)不帶四組數(shù)據(jù)做對(duì)齊時(shí)我寫了三段臨時(shí)腳本才把樣本ID統(tǒng)一好。這個(gè)環(huán)節(jié)不要圖快你用parallel坐標(biāo)圖或者簡(jiǎn)單的集合對(duì)比圖先做all-in-one診斷比悶頭處理數(shù)據(jù)高效得多。2. 論文A復(fù)現(xiàn)轉(zhuǎn)錄組數(shù)據(jù)與機(jī)器學(xué)習(xí)預(yù)后模型拆解2.1 數(shù)據(jù)清洗從表達(dá)矩陣到建模輸入論文A用的是某公共腫瘤數(shù)據(jù)倉(cāng)庫(kù)的膀胱癌轉(zhuǎn)錄組數(shù)據(jù)加一套外部驗(yàn)證隊(duì)列。我從公共倉(cāng)庫(kù)下載的是STAR-Counts級(jí)別的原始計(jì)數(shù)數(shù)據(jù)而不是直接下載整理后的TPM矩陣原因很簡(jiǎn)單自己歸一化可以保證轉(zhuǎn)錄本長(zhǎng)度校正的這個(gè)細(xì)節(jié)是可控的。我的處理順序是這樣的先過(guò)濾蛋白編碼基因去掉低表達(dá)量基因表達(dá)均值小于1的刪掉然后做TPM轉(zhuǎn)換再做log2變換。這里有個(gè)容易被忽略的點(diǎn)為什么很多臨床模型用TPM而不是原始count因?yàn)門PM做了轉(zhuǎn)錄本長(zhǎng)度和測(cè)序深度的雙重歸一化不同樣本之間可比性更好而且log2變換能讓數(shù)據(jù)分布更接近正態(tài)對(duì)后續(xù)線性模型的擬合更友好。但如果你后續(xù)要做差異表達(dá)分析建議用count數(shù)據(jù)走專門的流程不要拿TPM直接去跑差異分析這是我踩過(guò)的教訓(xùn)。外部驗(yàn)證隊(duì)列同樣要做相同的清洗流程。注意兩個(gè)隊(duì)列的基因交集要提前算好我一開(kāi)始沒(méi)做這個(gè)步驟導(dǎo)致建模時(shí)特征矩陣的列數(shù)和驗(yàn)證集對(duì)不上程序跑到模型預(yù)測(cè)那一步才報(bào)錯(cuò)非常浪費(fèi)時(shí)間。2.2 特征篩選單因素Cox、LASSO與多因素Cox的三層過(guò)濾論文A的特征篩選策略是典型的三層結(jié)構(gòu)這也是腫瘤預(yù)后建模最經(jīng)典的套路。第一步先用單因素Cox回歸對(duì)所有基因做一遍過(guò)濾P值小于0.05的留下。這一步的目的不是找出真正的關(guān)鍵基因而是先砍掉大量明顯無(wú)關(guān)的噪聲特征把特征空間從兩三萬(wàn)個(gè)基因縮減到幾百個(gè)。第二步對(duì)剩下的特征做LASSO Cox回歸。這里我用的是十折交叉驗(yàn)證選擇懲罰參數(shù)并且選了“l(fā)ambda.1se”而不是“l(fā)ambda.min”。很多人不理解這個(gè)選擇的區(qū)別lambda.min是交叉驗(yàn)證誤差最小的點(diǎn)lambda.1se是誤差最小再加一個(gè)標(biāo)準(zhǔn)差范圍內(nèi)的最大lambda也就是更稀疏、更保守的解。在預(yù)后建模里選lambda.1se能減少很多“脆弱的”特征提高模型在外部數(shù)據(jù)上的穩(wěn)定性寧可犧牲一點(diǎn)點(diǎn)訓(xùn)練集AUC也要保泛化性。LASSO這塊的代碼我給你一個(gè)可以照抄的示例框架import numpy as np from sksurv.linear_model import CoxnetSurvivalAnalysis # X 是標(biāo)準(zhǔn)化后的特征矩陣y 是結(jié)構(gòu)化數(shù)組包含 event 和 time coxnet CoxnetSurvivalAnalysis( l1_ratio1.0, # 1.0 表示純 LASSO 懲罰 n_alphas200, max_iter2000 ) coxnet.fit(X, y) # 篩選非零系數(shù)特征 coef pd.Series( coxnet.coef_, indexX.columns ) selected_features coef[coef ! 0].index.tolist()第三步把LASSO篩出的基因放進(jìn)多因素Cox回歸里計(jì)算每個(gè)基因的風(fēng)險(xiǎn)比和置信區(qū)間只保留P值仍然顯著的基因。這一步可以理解為給前面兩步的結(jié)果做一次“重刑審查”。三步篩完我拿到手的是19個(gè)基因和論文里公開(kāi)的基因列表對(duì)比重合了17個(gè)剩下兩個(gè)不一致。這屬于正常情況因?yàn)楹Y選過(guò)程和預(yù)處理細(xì)節(jié)可能有微小差異但核心生物學(xué)信號(hào)是穩(wěn)定的。2.3 模型對(duì)比與評(píng)估指標(biāo)別只看C指數(shù)論文A的建模部分用了三個(gè)模型做對(duì)比隨機(jī)森林、XGBoost、CoxBoost。我用了一個(gè)通用生存模型框架來(lái)統(tǒng)一調(diào)用但你自己復(fù)現(xiàn)的時(shí)候可以直接用各庫(kù)的原生接口。重點(diǎn)在于評(píng)估策略。我當(dāng)時(shí)做了四件事時(shí)間依賴AUC、校準(zhǔn)曲線、決策曲線DCA、分層后的KM曲線。時(shí)間依賴AUC重點(diǎn)關(guān)注1年、3年、5年三個(gè)時(shí)間點(diǎn)因?yàn)榘螂装┑碾S訪實(shí)踐中這三個(gè)節(jié)點(diǎn)最常被臨床參考。DCA曲線很多人忽略但它其實(shí)是臨床落地最關(guān)心的指標(biāo)——它回答的不是“模型測(cè)得多準(zhǔn)”而是“在不同閾值下模型能不能帶來(lái)凈獲益”。這里有一個(gè)我要特別提醒的點(diǎn)如果你自己也準(zhǔn)備發(fā)同類文章評(píng)估指標(biāo)別只匯報(bào)C指數(shù)?,F(xiàn)在審稿人對(duì)單指標(biāo)越來(lái)越反感校準(zhǔn)曲線和DCA基本快成了標(biāo)配。3. 論文B復(fù)現(xiàn)影像組學(xué)與深度學(xué)習(xí)特征融合全流程3.1 影像數(shù)據(jù)預(yù)處理窗寬窗位與方向統(tǒng)一論文B是影像組學(xué)加深度特征融合做膀胱癌肌層浸潤(rùn)狀態(tài)預(yù)測(cè)。我用的影像數(shù)據(jù)來(lái)自一個(gè)公開(kāi)的CT影像集但復(fù)現(xiàn)過(guò)程遠(yuǎn)遠(yuǎn)沒(méi)有轉(zhuǎn)錄組數(shù)據(jù)順利因?yàn)橛跋駭?shù)據(jù)的坑太多了。第一個(gè)坑是窗寬窗位。CT圖像如果不統(tǒng)一窗寬窗位不同設(shè)備掃描出來(lái)的圖像對(duì)比度差異會(huì)被特征提取器當(dāng)成真實(shí)的組織差異。論文B在方法部分提到統(tǒng)一到腹部軟組織窗但沒(méi)給具體數(shù)值。我查了公共協(xié)議的推薦值設(shè)置了窗寬400窗位40再用線性變換把范圍內(nèi)的像素值映射到0到255。這一步做完之后同一患者不同掃描期的紋理特征穩(wěn)定性一下子提升了很多。第二個(gè)坑是方向不一致。我發(fā)現(xiàn)有一部分DICOM文件的影像方向向量不是標(biāo)準(zhǔn)正交方向直接送進(jìn)特征提取庫(kù)會(huì)出問(wèn)題導(dǎo)致同一類別的病灶方向特征完全不一致。這個(gè)問(wèn)題的排查手段是批量查看DICOM頭文件里的方向余弦信息發(fā)現(xiàn)異常樣本后統(tǒng)一用重采樣工具處理。第三個(gè)坑是像素間距。原始圖像的像素間距從0.5毫米到1.5毫米不等如果不重采樣到統(tǒng)一間距形狀特征和紋理特征會(huì)被掃描設(shè)備差異污染。我的做法是統(tǒng)一重采樣到1毫米等距網(wǎng)格在特征提取庫(kù)參數(shù)里設(shè)置對(duì)應(yīng)的重采樣間距。3.2 特征提取手工特征與深度特征的互補(bǔ)邏輯論文B的特征提取分兩條線并行。第一條線是傳統(tǒng)放射組學(xué)特征。我用放射組學(xué)特征提取庫(kù)計(jì)算了七大類特征一階統(tǒng)計(jì)量、形狀特征、灰度共生矩陣GLCM、灰度游程矩陣GLRLM、灰度大小區(qū)域矩陣GLSZM、鄰域灰度差矩陣NGTDM、灰度依賴矩陣GLDM。每個(gè)類別內(nèi)部還有不同參數(shù)組合比如GLCM里不同方向上距離為1和2的特征加起來(lái)單張影像能提取出上千個(gè)特征。為了讓復(fù)現(xiàn)更穩(wěn)我先用原始圖像直接提取了107個(gè)核心特征再補(bǔ)了wavelet濾波后的特征。第二條線是深度特征。我用在互聯(lián)網(wǎng)大規(guī)模圖像數(shù)據(jù)集上預(yù)訓(xùn)練好的經(jīng)典殘差網(wǎng)絡(luò)ResNet50提取倒數(shù)第二層輸出作為高維特征向量。這里特別要注意深度特征是在ROI區(qū)域上提取的不是整張CT。而且我用的是預(yù)訓(xùn)練權(quán)重直接推理不進(jìn)行微調(diào)。原因很簡(jiǎn)單膀胱癌影像樣本量太小幾百例微調(diào)預(yù)訓(xùn)練模型非常容易過(guò)擬合反而用固定權(quán)重當(dāng)“特征提取器”更穩(wěn)。融合策略上我做了早期融合和晚期融合的對(duì)比。早期融合就是把放射組學(xué)特征和深度特征拼接然后PCA降維再進(jìn)分類器晚期融合是放射組學(xué)特征單獨(dú)出一個(gè)模型分?jǐn)?shù)深度特征單獨(dú)出一個(gè)模型分?jǐn)?shù)最后兩個(gè)分?jǐn)?shù)加權(quán)。實(shí)驗(yàn)下來(lái)在我的數(shù)據(jù)集上晚期融合略占優(yōu)勢(shì)因?yàn)閮煞N特征的分布差異太大直接拼接容易讓深度學(xué)習(xí)特征淹沒(méi)手工特征。3.3 模型訓(xùn)練與影像特征穩(wěn)定性篩選論文B的模型主體是帶高斯核的支持向量機(jī)然后加了邏輯回歸三者對(duì)比。支持向量機(jī)在小樣本高維特征的場(chǎng)景下優(yōu)勢(shì)很明顯尤其是RBF核能把非線性關(guān)系映射到高維空間。在建模之前我還做了特征穩(wěn)定性篩選讓兩位標(biāo)注者分別在同一個(gè)樣本上勾畫ROI對(duì)兩組特征計(jì)算組內(nèi)相關(guān)系數(shù)ICC只保留ICC大于0.8的特征。這一步在影像組學(xué)里幾乎是必備操作因?yàn)镽OI勾畫存在觀察者間差異如果特征對(duì)勾畫邊界的微小變化都很敏感那這個(gè)特征本身就是噪聲。我復(fù)現(xiàn)時(shí)發(fā)現(xiàn)一階統(tǒng)計(jì)量特征和大部分紋理特征穩(wěn)定性都很好但形狀特征很容易受到勾畫邊界微小改動(dòng)的干擾所以最后保留下來(lái)的形狀特征很少。4. 論文C復(fù)現(xiàn)多組學(xué)整合與圖神經(jīng)網(wǎng)絡(luò)藥物敏感性預(yù)測(cè)4.1 多組學(xué)數(shù)據(jù)對(duì)齊與缺失值處理論文C在數(shù)據(jù)處理階段就需要非常耐心。它用了四組數(shù)據(jù)mRNA表達(dá)譜、外顯子突變、甲基化、拷貝數(shù)變異。這四組數(shù)據(jù)不是所有樣本都覆蓋完全有的患者缺甲基化有的缺拷貝數(shù)直接全部取交集的話樣本量會(huì)驟減到原來(lái)的三分之一。我的處理邏輯是先按患者ID對(duì)齊四組數(shù)據(jù)統(tǒng)計(jì)每個(gè)樣本的缺失情況。整體缺失率低于10%的組學(xué)用KNN插補(bǔ)插補(bǔ)參數(shù)k設(shè)置為10距離度量用歐氏距離。缺失率太高的組學(xué)就不硬補(bǔ)在后續(xù)建模時(shí)做模態(tài)掩碼處理也就是允許缺失模態(tài)在輸入網(wǎng)絡(luò)時(shí)置零。突變數(shù)據(jù)處理要特別注意編碼方式。我先統(tǒng)計(jì)了每個(gè)基因在隊(duì)列里的突變頻率把突變頻率低于5%的基因全部過(guò)濾掉剩下約兩百個(gè)高頻突變基因用一行布爾向量表示每個(gè)患者是否攜帶該基因突變。這個(gè)“5%頻率閾值”是我在論文C的補(bǔ)充材料里讀到的屬于一個(gè)經(jīng)驗(yàn)性的閾值太低會(huì)引入大量無(wú)意義的罕見(jiàn)突變?cè)肼曁邥?huì)過(guò)濾掉有意義的驅(qū)動(dòng)突變。4.2 患者相似性圖的構(gòu)建與圖劃分策略圖神經(jīng)網(wǎng)絡(luò)不是天然適合所有數(shù)據(jù)的。要讓圖網(wǎng)絡(luò)發(fā)揮作用關(guān)鍵是“圖”構(gòu)建得是否合理。論文C的做法是對(duì)每個(gè)組學(xué)模態(tài)分別計(jì)算患者間的距離矩陣再用K近鄰方法建圖K取10。邊的權(quán)重用高斯核函數(shù)計(jì)算這樣距離越近的患者邊權(quán)重越大。我復(fù)現(xiàn)時(shí)自己增加了一步分別構(gòu)建四個(gè)模態(tài)的子圖然后做圖融合。融合方式不是簡(jiǎn)單把鄰接矩陣相加而是把每個(gè)患者的各模態(tài)embeddings先過(guò)一層全連接網(wǎng)絡(luò)映射到同一維度再按注意力權(quán)重融合。這個(gè)改動(dòng)的依據(jù)是不同組學(xué)對(duì)藥物敏感性的貢獻(xiàn)明顯不同mRNA表達(dá)貢獻(xiàn)最大突變和甲基化次之拷貝數(shù)變異的信號(hào)比較稀疏用注意力機(jī)制讓模型自己學(xué)權(quán)重比固定權(quán)重更合理。這里我要強(qiáng)調(diào)一個(gè)特別隱蔽的坑圖的劃分不能隨機(jī)劃分節(jié)點(diǎn)。因?yàn)閳D用到了患者間的相似性關(guān)系如果同一個(gè)患者的信息在訓(xùn)練集和測(cè)試集里都有出現(xiàn)比如通過(guò)相似性圖的鄰居關(guān)系間接出現(xiàn)模型性能評(píng)估就會(huì)虛高。正確做法是先把患者按ID分好訓(xùn)練/驗(yàn)證/測(cè)試三個(gè)集合然后再重建各自的子圖每棵子圖里只包含該集合內(nèi)的患者節(jié)點(diǎn)。我一開(kāi)始沒(méi)注意這個(gè)問(wèn)題圖注意力網(wǎng)絡(luò)在測(cè)試集上達(dá)到了相當(dāng)高的預(yù)測(cè)相關(guān)系數(shù)后來(lái)仔細(xì)一查才發(fā)現(xiàn)是劃分泄漏教訓(xùn)很深刻。4.3 模型架構(gòu)與超參數(shù)設(shè)置論文C用的基準(zhǔn)模型是兩層圖卷積網(wǎng)絡(luò)改進(jìn)模型是兩層圖注意力網(wǎng)絡(luò)。具體超參數(shù)我復(fù)現(xiàn)時(shí)穩(wěn)定跑下來(lái)的一套配置是隱藏層維度64學(xué)習(xí)率0.001權(quán)重衰減0.0005dropout 0.3訓(xùn)練輪數(shù)200優(yōu)化器選Adam。每輪訓(xùn)練之后做早停當(dāng)驗(yàn)證集損失連續(xù)30輪不下降時(shí)停止并恢復(fù)到驗(yàn)證損失最低的模型參數(shù)。藥物敏感性預(yù)測(cè)是回歸任務(wù)輸出是一個(gè)患者的IC50預(yù)測(cè)值。評(píng)估指標(biāo)我重點(diǎn)關(guān)注了三個(gè)預(yù)測(cè)值與真實(shí)值的Pearson相關(guān)系數(shù)、均方根誤差、以及一致性指數(shù)C-index。前兩個(gè)是常規(guī)回歸指標(biāo)C-index把回歸預(yù)測(cè)轉(zhuǎn)為排序一致性可以衡量“模型預(yù)測(cè)的抗藥性排序是否準(zhǔn)確”在藥物敏感性場(chǎng)景下比單純的相關(guān)系數(shù)更接近臨床決策的真實(shí)需求。我在復(fù)現(xiàn)中還發(fā)現(xiàn)一個(gè)經(jīng)驗(yàn)圖注意力網(wǎng)絡(luò)在數(shù)據(jù)量較小的情況下并沒(méi)有比圖卷積網(wǎng)絡(luò)有壓倒性優(yōu)勢(shì)但它對(duì)注意力頭數(shù)的設(shè)置比較敏感頭數(shù)太多容易過(guò)擬合頭數(shù)太少學(xué)不出模態(tài)間的復(fù)雜交互。最后我用了2個(gè)頭效果最穩(wěn)定。5. 三篇論文復(fù)現(xiàn)中的高頻踩坑實(shí)錄5.1 數(shù)據(jù)泄漏最隱蔽也最致命復(fù)現(xiàn)這三篇論文的過(guò)程中我遇到最多的問(wèn)題就是數(shù)據(jù)泄漏。最常見(jiàn)的有兩類。第一類是預(yù)處理泄漏。比如你在全數(shù)據(jù)集上做了標(biāo)準(zhǔn)化然后再切訓(xùn)練測(cè)試集這會(huì)導(dǎo)致模型的測(cè)試性能被高估。我在復(fù)現(xiàn)論文A時(shí)剛開(kāi)始順手用全表達(dá)矩陣算均值和方差做z-score標(biāo)準(zhǔn)化結(jié)果訓(xùn)練集和驗(yàn)證集的AUC都虛高了不少。正確做法是先切數(shù)據(jù)再在訓(xùn)練集上擬合標(biāo)準(zhǔn)化器的參數(shù)再用這個(gè)標(biāo)準(zhǔn)化器去轉(zhuǎn)換測(cè)試集。這個(gè)順序在語(yǔ)音識(shí)別、圖像分類里可能沒(méi)那么關(guān)鍵但醫(yī)學(xué)小樣本數(shù)據(jù)里差別很大因?yàn)樯倭繕O端樣本就能明顯拉偏標(biāo)準(zhǔn)化參數(shù)。第二類是樣本重疊泄漏。同一個(gè)患者可能在數(shù)據(jù)集中出現(xiàn)多次不同時(shí)間點(diǎn)的隨訪樣本、多處病灶的影像如果不按患者ID去重直接劃分同一個(gè)患者的多個(gè)樣本會(huì)同時(shí)出現(xiàn)在訓(xùn)測(cè)兩邊模型成績(jī)虛高。論文B的影像數(shù)據(jù)里我就遇到過(guò)這種情況后來(lái)整理了一個(gè)患者ID到影像文件列表的映射字典再基于患者ID做分組劃分才解決。5.2 樣本量過(guò)小時(shí)的過(guò)擬合問(wèn)題這個(gè)我在論文A和論文C都踩到了。轉(zhuǎn)錄組特征即使經(jīng)過(guò)三輪篩選也有近20個(gè)基因但訓(xùn)練樣本量可能只有一兩百例隨機(jī)森林或圖網(wǎng)絡(luò)很容易把訓(xùn)練集擬合到AUC接近0.99外部驗(yàn)證只有0.7左右。我的解法是三層第一層是特征篩選階段就用bootstrap重采樣看基因被選中頻率頻次低于80%的基因直接不要因?yàn)榛貧w系數(shù)不穩(wěn)定大概率意味著它只是噪聲或個(gè)人樣本的偶合現(xiàn)象。第二層是模型正則化參數(shù)放大比如XGBoost里把樹(shù)深度從默認(rèn)6降到3把最小葉子節(jié)點(diǎn)樣本數(shù)調(diào)高到10圖網(wǎng)絡(luò)里把dropout從0.1調(diào)到0.3。第三層是早停機(jī)制不要等模型充分收斂在驗(yàn)證損失開(kāi)始反彈時(shí)就停。5.3 批次效應(yīng)掩蓋真實(shí)生物信號(hào)復(fù)現(xiàn)論文A時(shí)我把外部驗(yàn)證隊(duì)列放進(jìn)去做圖時(shí)看PCA降維發(fā)現(xiàn)兩個(gè)隊(duì)列的樣本完全分成兩團(tuán)。一開(kāi)始我懷疑是生物學(xué)差異但后來(lái)發(fā)現(xiàn)這更可能是測(cè)序平臺(tái)差別帶來(lái)的批次效應(yīng)。后來(lái)在特征篩選之前我對(duì)兩個(gè)隊(duì)列的標(biāo)準(zhǔn)化表達(dá)矩陣做了批次校正再用校正后的矩陣重新走單因素Cox和LASSO特征穩(wěn)定性和外部驗(yàn)證集的C指數(shù)都有了小幅提升。這里有一個(gè)值得記住的原則批次校正要不要做不能拍腦袋先可視化再做決策。我也見(jiàn)過(guò)有些研究用了批次校正反而把真實(shí)的生物學(xué)信號(hào)磨掉了。對(duì)于轉(zhuǎn)錄組數(shù)據(jù)批次校正工具非常多但在做之前一定要用UMAP或PCA先畫個(gè)圖看看數(shù)據(jù)分布。5.4 軟硬件環(huán)境相關(guān)的“玄學(xué)”問(wèn)題圖神經(jīng)網(wǎng)絡(luò)庫(kù)版本兼容性是我在論文C復(fù)現(xiàn)中花時(shí)間最多的問(wèn)題。我當(dāng)時(shí)圖神經(jīng)網(wǎng)絡(luò)庫(kù)和深度學(xué)習(xí)框架版本沖突最后重裝匹配版本組合才解決。建議你在裝環(huán)境的時(shí)候直接把兼容版本組合記錄下來(lái)不要等到半年后再跑才發(fā)現(xiàn)。還有一個(gè)問(wèn)題是隨機(jī)種子。對(duì)于醫(yī)學(xué)小樣本數(shù)據(jù)隨機(jī)種子對(duì)結(jié)果的影響非常大。我做過(guò)一個(gè)測(cè)試同一個(gè)模型只改隨機(jī)種子測(cè)試集AUC在0.71到0.78之間波動(dòng)。這不是模型不穩(wěn)定而是樣本量太小導(dǎo)致的固有隨機(jī)性。所以復(fù)現(xiàn)時(shí)一定要固定所有隨機(jī)種子并記錄最終用的種子值否則你換個(gè)環(huán)境重跑結(jié)果完全對(duì)不上。6. 復(fù)現(xiàn)后的沉淀如何把這些方法論遷移到自己的課題6.1 三篇論文的技術(shù)點(diǎn)遷移矩陣跑完三篇論文之后我做了一張技術(shù)點(diǎn)遷移矩陣把三套路線里所有可以復(fù)用的環(huán)節(jié)拆出來(lái)技術(shù)環(huán)節(jié)論文A方案論文B方案論文C方案可遷移場(chǎng)景特征初篩單因素CoxICC穩(wěn)定性篩選高頻突變頻率篩查任何高維生物數(shù)據(jù)特征降維LASSOmRMR模態(tài)注意力加權(quán)消除冗余特征模型融合多模型對(duì)比深度特征手工特征融合多組學(xué)圖融合多來(lái)源數(shù)據(jù)整合驗(yàn)證體系內(nèi)部驗(yàn)證外部驗(yàn)證觀察者差異驗(yàn)證患者級(jí)分層劃分所有預(yù)測(cè)類研究可視化校準(zhǔn)曲線DCA特征分布圖注意力權(quán)重?zé)崃D向?qū)徃迦苏故究煽啃?.2 當(dāng)自己只有少量樣本時(shí)怎么辦復(fù)現(xiàn)完頂刊路線之后最常被問(wèn)的一個(gè)問(wèn)題是我的單中心數(shù)據(jù)只有幾十例這些方法還能用嗎我的答案是能用但要換策略。小樣本場(chǎng)景下傳統(tǒng)機(jī)器學(xué)習(xí)的嵌套交叉驗(yàn)證比任何深度模型都可靠。外部驗(yàn)證隊(duì)列樣本量不夠就用bootstrap內(nèi)部驗(yàn)證。論文B那種深度學(xué)習(xí)特征融合路線可以跑但預(yù)訓(xùn)練模型一定不能微調(diào)只做固定特征提取。論文C那種多組學(xué)圖網(wǎng)絡(luò)需要的數(shù)據(jù)量大自己幾十例是撐不住的但你可以把圖網(wǎng)絡(luò)的思路簡(jiǎn)化成“多組學(xué)相似性加權(quán)”的個(gè)性化預(yù)測(cè)對(duì)每個(gè)新患者計(jì)算其與歷史患者的組學(xué)相似度然后用相似度加權(quán)的歷史患者結(jié)局來(lái)做預(yù)測(cè)本質(zhì)是一個(gè)可解釋的局部加權(quán)回歸。這個(gè)思路在小樣本場(chǎng)景下往往比端到端的圖網(wǎng)絡(luò)實(shí)用得多。6.3 從復(fù)現(xiàn)到發(fā)表的最后一公里代碼復(fù)現(xiàn)的終點(diǎn)不是“能跑通”而是“能輸出一套可信的結(jié)果體系”。這句話是我復(fù)現(xiàn)完三篇論文之后才真正理解的。你復(fù)現(xiàn)別人的論文時(shí)可能會(huì)發(fā)現(xiàn)有些實(shí)驗(yàn)細(xì)節(jié)論文里沒(méi)寫需要你回頭跟作者確認(rèn)這就是很典型的“隱性知識(shí)”期刊的補(bǔ)充材料是補(bǔ)不全的。我的經(jīng)驗(yàn)是每復(fù)現(xiàn)一篇論文都要記錄一份“復(fù)現(xiàn)日志”內(nèi)容包括數(shù)據(jù)來(lái)源、預(yù)處理每一步的具體命令、特征篩選的參數(shù)、模型訓(xùn)練配置、每個(gè)階段的結(jié)果快照。這份日志的價(jià)值非常大它不僅是幫你驗(yàn)證別人的結(jié)果更是你后續(xù)寫自己方法部分時(shí)的現(xiàn)成素材。你可以把它當(dāng)成做科研的“實(shí)驗(yàn)記錄”一點(diǎn)不夸張。如果你想把復(fù)現(xiàn)的成果擴(kuò)展成一篇文章我建議把重點(diǎn)放在“比較”而不是“重復(fù)”。比如你在論文A的框架基礎(chǔ)上發(fā)現(xiàn)某個(gè)全新的特征篩選策略在更大范圍的數(shù)據(jù)上表現(xiàn)更好或者在論文B的基礎(chǔ)上加入了一個(gè)多模態(tài)融合模塊這些才是你自己的貢獻(xiàn)。單純把別人的流程在公開(kāi)數(shù)據(jù)上重跑一遍能發(fā)表在小型期刊但很難再上頂刊。從應(yīng)用層面來(lái)說(shuō)膀胱癌AI的前沿方向還有不少可挖的地方比如影像組學(xué)加基因組學(xué)構(gòu)建“影像基因組學(xué)”模型從CT影像里反推分子分型比如用對(duì)比學(xué)習(xí)解決小樣本下的特征魯棒性問(wèn)題比如把藥物敏感性預(yù)測(cè)和細(xì)胞系數(shù)據(jù)預(yù)訓(xùn)練結(jié)合再遷移到患者數(shù)據(jù)。復(fù)現(xiàn)這三篇論文只是起點(diǎn)你看到的其實(shí)是這套方法論的底層邏輯——所有腫瘤預(yù)測(cè)類研究核心就一句話把高維生物數(shù)據(jù)變成臨床可操作的低維決策信號(hào)。說(shuō)回復(fù)現(xiàn)本身。我個(gè)人在實(shí)際操作中的體會(huì)是真正耗時(shí)間的不是模型訓(xùn)練而是數(shù)據(jù)清洗和數(shù)據(jù)對(duì)齊這部分占了我整個(gè)復(fù)現(xiàn)時(shí)間的七成。不要試圖跳過(guò)這些臟活它們才是保證后續(xù)模型可靠的關(guān)鍵。最后再分享一個(gè)小技巧每次清洗完一批數(shù)據(jù)立刻存成中間文件哪怕只是按ID排序這種看起來(lái)無(wú)關(guān)緊要的步驟也要存。因?yàn)槟悴淮_定后面哪個(gè)環(huán)節(jié)會(huì)出問(wèn)題可能重新比對(duì)數(shù)據(jù)時(shí)就得回到某個(gè)中間狀態(tài)重跑一遍這個(gè)時(shí)候文件和文件夾命名規(guī)范一點(diǎn)能幫你省下整整兩天時(shí)間。