mcpField
D
deepchem

deepchem

github.com/jaechang-hits数据与数据库38472 次安装1 周前更新
代码仓库

关于 deepchem

DeepChem 是面向药物发现、材料科学和量子化学的开源 Python 分子机器学习框架,适合研究人员构建和评估预测模型。它以统一 API 整合分子数据集、特征化方法与多类模型。

主要功能

  1. 01加载 CSV 与 MoleculeNet 数据集
  2. 02提供分子特征化方法
  3. 03训练经典机器学习与神经网络
  4. 04支持分子图与 SMILES 模型
  5. 05微调预训练化学语言模型

适用场景

  1. 01预测分子溶解度或毒性
  2. 02在 MoleculeNet 数据集上比较模型
  3. 03筛选候选分子并排序
  4. 04预测材料性质或结合亲和力

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jaechang-hits/sciagent-skills --skill deepchem

安装后在 Claude Code 中输入/deepchem确认已加载。

附带文件references/workflows_model_catalog.md

详细介绍

DeepChem — 药物发现深度学习

概述

DeepChem 是一个开源 Python 框架,为药物发现、材料科学和量子化学领域的分子机器学习提供统一 API。它封装了 60 多种模型架构(图神经网络、Transformer、传统机器学习),并提供 50 多种分子特征化器和标准化数据集(MoleculeNet),支持从 SMILES 字符串到训练预测模型的端到端工作流。

适用场景

  • 根据 SMILES 预测分子属性(溶解度、毒性、结合亲和力)
  • 在 MoleculeNet 标准化数据集(BBBP、Tox21、ESOL、FreeSolv 等)上对模型进行基准测试
  • 在分子图上训练图神经网络(GCN、GAT、AttentiveFP、MPNN、DMPNN)
  • 微调预训练的化学语言模型(ChemBERTa、GROVER、MolFormer)
  • 对分子机器学习模型进行超参数优化
  • 使用训练好的模型进行虚拟筛选和候选化合物优先级排序
  • 根据晶体结构预测材料属性(CGCNN、MEGNet)
  • 对蛋白质-配体相互作用进行建模并预测结合亲和力
  • 如果要在不使用深度学习的情况下进行基于指纹的化学信息学,请改用 rdkit-cheminformatics
  • 如果只需要特征化(不训练模型),请改用 molfeat-molecular-featurization

先决条件

  • Python 包:deepchem(核心包)、torch 或 tensorflow(取决于模型所用后端)
  • GPU:建议用于图神经网络和 Transformer 模型;传统机器学习和指纹模型使用 CPU 即可
  • 数据:带有属性标签的 SMILES 字符串(CSV),或 MoleculeNet 数据集(自动下载)
# Core installation (includes RDKit, scikit-learn, XGBoost)
pip install deepchem

# With PyTorch backend (GNN models)
pip install deepchem[torch]

# With TensorFlow backend (legacy models)
pip install deepchem[tensorflow]

# Full installation (all backends + extras)
pip install deepchem[all]

快速入门

import deepchem as dc

# Load MoleculeNet dataset with featurization + scaffold split
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP")
train, valid, test = datasets

# Train and evaluate a multitask regressor
model = dc.models.MultitaskRegressor(n_tasks=1, n_features=1024, dropouts=0.2)
model.fit(train, nb_epoch=50)
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score)
print(f"Test R2: {model.evaluate(test, [metric])}")  # {'pearson_r2_score': ~0.7}

核心 API

模块 1:数据加载与处理

从 CSV 文件或 MoleculeNet 基准数据集中加载分子数据。

import deepchem as dc

# Load from CSV (SMILES + property columns)
loader = dc.data.CSVLoader(
    tasks=["measured_log_solubility"],
    feature_field="smiles",
    featurizer=dc.feat.CircularFingerprint(size=2048, radius=3)
)
dataset = loader.create_dataset("solubility_data.csv")
print(f"Samples: {dataset.X.shape[0]}, Features: {dataset.X.shape[1]}")
# Samples: 1128, Features: 2048

