DeepChem BACE 数据集实战:BACE-1 抑制剂数据加载与随机森林建模全解析
发布时间:2026/9/17 9:16:03 作者:尧图编辑部 阅读量:1,286

DeepChem BACE 数据集实战BACE-1 抑制剂数据加载与随机森林建模全解析【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchemBACEβ-secretase 1抑制剂数据集是药物发现中经典的配体活性建模基准DeepChem 在 examples/bace 目录下提供了一整套可运行的示例代码涵盖数据加载bace_datasets.py与随机森林建模评估bace_rf.py两条完整链路。本文以 examples/bace/README.md 为骨架深入其背后的数据文件、特征工程、分割策略与评估流程帮助你理解如何在 DeepChem 中复现论文实验并据此迁移到自己的分子活性预测任务。BACE 数据集来源与研究背景根据 examples/bace/README.md 的说明BACE 数据集来自以下论文Subramanian, Govindan, et al. Computational modeling of β-secretase 1 (BACE-1) inhibitors using ligand based approaches.Journal of chemical information and modeling56.10 (2016): 1936-1949.BACE-1β-位点淀粉样前体蛋白裂解酶 1是阿尔茨海默症药物研发中的关键靶点。该研究使用一个小型数据集——205 个化合物——训练模型并在一组更大的1273 个化合物外部验证集上评估模型的泛化能力采用基于配体的计算建模方法。README 明确指出bace_datasets.py 负责按论文原始方式加载数据bace_rf.py 演示针对该数据集训练随机森林Random Forest。仓库的deepchem/molnet模块deepchem/molnet/load_function/bace_datasets.py中对其任务定义有更精确的补充说明该数据集提供 BACE-1 抑制剂的定量 IC50 与定性二分类标签结合活性结果全部为近十年科学文献中报道的实验值部分化合物附带晶体结构信息回归标签为负对数抑制常数pIC50。仓库内的 BACE 数据文件bace_datasets.py通过相对路径引用了仓库根目录 datasets 下的三个 CSV 文件它们分别对应不同的分割与用途文件数据规模含表头在代码中的作用datasets/desc_canvas_aug30.csv1523 行split20-80时加载的活性数据集datasets/rev8020split_desc.csv1476 行split80-20时加载的数据集datasets/crystal_desc_canvas_aug30.csv26 行独立晶体结构化合物集Crystal set以desc_canvas_aug30.csv为例其列结构为mol, CID, Class, Model, pIC50, MW, AlogP, HBA, ...mol分子结构的 SMILES 表示CID化合物 ID如BACE_1Class二分类活性标签0/1用于 classification 模式Model分割归属标记如Train/Valid供SpecifiedSplitter按论文指定的方式切分pIC50回归标签-log10(IC50)值越大代表抑制活性越强其余数百列为预计算好的分子描述符特征。rev8020split_desc.csv的列结构与前者一致但行尾 ID 列名为idx且Class列全部为 1从实际数据内容看该文件收录的均为活性化合物两者分别对应论文中不同的训练/验证划分方式。数据加载管线bace_datasets.py 逐行拆解examples/bace/bace_datasets.py 的核心函数是load_bace(mode, transform, split)它同时支持回归与分类两种任务def load_bace(moderegression, transformTrue, split20-80): Load BACE-1 dataset as regression/classification problem. assert split in [20-80, 80-20] assert mode in [regression, classification]入口处的assert限定了合法的参数取值是理解整个管线的钥匙split仅接受20-80或80-20对应论文中的两种数据分割方式mode仅接受regression标签pIC50或classification标签Class。任务与特征列的选择根据模式选择不同的任务列if mode regression: bace_tasks [pIC50] elif mode classification: bace_tasks [Class]回归模式预测pIC50连续值分类模式预测Class二分类标签。UserDefinedFeaturizer 与 UserCSVLoaderBACE 示例最大的特点在于它不调用任何分子图或指纹特征化器而是直接使用 CSV 中预计算好的特征列。这通过UserDefinedFeaturizer实现featurizer dc.feat.UserDefinedFeaturizer(bace_user_specified_features) loader dc.data.UserCSVLoader( tasksbace_tasks, smiles_fieldmol, id_fieldCID, featurizerfeaturizer) dataset loader.featurize(dataset_file) crystal_dataset loader.featurize(crystal_dataset_file)bace_user_specified_features定义在 deepchem/molnet/load_function/bace_features.py是一个数百维的特征名列表对应UserDefinedFeaturizer定义于 deepchem/feat/base_classes.py按列名从原始表中抽取的特征矩阵UserCSVLoader定义于 deepchem/data/data_loader.py在标准CSVLoader基础上支持用户自定义特征列smiles_fieldmol指定 SMILES 列id_fieldCID指定样本 ID 列主数据集与晶体数据集crystal_desc_canvas_aug30.csv分别加载后者作为额外的外部评估集合。特征体系的构成从 deepchem/molnet/load_function/bace_features.py 的源码可以确认bace_user_specified_features覆盖了非常完整的一维分子描述符体系主要包括基础理化性质MW分子量、AlogP脂水分配系数、HBA/HBD氢键受体/供体数、RB可旋转键数、HeavyAtomCount、ChiralCenterCount、RingCount、PSA极性表面积、MR摩尔折射率、Estate、Polar等原子类型 E-state 统计以sLi_Key、ssCH2_Key、aaNH_Key、sOH_Key、sCl_Key为代表的键合环境原子类型编码且每个原子类型又派生_Cnt计数、_Sum和、_Avg平均三组统计量拓扑与连接性指数Zagreb 指数ZM1/ZM2、Wiener 指数W、Balaban 指数J、Randić 连接性指数CIX0-CIX5、Kier 形状指数KAMS1-KAMS3、拓扑电荷指数TCI1-TCI10等大量图论描述符环系统统计Ring Count 3-20不同尺寸环的计数、Cyclomatic number、Ring Fusion degree、Ring complexity index等其他分子性质Van der Waals 表面积VSA、ALOGP1-ALOGP10、PEOE1-PEOE14PEOE 部分电荷等。这套特征在论文中由 Canvas 分子描述符工具生成因此 CSV 文件名中的desc/canvas即暗示其来源而 BACE 示例的意义正在于演示特征已在外部预计算好时如何接入 DeepChem 管线。SpecifiedSplitter按论文指定的分割方式划分BACE 论文的实验设计不是随机划分而是遵循论文给定的 Train/Valid 归属因此示例使用SpecifiedSplittersplitter dc.splits.SpecifiedSplitter(dataset_file, Model) train_dataset, valid_dataset, test_dataset splitter.train_valid_test_split(dataset)它读取 CSV 文件中的Model列按照论文指定的样本归属完成训练/验证/测试划分从而保证复现实验时数据集划分与论文完全一致。需要注意的兼容性细节当前仓库主库 deepchem/splits/splitters.py 中SpecifiedSplitter的构造函数签名已演变为接收valid_indices/test_indices索引列表其 docstring 示例展示了如何显式给出验证集与测试集索引 splitter dc.splits.SpecifiedSplitter(valid_indices[1,3,5], test_indices[0,2,7,9])而从源码结构看examples/bace/bace_datasets.py 中SpecifiedSplitter(dataset_file, Model)属于旧版 API 的调用方式——即按文件路径 归属列名切分。因此在新版本 DeepChem 中直接运行该示例脚本前可能需要将分割逻辑适配为基于Model列解析出 valid/test 索引再传入新的SpecifiedSplitter。这是示例代码与当前主库 API 之间值得留意的差异。分割后的数据集规模打印load_bace加载完成后会打印各子集的化合物数量print(Number of compounds in train set) print(len(train_dataset)) ... print(Number of compounds in crystal set) print(len(crystal_dataset))训练集、验证集、测试集与晶体集分别打印方便核对数据是否按预期加载README 所述 205 个训练化合物与 1273 个外部验证化合物对应论文的划分规模。数据变换Transformers加载与分割之后load_bace构建了一组数据变换器transformers [ dc.trans.NormalizationTransformer( transform_XTrue, datasettrain_dataset), dc.trans.ClippingTransformer(transform_XTrue, datasettrain_dataset) ] if mode regression: transformers [ dc.trans.NormalizationTransformer( transform_yTrue, datasettrain_dataset) ]NormalizationTransformerdeepchem/trans/transformers.py基于训练集统计量对特征 X 做标准化回归模式额外对标签 y 做标准化ClippingTransformerdeepchem/trans/transformers.py对特征 X 进行截断抑制极端离群值对模型的影响。随后对四个子集依次应用全部变换for dataset in [train_dataset, valid_dataset, test_dataset, crystal_dataset]: if len(dataset) 0: for transformer in transformers: dataset transformer.transform(dataset)注意transformers拟合只基于训练集统计量datasettrain_dataset再应用到验证/测试集上避免数据泄漏。此处还有一个从源码可观察的实现细节load_bace的transform布尔参数在函数体内并未被实际引用变换始终会被应用bace_rf.py 中调用load_bace(..., transformFalse)但后续Evaluator仍使用返回的transformers因此在当前实现下transform参数的效果有限属于示例代码中的遗留设计。随机森林建模bace_rf.py 全流程examples/bace/bace_rf.py 实现了论文DOI: 10.1021/acs.jcim.6b00290中的随机森林实验其入口函数bace_rf_model(mode, split)的流程为加载数据 → 定义模型与评估指标 → 超参数搜索 → 在各子集上评估。分类与回归两种模式的指标与模型回归模式使用 sklearn 的RandomForestRegressor并定义三个指标r2_metric Metric(metrics.r2_score) rms_metric Metric(metrics.rms_score) mae_metric Metric(metrics.mae_score) all_metrics [r2_metric, rms_metric, mae_metric] metric r2_metric model_class RandomForestRegressor以 R² 作为超参数搜索的优化目标RMS均方根误差与 MAE平均绝对误差作为辅助评估指标。分类模式使用RandomForestClassifier定义四个指标roc_auc_metric Metric(metrics.roc_auc_score) accuracy_metric Metric(metrics.accuracy_score) mcc_metric Metric(metrics.matthews_corrcoef) # Note sensitivity recall recall_metric Metric(metrics.recall_score) all_metrics [accuracy_metric, mcc_metric, recall_metric, roc_auc_metric] metric roc_auc_metric以 ROC-AUC 作为搜索目标同时报告准确率、Matthews 相关系数MCC与召回率源码注释明确指出此处 sensitivity 即 recall。两种模式都通过rf_model_builder工厂函数把 sklearn 模型包装进 DeepChem 的SklearnModel定义于 deepchem/models/sklearn_models/sklearn_model.pydef rf_model_builder(model_params, model_dir): sklearn_model RandomForestClassifier(**model_params) return SklearnModel(sklearn_model, model_dir)超参数搜索示例使用 DeepChem 的HyperparamOptdeepchem/hyper/base_classes.py在如下参数网格上搜索params_dict { n_estimators: [10, 100], max_features: [auto, sqrt, log2, None], }n_estimators随机森林中决策树的数量取 10 或 100 两种规模max_features每次分裂考虑的特征子集策略覆盖auto、sqrt、log2与None全部特征。搜索以验证集上的优化指标回归为 R²、分类为 ROC-AUC为依据挑选最优模型optimizer HyperparamOpt(rf_model_builder) best_rf, best_rf_hyperparams, all_rf_results optimizer.hyperparam_search( params_dict, train, valid, transformers, metricmetric)hyperparam_search返回最优模型、最优超参数组合以及全部候选结果供后续分析与复现。四组数据集上的评估训练完成后脚本使用Evaluatordeepchem/utils/evaluate.py分别在训练集、验证集、测试集与晶体集上计算全部指标并输出 CSV 明细与统计文件rf_train_evaluator Evaluator(best_rf, train, transformers) csv_out rf_%s_%s_train.csv % (mode, split) stats_out rf_%s_%s_train_stats.txt % (mode, split) rf_train_score rf_train_evaluator.compute_model_performance( all_metrics, csv_outcsv_out, stats_outstats_out)每个评估子集都会生成rf_mode_split_set.csv逐样本预测明细与rf_mode_split_set_stats.txt汇总指标对训练集、验证集、测试集、晶体集分别计算验证集用于超参数选择测试集与晶体集用于泛化能力检验len(dataset) 0的判空保护确保空子集不会被误评估。运行方式与预期输出在仓库根目录已安装 DeepChem 及其依赖且工作目录包含examples/bace下执行python examples/bace/bace_rf.py__main__入口会依次运行四种组合完整覆盖论文实验矩阵print(Classifier RF 20-80:) bace_rf_model(modeclassification, split20-80) print(Classifier RF 80-20:) bace_rf_model(modeclassification, split80-20) print(Regressor RF 20-80:) bace_rf_model(moderegression, split20-80) print(Regressor RF 80-20:) bace_rf_model(moderegression, split80-20)运行结束后当前目录下会产出 16 组结果文件4 个评估子集 × 4 种 mode/split 组合的.csv与_stats.txt分别对应分类/回归在 20-80 与 80-20 两种分割下的完整评估报告。若要单独复现某一种配置也可直接在 Python 中调用bace_rf_model(mode..., split...)。与 MolNet 标准 BACE 加载器的对比仓库同时提供了更现代的 MolNet 标准加载方式deepchem/molnet/load_function/bace_datasets.py二者定位不同维度examples/bace 示例MolNet 标准加载器入口load_bace(mode, transform, split)load_bace_regression()/load_bace_classification()特征固定使用 Canvas 预计算描述符列可通过featurizer参数选择默认ECFP指纹分割按论文Model列指定20-80 / 80-20默认scaffold骨架分割官方注释推荐使用变换归一化 截断回归默认[normalization]分类默认[balancing]数据获取读取仓库内 datasets 下的 CSV自动从远程 URL 下载bace.csv并缓存reload控制MolNet 版加载器的 docstring 对数据规模有补充说明回归任务提供 1522 个化合物分类任务提供 1513 个化合物仓库内的desc_canvas_aug30.csv有 1522 行数据与此吻合。对于希望以默认指纹特征快速跑通 BACE 基准的用户dc.molnet.load_bace_regression()是更省事的选择而对于希望严格复现论文特征与分割的用户examples/bace 下的脚本则是与论文设置一一对应的参考实现。小结BACE 示例虽然体量不大却完整展示了 DeepChem 处理外部预计算特征 论文指定分割 sklearn 模型 超参数搜索 多子集评估的经典工作流具体可迁移的要点包括特征接入UserDefinedFeaturizerUserCSVLoader是接入 CSV 预计算特征列的通用方案smiles_field与id_field分别指定分子与样本标识列论文复现SpecifiedSplitter支持按论文给定的样本归属切分旧版按Model列、新版按索引列表是实现可复现实验的关键使用时需注意当前主库 API 签名差异数据变换归一化与截断变换只基于训练集拟合再应用到验证/测试/晶体集避免数据泄漏建模评估HyperparamOptSklearnModelEvaluator的组合覆盖了从超参数搜索到逐样本结果落盘的完整闭环分类与回归的指标选择ROC-AUC/MCC/Recall 与 R²/RMS/MAE可直接套用到其他活性预测任务。结合 examples/bace/bace_datasets.py、examples/bace/bace_rf.py 与 datasets 下的三份 CSV 数据你可以完整还原 Subramanian 等人论文中的 BACE-1 随机森林实验并以此为模板构建自己的分子性质预测流程。【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考