前情提要
正在做一个AI制药平台项目,前端使用vue3、后端采用双后端(主后端Java、SpringBoot做业务,次后端Python、FastAPI做AI服务)
Vue3 前端
|
| REST API
v
SpringBoot 主后端
|
| 任务管理 / 数据管理
v
PostgreSQL + Redis
|
| 调用
v
Python AI Service
|
| RDKit / PyTorch / PyG / scikit-learn
v
模型推理与分子计算
会把自己认为比较重要的部分,单独写成文章以便记录。写这个项目的主要目的是以赛代练,因为不想从头到尾啃生物信息学、生物化学原理这些AI制药理论。通过项目能快速理解核心概念,剩下零零散散的后续慢慢补。
此篇就是第 6 周的记录。
第 6 周:Tox21 多标签毒性预测
第 6 周从 ESOL 回归切到 Tox21 毒性预测。任务性质变了,模型训练里的很多细节也跟着变了。
ESOL 是一个分子对应一个连续值:
SMILES -> logS
Tox21 更接近 ADMET 里的毒性筛查语境。一个分子可能同时对应多个毒性相关标签,每个标签都可以是阳性、阴性或缺失:
SMILES -> [NR-AR, NR-AhR, SR-p53, ...]
所以这一周的核心不是换一个数据集而已,而是把回归任务切换成多标签分类任务。
Tox21 的任务形态
Tox21 用小分子结构预测化合物是否会激活或抑制某些毒性相关通路。它不是多分类,而是多标签分类。
多分类通常表示几个类别里只能选一个,比如 A / B / C。多标签分类表示多个标签可以同时成立。一个分子可以在某个毒性通路上为阳性,也可以在另一个通路上为阴性。
模型输出因此不是一个类别编号,而是一组 logits:
fingerprint -> MLP -> 12 个 logits
每个 logit 对应一个 Tox21 任务。
loss 从 MSELoss 换成 BCEWithLogitsLoss
第 5 周 ESOL 回归用的是 MSELoss。Tox21 是多标签二分类,因此这一周用 BCEWithLogitsLoss。
这里没有在模型最后手动加 sigmoid,因为 BCEWithLogitsLoss 内部已经把 sigmoid 和 binary cross entropy 合在一起,数值上更稳定。
训练阶段处理的是 logits。评估阶段再对 logits 做 sigmoid,得到每个标签的概率:
logit -> sigmoid -> probability
这个区别很小,但如果搞混,训练和评估都会变得不可靠。
缺失标签不能当阴性
Tox21 里有缺失标签。缺失不是阴性,而是没有实验记录。
如果把缺失值直接填成 0,模型会把“未知”当成“无毒”,评估结果会被污染。这里我用 mask 只在有效标签上计算 loss:
labels: 0 / 1 / missing
mask: valid / invalid
loss: only valid labels
这个处理比模型结构更重要。毒性数据本来就不完整,错误处理缺失标签会让后面所有指标都失去意义。
Accuracy 不够用
Tox21 还有类别不平衡问题。很多毒性标签里,阳性样本比例并不高。如果只看 Accuracy,一个模型即使大部分都预测阴性,也可能得到看起来不错的分数。
这一周主要看:
| 指标 | 用途 |
|---|---|
| ROC-AUC | 看模型区分阳性/阴性的排序能力 |
| PR-AUC | 类别不平衡时更敏感 |
| F1 | 平衡 precision 和 recall |
输出报告会按任务列出指标,而不是只给一个总分。每个毒性任务的数据分布不一样,平均值只能做粗略参考。
小分子任务的语境更清楚了
做完 ESOL 和 Tox21 后,当前项目的对象基本明确:前半段主要处理小分子。
小分子药物通常可以用 SMILES 表示,适合用 RDKit、Morgan Fingerprint、分子图、描述符、QSAR、ADMET、分子对接这些工具和任务。ESOL 是性质预测,Tox21 是毒性预测,都属于小分子方向。
大分子药物则是另一套语境,比如蛋白、抗体、肽、核酸药物。它们更多依赖氨基酸序列、3D 结构、蛋白 embedding、AlphaFold 结构、蛋白语言模型等表示方式。
这个区分对工程路线很重要。当前平台先把小分子的标准化、性质预测、毒性预测和后续 DTI 中的 drug 端打稳,再逐步接触蛋白端,会比一开始同时铺开小分子和大分子更可控。
本周产物
第 6 周对应的核心文件是:
ml-experiments/tox21_mlp.py
models/tox21_mlp.pt
ml-experiments/reports/tox21_report.md
docs/week06_tox21_multilabel.md
这周把模型任务从“预测一个连续性质”推进到“同时预测多个毒性标签”。它更接近 AI 制药里真实会遇到的数据形态:标签缺失、类别不平衡、任务之间分布不同、单一指标不够解释模型质量。
第 6 周之后,再看模型评估时就不能只问“分数高不高”,还要看标签怎么来的、缺失怎么处理、阳性比例是多少、指标是否适合这个任务。