# Load from SDF (3D structures)
sdf_loader = dc.data.SDFLoader(
    tasks=["activity"],
    featurizer=dc.feat.CoulombMatrix(max_atoms=50)
)
dataset_3d = sdf_loader.create_dataset("molecules.sdf")
# Load MoleculeNet benchmark datasets (auto-download + featurize + split)
# Available: load_delaney, load_bbbp, load_tox21, load_hiv, load_qm7, load_qm9, etc.
tasks, datasets, transformers = dc.molnet.load_tox21(featurizer="ECFP", splitter="scaffold")
train, valid, test = datasets
print(f"Tasks: {len(tasks)}, Train: {len(train)}, Test: {len(test)}")
# Tasks: 12, Train: ~6264, Test: ~631

# Inverse-transform predictions back to original scale
y_pred = model.predict(test)
y_original = transformers[0].untransform(y_pred)
模块 2:分子特征化

将分子转换为机器学习所用的数值表示。DeepChem 提供 50 多种特征化器,涵盖指纹、描述符、图特征和库仑矩阵。

import deepchem as dc

smiles = ["CCO", "CC(=O)O", "c1ccccc1", "CC(C)O"]

# Fingerprints (most common for classical ML)
ecfp = dc.feat.CircularFingerprint(size=2048, radius=3)
fp_features = ecfp.featurize(smiles)
print(f"ECFP shape: {fp_features.shape}")  # (4, 2048)

# RDKit descriptors (interpretable physicochemical properties)
rdkit_desc = dc.feat.RDKitDescriptors()
desc_features = rdkit_desc.featurize(smiles)
print(f"Descriptor shape: {desc_features.shape}")  # (4, 208)

# Graph features (for GNN models — returns ConvMol objects)
graph_feat = dc.feat.ConvMolFeaturizer()
graphs = graph_feat.featurize(smiles)
print(f"Atoms in first mol: {graphs[0].get_num_atoms()}")  # 3

# Mol2Vec embeddings (pretrained word2vec on molecular substructures)
mol2vec = dc.feat.Mol2VecFingerprint()
embeddings = mol2vec.featurize(smiles)
print(f"Mol2Vec shape: {embeddings.shape}")  # (4, 300)
模块 3:模型训练与评估

DeepChem 提供通用模型 MultitaskRegressor 和 MultitaskClassifier,以及用于图数据和序列数据的专用架构。

import deepchem as dc

# Load dataset
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP")
train, valid, test = datasets

# Regression model (fingerprint input)
model = dc.models.MultitaskRegressor(
    n_tasks=1,
    n_features=1024,
    layer_sizes=[1000, 500],
    dropouts=0.25,
    learning_rate=0.001,
    batch_size=64,
)
model.fit(train, nb_epoch=100)

# Evaluate with multiple metrics
metrics = [
    dc.metrics.Metric(dc.metrics.pearson_r2_score),
    dc.metrics.Metric(dc.metrics.mean_absolute_error),
    dc.metrics.Metric(dc.metrics.rms_score),
]
results = model.evaluate(test, metrics)
print(f"R2: {results['pearson_r2_score']:.3f}, MAE: {results['mean_absolute_error']:.3f}")
# Classification model (e.g., Tox21 toxicity prediction)
tasks, datasets, transformers = dc.molnet.load_tox21(featurizer="ECFP")
train, valid, test = datasets

clf = dc.models.MultitaskClassifier(
    n_tasks=len(tasks),
    n_features=1024,
    layer_sizes=[1000, 500],
    dropouts=0.5,
    learning_rate=0.001,
)
clf.fit(train, nb_epoch=50)
roc_metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean)
print(f"Mean ROC-AUC: {clf.evaluate(test, [roc_metric])}")
模块 4:图神经网络

图神经网络直接处理分子图(原子作为节点,化学键作为边),避免固定指纹造成的信息损失。

import deepchem as dc

# Load with graph featurizer
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="GraphConv")
train, valid, test = datasets

