关于 deepchem
DeepChem 是面向药物发现、材料科学和量子化学的开源 Python 分子机器学习框架,适合研究人员构建和评估预测模型。它以统一 API 整合分子数据集、特征化方法与多类模型。
主要功能
- 01加载 CSV 与 MoleculeNet 数据集
- 02提供分子特征化方法
- 03训练经典机器学习与神经网络
- 04支持分子图与 SMILES 模型
- 05微调预训练化学语言模型
适用场景
- 01预测分子溶解度或毒性
- 02在 MoleculeNet 数据集上比较模型
- 03筛选候选分子并排序
- 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/Morgan | CircularFingerprint | 二进制向量(1024-2048) | 通用 QSAR、快速基线 |
| MACCS Keys | MACCSKeysFingerprint | 167 位向量 | 子结构筛选 |
| RDKit 2D | RDKitDescriptors | 200 多个描述符 | 可解释模型 |
| Mol2Vec | Mol2VecFingerprint | 300 维嵌入 | 相似性、聚类 |
| ConvMol | ConvMolFeaturizer | 图特征 | GraphConvModel 输入 |
| MolGraph | MolGraphConvFeaturizer | 节点 + 边特征 | AttentiveFPModel、MPNNModel |
| Weave | WeaveFeaturizer | 成对特征 | WeaveModel 输入 |
| 库仑矩阵 | CoulombMatrix | 原子对距离 | QM 属性预测 |
| SMILES 词元 | SmilesTokenizer | 词元 ID | ChemBERTa、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:迁移学习流程
目标:在小型数据集上微调预训练模型。
- 加载预训练的 ChemBERTa 模型(代码见模块 5)
- 使用
SmilesTokenizer特征化器准备下游数据集 - 将学习率降低至
1e-5到5e-5,微调 5-15 个周期 - 在留出的 scaffold 拆分数据上评估——当训练数据少于 1000 个样本时,预期性能优于指纹基线
- 保存微调后的模型:
model.save_checkpoint() - 完整的超参数优化代码见
references/workflows_model_catalog.md中的 Workflow 1
关键参数
| 参数 | 模块 | 默认值 | 范围 / 选项 | 作用 |
|---|---|---|---|---|
n_features | MultitaskRegressor/Classifier | 必需 | 与特征化器的输出匹配 | 输入特征维度 |
layer_sizes | MultitaskRegressor/Classifier | [1000] | [256] 到 [1000, 500, 250] | 隐藏层维度 |
dropouts | 所有神经网络模型 | 0.0 | 0.0-0.5 | 正则化强度 |
learning_rate | 所有神经网络模型 | 0.001 | 1e-5-0.01 | 训练步长 |
batch_size | 所有神经网络模型 | 100 | 16-256 | 每次梯度更新的样本数 |
nb_epoch | model.fit() | 10 | 10-300 | 训练迭代次数 |
size | CircularFingerprint | 2048 | 512-4096 | 指纹位数 |
radius | CircularFingerprint | 2 | 2-4 | 子结构邻域半径 |
graph_conv_layers | GraphConvModel | [64, 64] | [32] 到 [128, 128, 64] | 图卷积层宽度 |
num_layers | AttentiveFPModel | 2 | 1-5 | GNN 消息传递深度 |
graph_feat_size | AttentiveFPModel | 200 | 64-512 | 图特征维度 |
splitter | dc.molnet.load_*() | "scaffold" | "scaffold"、"random"、"butina" | 数据拆分策略 |
最佳实践
-
药物发现始终使用骨架拆分:随机拆分会泄露结构信息并高估性能。骨架拆分可测试模型对新型化学类型的泛化能力。
-
归一化回归目标:训练前应用
NormalizationTransformer(transform_y=True)。记得对预测结果调用untransform(),以获得便于解读的数值。 -
从指纹基线开始:先训练
MultitaskRegressor+ ECFP。只有在指纹基线效果不足时才转用 GNN;GNN 需要更多数据和计算资源。# Baseline first baseline = dc.models.MultitaskRegressor(n_tasks=1, n_features=2048) -
让特征化器与模型匹配:GNN 模型需要图特征化器(
ConvMolFeaturizer、MolGraphConvFeaturizer)。指纹模型需要CircularFingerprint。混用会导致不易察觉的错误。 -
反模式——药物发现基准测试不要使用随机拆分:使用
RandomSplitter得出的结果不适合发表。审稿人通常要求采用骨架或时间拆分。 -
处理多任务数据集中的缺失标签:Tox21 和许多生物活性数据集都存在缺失值。DeepChem 会在训练期间自动处理 NaN 标签(掩码损失),但请使用
np.isnan(dataset.y).sum()进行验证。 -
通过验证集进行早停:监控验证损失以防止过拟合,尤其是在使用 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 出现 FeaturizationError | SMILES 字符串无效或过于复杂 | 使用 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封装的经典机器学习基线
参考资料
- DeepChem 文档 -- 官方 API 文档和教程
- DeepChem GitHub -- 源代码、示例、问题
- MoleculeNet 基准测试论文 -- Wu 等人,2018 年;基准数据集说明
- DeepChem 教程 -- Jupyter 笔记本教程