对 MoleculeNet 的介绍#

Jupyter Notebook

Jupyter Notebook 中文翻译版查看

Jupyter Notebook 中文翻译版

DeepChem最强大的功能之一是它自带“电池”,也就是说,它自带数据集。DeepChem开发者社区维护MoleculeNet[1]数据集套件,它包含了大量不同的科学数据集,用于机器学习应用。最初的MoleculeNet套件有17个主要关注分子性质的数据集。在过去的几年里,MoleculeNet已经发展成为一个更广泛的科学数据集集合,以促进科学机器学习工具的广泛使用和发展。

这些数据集与DeepChem套件的其他部分集成在一起,因此你可以通过 dc.molnet 子模块中的函数方便地访问这些数据集。在学习本系列教程的过程中,你已经看到了这些加载器(loaders)的一些示例。MoleculeNet套件的完整文档可在我们的文档[2]中找到。

[1] Wu, Zhenqin, et al. “MoleculeNet: a benchmark for molecular machine learning.” Chemical science 9.2 (2018): 513-530.

[2] https://deepchem.readthedocs.io/en/latest/moleculenet.html

MoleculeNet的概述#

在上两个教程中,我们加载了分子溶解度——Delaney数据集。让我们再加载一次。

import deepchem as dc

tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv')
train_dataset, valid_dataset, test_dataset = datasets

注意我们调用的加载器函数 dc.molnet.load_delaneydc.molnet 的子模块。让我们看一看可供我们使用的加载器函数的完整名单。

[method for method in dir(dc.molnet) if "load_" in method ]

MoleculeNet加载器由DeepChem社区积极维护,我们致力于向集合中添加新的数据集。让我们看看今天在MoleculeNet中有多少数据集。

len([method for method in dir(dc.molnet) if "load_" in method ])

MoleculeNet数据集类别#

MoleculeNet 中有很多不同的数据集。让我们快速概述一下可用的不同类型的数据集。我们将把数据集分成不同的类别,并列出属于这些类别的加载器。更多关于这些数据集的细节可以在 https://deepchem.readthedocs.io/en/latest/moleculenet.html 上找到。最初的MoleculeNet论文[1]提供了标记为 V1 的数据集的详细信息。所有剩下的数据集都是 V2 ,在论文中没有记录。

量子力学数据集#

MoleculeNet的量子力学数据集包含各种量子力学特性预测任务。目前的量子力学数据集包括QM7、QM7b、QM8、QM9。相关的加载器是:

物理化学数据集#

物理化学数据集包含预测分子的各种物理性质的各种任务。

化学反应数据集#

这些数据集包含了用于计算逆向合成/正向合成的化学反应数据集。

生物化学/生物物理数据集#

这些数据集是从各种生化/生物物理数据集中提取的,这些数据集包括比如化合物与蛋白质的结合亲和力等数据。

分子目录数据集#

这些数据集提供的分子数据集除了原始的SMILES公式或结构外没有相关的性质。这种类型的数据集对于建立生成模型任务非常有用。

生理学数据集#

这些数据集包含关于化合物如何与人类患者相互作用的生理特性的实验数据。

结构生物学数据集#

这些数据集包含大分子的三维结构和相关的性质。

显微术数据集#

这些数据集包含显微术图像数据集,通常是细胞系。这些数据集并没有出现在最初的MoleculeNet论文中。

材料属性数据集#

这些数据集包含关于各种材料的性能的数据。

[3] Lopez, Steven A., et al. “The Harvard organic photovoltaic dataset.” Scientific data 3.1 (2016): 1-7.

[4] Ramsundar, Bharath, et al. “Is multitask deep learning practical for pharma?.” Journal of chemical information and modeling 57.8 (2017): 2068-2076.

MoleculeNet加载器(Loaders)的解释#

所有的MoleculeNet加载器函数都采用 dc.molnet.load_X 的形式。加载器函数返回一个元组 (任务,数据集,转换器)(tasks, datasets, transformers) 。让我们遍历每个返回值并解释我们得到了什么:

  1. 任务(tasks):这是一个任务名称列表。MoleculeNet中的许多数据集都是“多任务”的。也就是说,一个给定的数据点有多个与之相关的标签。这些对应于与这个数据点相关的不同测量值或值。

  2. 数据集(datasets):这是一个元组包含三个 dc.data.Dataset 对象 (训练,验证,测试) 。这些对应于这个MoleculeNet数据集的训练、验证和测试集。

  3. 转换器(transformers):这是一个在处理期间应用于此数据集的 dc.trans.Transformer 对象列表。

这有点抽象,所以让我们看看我们上面调用的 dc.molnet.load_delaney 函数的这些返回值。让我们从 任务(tasks) 开始。

print(tasks)

我们在这个数据集中有一个任务,它对应于测量的 log(溶解度),单位为mol/L。现在让我们来看看 数据集(datasets)

print(datasets)

正如我们前面提到的,我们看到 datassets 是一个包含3个数据集的元组。我们把它们分开。

train, valid, test = datasets
print(train)
print(valid)
print(test)

让我们来看看 train 数据集中的一个数据点。

print(train.X[0])

注意,这是一个由 dc.feat.ConvMolFeaturizer 生成的 dc.feat.mol_graphs.ConvMol 对象。稍后我们将更多地讨论如何选择特征化(featurization)。最后让我们来看看 transformers

print(transformers)

我们看到一个转换器(transformer)被应用了, dc.trans.NormalizationTransformer

在阅读完这篇描述之后,你可能想知道在底层做了哪些选择。正如我们之前简要提到的,可以使用不同的“featurizer”来处理数据集。在这儿,我们能选择如何特征化吗?此外,如何将源数据集分割为训练/验证/测试三个不同的数据集?

你可以使用 featurizersplitter 关键字参数并传入不同的字符串。“featurizer”通常可能的选择是“ECFP”,“GraphConv”,“Weave”和“smiles2img”,对应于 dc.feat.CircularFingerprintdc.feat.ConvMolFeaturizerdc.feat.WeaveFeaturizerdc.feat.SmilesToImage 。splitter的常见可能选项是“None”,“index”,“random”,“scaffold”和“stratified”,对应于no split, dc.splits.IndexSplitter , dc.splits.RandomSplitter , dc.splits.SingletaskStratifiedSplitter 。我们还没有讨论分离器,但直观地说,它们是一种基于不同标准划分数据集的方法。我们将在以后的教程中详细介绍。

除了字符串,你还可以传入任何 FeaturizerSplitter 对象。这是非常有用的,例如,Featurizer的构造参数可以被用来定制它的行为。

tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP", splitter="scaffold")
(train, valid, test) = datasets
print(train)
print(train.X[0])

注意,与前面的调用不同,我们有了由 dc.feat.CircularFingerprint 生成的numpy数组。而不是 dc.feat.ConvMolFeaturizer 生成的 ConvMol 对象。

自己试试吧。尝试调用MoleculeNet来加载一些其他的数据集,并使用不同的 featurizer/splitter 选项进行实验,看看会发生什么!