DeepChem 实战:基于 ToxCast 数据集训练多任务随机森林毒性预测模型
2026/9/17 8:58:09 网站建设 项目流程

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.gztoxcast_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 核心并行训练,加快速度
SingletaskToMultitaskDeepChem 封装按任务列表为每个任务构造独立子模型,评估时自动汇总

模型训练完成后,使用 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.gzdata_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时,首次调用会按"特征化器 + 划分器"的组合把处理好的数据集缓存到磁盘,后续调用直接加载缓存,避免重复特征化。
  • 参数化更灵活featurizersplittertransformers均可传字符串或对象;splitter=None时不划分,全部数据作为单一数据集返回。
  • 大数据集分片加载:内部通过CSVLoader.create_dataset(dataset_file, shard_size=8192)以 8192 行为一个分片(shard)进行特征化,内存友好。

MolNet 加载器是 DeepChem 全部基准数据集(tox21、sider、pcba、muv 等)的统一入口,deepchem/molnet/run_benchmark.py 中把toxcast注册进MODELSDATASETS字典,因此 ToxCast 也可直接参与run_benchmark.py的自动化基准评测(模型包括 rf、tf、graphconv、weave 等,详见该文件的模型注册表)。

原始数据的加工管线

examples/toxcast/processing/tox.py 记录了 ToxCast 原始数据到toxcast_data.csv.gz的加工过程,可以理解为数据血缘(lineage)说明:

  1. 读取三份中间文件:casn_to_smiles.csv.gz(CAS 登记号 → SMILES)、code_to_casn.csv.gz(实验代号 → CAS 号)、code_to_hitc.csv.gz(实验代号 × 化合物的命中矩阵 hit-call);
  2. 通过code → casn → smiles两级映射,把命中矩阵中的实验代号替换为 SMILES 字符串;
  3. 丢弃无法映射到 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 毒理学数据的加载、特征化、平衡变换、数据集划分与多任务随机森林训练全流程。实践中的关键要点可归纳为:

  1. 数据形态:CSV 中smiles列 + 617 个实验任务列,约 8000 化合物,定性(二分类)结果;
  2. 两类入口:旧版 toxcast_datasets.py(本地文件 + 三种划分器)与新版 MolNet 加载器(自动下载 + 缓存 + 更全的参数化),推荐使用后者;
  3. 不平衡处理BalancingTransformer与随机森林的class_weight="balanced"双管齐下;
  4. 模型结构SingletaskToMultitask为每个任务构建独立随机森林(500 棵树、全核并行),以 ROC-AUC 均值评估;
  5. 进阶方向:同一数据集可迁移到 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询