DeepChem最强大的特征之一是它内置了许多数据集供使用。DeepChem开发者社区维护了MoleculeNet整套数据集,它维护了大量的不同不同科学数据集以供机器学习应用。原始的MoleculeNet有17个数据集大部分关注于分物特征。在过去的几年里,MoleculeNet的发展扩大了科学数据集以便扩大其用途以及便以科学的机器学习工具的发展。这些数据集补充到DeepChem的后面所以你可以dc.molnet submodule通过方便的访问它们 你已经看到过这些加载器的一些例子,因为你已过运行了一些教程了。关于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
Colab
我们推荐用Google Colab来运行本教程序列。你可以执行下以命令以将DeepChem安装到你的colab记事本中。注意这将花费5分钟来运行你的实例。当然你也可以在本地运行教程,如果你喜欢。这种情况下, 需要下载和安装Anaconda到你的本地机器。
In [ ]:
!curl -Lo conda_installer.py https://raw.githubusercontent.com/deepchem/deepchem/master/scripts/colab_install.py
import conda_installer
conda_installer.install()
!/root/miniconda/bin/conda info -e
In [ ]:
!pip install --pre deepchem
现在就可以导入deepchem包进行尝试了。
In [1]:
import deepchem as dc
dc.__version__
Out[1]:
'2.4.0-rc1.dev'
MoleculeNet概述
前面的两个教程我们加载了分子溶解度数据集Delaney。再在我们再次加载它。
In [2]:
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv', splitter='random')
注意我们调用的dc.molnet.load_delaney加载器函数存在于MoleculeNet加载器的 dc.molnet子模块。现在看一下我们可以使用户所有加载器。
In [3]:
[method for method in dir(dc.molnet) if "load_" in method ]
Out[3]:
['load_bace_classification',
'load_bace_regression',
'load_bandgap',
'load_bbbc001',
'load_bbbc002',
'load_bbbp',
'load_cell_counting',
'load_chembl',
'load_chembl25',
'load_clearance',
'load_clintox',
'load_delaney',
'load_factors',
'load_function',
'load_hiv',
'load_hopv',
'load_hppb',
'load_kaggle',
'load_kinase',
'load_lipo',
'load_mp_formation_energy',
'load_mp_metallicity',
'load_muv',
'load_nci',
'load_pcba',
'load_pcba_146',
'load_pcba_2475',
'load_pdbbind',
'load_pdbbind_from_dir',
'load_pdbbind_grid',
'load_perovskite',
'load_ppb',
'load_qm7',
'load_qm7_from_mat',
'load_qm7b_from_mat',
'load_qm8',
'load_qm9',
'load_sampl',
'load_sider',
'load_sweet',
'load_thermosol',
'load_tox21',
'load_toxcast',
'load_uspto',
'load_uv',
'load_zinc15']
MoleculeNet加载器的集合由 DeepChem社区维护并且我们可以不断地向它添加数据集。我们来看一下MoleculeNet现在有多少个数据集。
In [4]:
len([method for method in dir(dc.molnet) if "load_" in method ])
Out[4]:
46
MoleculeNet数据集的分类
MoleculeNet有许多不同的数据集。我们来快速的浏览一下可用的数据集的类型。我们将数据集分为不同的类型并列出属于这些类的加载器。有关这些数据集的细节可以参见https://deepchem.readthedocs.io/en/latest/moleculenet.html。MoleculeNet的原始论文[1]提供了关于这些论文子集的详情。我们标记以下的数据集为"V1"。其它的为"V2"而且没有旧的论文介绍。
Quantum Mechanical Datasets
MoleculeNet的quantum mechanical datasets包括了多个量子机理特征预测任务。现在的量子机理数据集包括QM7, QM7b, QM8, QM9。相关的加载器为:
dc.molnet.load_qm7: V1
dc.molnet.load_qm7b_from_mat: V1
dc.molnet.load_qm8: V1
dc.molnet.load_qm9: V1
Physical Chemistry Datasets
physical chemistry dataset包括了多个任务预测不同的分子物理特征。
dc.molnet.load_delaney: V1. 这个数据集在原始论文中也称为ESOL。
dc.molnet.load_sampl: V1. 这个数据集在原始论文中也称为FreeSolv。
dc.molnet.load_lipo: V1. 这个数据集在原始论文中也称为Lipophilicity。
dc.molnet.load_thermosol: V2.
dc.molnet.load_hppb: V2.
dc.molnet.load_hopv: V2. 这个数据集取自文献 [3]
Chemical Reaction Datasets
这些数据集贮存化学反应数据集用以逆合成或前向合成。
dc.molnet.load_uspto
Biochemical/Biophysical Datasets
这些数据取自不同的生物化学/生物物理数据集,测量分子与蛋白质的结合亲和力之类的数据。
dc.molnet.load_pcba: V1
dc.molnet.load_nci: V2.
dc.molnet.load_muv: V1
dc.molnet.load_hiv: V1
dc.molnet.load_ppb: V2.
dc.molnet.load_bace_classification: V1. 这个加载器加载了来自原始的MoleculeNet论文中的BACE数据集的分类任务。
dc.molnet.load_bace_regression: V1. 这个加载器加载了来自原始的MoleculeNet论文中的BACE数据集的回归任务。
dc.molnet.load_kaggle: V2. 这个数据集来自Merck's的药物发现kaggle比赛并描述于文献 [4]。
dc.molnet.load_factors: V2. 这个数据集来自于文献[4]。
dc.molnet.load_uv: V2. 这个数据集来自于文献[4。
dc.molnet.load_kinase: V2. 这个数据集来自于文献[4。
Molecular Catalog Datasets
这些数据集提供分子数据,与原始的SMILES分子或结构之外的特征不相关。这些类型的数据用于生产式模型任务。
dc.molnet.load_zinc15: V2
dc.molnet.load_chembl: V2
dc.molnet.load_chembl25: V2
Physiology Datasets
这些数据集测量分子如何与患者作用的生理学的特征。
dc.molnet.load_bbbp: V1
dc.molnet.load_tox21: V1
dc.molnet.load_toxcast: V1
dc.molnet.load_sider: V1
dc.molnet.load_clintox: V1
dc.molnet.load_clearance: V2
Structural Biology Datasets
这些数据集包括 大分子的3D结构及相关特性。
dc.molnet.load_pdbbind: V1
Microscopy Datasets
这些数据集包括显微图像数据集,特别是细胞种属。这些数据集不在原始的MoleculeNet论文中。
dc.molnet.load_bbbc001: V2
dc.molnet.load_bbbc002: V2
dc.molnet.load_cell_counting: V2
Materials Properties Datasets
这些数据集计算不同的材料特性。
dc.molnet.load_bandgap: V2
dc.molnet.load_perovskite: V2
dc.molnet.load_mp_formation_energy: V2
dc.molnet.load_mp_metallicity: V2
[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加载器解释
所有的MoleculeNet加载器函数的形式为dc.molnet.load_X。加载器函数返回参数的元组(tasks, datasets, transformers)。 我们来看一下这些返回值并解释一下我们得到的结果。
tasks: 这是task-names的列表。MoleculeNet的许多数据集都是多任务的。即是,一个数据点有多个与之相关的标签。这些与数据点的不同的测量或值对应。
datasets: 这个字段是dc.data.Dataset对象的三元组(train, valid, test).。这些与MoleculeNet数据集的训练集、验证集、测试集对应。
transformers: 这个字段是dc.trans.Transformer对象的列表,应用于数据集的处理过程。这是抽像的所以我们来看一下我们前面调用的dc.molnet.load_delaney返回的这些字段。我们从tasks字段开始。
In [5]:
tasks
Out[5]:
['measured log solubility in mols per litre']
这个数据集有一个任务与mol/L为单位的对数溶解度相对应。我们来看一下数据集。
In [6]:
datasets
Out[6]:
(<DiskDataset X.shape: (902,), y.shape: (902, 1), w.shape: (902, 1), ids: ['CCC(C)Cl' 'O=C1NC(=O)NC(=O)C1(C(C)C)CC=C' 'Oc1ccccn1' ...
'CCCCCCCC(=O)OCC' 'O=Cc1ccccc1' 'CCCC=C(CC)C=O'], task_names: ['measured log solubility in mols per litre']>,
<DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['CSc1nc(nc(n1)N(C)C)N(C)C' 'CC#N' 'CCCCCCCC#C' ... 'ClCCBr'
'CCN(CC)C(=O)CSc1ccc(Cl)nn1' 'CC(=O)OC3CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C '], task_names: ['measured log solubility in mols per litre']>,
<DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['CCCCc1c(C)nc(nc1O)N(C)C '
'Cc3cc2nc1c(=O)[nH]c(=O)nc1n(CC(O)C(O)C(O)CO)c2cc3C'
'CSc1nc(NC(C)C)nc(NC(C)C)n1' ... 'O=c1[nH]cnc2[nH]ncc12 '
'CC(=C)C1CC=C(C)C(=O)C1' 'OC(C(=O)c1ccccc1)c2ccccc2'], task_names: ['measured log solubility in mols per litre']>)
如我们前面提到的,我们看到数据集是3个数据集的元组。我们将它们分开。
In [7]:
train, valid, test = datasets
In [8]:
train
Out[8]:
<DiskDataset X.shape: (902,), y.shape: (902, 1), w.shape: (902, 1), ids: ['CCC(C)Cl' 'O=C1NC(=O)NC(=O)C1(C(C)C)CC=C' 'Oc1ccccn1' ...
'CCCCCCCC(=O)OCC' 'O=Cc1ccccc1' 'CCCC=C(CC)C=O'], task_names: ['measured log solubility in mols per litre']>
In [9]:
valid
Out[9]:
<DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['CSc1nc(nc(n1)N(C)C)N(C)C' 'CC#N' 'CCCCCCCC#C' ... 'ClCCBr'
'CCN(CC)C(=O)CSc1ccc(Cl)nn1' 'CC(=O)OC3CCC4C2CCC1=CC(=O)CCC1(C)C2CCC34C '], task_names: ['measured log solubility in mols per litre']>
In [10]:
test
Out[10]:
<DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['CCCCc1c(C)nc(nc1O)N(C)C '
'Cc3cc2nc1c(=O)[nH]c(=O)nc1n(CC(O)C(O)C(O)CO)c2cc3C'
'CSc1nc(NC(C)C)nc(NC(C)C)n1' ... 'O=c1[nH]cnc2[nH]ncc12 '
'CC(=C)C1CC=C(C)C(=O)C1' 'OC(C(=O)c1ccccc1)c2ccccc2'], task_names: ['measured log solubility in mols per litre']>
我们来看一下训练集中的一个数据点。
In [11]:
train.X[0]
Out[11]:
<deepchem.feat.mol_graphs.ConvMol at 0x7fe1ef601438>
注意,这是一个由dc.feat.ConvMolFeaturizer产生的dc.feat.mol_graphs.ConvMol对象。我们会详细地说一下如何控制特征化选择。最后来看一下transformers字段:
In [12]:
transformers
Out[12]:
[<deepchem.trans.transformers.NormalizationTransformer at 0x7fe2029bdfd0>]
我们看到使用了一个转换器,dc.trans.Normalization转换器。
读完现在的这些描述,你会问如何选择。我们在前面简单的提到,数据集可以由不同的"featurizers"处理。我们该如何选择特征化过程呢?另外,源数据又是如何分为训练/验证/测试三种数据集的呢? 你可以使用 'featurizer' 和 'splitter'关键词参数并传递不同的字串。 通常 'featurizer'可能的选择是'ECFP', 'GraphConv', 'Weave' 和 'smiles2img'对应于dc.feat.CircularFingerprint, dc.feat.ConvMolFeaturizer, dc.feat,WeaveFeaturizer 和 dc.feat.SmilesToImage featurizers。
通常'splitter'可能的选择是None, 'index', 'random', 'scaffold'和 'stratified'对应于无分割,dc.splits.IndexSplitter, dc.splits.RandomSplitter, dc.splits.SingletaskStratifiedSplitter。我们现在不多讨论splitters,但是直观地它们是按不现标准将数据集分成不同的部分。后们我们会更多的讨论。 除了字串,你可以传递任意的 Featurizer 或Splitter对象。这是非常有用的,例如,通过有构建子参数的特征化器你可以定制它的行为。
In [13]:
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP", splitter="scaffold")
In [14]:
(train, valid, test) = datasets
In [15]:
train
Out[15]:
<DiskDataset X.shape: (902, 1024), y.shape: (902, 1), w.shape: (902, 1), ids: ['CC(C)=CCCC(C)=CC(=O)' 'CCCC=C' 'CCCCCCCCCCCCCC' ...
'Nc2cccc3nc1ccccc1cc23 ' 'C1CCCCCC1' 'OC1CCCCCC1'], task_names: ['measured log solubility in mols per litre']>
In [16]:
train.X[0]
Out[16]:
array([0., 0., 0., ..., 0., 0., 0.])
注意不像前面我们有dc.feat.CircularFingerprint产生的numpy数组而是由dc.feat.ConvMolFeaturizer产生的ConvMol对象。
你自已尝试一下。试一下调用MoleculeNet加载一些其它的数据集并实验一下不同的featurizer/split选项看看会发生什么!