第 6 周:Tox21 多标签毒性预测

记录从 ESOL 回归转向 Tox21 多标签分类时,模型输出、loss、mask 和评估指标的变化。

2026/6/3
0 分钟阅读

前情提要

正在做一个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 周之后,再看模型评估时就不能只问“分数高不高”,还要看标签怎么来的、缺失怎么处理、阳性比例是多少、指标是否适合这个任务。