DeepChem教程4:分子指纹

       分子可以用多种方法表示。本教程介绍一种方法叫做"分子指纹(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}

       对于这个简单的模型和特征来说模型的表现不错。更复杂的模型对于这个数据集的表现更好,但不会好很多。

猜你喜欢

转载自blog.csdn.net/lishaoan77/article/details/114270747
今日推荐