DeepChem 实战:基于 ToxCast 数据集训练多任务随机森林毒性预测模型
【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem
ToxCast 是美国 EPA 主导的体外高通量毒性筛选计划,与 Tox21 同源,其公开数据包含 8000 余种化合物在超过 600 项生化与细胞实验上的定性结果。本篇指南以 examples/toxcast/README.md 为核心骨架,完整讲解如何在 DeepChem 中加载 ToxCast 数据、进行特征化与数据变换、划分训练/验证/测试集,并训练一个可复用的多任务随机森林分类模型,同时结合仓库源码与底层molnet加载器补充实现细节。
ToxCast 数据集是什么
ToxCast(Toxicity Forecaster)与 Tox21 来自同一研究倡议,但数据规模更大:它基于体外高通量筛选(in vitro high-throughput screening)对大型化合物库进行毒理学测试。DeepChem 仓库中经过处理的 ToxCast 集合包含超过 600 项实验在约 8000 种化合物上的定性结果。
该数据集的原始来源论文为:
Richard, Ann M., et al. "ToxCast chemical landscape: paving the road to 21st century toxicology." Chemical research in toxicology 29.8 (2016): 1225-1251.
原始数据文件是一个 CSV 表格,其中被 DeepChem 使用的列包括:
| 列 | 含义 |
|---|---|
smiles | 化合物分子结构的 SMILES 表示 |
ACEA_T47D_80hr_Negative~Tanguay_ZF_120hpf_YSE_up | 各生物测定(Bioassay)的实验结果列 |
任务列的命名遵循"检测平台_细胞类型/模型_时间点_读出信号"的约定,例如ATG_AR_TRANS_up(雄激素受体报告基因上调)、TOX21_ERa_BLA_Agonist_ratio(雌激素受体激动剂比率)、Tanguay_ZF_120hpf_MORT_up(斑马鱼胚胎致死)等,具体实验信息可参考 EPA 官网的 "high-throughput assay information" 栏目。
数据加载器:从 CSV 到 DeepChem 数据集
本示例的自定义加载器位于 examples/toxcast/toxcast_datasets.py,其核心函数为load_toxcast(featurizer='ECFP', split='index'),完整流程如下:
import os import deepchem as dc def load_toxcast(featurizer='ECFP', split='index'): current_dir = os.path.dirname(os.path.realpath(__file__)) dataset_file = os.path.join(current_dir, "./processing/toxcast_data.csv.gz") dataset = dc.utils.save.load_from_disk(dataset_file) if featurizer == 'ECFP': featurizer = dc.feat.CircularFingerprint(size=1024) elif featurizer == 'GraphConv': featurizer = dc.feat.ConvMolFeaturizer() TOXCAST_tasks = dataset.columns.values[1:].tolist() # 第一列是 smiles,其余全是任务列 loader = dc.data.CSVLoader( tasks=TOXCAST_tasks, smiles_field="smiles", featurizer=featurizer) dataset = loader.featurize(dataset_file) return TOXCAST_tasks, (train, valid, test), transformers这段代码揭示了 ToxCast 示例的几个关键设计:
- 任务列的自动推导:通过
dataset.columns.values[1:].tolist()把 CSV 中除smiles外的所有列当作多任务学习的标签列,无需手工维护任务清单——这正是 ToxCast 数据"列即实验"的体现。 - 数据文件位置:实际数据位于 examples/toxcast/processing/toxcast_data.csv.gz,仓库同时保留了
toxcast_539.csv.gz与toxcast_571.csv.gz等中间版本,可通过 processing/tox.py 的加工流程追溯生成过程(详见下文)。
支持的两种特征化方式
load_toxcast通过字符串参数切换特征化器:
featurizer取值 | 实际特征化器 | 说明 |
|---|---|---|
'ECFP'(默认) | dc.feat.CircularFingerprint(size=1024) | 1024 位圆形(ECFP)指纹,基于 RDKit 实现,适合传统机器学习模型 |
'GraphConv' | dc.feat.ConvMolFeaturizer() | 分子图卷积特征,为图神经网络模型准备 |
指纹特征与图特征的关键差异在于:ECFP 把分子编码为定长 0/1 向量,可直接输入随机森林等 sklearn 模型;ConvMolFeaturizer则生成带原子邻接关系的图结构,需要配合图卷积类模型使用。
数据平衡变换与数据集划分
加载器在返回数据前还做了两项重要的预处理:
# 1. 类别平衡变换:为不平衡的多任务分类数据自动加权 transformers = [dc.trans.BalancingTransformer(dataset=dataset)] for transformer in transformers: dataset = transformer.transform(dataset) # 2. 数据集划分 splitters = { 'index': dc.splits.IndexSplitter(), 'random': dc.splits.RandomSplitter(), 'scaffold': dc.splits.ScaffoldSplitter() } splitter = splitters[split] train, valid, test = splitter.train_valid_test_split(dataset)- BalancingTransformer:ToxCast 数据严重不平衡(阴性远多于阳性,见 examples/low_data/toxcast_maml.py 中的注释),该变换器会为每个任务计算样本权重,让训练时少数类获得更高权重,是提升多任务毒性模型效果的关键一步。
- 三种内置划分器:
IndexSplitter(按顺序划分,默认)、RandomSplitter(随机划分)、ScaffoldSplitter(按分子骨架划分,用于评估泛化到新化学骨架的能力)。使用时只需把split参数改为'random'或'scaffold'即可切换。
训练多任务随机森林模型
examples/toxcast/toxcast_rf.py 展示了完整的训练脚本,其核心思想是SingletaskToMultitask:为每一个任务单独训练一个随机森林子模型,再统一管理:
from sklearn.ensemble import RandomForestClassifier from deepchem.molnet import load_toxcast import deepchem as dc toxcast_tasks, toxcast_datasets, transformers = load_toxcast() (train_dataset, valid_dataset, test_dataset) = toxcast_datasets metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean) def model_builder(model_dir): sklearn_model = RandomForestClassifier( class_weight="balanced", n_estimators=500, n_jobs=-1) return dc.models.SklearnModel(sklearn_model, model_dir) model = dc.models.SingletaskToMultitask(toxcast_tasks, model_builder) model.fit(train_dataset)注意这里直接使用from deepchem.molnet import load_toxcast,即调用的是 MolNet 提供的官方加载器(见下文),而非示例目录下的同名函数——两条路径最终产出的数据结构一致:(tasks, (train, valid, test), transformers)。
关键参数说明:
| 配置 | 值 | 作用 |
|---|---|---|
class_weight="balanced" | sklearn 内置参数 | 与BalancingTransformer形成双保险,进一步缓解类别不平衡 |
n_estimators=500 | 随机森林超参数 | 500 棵决策树,兼顾精度与训练耗时 |
n_jobs=-1 | 随机森林超参数 | 使用全部 CPU 核心并行训练,加快速度 |
SingletaskToMultitask | DeepChem 封装 | 按任务列表为每个任务构造独立子模型,评估时自动汇总 |
模型训练完成后,使用 ROC-AUC 作为评估指标(多个任务的均值),分别对训练集和验证集打分:
train_scores = model.evaluate(train_dataset, [metric], transformers) valid_scores = model.evaluate(valid_dataset, [metric], transformers)evaluate会返回每个任务的 ROC-AUC 及整体均值。对 ToxCast 这种典型的多任务毒性筛选场景,ROC-AUC 能较好衡量模型在阳性样本极少情况下的排序能力。
运行方式
确保 DeepChem 已正确安装后,在仓库根目录执行:
python examples/toxcast/toxcast_rf.py脚本会自动完成数据加载、特征化、变换、训练与评估,并依次打印训练集与验证集的评估分数。
MolNet 官方加载器:更现代的调用方式
示例脚本中实际使用的deepchem.molnet.load_toxcast定义在 deepchem/molnet/load_function/toxcast_datasets.py,它比示例目录下的旧版加载器功能更完整,是当前推荐入口。其完整签名如下:
def load_toxcast( featurizer='ECFP', splitter='scaffold', transformers=['balancing'], reload=True, data_dir=None, save_dir=None, **kwargs ) -> (tasks, (train, valid, test), transformers)相比旧版加载器的主要增强:
- 自动下载:若本地不存在数据,会从
TOXCAST_URL(DeepChem 官方数据仓库)自动下载toxcast_data.csv.gz到data_dir,无需手工准备数据文件。 - 内置完整任务清单:模块顶部定义了
TOXCAST_TASKS列表(deepchem/molnet/load_function/toxcast_datasets.py),共 617 项任务,涵盖核受体(AR/ER/PPAR/VDR 等)、应激通路(ARE/HSE/NFkB)、ADME 相关酶(CYP450 系列)、离子通道、GPCR、斑马鱼发育毒性(Tanguay_ZF_120hpf_*)等多个毒理学终点。 - 缓存机制:
reload=True时,首次调用会按"特征化器 + 划分器"的组合把处理好的数据集缓存到磁盘,后续调用直接加载缓存,避免重复特征化。 - 参数化更灵活:
featurizer、splitter、transformers均可传字符串或对象;splitter=None时不划分,全部数据作为单一数据集返回。 - 大数据集分片加载:内部通过
CSVLoader.create_dataset(dataset_file, shard_size=8192)以 8192 行为一个分片(shard)进行特征化,内存友好。
MolNet 加载器是 DeepChem 全部基准数据集(tox21、sider、pcba、muv 等)的统一入口,deepchem/molnet/run_benchmark.py 中把toxcast注册进MODELS与DATASETS字典,因此 ToxCast 也可直接参与run_benchmark.py的自动化基准评测(模型包括 rf、tf、graphconv、weave 等,详见该文件的模型注册表)。
原始数据的加工管线
examples/toxcast/processing/tox.py 记录了 ToxCast 原始数据到toxcast_data.csv.gz的加工过程,可以理解为数据血缘(lineage)说明:
- 读取三份中间文件:
casn_to_smiles.csv.gz(CAS 登记号 → SMILES)、code_to_casn.csv.gz(实验代号 → CAS 号)、code_to_hitc.csv.gz(实验代号 × 化合物的命中矩阵 hit-call); - 通过
code → casn → smiles两级映射,把命中矩阵中的实验代号替换为 SMILES 字符串; - 丢弃无法映射到 SMILES 的行(脚本中以
badCounter统计),处理缺失值后输出reprocessed_tox_cast.csv。
这条管线说明 ToxCast 的最终 CSV 中的smiles列是从化学登记号体系(CASRN)映射而来,而非直接由 EPA 提供 SMILES,理解这一点有助于排查数据质量问题。
进阶场景:ToxCast 用于小样本元学习
由于 ToxCast 任务数量多(617 项)但单任务样本稀疏,它还是 DeepChem 元学习(Meta-Learning)示例的理想数据源。examples/low_data/toxcast_maml.py 演示了使用 MAML(Model-Agnostic Meta-Learning)在 ToxCast 上做小样本毒性预测:
- 数据规模:脚本注释明确指出 ToxCast 包含6874 个分子、617 个任务,且数据高度稀疏——大多数任务只覆盖少数分子,且阴性远多于阳性;
- 每任务构造正负样本交替的批次,保证每个 batch 正负例数量均衡;
- 用 80% 的任务做元训练,剩余任务做验证,比较微调前后(
compute_scores(False)vscompute_scores(True))的 ROC-AUC 与准确率变化。
该示例展示了同一份 ToxCast 数据在不同学习范式(多任务分类 vs 元学习)下的复用方式,也印证了"任务多、样本稀疏、类别不平衡"是 ToxCast 的核心数据特征,建模时需针对性处理。
小结
从 examples/toxcast/README.md 出发,本文完整覆盖了 ToxCast 毒理学数据的加载、特征化、平衡变换、数据集划分与多任务随机森林训练全流程。实践中的关键要点可归纳为:
- 数据形态:CSV 中
smiles列 + 617 个实验任务列,约 8000 化合物,定性(二分类)结果; - 两类入口:旧版 toxcast_datasets.py(本地文件 + 三种划分器)与新版 MolNet 加载器(自动下载 + 缓存 + 更全的参数化),推荐使用后者;
- 不平衡处理:
BalancingTransformer与随机森林的class_weight="balanced"双管齐下; - 模型结构:
SingletaskToMultitask为每个任务构建独立随机森林(500 棵树、全核并行),以 ROC-AUC 均值评估; - 进阶方向:同一数据集可迁移到 MAML 元学习、图卷积等更复杂的建模方案。
如需继续探索,可参考仓库内相关实现:ToxCast MolNet 加载器、数据加工脚本、基准评测注册表、MAML 元学习示例。
【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考