# Graph Convolutional Network (Duvenaud et al.)
gcn_model = dc.models.GraphConvModel(
    n_tasks=1,
    mode="regression",
    graph_conv_layers=[64, 64],
    dense_layer_size=256,
    dropout=0.2,
    learning_rate=0.001,
    batch_size=64,
)
gcn_model.fit(train, nb_epoch=100)
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score)
print(f"GCN R2: {gcn_model.evaluate(test, [metric])}")
# AttentiveFP (Xiong et al.) — attention-based GNN, strong on molecular properties
tasks, datasets, transformers = dc.molnet.load_delaney(
    featurizer=dc.feat.MolGraphConvFeaturizer(use_edges=True)
)
train, valid, test = datasets

attfp_model = dc.models.AttentiveFPModel(
    n_tasks=1,
    mode="regression",
    num_layers=2,
    graph_feat_size=200,
    num_timesteps=2,
    dropout=0.2,
    learning_rate=0.001,
    batch_size=64,
)
attfp_model.fit(train, nb_epoch=100)
print(f"AttentiveFP R2: {attfp_model.evaluate(test, [metric])}")
模块 5:迁移学习

使用有限的数据,为下游任务微调预训练的化学语言模型。

import deepchem as dc
from deepchem.models.torch_models import ChemBERTaModel

# ChemBERTa — SMILES-based transformer (pretrained on 77M molecules)
tasks, datasets, transformers = dc.molnet.load_bbbp(featurizer=dc.feat.SmilesTokenizer())
train, valid, test = datasets

chemberta = ChemBERTaModel(
    task="classification",
    n_tasks=1,
    model_dir="chemberta_finetuned/",
)
# Fine-tune on downstream task (BBB permeability)
chemberta.fit(train, nb_epoch=10)
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
print(f"ChemBERTa ROC-AUC: {chemberta.evaluate(test, [metric])}")
模块 6:预测新分子

使用训练好的模型对新分子进行推理。

import deepchem as dc
import numpy as np

# Assume trained model from Module 3
# Featurize new molecules using same featurizer
featurizer = dc.feat.CircularFingerprint(size=1024, radius=2)
new_smiles = ["c1cc(O)ccc1", "CC(=O)Nc1ccc(O)cc1", "OC(=O)c1ccccc1"]
new_features = featurizer.featurize(new_smiles)
new_dataset = dc.data.NumpyDataset(X=new_features)

predictions = model.predict(new_dataset)
for smi, pred in zip(new_smiles, predictions):
    print(f"{smi}: {pred[0]:.2f}")

# Ensemble predictions from multiple models for robustness
models = [model1, model2, model3]  # trained models
all_preds = np.array([m.predict(new_dataset) for m in models])
ensemble_mean = all_preds.mean(axis=0)
ensemble_std = all_preds.std(axis=0)
print(f"Ensemble prediction: {ensemble_mean[0][0]:.2f} +/- {ensemble_std[0][0]:.2f}")

核心概念

统一 API 模式

所有 DeepChem 工作流都遵循一致的 5 步模式:

Load Data → Featurize → Split → Train → Evaluate
  • 加载:CSVLoader、SDFLoader 或 dc.molnet.load_*()(自动加载 MoleculeNet 数据集)
  • 特征化:将特征化器传递给加载器,或直接调用 featurizer.featurize(smiles)
  • 拆分:ScaffoldSplitter(药物发现推荐使用)、RandomSplitter、ButinaSplitter
  • 训练:model.fit(train_dataset, nb_epoch=N)
  • 评估:model.evaluate(test_dataset, metrics_list)
