前情提要
正在做一个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制药理论。通过项目能快速理解核心概念,剩下零零散散的后续慢慢补。
此篇就是第 4 周的记录。
第 4 周:用 ESOL 和 RandomForest 建一个分子性质预测 baseline
第 4 周开始进入分子性质预测。前 3 周主要是在处理 SMILES、描述符、指纹和相似性搜索,这些东西本身还不算“预测”。这一周我把它们接到一个真正的监督学习任务上:用 ESOL 数据集预测小分子的水溶解度 logS。
我没有一上来写 GNN。第一版选择了更朴素的组合:
SMILES
-> RDKit descriptors
-> RandomForestRegressor
-> MAE / RMSE / R2
-> model.pkl + report
这个 baseline 的意义不在于模型复杂,而在于它给后面的 MLP、GNN、scaffold split 留下一个可比较的参照。
ESOL 预测的是 logS
这里最容易混淆的是 logS 和 logP。
logS 表示水溶解度,描述一个分子能在水里溶解多少。logP 表示脂水分配系数,描述分子更偏亲脂还是亲水。二者相关,但不是同一个目标。ESOL 数据集做的是水溶解度预测,所以目标列是 logS,不是 logP。
我在这一周把 ESOL 当成一个回归任务处理。输入是分子结构,输出是连续数值,因此评估指标选了:
| 指标 | 作用 |
|---|---|
| MAE | 平均绝对误差,直观看平均偏差 |
| RMSE | 对大误差更敏感 |
| R2 | 衡量模型解释目标变量变化的能力 |
特征先从 RDKit descriptors 开始
这一版没有使用深度学习特征,而是复用前面封装好的 molkit.calculate_descriptors()。最终进入 RandomForest 的特征包括:
molecular_weight
logp
tpsa
h_bond_donors
h_bond_acceptors
rotatable_bonds
ring_count
这些描述符很基础,但好处是含义清楚。比如分子量、极性表面积、氢键供体/受体、可旋转键数量,都能和溶解度建立比较直接的关系。对于一个工程作品集来说,这种 baseline 比直接堆一个黑盒模型更稳。
实验脚本
本周核心脚本是:
ml-experiments/esol_rf_baseline.py
它完成了几件事:
- 下载或读取 ESOL 数据
- 校验 SMILES 并计算 RDKit descriptors
- 按 train / validation / test 划分数据
- 训练
RandomForestRegressor - 输出预测结果、指标和散点图
- 保存模型到
models/esol_rf.pkl
运行入口保留在 ai-service 环境里:
cd ai-service
uv run python ../ml-experiments/esol_rf_baseline.py
输出文件集中放在:
models/esol_rf.pkl
ml-experiments/outputs/esol_rf_metrics.json
ml-experiments/outputs/esol_rf_predictions.csv
ml-experiments/outputs/figures/esol_rf_pred_vs_actual.png
ml-experiments/reports/esol_rf_report.md
models/esol_rf.pkl 里不只保存模型本身,也保存了特征列、目标列、指标和数据来源信息。后面做推理服务时,不能只加载一个裸模型,否则很容易出现训练和预测阶段特征顺序不一致的问题。
predicted vs actual 散点图
这一周最有用的图是 predicted vs actual。
散点越接近中间的对角线,预测越准。点在对角线上方,说明模型把这个分子预测得更易溶于水;点在下方,说明模型预测得更难溶于水。
这张图比单独看 MAE 更有信息量。MAE 只能告诉我平均偏差,散点图能看出误差是否集中在某类分子上,也能暴露极端样本。
baseline 的价值
RandomForest 不新,但在这个任务里很适合作为第一版。它不需要复杂训练流程,对小数据集比较友好,也能快速确认数据处理链路有没有问题。
如果后面的 MLP 或 GNN 在同样数据划分下跑不过这个 baseline,那复杂模型本身就没有带来收益。这个结论比“我跑了一个深度学习模型”更有价值。
第 4 周最终留下的核心产物是:
ml-experiments/esol_rf_baseline.py
models/esol_rf.pkl
ml-experiments/reports/esol_rf_report.md
从这一周开始,项目从“分子数据处理工具”进入了“可评估的分子性质预测模型”。