赞
踩
分子可以用多种方法表示。本教程介绍一种方法叫做"分子指纹(molecular fingerprint)",这是一种简单的表示主法,对于小分子类药物来说通常工作得很好。
In [1]:
import deepchem as dc
dc.__version__
Out[1]:
'2.4.0-rc1.dev'
什么叫指纹?
深度学习几乎总是以数组作为它们的输入。如果我们要用深度学习来处理它们,我们需要一个或多个数组来表示分子。许多(不是所有)的模型要求它们的输入是固定大小的。这对分子来说是很有挑战的。因为不同的分子有不同的原子数。如果我们想要使用这些类型的模型,我们要用固定大小的数组表示不同大小的分子。指纹为处理这个问题而产生。指纹是固定大小的数组,不同的元素表示不同的特征的存在与否。如果两个分子有相似的指纹,提示它们有许多相似的特征,因此有相似的化学性质。DeepChem支持特殊的指纹叫做"Extended Connectivity Fingerprint",缩写为"ECFP"。它们有时也称为"circular fingerprints"。 ECFP算法由分类原子开始,基于原子的直接特征和键。每个唯一的模式都有一个特征,例如,“碳原子与两个氢原子键合并与两个重原子键合”可能是一个特征,当含有某一特征时一个特定的指纹元素设定为1。然后再迭代识别新的特征通过查找大的圆形周围。一个指定的特征与另两个指定的特征形成更高水平的特征,相应的元素被设置。这持续到指定数量的迭代,通常为2。我们来看一下已经用ECFP特征化的数据集。
In [2]:
tasks, datasets, transformers = dc.molnet.load_tox21(featurizer='ECFP')
train_dataset, valid_dataset, test_dataset = datasets
print(train_dataset)
<DiskDataset X.shape: (6264, 1024), y.shape: (6264, 12), w.shape: (6264, 12), task_names: ['NR-AR' 'NR-AR-LBD' 'NR-AhR' ... 'SR-HSE' 'SR-MMP' 'SR-p53']>
特征数组X的形状为 (6264, 1024) 。即有训练集中有 6264个样本,每个样本的指纹长度为 1024。也要注意标签数组的形状 (6264, 12):这是个多任务数据集。Tox21包含分子毒性的信息。用12个不同的测定来查找毒性信号。数据集记录12个测定结果,每个对应一个任务。
我们也看一下权重数组。
In [3]:
train_dataset.w
Out[3]:
array([[1.0433141624730409, 1.0369942196531792, 8.53921568627451, ...,
1.060388945752303, 1.1895710249165168, 1.0700990099009902],
[1.0433141624730409, 1.0369942196531792, 1.1326397919375812, ...,
0.0, 1.1895710249165168, 1.0700990099009902],
[0.0, 0.0, 0.0, ..., 1.060388945752303, 0.0, 0.0],
...,
[0.0, 0.0, 0.0, ..., 0.0, 0.0, 0.0],
[1.0433141624730409, 1.0369942196531792, 8.53921568627451, ...,
1.060388945752303, 0.0, 0.0],
[1.0433141624730409, 1.0369942196531792, 1.1326397919375812, ...,
1.060388945752303, 1.1895710249165168, 1.0700990099009902]],
dtype=object)
注意,有些元素为0。用权重来指示缺失的数据。不是每一分子都进行了实际的测定。一个样本的权重为0或样本任务对为0将会导致它在训练和评估时被忽略。它对损失函数或其它量度无影响。大部分的权重约为1,但不是正好为1.这样可以平衡每个任务的正负样本的权重。当训练模型时,我们希望12任务中每个任务分配均衡。对于正负样本我们希望每个任务的权重均衡。否则,模型会只学习一些无毒性的样本,因些会偏向于识别无毒性的分子。
用指纹来训练一个模型
让我们来训练模型。之前的教程我们使用GraphConvModel,它是相当复杂的架构,输入复杂。由于指纹简单,只是一个固定大小的数组,我们可以使用更简单的模型。
In [4]:
model = dc.models.MultitaskClassifier(n_tasks=12, n_features=1024, layer_sizes=[1000])
多任务分类器是全链接层的简单的堆叠。这个例子中我们告诉它使用的隐藏层大小为1000。我们也告诉它每个输入有1024个特征,它要预测12个不同任务。为什不对每一个任务进行训练呢?我们可以这样做,但是事实证明为多个任务训练一个模型工作得更好。我们将在后面的教程中看到一个例子。
我们来训练和评估模型
In [5]:
import numpy as np
model.fit(train_dataset, nb_epoch=10)
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
print('training set score:', model.evaluate(train_dataset, [metric], transformers))
print('test set score:', model.evaluate(test_dataset, [metric], transformers))
training set score: {'roc_auc_score': 0.9550063590563469}
test set score: {'roc_auc_score': 0.7781819573695475}
对于这个简单的模型和特征来说模型的表现不错。更复杂的模型对于这个数据集的表现更好,但不会好很多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。