模型选择指南
数据类型模型主要特点适用场景
SMILES + 指纹MultitaskRegressor快速,基线模型首次尝试、小型数据集
SMILES + 指纹MultitaskClassifier多标签多任务分类(Tox21)
分子图GraphConvModel学习得到的指纹中型数据集、通用属性
分子图GATModel注意力机制需要关注原子重要性的场景
分子图AttentiveFPModel图注意力 + 时间步注意力最先进的分子属性预测
分子图MPNNModel消息传递复杂的分子相互作用
分子图DMPNNModel有向 MPNN键级预测
SMILES 字符串ChemBERTaModel预训练 Transformer低数据场景、迁移学习
SMILES 字符串GROVERModel图 + Transformer丰富的分子表示
晶体结构CGCNNModel晶体图 CNN材料属性预测
晶体结构MEGNetModel图网络材料和分子
蛋白质序列ProteinLigandComplexModel复合物建模结合亲和力预测
表格特征XGBoostModel、RandomForestModel传统机器学习可解释性、基线模型
特征化器选择指南
特征化器类输出最适合
ECFP/MorganCircularFingerprint二进制向量(1024-2048)通用 QSAR、快速基线
MACCS KeysMACCSKeysFingerprint167 位向量子结构筛选
RDKit 2DRDKitDescriptors200 多个描述符可解释模型
Mol2VecMol2VecFingerprint300 维嵌入相似性、聚类
ConvMolConvMolFeaturizer图特征GraphConvModel 输入
MolGraphMolGraphConvFeaturizer节点 + 边特征AttentiveFPModel、MPNNModel
WeaveWeaveFeaturizer成对特征WeaveModel 输入
库仑矩阵CoulombMatrix原子对距离QM 属性预测
SMILES 词元SmilesTokenizer词元 IDChemBERTa、Transformer 模型
数据拆分策略
拆分器使用场景原因
ScaffoldSplitter药物发现(默认)测试对新化学型的泛化能力
RandomSplitter快速实验基线,但会高估性能
ButinaSplitter基于多样性按 Tanimoto 相似度聚类
FingerprintSplitter化学相似性将结构相似的分子分组
MaxMinSplitter最大多样性测试极端泛化测试

常见工作流

工作流 1:从 CSV 数据构建 QSAR

目标:使用包含 SMILES 和活性列的 CSV 文件构建属性预测模型。

import deepchem as dc
import pandas as pd

# Step 1: Load and featurize CSV data
loader = dc.data.CSVLoader(
    tasks=["pIC50"],
    feature_field="smiles",
    featurizer=dc.feat.CircularFingerprint(size=2048, radius=3),
)
dataset = loader.create_dataset("bioactivity_data.csv")

# Step 2: Normalize targets
transformer = dc.trans.NormalizationTransformer(
    transform_y=True, dataset=dataset
)
dataset = transformer.transform(dataset)

# Step 3: Scaffold split (realistic for drug discovery)
splitter = dc.splits.ScaffoldSplitter()
train, valid, test = splitter.train_valid_test_split(dataset)
print(f"Train: {len(train)}, Valid: {len(valid)}, Test: {len(test)}")

# Step 4: Train model
model = dc.models.MultitaskRegressor(
    n_tasks=1, n_features=2048,
    layer_sizes=[1000, 500], dropouts=0.25,
    learning_rate=0.001, batch_size=64,
)
model.fit(train, nb_epoch=100)

# Step 5: Evaluate
metrics = [
    dc.metrics.Metric(dc.metrics.pearson_r2_score),
    dc.metrics.Metric(dc.metrics.mean_absolute_error),
]
results = model.evaluate(test, metrics)
print(f"R2: {results['pearson_r2_score']:.3f}, MAE: {results['mean_absolute_error']:.3f}")
工作流 2:比较 MoleculeNet 基准测试

目标:在 MoleculeNet 基准数据集上比较多个模型。

import deepchem as dc

# Load dataset with graph featurizer (supports both fingerprint and GNN models)
tasks, datasets, transformers = dc.molnet.load_bbbp(
    featurizer="GraphConv", splitter="scaffold"
)
train, valid, test = datasets
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)

# Model 1: Graph Convolutional Network
gcn = dc.models.GraphConvModel(n_tasks=1, mode="classification", dropout=0.2)
gcn.fit(train, nb_epoch=50)
gcn_score = gcn.evaluate(test, [metric])

