第 4 周:用 ESOL 和 RandomForest 建一个分子性质预测 baseline

记录从 ESOL 数据、RDKit descriptors 到 RandomForest 回归模型的第一版分子水溶解度预测实验。

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

此篇就是第 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

这里最容易混淆的是 logSlogP

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

从这一周开始,项目从“分子数据处理工具”进入了“可评估的分子性质预测模型”。