DeepChem 最强大的功能之一是它带有“包含电池”的数据集供使用。DeepChem 开发者社区维护着 MoleculeNet [1] 数据集套件,该套件维护着大量不同的科学数据集,用于机器学习的应用。最初的 MoleculeNet 套件有 17 个数据集,主要关注分子特性,在过去几年中,MoleculeNet 已经发展成为更广泛的科学数据集集 合,以促进机器学习的使用和开发。
这些数据集与 DeepChem 套件的其余部分集成在一起,因此您可以通过 dc.molnet 子模块中的函数方便地访问这些数据集。在学习本教程系列时,您可以看到这些加载器的一些示例。 MoleculeNet 套件的完整文档可在我们的文档 [2] 中找到。
[1] Wu, Zhenqin, et al.“MoleculeNet: a benchmark for molecular machine learning.” Chemical science 9.2 (2018): 513-530.
!pip install --pre deepchem
我们现在可以导入 deepchem 包来试一试。
import deepchem as dc
dc.__version__
'2.4.0-rc1.dev
在上两个教程中,我们加载了分子溶解度的 Delaney 数据集,让我们再加载一次。
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv', splitter='random')
请注意,我们调用“dc.molnet.load_delaney”的函数位于MoleculeNet 加载器的“dc.molnet”子模块中,让我们来看看MoleculeNet加载器中所有可用的加载器的完整集 合。
[method for method in dir(dc.molnet) if "load_" in method ]
['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 中有多少数据集。
len([method for method in dir(dc.molnet) if "load_" in method ])
46
MoleculeNet 中有很多不同的数据集,我们可以浏览可用的不同类型的数据集。将数据集分成不同的类别,并列出属于这些类别的加载器,有关这些数据集的更多详细信息,可以请访问下面链接。
https://deepchem.readthedocs.io/en/latest/moleculenet.html
原始的 MoleculeNet 论文 [1] 提供了有关这些论文的一部分的详细信息,我们在下面将这些数据集标记为“V1”,剩余的数据集都是“V2”,但没有记录在旧论文中。
MoleculeNet 的量子力学数据集包含各种量子力学性质预测任务。当前的量子力学数据集包括 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
物理化学数据集集 合包含用于预测分子的各种物理性质的各种任务。
#该数据集在原始论文中也称为ESOL。
•dc.molnet.load_delaney:V1。
#该数据集在原始论文中也称为FreeSolv。
•dc.molnet.load_sampl:V1。
#该数据集在原始论文中也称为Lipophilicity。
•dc.molnet.load_lipo:V1。
#该数据集来自最近的出版物 [3]
•dc.molnet.load_hopv:V2。
•dc.molnet.load_thermosol:V2。
•dc.molnet.load_hppb:V2。
这些数据集包含用于retrosynthesis / forward数据集。
• dc.molnet.load_uspto
这些数据集来自各种生化/生物物理数据集,这些数据集测量诸如化合物与蛋白质的结合亲和力之类的东西。
•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
#此加载器从原始 MoleculeNet 中加载 BACE 数据集的分类任务。
dc.molnet.load_bace_classification:V1
#此加载程序从原始 MoleculeNet 论文中加载 BACE 数据集的回归任务。
dc.molnet.load_bace_regression:V1
#该数据集来自 Merck 的药物发现 kaggle 竞赛,并在 [4] 中进行了描述。
•dc.molnet.load_kaggle:V2
•dc.molnet.load_factors:V2 该数据集来自[4]。
•dc.molnet.load_uv:V2 该数据集来自[4]。
•dc.molnet.load_kinase:V2 该数据集来自 [4]。
这些数据集提供的分子数据集没有超出原始 SMILES 公式或结构的相关属性。这些类型的数据集对于生成建模任务很有用。
•dc.molnet.load_zinc15:V2
•dc.molnet.load_chembl:V2
•dc.molnet.load_chembl25:V2
这些数据集测量分子如何与人类患者相互作用的生理特性。
•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
这些数据集包含大分子的 3D 结构以及相关属性。
•dc.molnet.load_pdbbind:V1
这些数据集包含显微镜图像数据集,通常是细胞系。这些数据集不在原始的 MoleculeNet 论文中。
•dc.molnet.load_bbbc001:V2
•dc.molnet.load_bbbc002:V2
•dc.molnet.load_cell_counting:V2
这些数据集计算各种材料的属性。
•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数据加载器函数的命名格式为dc.molnet.load_X,其中X是数据集的名称。
加载器函数返回一个元组(tasks, datasets, transformers);
其中tasks代表任务名称列表;datasets该字段是包含三个dc.data.Dataset 对象 (train, valid, test) ,它们分别对应于该MoleculeNet数据集的训练、验证和测试集;transformers该字段是在处理期间应用于该数据集的dc.trans.Transformer 对象的列表。
解释的相对比较抽象的,我们来看调用“dc.molnet.load_delaney”函数为例,首先我们从“tasks”开始。
tasksbr
['measured log solubility in mols per litre']
我们在此数据集中有一项任务,即测量的摩尔溶解度,现在让我们看一下“datasets”。
datasets
(<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']>)
正如我们之前提到的,我们看到这 datasets 是一个包含 3 个数据集,我们把它们分开。
train, valid, test = datasets
train
<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']>
valid
<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']>
test
<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']>
让我们来看看“train”数据集中的一个数据点。
train.X[0]
<deepchem.feat.mol_graphs.ConvMol at 0x7fe1ef601438>
请注意,这是一个由 dc.feat.ConvMolFeaturizer 生成的对象dc.feat.mol_graphs.ConvMol ,稍后我们将详细介绍如何控制特征化的选择.最后看一下“transformers”:
transformers
[<deepchem.trans.transformers.NormalizationTransformer at 0x7fe2029bdfd0>]
我们看到应用了一个转换器,即“dc.trans.NormalizationTransformer”。
根据之前的描述,你想知道是如何做的选择?正如之前提到的,可以使用不同的featurizers来处理数据集。我们可以控制featurization的选择吗?此外,源数据集如何拆分为train/valid/test三个不同的数据集?
您可以使用 ‘featurizer’ 和 ‘splitter’ 关键字参数并传入不同的值。
其中,常用的特征提取器有四种:ECFP、GraphConv、Weave和smiles2img,它们分别对应于DeepChem中的CircularFingerprint、ConvMolFeaturizer、WeaveFeaturizer和SmilesToImage特征提取器。
常用的数据集分割器有五种:None、index、random、scaffold和stratified,它们分别对应于没有分割、IndexSplitter、RandomSplitter、SingletaskStratifiedSplitter。数据集分割器是一种基于不同标准对数据集进行划分的方法。我们会在以后的教程中说更多。
在使用Featurizer或Splitter对象时,可以传入自定义的构造参数来实现定制化行为的功能。这种方法可以代替字符串作为参数传入,非常实用。
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="ECFP", splitter="scaffold")
(train, valid, test) = datasets
train
<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']>
train.X[0]
array([0., 0., 0., ..., 0., 0., 0.])
请注意,与之前的调用不同,dc.feat.CircularFingerprint 和 dc.feat.ConvMolFeaturizer,前者生成的是numpy数组,后者生成的是ConvMol对象。
尝试调用 MoleculeNet 加载一些其他数据集并尝试使用不同的featurizer/split,看看会发生什么!