# Model 2: Random Forest baseline (needs fingerprints)
tasks_fp, datasets_fp, _ = dc.molnet.load_bbbp(featurizer="ECFP", splitter="scaffold")
train_fp, _, test_fp = datasets_fp
rf = dc.models.SklearnModel(
    model=dc.models.sklearn_models.RandomForestClassifier(n_estimators=500),
    model_dir="rf_model/"
)
rf.fit(train_fp)
rf_score = rf.evaluate(test_fp, [metric])

print(f"GCN ROC-AUC: {gcn_score['roc_auc_score']:.3f}")
print(f"RF  ROC-AUC: {rf_score['roc_auc_score']:.3f}")
工作流 3:迁移学习流程

目标:在小型数据集上微调预训练模型。

  1. 加载预训练的 ChemBERTa 模型(代码见模块 5)
  2. 使用 SmilesTokenizer 特征化器准备下游数据集
  3. 将学习率降低至 1e-5 到 5e-5,微调 5-15 个周期
  4. 在留出的 scaffold 拆分数据上评估——当训练数据少于 1000 个样本时,预期性能优于指纹基线
  5. 保存微调后的模型:model.save_checkpoint()
  6. 完整的超参数优化代码见 references/workflows_model_catalog.md 中的 Workflow 1

关键参数

参数模块默认值范围 / 选项作用
n_featuresMultitaskRegressor/Classifier必需与特征化器的输出匹配输入特征维度
layer_sizesMultitaskRegressor/Classifier[1000][256] 到 [1000, 500, 250]隐藏层维度
dropouts所有神经网络模型0.00.0-0.5正则化强度
learning_rate所有神经网络模型0.0011e-5-0.01训练步长
batch_size所有神经网络模型10016-256每次梯度更新的样本数
nb_epochmodel.fit()1010-300训练迭代次数
sizeCircularFingerprint2048512-4096指纹位数
radiusCircularFingerprint22-4子结构邻域半径
graph_conv_layersGraphConvModel[64, 64][32] 到 [128, 128, 64]图卷积层宽度
num_layersAttentiveFPModel21-5GNN 消息传递深度
graph_feat_sizeAttentiveFPModel20064-512图特征维度
splitterdc.molnet.load_*()"scaffold""scaffold"、"random"、"butina"数据拆分策略

最佳实践

  1. 药物发现始终使用骨架拆分:随机拆分会泄露结构信息并高估性能。骨架拆分可测试模型对新型化学类型的泛化能力。

  2. 归一化回归目标:训练前应用 NormalizationTransformer(transform_y=True)。记得对预测结果调用 untransform(),以获得便于解读的数值。

  3. 从指纹基线开始:先训练 MultitaskRegressor + ECFP。只有在指纹基线效果不足时才转用 GNN;GNN 需要更多数据和计算资源。

    # Baseline first
    baseline = dc.models.MultitaskRegressor(n_tasks=1, n_features=2048)
    
  4. 让特征化器与模型匹配:GNN 模型需要图特征化器(ConvMolFeaturizer、MolGraphConvFeaturizer)。指纹模型需要 CircularFingerprint。混用会导致不易察觉的错误。

  5. 反模式——药物发现基准测试不要使用随机拆分:使用 RandomSplitter 得出的结果不适合发表。审稿人通常要求采用骨架或时间拆分。

  6. 处理多任务数据集中的缺失标签:Tox21 和许多生物活性数据集都存在缺失值。DeepChem 会在训练期间自动处理 NaN 标签(掩码损失),但请使用 np.isnan(dataset.y).sum() 进行验证。

  7. 通过验证集进行早停:监控验证损失以防止过拟合,尤其是在使用 GNN 模型时。

常用配方

配方:超参数搜索

适用场景:在最终评估前优化模型性能。

import deepchem as dc

tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP")
train, valid, test = datasets

# Define parameter grid
params = {
    "n_features": [1024],
    "layer_sizes": [[500], [1000, 500], [1000, 500, 250]],
    "dropouts": [0.1, 0.25, 0.5],
    "learning_rate": [0.001, 0.0005],
}

