測(cè)與ADMET性質(zhì)建模:從分子描述符到機(jī)器學(xué)習(xí)實(shí)戰(zhàn))
做藥物活性預(yù)測(cè)這個(gè)項(xiàng)目起因其實(shí)挺樸素。計(jì)算化學(xué)和機(jī)器學(xué)習(xí)結(jié)合已經(jīng)不是新鮮事了但很多剛?cè)肟拥呐笥涯玫降慕坛桃粗恢v算法原理要么只給代碼跑一遍就結(jié)束很難直接遷移到自己的分子數(shù)據(jù)集上。這次我把ERα拮抗劑活性預(yù)測(cè)和ADMET性質(zhì)預(yù)測(cè)整套流程完整走了一遍用到了Python生態(tài)里最經(jīng)典的那幾個(gè)模型——神經(jīng)網(wǎng)絡(luò)、隨機(jī)森林、SVM、KNN還有回歸家族中間加了PCA做特征壓縮把踩過(guò)的坑和關(guān)鍵參數(shù)調(diào)整都記錄下來(lái)希望對(duì)正在做類似QSAR或者藥物篩選的朋友有實(shí)際幫助。這個(gè)項(xiàng)目的價(jià)值在于兩點(diǎn)一是ERα是乳腺癌藥物研發(fā)里非常重要的靶點(diǎn)能在化合物合成前用模型快速評(píng)估拮抗活性能省下大量濕實(shí)驗(yàn)成本二是ADMET性質(zhì)預(yù)測(cè)解決的是“活性有了但成藥性差”的痛點(diǎn)把吸收、分布、代謝、排泄和毒性風(fēng)險(xiǎn)在早期就暴露出來(lái)。整套流程跑通后對(duì)一個(gè)新化合物從活性到成藥性的初步評(píng)估幾分鐘內(nèi)就能出結(jié)果。1. 項(xiàng)目整體思路與方案選型1.1 核心需求拆解ERα拮抗劑預(yù)測(cè)本質(zhì)上是一個(gè)分子性質(zhì)回歸問(wèn)題。我們把分子結(jié)構(gòu)轉(zhuǎn)化成計(jì)算機(jī)能理解的特征向量然后讓模型學(xué)習(xí)“結(jié)構(gòu)特征→拮抗活性”之間的映射關(guān)系。常用的活性指標(biāo)是IC50值但I(xiàn)C50是微摩爾級(jí)別數(shù)值跨度過(guò)大直接回歸效果不好所以業(yè)界普遍先做負(fù)對(duì)數(shù)轉(zhuǎn)換轉(zhuǎn)換成pIC50這樣數(shù)值范圍基本落在4到10之間更符合回歸模型對(duì)目標(biāo)變量分布的要求。ADMET預(yù)測(cè)則是另一套邏輯。它不是一個(gè)單一任務(wù)而是多個(gè)二分類或回歸子任務(wù)的集合。比如血腦屏障穿透能力可以做成“能穿透/不能穿透”的二分類水溶性可以做成回歸預(yù)測(cè)LogS值。項(xiàng)目標(biāo)題里把這些任務(wù)放在一起表面上看起來(lái)復(fù)雜實(shí)際上核心挑戰(zhàn)是一致的如何用有限的數(shù)據(jù)訓(xùn)練出泛化能力強(qiáng)的模型以及如何處理高維稀疏的分子特征。1.2 為什么選這五種算法先說(shuō)說(shuō)模型選型的思路。如果你去過(guò)Kaggle或者看過(guò)多篇QSAR論文會(huì)發(fā)現(xiàn)這幾個(gè)算法出場(chǎng)率極高不是沒(méi)有原因的。隨機(jī)森林是集成學(xué)習(xí)的代表通過(guò)構(gòu)建多棵決策樹(shù)并投票或者取平均天然抗過(guò)擬合對(duì)異常值不敏感而且自帶特征重要性評(píng)估。在分子描述符這種噪聲較多的數(shù)據(jù)上隨機(jī)森林往往比單棵決策樹(shù)穩(wěn)定得多。SVM在小樣本高維場(chǎng)景下表現(xiàn)一直很穩(wěn)尤其配合RBF核函數(shù)能把非線性關(guān)系映射到高維空間去擬合。藥物篩選數(shù)據(jù)通常樣本量不大幾百到幾千個(gè)化合物SVM正好發(fā)揮優(yōu)勢(shì)。KNN的思路最簡(jiǎn)單相似的結(jié)構(gòu)往往有相似的活性這個(gè)假設(shè)在化學(xué)空間里很多時(shí)候是成立的。但從實(shí)操角度看KNN對(duì)特征縮放非常敏感分子描述符量綱差異很大不標(biāo)準(zhǔn)化基本沒(méi)法用這也正好引出PCA。神經(jīng)網(wǎng)絡(luò)我們用的是MLP多層感知機(jī)。在小規(guī)模表格數(shù)據(jù)上只要數(shù)據(jù)量不太小、特征質(zhì)量高M(jìn)LP能擬合非常復(fù)雜的非線性關(guān)系。但它有個(gè)明顯缺點(diǎn)——可解釋性差參數(shù)也多調(diào)參成本高?;貧w模型這里主要指線性回歸和嶺回歸作為基線模型非常重要。先用簡(jiǎn)單的線性模型跑一遍得到一個(gè)性能下限再去對(duì)比復(fù)雜模型有沒(méi)有真的帶來(lái)提升。如果隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)比嶺回歸沒(méi)高幾個(gè)點(diǎn)那就要反思特征工程或者數(shù)據(jù)質(zhì)量的問(wèn)題而不是繼續(xù)往上堆模型復(fù)雜度。1.3 數(shù)據(jù)來(lái)源與格式設(shè)計(jì)數(shù)據(jù)方面ERα拮抗劑活性數(shù)據(jù)可以從ChEMBL數(shù)據(jù)庫(kù)下載篩選標(biāo)準(zhǔn)是human ERα、IC50類型數(shù)據(jù)刪掉重復(fù)項(xiàng)和異常值。ADMET數(shù)據(jù)可以從Tox21、AMES、以及一些公開(kāi)的ADMET benchmark數(shù)據(jù)集獲取。格式上我用的是SDF文件加CSV標(biāo)簽文件的結(jié)構(gòu)。SDF存分子結(jié)構(gòu)CSV存pIC50或者ADMET標(biāo)簽兩邊的ID一一對(duì)應(yīng)。這樣設(shè)計(jì)的好處是換數(shù)據(jù)集時(shí)不用改代碼邏輯只要保證ID匹配就行。有一個(gè)特別容易忽略的點(diǎn)數(shù)據(jù)集劃分必須按分子骨架或者相似性來(lái)分而不是隨機(jī)分。藥物活性數(shù)據(jù)里經(jīng)常有大量結(jié)構(gòu)類似的類似物隨機(jī)劃分會(huì)導(dǎo)致訓(xùn)練集和測(cè)試集高度重疊模型性能虛高。我在實(shí)操中用了基于Bemis-Murcko骨架的ScaffoldSplit效果比隨機(jī)劃分要嚴(yán)謹(jǐn)?shù)枚?。初學(xué)者容易忽略這個(gè)問(wèn)題但發(fā)論文或者實(shí)際項(xiàng)目評(píng)估時(shí)這個(gè)細(xì)節(jié)很關(guān)鍵。2. 特征工程與PCA降維實(shí)戰(zhàn)2.1 分子描述符的計(jì)算與處理分子描述符是把化學(xué)結(jié)構(gòu)轉(zhuǎn)化成數(shù)值特征的核心手段。我這里用RDKit庫(kù)計(jì)算了大約200個(gè)2D描述符包括分子量、LogP、氫鍵供體受體數(shù)量、拓?fù)錁O性表面積、可旋轉(zhuǎn)鍵數(shù)、芳香環(huán)數(shù)等。為什么不用3D描述符因?yàn)?D描述符依賴分子構(gòu)象計(jì)算成本高而且構(gòu)象生成的不確定性會(huì)影響模型復(fù)現(xiàn)性。很多QSAR模型只用2D描述符就能達(dá)到很好的效果省時(shí)省力。拿到原始描述符后第一步是清洗。RDKit計(jì)算過(guò)程中部分分子可能返回NaN比如某些描述符對(duì)特定原子類型不支持。處理策略很簡(jiǎn)單刪除缺失值占比超過(guò)5%的特征列剩余缺失值用中位數(shù)填充。這里不推薦用均值填充因?yàn)槊枋龇植纪瞧珣B(tài)的均值容易被極端值帶偏中位數(shù)更穩(wěn)健。第二步是去低方差特征。那些幾乎所有分子取值都一樣的描述符對(duì)模型區(qū)分沒(méi)有貢獻(xiàn)直接刪掉??梢杂梅讲铋撝捣ūA舴讲畲笥?.01的特征。第三步才是標(biāo)準(zhǔn)化。注意PCA和SVM、KNN這些基于距離的算法都要求特征在同一量綱下否則量級(jí)大的特征會(huì)主導(dǎo)距離計(jì)算。標(biāo)準(zhǔn)化用StandardScaler就行減去均值除以標(biāo)準(zhǔn)差。2.2 PCA降維的合理參數(shù)設(shè)置主成分分析本身不復(fù)雜就是把高維相關(guān)特征通過(guò)正交變換變成一組線性無(wú)關(guān)的主成分。但在分子描述符這個(gè)場(chǎng)景里PCA有兩個(gè)實(shí)際價(jià)值一是消除共線性分子描述符之間相關(guān)性普遍很高比如分子量和分子體積基本是正相關(guān)的二是壓縮維度200多個(gè)描述符降到50個(gè)主成分能保留95%以上方差同時(shí)讓SVM和KNN的距離計(jì)算更穩(wěn)定。我需要特別強(qiáng)調(diào)一點(diǎn)PCA必須放在特征縮放之后而且只能基于訓(xùn)練集擬合然后用訓(xùn)練集的變換參數(shù)去轉(zhuǎn)換測(cè)試集。這是數(shù)據(jù)泄漏問(wèn)題里最常見(jiàn)的一條見(jiàn)過(guò)太多人先對(duì)全量數(shù)據(jù)做PCA再來(lái)劃分訓(xùn)練測(cè)試集結(jié)果測(cè)試集信息提前進(jìn)入了訓(xùn)練過(guò)程模型評(píng)估結(jié)果虛高得離譜。正確做法是放進(jìn)sklearn的Pipeline里統(tǒng)一管理。主成分?jǐn)?shù)量的選擇我建議用累計(jì)方差貢獻(xiàn)率來(lái)定。一般保留90%到95%的累計(jì)方差即可。比如這套數(shù)據(jù)里前48個(gè)主成分解釋了95.2%的方差那我直接用48維特征訓(xùn)練模型。不要盲目保留太多主成分后面那些主成分解釋方差極低基本是噪聲加進(jìn)去反而干擾模型。2.3 特征重要性與PCA的對(duì)比觀察做完P(guān)CA之后我還做了一個(gè)對(duì)照實(shí)驗(yàn)一組直接用原始200維描述符訓(xùn)練另一組用PCA降維后訓(xùn)練。結(jié)果挺有意思。隨機(jī)森林對(duì)降維不敏感甚至原始特征表現(xiàn)略好一點(diǎn)因?yàn)殡S機(jī)森林的特征子集選擇機(jī)制本身就能處理高維冗余特征。但SVM和KNN在降維后性能明顯提升尤其是在KNN上訓(xùn)練和推理時(shí)間也大幅下降。這說(shuō)明PCA不是萬(wàn)能的它的價(jià)值跟模型選擇強(qiáng)相關(guān)。樹(shù)模型不需要它距離模型很需要它。如果你想節(jié)省調(diào)參時(shí)間直接做一版降維后的數(shù)據(jù)跑全部模型至少能保證距離類模型不會(huì)因?yàn)榫S度災(zāi)難而崩掉。3. 五種模型核心原理與關(guān)鍵參數(shù)3.1 隨機(jī)森林在活性預(yù)測(cè)中的表現(xiàn)隨機(jī)森林的實(shí)現(xiàn)細(xì)節(jié)值得展開(kāi)講。每棵樹(shù)在訓(xùn)練時(shí)用Bootstrap抽樣隨機(jī)取一部分樣本每個(gè)節(jié)點(diǎn)分裂時(shí)隨機(jī)選一部分特征尋找最優(yōu)分裂。這個(gè)“雙隨機(jī)”機(jī)制讓每棵樹(shù)都有差異最后取平均時(shí)方差大幅降低。實(shí)際操作里我重點(diǎn)調(diào)的是n_estimators和max_features。n_estimators從100開(kāi)始增加觀察交叉驗(yàn)證分?jǐn)?shù)到300之后基本平臺(tái)期再增加只是浪費(fèi)計(jì)算時(shí)間。max_features默認(rèn)是sqrt(n_features)在降維后的48維特征上大概取7這個(gè)值我試過(guò)調(diào)大調(diào)小效果都略差于默認(rèn)。樣本不均衡問(wèn)題在ADMET分類任務(wù)里很突出比如毒性陽(yáng)性樣本可能只占10%。隨機(jī)森林的class_weight參數(shù)設(shè)成balanced能自動(dòng)調(diào)整權(quán)重讓少數(shù)類被更重視。這個(gè)參數(shù)在ERα回歸任務(wù)里用不上但ADMET分類必須要加。3.2 SVM的核函數(shù)選擇與小樣本優(yōu)勢(shì)SVM在這個(gè)項(xiàng)目里的定位是“精度擔(dān)當(dāng)”。藥物數(shù)據(jù)樣本量不大幾百個(gè)樣本在高維空間里線性不可分很常見(jiàn)RBF核函數(shù)能通過(guò)高斯映射把樣本投影到無(wú)窮維空間理論上可以處理任意復(fù)雜的決策邊界。但RBF核有兩個(gè)關(guān)鍵超參數(shù)C和gamma。C控制誤分類懲罰力度太大容易過(guò)擬合太小欠擬合。gamma控制徑向基函數(shù)的寬度gamma越大每個(gè)樣本的影響范圍越小決策邊界越復(fù)雜。我用了GridSearchCV網(wǎng)格搜索C在0.1到100范圍gamma在0.001到1范圍用5折交叉驗(yàn)證選組。一個(gè)小技巧SVM對(duì)數(shù)據(jù)尺度極敏感Pipeline里先StandardScaler再SVC這一步不做的話RBF核直接失效。另外SVM訓(xùn)練完成后沒(méi)有天然的概率輸出如果要概率值需要設(shè)置probabilityTrue但訓(xùn)練時(shí)間會(huì)變長(zhǎng)這個(gè)代價(jià)在幾百樣本的規(guī)模下完全能接受。3.3 KNN的距離度量與標(biāo)準(zhǔn)化必要性KNN在藥物篩選里的作用經(jīng)常被低估。它雖然簡(jiǎn)單但在某些局部化學(xué)空間里預(yù)測(cè)效果出奇地好。核心假設(shè)是化學(xué)相似性原理——結(jié)構(gòu)相似的化合物活性也相似。實(shí)際操作中K值的選擇比較關(guān)鍵。K太小模型過(guò)度依賴最近鄰噪聲影響大K太大會(huì)把距離很遠(yuǎn)的樣本也納入投票整體趨于平均。我用交叉驗(yàn)證從K3到K15逐個(gè)測(cè)試發(fā)現(xiàn)K7在這個(gè)數(shù)據(jù)集上是折中點(diǎn)。距離度量選的是歐氏距離配合標(biāo)準(zhǔn)化后的特征。為什么不用曼哈頓距離或者余弦相似度因?yàn)闃?biāo)準(zhǔn)化后歐氏距離能較好地反映高維空間中的真實(shí)差異曼哈頓距離在高維下區(qū)分度會(huì)變差。weights參數(shù)我設(shè)成了distance即距離近的樣本權(quán)重更大這樣比均勻權(quán)重略好。3.4 回歸模型家族與基線設(shè)定回歸部分我選了三種線性回歸、嶺回歸、Lasso回歸。線性回歸是最樸素的基線嶺回歸加了L2正則化Lasso加了L1正則化后者還能做特征選擇。嶺回歸的alpha參數(shù)控制正則化強(qiáng)度。alpha越大模型系數(shù)越被壓縮向零方差減小但偏差增大。通過(guò)交叉驗(yàn)證這個(gè)數(shù)據(jù)集上alpha1.0周圍表現(xiàn)不錯(cuò)。Lasso的alpha適當(dāng)調(diào)大后很多特征的系數(shù)直接變成零相當(dāng)于自動(dòng)做了特征篩選解釋性更強(qiáng)。這里必須強(qiáng)調(diào)基線模型的價(jià)值。我用嶺回歸跑出來(lái)的R2大概在0.61隨機(jī)森林能到0.78SVM到0.75這說(shuō)明復(fù)雜的非線性模型確實(shí)學(xué)到了更多結(jié)構(gòu)活性關(guān)系。如果是那種所有復(fù)雜模型跟線性回歸持平的項(xiàng)目大概率是特征工程有問(wèn)題或者數(shù)據(jù)本身線性關(guān)系已經(jīng)很強(qiáng)沒(méi)必要費(fèi)勁上深度學(xué)習(xí)。3.5 神經(jīng)網(wǎng)絡(luò)MLP的架構(gòu)設(shè)計(jì)與防過(guò)擬合MLP的架構(gòu)我設(shè)計(jì)得比較克制輸入層48維PCA降維后一個(gè)隱藏層128個(gè)神經(jīng)元激活函數(shù)ReLU輸出層1個(gè)神經(jīng)元預(yù)測(cè)pIC50。為什么只有一個(gè)隱藏層因?yàn)樵谛颖緮?shù)據(jù)上網(wǎng)絡(luò)太深很容易過(guò)擬合一層隱藏層加足夠的神經(jīng)元已經(jīng)能逼近任意連續(xù)函數(shù)。訓(xùn)練時(shí)batch_size設(shè)為32優(yōu)化器Adam學(xué)習(xí)率0.001loss用MSE。關(guān)鍵步驟是EarlyStopping——監(jiān)控驗(yàn)證集loss連續(xù)20個(gè)epoch沒(méi)有改善就停下并且恢復(fù)最佳權(quán)重。這套機(jī)制比固定epoch數(shù)訓(xùn)練好用得多能自動(dòng)找到合適的訓(xùn)練輪數(shù)。MLP在表格數(shù)據(jù)上還有個(gè)隱藏問(wèn)題特征尺度不一致時(shí)收斂很慢。雖然PCA前的標(biāo)準(zhǔn)化已經(jīng)處理過(guò)但最好確認(rèn)一下PCA后各主成分的值域。另外神經(jīng)元數(shù)量也不是越多越好我試過(guò)256個(gè)神經(jīng)元驗(yàn)證集分?jǐn)?shù)反而略降這就是過(guò)擬合的信號(hào)。4. 實(shí)操過(guò)程與核心代碼實(shí)現(xiàn)4.1 數(shù)據(jù)加載與劃分策略整個(gè)項(xiàng)目的代碼基于Python 3.9和scikit-learn 1.2版本。數(shù)據(jù)加載、特征計(jì)算、模型訓(xùn)練和評(píng)估的完整代碼我整理好了這里按關(guān)鍵環(huán)節(jié)拆解說(shuō)明。數(shù)據(jù)加載用的是pandas讀取CSV分子描述符計(jì)算用RDKit。下面是核心代碼片段import pandas as pd import numpy as np from rdkit import Chem from rdkit.Chem import Descriptors from rdkit.Chem import Draw df pd.read_csv(er_activity.csv) molecules [Chem.MolFromSmiles(smi) for smi in df[SMILES]] desc_names [desc[0] for desc in Descriptors._descList] desc_funcs [desc[1] for desc in Descriptors._descList] desc_data [] valid_idx [] for i, mol in enumerate(molecules): if mol is None: continue try: desc_values [func(mol) for func in desc_funcs] desc_data.append(desc_values) valid_idx.append(i) except: continue df_desc pd.DataFrame(desc_data, columnsdesc_names) df_desc[pIC50] df.iloc[valid_idx][pIC50].values這里有個(gè)坑RDKit的計(jì)算有些函數(shù)會(huì)對(duì)特定分子拋異常比如含金屬原子的配體。所以必須用try-except包裹把計(jì)算失敗的分子剔除掉否則整個(gè)流程會(huì)中斷。數(shù)據(jù)劃分用ScaffoldSplit按骨架劃分保證訓(xùn)練集和測(cè)試集的結(jié)構(gòu)差異性from sklearn.model_selection import train_test_split from rdkit.Chem.Scaffolds import MurckoScaffold scaffolds [] for smi in df_desc[SMILES]: mol Chem.MolFromSmiles(smi) scaffold MurckoScaffold.MurckoScaffoldSmiles(molmol) scaffolds.append(scaffold) from sklearn.model_selection import GroupShuffleSplit gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, test_idx next(gss.split(df_desc, groupsscaffolds)) train_df df_desc.iloc[train_idx] test_df df_desc.iloc[test_idx]ScaffoldSplit做的是按骨架分組后分組切分確保同一骨架的分子不會(huì)同時(shí)出現(xiàn)在訓(xùn)練集和測(cè)試集里。這在評(píng)估模型對(duì)新化學(xué)骨架的泛化能力時(shí)比隨機(jī)劃分靠譜得多。4.2 PCA與Pipeline的整合特征縮放和PCA放進(jìn)Pipeline里管理這一步的核心邏輯是確保交叉驗(yàn)證時(shí)每個(gè)fold都獨(dú)立做縮放和降維絕不使用測(cè)試集信息。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.ensemble import RandomForestRegressor from sklearn.svm import SVR from sklearn.neighbors import KNeighborsRegressor from sklearn.linear_model import Ridge from sklearn.neural_network import MLPRegressor from sklearn.metrics import r2_score, mean_absolute_error pipeline_svm Pipeline([ (scaler, StandardScaler()), (pca, PCA(n_components0.95)), (svm, SVR(kernelrbf, C10, gamma0.01, probabilityTrue)) ])n_components0.95這種寫法是讓PCA自動(dòng)保留95%的累計(jì)方差比寫死一個(gè)整數(shù)更靈活。如果數(shù)據(jù)集換了一批分子描述符的方差分布會(huì)變固定寫48反而可能不合適。4.3 模型訓(xùn)練與交叉驗(yàn)證評(píng)估訓(xùn)練和評(píng)估我統(tǒng)一了流程每個(gè)模型跑5折交叉驗(yàn)證用R2和MAE做評(píng)估指標(biāo)。在回歸任務(wù)里R2衡量模型解釋的方差比例MAE則給出預(yù)測(cè)值跟真實(shí)值之間的平均絕對(duì)誤差兩者結(jié)合看比較全面。from sklearn.model_selection import cross_validate scoring {r2: r2, neg_mae: neg_mean_absolute_error} results {} models { Ridge: pipeline_ridge, RandomForest: pipeline_rf, SVM: pipeline_svm, KNN: pipeline_knn, MLP: pipeline_mlp } for name, model in models.items(): cv_results cross_validate(model, train_df.drop([SMILES, pIC50], axis1), train_df[pIC50], cv5, scoringscoring) results[name] { R2_mean: cv_results[test_r2].mean(), R2_std: cv_results[test_r2].std(), MAE_mean: -cv_results[test_neg_mae].mean() }交叉驗(yàn)證的5個(gè)fold里每個(gè)fold的R2可能相差挺大這在小樣本數(shù)據(jù)里太正常了。所以看結(jié)果時(shí)不能只看均值還得看標(biāo)準(zhǔn)差。如果標(biāo)準(zhǔn)差特別大說(shuō)明模型對(duì)數(shù)據(jù)劃分很敏感需要檢查是否存在某些骨架的分子特別難預(yù)測(cè)。最后在獨(dú)立測(cè)試集上做一次最終評(píng)估。測(cè)試集不參與任何訓(xùn)練和調(diào)參這一步得到的R2才是真正能對(duì)外匯報(bào)的泛化性能。final_scores {} for name, model in models.items(): model.fit(train_df.drop([SMILES, pIC50], axis1), train_df[pIC50]) pred model.predict(test_df.drop([SMILES, pIC50], axis1)) final_scores[name] { R2: r2_score(test_df[pIC50], pred), MAE: mean_absolute_error(test_df[pIC50], pred) }4.4 ADMET多任務(wù)預(yù)測(cè)的特殊處理ADMET預(yù)測(cè)跟ERα回歸不太一樣的地方在于它通常是分類任務(wù)。以血腦屏障穿透預(yù)測(cè)為例標(biāo)簽只有0和1。此時(shí)評(píng)估指標(biāo)從R2換成AUC和準(zhǔn)確率。分類模型的訓(xùn)練代碼跟回歸高度相似只是把SVR換成SVCMLPRegressor換成MLPClassifier評(píng)估函數(shù)換成roc_auc_score。有一個(gè)小細(xì)節(jié)ADMET數(shù)據(jù)通常正負(fù)樣本不均衡單純用準(zhǔn)確率容易騙人——比如90%的樣本是負(fù)類模型全部預(yù)測(cè)為負(fù)類也能拿到90%準(zhǔn)確率。所以必須用AUC作為主指標(biāo)。對(duì)于多個(gè)ADMET端點(diǎn)我建議分別訓(xùn)練模型而不是合并成一個(gè)多標(biāo)簽?zāi)P?。因?yàn)椴煌它c(diǎn)的最優(yōu)特征和模型可能不同合并后反而互相干擾。實(shí)際操作時(shí)寫一個(gè)循環(huán)每個(gè)端點(diǎn)單獨(dú)訓(xùn)練和評(píng)估最后匯總成一張性能表。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 描述符計(jì)算報(bào)錯(cuò)與缺失值處理跑RDKit描述符時(shí)最容易遇到的是部分分子返回NaN。這可能是分子包含特殊原子類型或者某個(gè)描述符定義里出現(xiàn)了除以零的情況。處理邏輯分兩步先刪列再填行。具體來(lái)說(shuō)如果某列缺失值占比超過(guò)5%整列刪除因?yàn)槿笔嗾f(shuō)明這個(gè)描述符對(duì)很多分子不適用保留反而引入噪聲。剩余列的缺失值用中位數(shù)填充注意填充必須只基于訓(xùn)練集統(tǒng)計(jì)量再應(yīng)用到測(cè)試集否則又是數(shù)據(jù)泄漏。還有一類問(wèn)題是SMILES格式本身不合法。RDKit的MolFromSmiles解析不出來(lái)會(huì)返回None這種情況直接剔掉該分子。如果剔除的比例超過(guò)10%那要回頭檢查SMILES的來(lái)源是否可靠。5.2 數(shù)據(jù)泄漏的典型場(chǎng)景與規(guī)避數(shù)據(jù)泄漏是分子建模里最常見(jiàn)又最難察覺(jué)的問(wèn)題。我總結(jié)出三個(gè)高發(fā)場(chǎng)景。第一個(gè)是特征縮放發(fā)生在劃分之前相當(dāng)于用全量數(shù)據(jù)的均值和標(biāo)準(zhǔn)差來(lái)縮放訓(xùn)練集測(cè)試集的信息其實(shí)參與了縮放過(guò)程。解決方法是把縮放器放進(jìn)Pipeline里。第二個(gè)是PCA擬合在全量數(shù)據(jù)上。PCA的本質(zhì)是尋找方差最大的方向全量數(shù)據(jù)算出來(lái)的主成分方向已經(jīng)包含了測(cè)試集的信息。這個(gè)問(wèn)題的嚴(yán)重性比特征縮放更大因?yàn)镻CA是線性變換測(cè)試集的投影方向被訓(xùn)練過(guò)程偷看了。第三個(gè)是相同分子出現(xiàn)在訓(xùn)練集和測(cè)試集里。很多公開(kāi)數(shù)據(jù)集本身可能含有重復(fù)結(jié)構(gòu)不洗掉直接用隨機(jī)劃分同一分子的不同條目會(huì)同時(shí)出現(xiàn)在兩邊模型等于記住答案。解決方法是先做去重再用骨架劃分。5.3 過(guò)擬合信號(hào)與應(yīng)對(duì)策略小樣本建模里過(guò)擬合是頭號(hào)敵人。典型信號(hào)是訓(xùn)練集R2接近1而測(cè)試集R2掉到0.5以下中間gap越大越危險(xiǎn)。應(yīng)對(duì)策略按優(yōu)先級(jí)排序先加正則化參數(shù)嶺回歸的alpha、SVM的C值調(diào)低、神經(jīng)網(wǎng)絡(luò)的早停和Dropout再做特征篩選或PCA降維減少冗余輸入最后考慮數(shù)據(jù)增強(qiáng)對(duì)分子結(jié)構(gòu)做微小的合理擾動(dòng)比如添加或刪除一個(gè)甲基。還有一種情況是數(shù)據(jù)量太少模型本身沒(méi)有任何辦法泛化。這種情況建議降低模型復(fù)雜度直接用線性模型或者KNN而不是執(zhí)著于隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)。5.4 模型性能瓶頸的判斷思路當(dāng)所有模型的性能都上不去時(shí)大多數(shù)人第一反應(yīng)是換更復(fù)雜的模型但我覺(jué)得應(yīng)該先檢查數(shù)據(jù)和標(biāo)簽。檢查標(biāo)簽分布。如果pIC50值集中在很窄的區(qū)間里比如6到7之間那么不管什么模型都很難得到高R2。因?yàn)槟繕?biāo)的方差本身就小模型提高R2的空間有限。這時(shí)候與其換模型不如檢查生物活性數(shù)據(jù)的質(zhì)量或者擴(kuò)大數(shù)據(jù)范圍涵蓋更多活性梯度。檢查特征信息量。如果只用2D描述符等于丟棄了立體化學(xué)信息。對(duì)某些靶點(diǎn)手性對(duì)活性影響巨大這時(shí)候考慮加入手性描述符或者3D描述符可能更有效。檢查相似性假設(shè)是否成立。如果同一個(gè)靶點(diǎn)的活性數(shù)據(jù)來(lái)自多種不同實(shí)驗(yàn)體系比如不同實(shí)驗(yàn)室的測(cè)定條件差異數(shù)據(jù)的噪聲會(huì)非常大單靠模型無(wú)法消化。這種情況需要做數(shù)據(jù)清洗或者加一個(gè)實(shí)驗(yàn)來(lái)源作為輔助分類特征?;仡^看看這套流程我對(duì)“先有數(shù)據(jù)質(zhì)量后有模型性能”這句話的體會(huì)又深了一層。模型選型固然重要但在藥物數(shù)據(jù)這種小樣本高噪聲的場(chǎng)景里特征工程的嚴(yán)謹(jǐn)程度和數(shù)據(jù)劃分的合理性往往比模型復(fù)雜度的提升帶來(lái)更多收益。PCA和標(biāo)準(zhǔn)化放在Pipeline里管理骨架劃分避免信息泄漏早期用嶺回歸建立基線這幾步看著不起眼但決定了整個(gè)項(xiàng)目的可信度。如果有人上手做類似任務(wù)我建議先跑通這條經(jīng)典路徑拿到靠譜的基線再去嘗試圖神經(jīng)網(wǎng)絡(luò)或者注意力機(jī)制否則很容易被數(shù)據(jù)里的假象帶偏。