6.2 模型验证、适用域与 Y-随机化


文档摘要

6.2 模型验证、适用域与 Y-随机化 本节摘要:一个 QSAR 模型的分数好不好看,与它可不可信是两回事。本节给出三件验证兵器——骨架划分(防信息抄袭)、Y-随机化(防偶然相关)、适用域(防越界预测)——并以"模型答辩三连问"案例演示如何在项目会上守住一个诚实模型的立场。 上一节造了引擎,本节开审讯室。验证不是建模收尾的仪式,而是贯穿全程的纪律:划分策略在训练前定死,随机化检验在定稿前跑完,适用域在使用前圈好。三者合起来,回答的是同一个问题的三个面——这个模型凭什么让人信。 一个分数不够,要三份证据 第一份:诚实的划分。随机划分在化学数据上有系统性漏洞:同一系列化合物(同骨架、只差取代基)活性相近,随机切分时近亲一半在训练集一半在测试集——模型不需要学会化学,只需要"背下近亲"就能拿高分。

6.2 模型验证、适用域与 Y-随机化

本节摘要:一个 QSAR 模型的分数好不好看,与它可不可信是两回事。本节给出三件验证兵器——骨架划分(防信息抄袭)、Y-随机化(防偶然相关)、适用域(防越界预测)——并以"模型答辩三连问"案例演示如何在项目会上守住一个诚实模型的立场。

上一节造了引擎,本节开审讯室。验证不是建模收尾的仪式,而是贯穿全程的纪律:划分策略在训练前定死,随机化检验在定稿前跑完,适用域在使用前圈好。三者合起来,回答的是同一个问题的三个面——这个模型凭什么让人信

一个分数不够,要三份证据

第一份:诚实的划分。随机划分在化学数据上有系统性漏洞:同一系列化合物(同骨架、只差取代基)活性相近,随机切分时近亲一半在训练集一半在测试集——模型不需要学会化学,只需要"背下近亲"就能拿高分。骨架划分(6.1 案例已用)按 Murcko 骨架整簇切分,逼模型面对没见过的骨架。两次划分的分数差,就是"抄袭含量"的直接测量;6.1 案例里 RMSE 从零点七涨到零点九,涨出来的零点二就是此前搭了近亲便车的部分。交叉验证(k 折轮换)应建立在同样的划分哲学上——按骨架分组交叉验证,而非天真的均匀切分。

第二份:Y-随机化。把活性标签随机打乱重训,重复多轮:一个健康的数据集-特征-算法组合,在乱标签下 R2 应当跌到零附近;若乱标签也能拟合出零点四的 R2,说明你的特征与算法组合偶然相关能力太强(特征列数太多、样本太少时的典型症状),真实分数要打回重估。这是上世纪就写进 QSAR 教科书的检定,至今仍是识别"刷分模型"的照妖镜。

第三份:适用域。模型对训练数据覆盖过的化学空间说话有底气,对没见过的地方纯属外推。适用域就是把"没见过"量化:新分子的指纹与训练集最近邻的平均相似度低于阈值(或描述符空间距离超过分位数),就标记"域外,预测仅供参考"。适用域的价值常被低估——虚拟筛选几十万候选时,模型分数最靠前的分子往往恰是域外怪分子(训练集没见过所以预测值离谱地高),不圈域等于把排序权交给噪声。

案例:模型答辩三连问

背景。项目会上,一个新模型被提出用于下一代筛选排序。药化主管是老江湖,当场三连问:"换一批没见过的骨架还准吗?""标签打乱还能拟合出来吗?""预测最猛的分子在训练集里找得到邻居吗?"三问对应三件兵器,我们当场演示。

操作。三段代码,每段几分钟:

import numpy as np from rdkit import DataStructs from sklearn.metrics import r2_score # 问一:骨架划分 vs 随机划分的分数差(6.1 已演示,这里看结论) # rmse_random=0.70, rmse_scaffold=0.90 —— 差值即"近亲便车"含量 # 问二:Y-随机化 rng = np.random.default_rng(42) scrambled = [] for _ in range(20): y_perm = rng.permutation(y) model.fit(X[train_mask], y_perm[train_mask]) scrambled.append(r2_score(y_perm[~train_mask], model.predict(X[~train_mask]))) print("乱标签 R2 均值:%.2f" % np.mean(scrambled)) # 健康时应接近 0 # 问三:适用域——候选分子与训练集的最近邻相似度 train_fps = [AllChem.GetMorganGenerator().GetFingerprint(m) for m in train_mols] def domain_score(smi): fp = AllChem.GetMorganGenerator().GetFingerprint(Chem.MolFromSmiles(smi)) sims = DataStructs.BulkTanimotoSimilarity(fp, train_fps) return max(sims) # 与训练集的最大相似度 outside = [s for s in candidates if domain_score(s) < 0.35] print("域外候选占比:%.0f%%" % (100 * len(outside) / len(candidates)))

结果。三问的答案依次落盘:随机与骨架划分的 RMSE 差零点二;乱标签下 R2 均值零点零三(模型没在背噪声,第二问过关);候选集中约一成分子与训练集最大相似度不足零点三五,被标记域外——其中包括模型给出的三个最高分,正好坐实了"高分域外怪分子"的警惕。

解读。三份证据拼出一份诚实的模型说明卡:适用范围(训练集覆盖的骨架类型与活性区间)、典型误差(骨架划分 RMSE 零点九,约十倍活性误差)、已知局限(约一成候选域外、极端活性段样本稀疏)、正确用法(排序优先级,不单独定量)。这张卡片比模型本身更值钱——会说自己不能什么的模型,才配被使用。行业里反复出现的"AI 模型上线即翻车",多数翻车点不在算法而在缺了这张卡。

变式。三件兵器的进阶用法:骨架划分推广为"时间划分"(用早期数据训练、后期数据测试,模拟真实前瞻使用,分数通常再跌一截但更诚实);Y-随机化升级为对整个建模流水线(含特征选择)做嵌套检验,防特征选择环节泄题;适用域从最近邻相似度升级为密度估计或集成方差(多个模型预测分歧大的地方即域外),第8章深度模型的适用域基本都靠集成方差这条路线。

适用域的形状:一张图说给全组听

适用域最怕停留在统计术语里。把它画出来,整个团队都能参与判断——这也是它最实用的交付形态。

图 6-2:训练集覆盖与候选分子的域内外身份

图 6-2:训练集覆盖与候选分子的域内外身份

把最近邻相似度当成横轴给候选排队,配合这张示意图,"域外"就从一句统计黑话变成人人可执行的除名规则——虚拟筛选收口时,这是最有说服力的一张图。

本节要点回顾

  • 划分即立场:随机划分放近亲便车,骨架划分逼真外推,两次分数差即抄袭含量。
  • Y-随机化是照妖镜:乱标签还能拟合的模型,分数全是偶然相关的泡沫。
  • 适用域保命:高分域外怪分子是虚拟筛选的经典陷阱,最近邻相似度是最低成本的护栏。
  • 模型说明卡是交付物:适用范围、典型误差、已知局限、正确用法四栏写清,模型才算交付。
  • 下一站:引擎过审、卡片随行,第7章把它装上筛选流水线——从单点预测走向百万级荐书实战。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U