第 5 周:Morgan Fingerprint 和 MLP 的第一次模型对比

记录用 Morgan Fingerprint 训练 MLP,并和第 4 周 RandomForest baseline 做 ESOL 水溶解度预测对比。

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制药理论。通过项目能快速理解核心概念,剩下零零散散的后续慢慢补。

此篇就是第 5 周的记录。

第 5 周:Morgan Fingerprint 和 MLP 的第一次模型对比

第 5 周的重点是把 PyTorch 训练流程接进分子预测任务。输入特征从上一周的 RDKit descriptors 换成 Morgan Fingerprint,模型从 RandomForest 换成 MLP。

这周跑通的链路是:

ESOL CSV
-> SMILES
-> Morgan Fingerprint
-> Dataset / DataLoader
-> MLP
-> loss curve
-> metrics
-> model checkpoint

它看起来比第 4 周复杂很多,但最后的结果反而提醒我:复杂模型不一定自动带来更好的效果。

Morgan Fingerprint 作为输入

Morgan Fingerprint 可以理解成一种固定长度的分子结构编码。它把分子局部结构转成 bit vector,常见配置是:

radius = 2
n_bits = 2048

相比 RDKit descriptors,fingerprint 的维度更高,也更像“结构模式”的集合。它不直接告诉我分子量、极性表面积这些人工描述符,而是用 bit 位表达某些子结构是否出现。

这一点很适合接 MLP。MLP 可以在高维稀疏特征上学习组合模式,但前提是数据量、正则化和划分方式都要站得住。

MLP 结构

这一版模型没有做复杂设计:

2048-bit Morgan fingerprint
-> Linear(2048, 256)
-> ReLU
-> Dropout(0.1)
-> Linear(256, 64)
-> ReLU
-> Linear(64, 1)
-> predicted logS

ESOL 是回归任务,输出是连续的 logS,所以最后一层保持线性输出,不加 sigmoid。如果加了 sigmoid,输出会被压到 [0, 1],而 logS 本身并不在这个范围内。

训练时使用 MSELoss。目标值先根据训练集均值和标准差做标准化,评估 MAE、RMSE、R2 时再还原到原始 logS 尺度。

PyTorch 训练闭环

核心脚本是:

ml-experiments/esol_mlp.py

新增输出包括:

models/esol_mlp.pt
ml-experiments/outputs/esol_mlp_metrics.json
ml-experiments/outputs/esol_mlp_predictions.csv
ml-experiments/outputs/esol_mlp_training_log.csv
ml-experiments/outputs/figures/esol_mlp_loss_curve.png
ml-experiments/reports/esol_model_compare.md

Dataset 负责定义一条样本如何取出,DataLoader 负责批量加载。训练时记录 train loss 和 validation loss,并加入 early stopping。validation loss 连续多轮不下降时停止训练,再恢复验证集表现最好的参数。

模型 checkpoint 里保存了:

  • model_state_dict
  • MLP 结构参数
  • fingerprint 参数
  • 目标值标准化参数
  • train / validation / test 指标

这样后续做预测服务时,不需要重新猜模型结构和特征配置。

对比结果

这周最关键的文件不是单个模型结果,而是:

ml-experiments/reports/esol_model_compare.md

在同样的 random split 下,第 4 周和第 5 周的测试集结果是:

模型MAERMSER2
RDKit descriptors + RandomForest0.54150.76900.8611
Morgan Fingerprint + MLP0.91831.19340.6655

这次 MLP 没有超过 RandomForest。

这个结果并不意外。ESOL 数据集规模不大,RandomForest 对低维描述符的处理很稳,而 MLP 对训练细节更敏感。高维 fingerprint 加 MLP 如果没有足够数据和调参,很容易学不到比传统 baseline 更好的规律。

这周真正留下来的判断

第 5 周最大的收获不是“写了一个神经网络”,而是把深度学习模型放进了同一套评估框架里。

如果没有第 4 周的 baseline,这周只看 MLP 自己的 loss 曲线,很容易误以为模型已经有效。但一对比指标,就能看到它并没有带来收益。

这也改变了后续路线的判断顺序:

  • 先保证数据处理正确
  • 先建立传统 ML baseline
  • 再比较 MLP 或 GNN 是否真的提升
  • 不用模型复杂度替代实验结论

第 5 周结束后,项目里已经有了两类分子表征:人工描述符和 Morgan Fingerprint。下一步进入 Tox21,多标签毒性分类会比 ESOL 回归更接近 AI 制药里的 ADMET 语境。