optimizer = dc.hyper.GridHyperparamOpt(lambda **p: dc.models.MultitaskRegressor(**p))
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score)
best_model, best_params, all_results = optimizer.hyperparam_search(
    params, train, valid, metric, logdir="hyperparam_logs/"
)
print(f"Best params: {best_params}")
print(f"Best R2: {best_model.evaluate(test, [metric])}")
配方:保存和重新加载模型

适用场景:部署训练好的模型或恢复训练。

# Save model checkpoint
model.save_checkpoint(model_dir="saved_model/")

# Reload model
loaded_model = dc.models.MultitaskRegressor(n_tasks=1, n_features=2048)
loaded_model.restore(model_dir="saved_model/")
predictions = loaded_model.predict(test)
配方:自定义指标

适用场景:使用领域特定指标评估模型。

import deepchem as dc
import numpy as np

def enrichment_factor(y_true, y_pred, top_fraction=0.01):
    """Enrichment factor at top X% of ranked predictions."""
    n = len(y_true)
    n_top = max(int(n * top_fraction), 1)
    top_indices = np.argsort(y_pred.flatten())[-n_top:]
    hits_in_top = y_true.flatten()[top_indices].sum()
    expected = y_true.sum() * top_fraction
    return hits_in_top / expected if expected > 0 else 0.0

ef_metric = dc.metrics.Metric(enrichment_factor, mode="regression")
print(f"EF@1%: {model.evaluate(test, [ef_metric])}")

故障排查

问题原因解决方案
ModuleNotFoundError: torch未安装 PyTorch对于 GNN 模型,运行 pip install deepchem[torch]
ValueError: n_features mismatch特征化器的输出大小与模型的 n_features 不匹配检查 dataset.X.shape[1],并据此设置 n_features
训练期间损失为 NaN学习率过高或目标值未归一化应用 NormalizationTransformer,将学习率降至 1e-4
Scaffold 划分下的性能较低模型记住了 Scaffold,而非属性使用更多数据,尝试 GNN 模型,或添加正则化(dropout 0.3-0.5)
RuntimeError: CUDA out of memory批次大小超出 GPU 容量减小 batch_size(32 或 16),或在小型数据集上使用 CPU
某些 SMILES 出现 FeaturizationErrorSMILES 字符串无效或过于复杂使用 RDKit 预先筛选:Chem.MolFromSmiles(smi) is not None
模型预测值恒定目标值未归一化或训练轮数太少应用 NormalizationTransformer,增加 nb_epoch
特征化速度慢数据集较大且特征化器开销较高使用 CircularFingerprint(速度快),或通过 n_jobs 参数并行处理

捆绑资源

  • references/workflows_model_catalog.md -- 扩展工作流(包含完整代码的超参数优化、MolGAN 生成模型、使用 CGCNN/MEGNet 进行材料属性预测、蛋白质-配体建模、自定义模型架构),以及完整的模型目录(按类别整理的 60 多个模型)和完整的特征化器目录(50 多个特征化器)。涵盖:原始内容中的工作流 4-8、扩展模型和特征化器清单、MoleculeNet 数据集目录。已迁移至正文:前 3 个工作流(QSAR、MoleculeNet 基准测试、迁移学习)位于常见工作流中;核心模型和特征化器表格位于关键概念中。省略:TensorFlow 1.x(已弃用)的详细安装故障排查,以及 Docker 专用设置(官方文档已有说明)。

相关技能

  • rdkit-cheminformatics -- 分子操作、指纹、子结构搜索(上游特征化)
  • molfeat-molecular-featurization -- 提供 100 多种特征化器并采用 scikit-learn API(仅特征化的替代方案)
  • datamol-cheminformatics -- Pythonic 分子处理(上游数据准备)
  • pytdc-therapeutics-data-commons -- 提供经过整理且具有标准化划分的 ADMET/DTI 数据集(互补数据源)
  • torch-geometric-graph-neural-networks -- 用于自定义 GNN 架构的底层 PyG(面向高级用户的替代方案)
  • scikit-learn-machine-learning -- DeepChem 通过 SklearnModel 封装的经典机器学习基线

参考资料

评论

支持 Markdown