TensorFlowとPyTorchによる学習モデル作成 DeepChem チュートリアル 5

Pythonでインフォマティクス

このカテゴリーの記事では、「Pythonを使った機械学習やケモ・バイオインフォマティクスの実装や論文」を紹介していきたいと考えています。Python は3系(3.7)、anacondaを中心にして環境構築していきます。以下のようなハード・ソフト環境(CentOS Linux)を用いますが、Python(anaconda)が利用できれば、異なる環境下でも類似の実装が可能かと思います。

● CPU Intel® Core™ i7-6700K CPU @ 4.00GHz × 8
● メモリ  64GB
● GPU GeForce GTX 1080/PCIe/SSE2
● OS  CentOS Linux 8
● Python 3.7


はじめに

これまでにケモインフォマティクス、特にグラフ畳み込みネットワーク(GCN; Graph Convolutional Network)による深層学習が実行可能な、DeepChem をインストールし、チュートリアル1, 2, 3, 4と実行してきました。

これまでのチュートリアルでは、DeepChemに含まれている、標準的な機械学習モデル(GraphConvModel や MultitaskClassifier)を使用してきました。このような既存のモデルを使用して、十分な性能が得られれば、それで問題ありません。一方で場合によっては、自分で定義した新しい学習モデルを作成することも可能です。DeepChemは、深層学習用ライブラリである、TensorFlow (Keras:TensorFlowに対応した深層学習用のラッパーライブラリ)とPyTorchの両方の環境を提供しており、これらライブラリを用いた学習モデルを作成することができます。今回は、チュートリアル 5 Creating Models with TensorFlow and PyTorch にて、これを試してみましょう。


PyTorchのインストール

これまでのように、ローカル環境にDeepchemをインストールし実行している場合、今回追加でPyTorch のインストールをする必要があります。以下を実行します。

$ conda activate deepchem                #仮想環境 deepchemをアクティブ
$ pip3 install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html

PyTorch は pip3 を利用してインストールしました。引数は、PyTorchのこちらのページを参考にしてください。

KerasModelの使用

TensorFlow またはPyTorch モデルをDeepChem で使用するには、2つの異なるアプローチがあります。それは、モデルのトレーニングと評価に TensorFlow/PyTorch API を使用するか、DeepChem APIを使用するかです。前者は、DeepChem のDatasetクラスによって可能です。make_tf_dataset() や make_pytorch_dataset() を使うことで、DeepChem の datasets, loaders, featurizers, transformers, splittersなどを TensorFlow/PyTorch のモデルと一緒に使うことができます。もう一つの、後者の方法は、既存の学習モデルをDeepChem Modelオブジェクトでラップすることです。その方法として、まずは KerasModel を使ってみましょう。

Jupyter notebookを起動し、notebook上で実行していきます。

$ jupyter notebook

セルに以下を入力し、Run して下さい。

In [1]:
import deepchem as dc
import tensorflow as tf

keras_model = tf.keras.Sequential([
    tf.keras.layers.Dense(1000, activation='relu'),
    tf.keras.layers.Dropout(rate=0.5),
    tf.keras.layers.Dense(1)
])
model = dc.models.KerasModel(keras_model, dc.models.losses.L2Loss())
2021-10-10 09:36:16.310688: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:22.653331: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:22.653714: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:22.654277: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-10-10 09:36:22.655253: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:22.655573: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:22.655862: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:24.665440: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:24.665766: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:24.666033: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-10-10 09:36:24.666270: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 6214 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1

1行目でDeepChem 、2行目でTensorFlowをインポートしています。1行空けて、4行目以降で学習モデルを定義しています。KerasのSequentialクラスを使用して、活性化関数ReLUによる全結合層、正則化のための50%のドロップアウト、そしてスカラー出力を生成する最終層という定義になっています。最後の行で、定義した学習モデルをDeepChem Modelオブジェクトでラップしています。その際に、モデルの学習に使用する損失関数として、今回は L2 loss を用いることを指定しています。

最後に定義した model を用いて、学習と評価を行うことができます。datasets の読込みや学習、評価については、これまでのチュートリアルと同様に記述します。下記で、Delaneyの溶解度データセットを読込み、フィンガープリント(ECFPs)に基づいた学習と予測が実行できます。

In [2]:
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='ECFP', splitter='random')
train_dataset, valid_dataset, test_dataset = datasets
model.fit(train_dataset, nb_epoch=50)
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score)
print('training set score:', model.evaluate(train_dataset, [metric]))
print('test set score:', model.evaluate(test_dataset, [metric]))
2021-10-10 09:36:27.135686: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
training set score: {'pearson_r2_score': 0.9805195363948028}
test set score: {'pearson_r2_score': 0.7232708731622692}

TorchModelの使用

TorchModelはKerasModelと同じように動作しますが、torch.nn.Moduleをラップします。PyTorchを使って、別のモデルを作り、同じデータで学習してみましょう。以下を実行してください。

In [3]:
import torch

pytorch_model = torch.nn.Sequential(
    torch.nn.Linear(1024, 1000),
    torch.nn.ReLU(),
    torch.nn.Dropout(0.5),
    torch.nn.Linear(1000, 1)
)
model = dc.models.TorchModel(pytorch_model, dc.models.losses.L2Loss())

model.fit(train_dataset, nb_epoch=50)
print('training set score:', model.evaluate(train_dataset, [metric]))
print('test set score:', model.evaluate(test_dataset, [metric]))
training set score: {'pearson_r2_score': 0.9804940146138569}
test set score: {'pearson_r2_score': 0.7109119459328586}

Loss の計算

上記のモデルでは、L2 lossがモデルの出力から直接計算されていました。これでもよいのですが、確率分布を出力する分類モデルを考えてみましょう。確率からlossを計算することは可能ですが、ロジットから計算した方が数値的に安定します。

これを行うために、確率とロジットの両者を出力するモデルを作成します。KerasModelやTorchModelでは、出力を”output types”リストで指定することができます。”output types”が ‘prediction’ であれば、それはpredict()を呼び出したときに返されるべき通常の出力であることを意味します。また、それが’loss’であれば、通常の出力の代わりにLoss関数に渡されるべきであることを意味します。

Sequential モデルでは複数の出力ができないので、代わりに subclassing style モデルを使います。以下を実行してください。

In [4]:
class ClassificationModel(tf.keras.Model):
    
    def __init__(self):
        super(ClassificationModel, self).__init__()
        self.dense1 = tf.keras.layers.Dense(1000, activation='relu')
        self.dense2 = tf.keras.layers.Dense(1)

    def call(self, inputs, training=False):
        y = self.dense1(inputs)
        if training:
            y = tf.nn.dropout(y, 0.5)
        logits = self.dense2(y)
        output = tf.nn.sigmoid(logits)
        return output, logits

keras_model = ClassificationModel()
output_types = ['prediction', 'loss']
model = dc.models.KerasModel(keras_model, dc.models.losses.SigmoidCrossEntropy(), output_types=output_types)

このモデルをBACEデータセットで学習してみましょう。このデータセットは、dc.molnet.load_bace_classificationで読み込むことができます。これは、ある分子がBACE-1(β-site Amyloid precursor protein Cleaving Enzyme 1、アミロイドβ前駆タンパク質(APP)を切断する酵素の1つ)を阻害するか、しないかを予測する、2値分類です。以下で、データセットの読込み、学習、評価を実行できます。

In [5]:
tasks, datasets, transformers = dc.molnet.load_bace_classification(feturizer='ECFP', split='scaffold')
train_dataset, valid_dataset, test_dataset = datasets
model.fit(train_dataset, nb_epoch=100)
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
print('training set score:', model.evaluate(train_dataset, [metric]))
print('test set score:', model.evaluate(test_dataset, [metric]))
'split' is deprecated.  Use 'splitter' instead.
training set score: {'roc_auc_score': 0.999631207655235}
test set score: {'roc_auc_score': 0.7830163043478261}

学習済みモデルの評価は、roc_auc_score、ROC曲線のAUCスコアで行っています。 特にtrain_datasetに対して、高い予測精度が得られました。各分子に対してどのような確率が予測されているか、下記で確認できます。train_datasetの100番目の分子までを見てみましょう。

In [6]:
y_predict = model.predict_on_batch(train_dataset.X[:100])
In [7]:
import numpy as np
for molecule, y_predict, y_train in zip(train_dataset.ids, np.round(y_predict, 3), train_dataset.y):
    print(y_predict, y_train, molecule)
[1.] [1.] Fc1ccc(cc1C#CCCCF)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FCC#Cc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FCCC#Cc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCCO
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCCCCO
[0.997] [1.] Fc1ccc(cc1OCCCF)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.999] [1.] FC(F)CCOc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1C#CCOC)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1C#CCOC)[C@]1(N=C(N)N(C)C1=O)c1cc(C)c(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)\C=C\COC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)\C=C\CCOC
[0.999] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CC(C)C
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCOC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCCOC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#C[C@H](O)C
[1.] [1.] Fc1ccc(cc1C#CCF)[C@]1(N=C(N)N(C)C1=O)c1cc(C)c(OC(F)F)cc1
[0.999] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)CCCC
[1.] [1.] FC(F)C\C=C\c1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCCC
[0.999] [1.] FC(F)COc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1OCC\C=C(\F)/F)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(OCC\C=C(\F)/F)ccc1
[1.] [1.] Fc1ccc(cc1C#CCCC)[C@]1(N=C(N)N(C)C1=O)c1cc(C)c(OC(F)F)cc1
[1.] [1.] FCC\C=C\c1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)\C=C\CCCO
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#CCC
[1.] [1.] FCCCCC#Cc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1C#CC)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)CCCC#N
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)\C=C\CCCOC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)\C=C\CCO
[0.999] [1.] FC(F)(F)CCCc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1OCC(F)F)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] Fc1ccc(cc1OCC(F)F)[C@]1(N=C(N)N(C)C1=O)c1cc(C)c(OC(F)F)cc1
[0.998] [1.] FCCCC(=O)c1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[1.] [1.] FCCC[C@@H](F)c1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.997] [1.] FC(F)Oc1ccc(cc1C)[C@@]1(N=C(N)N(C)C1=O)c1ccccc1
[0.997] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)CCC
[1.] [1.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)CCCCC
[0.998] [1.] Fc1ccc(cc1OCCCCF)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.002] [0.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C[C@@H](CC)C
[0.033] [0.] Fc1ccc(cc1OCCF)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.004] [0.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1ccccc1
[0.001] [0.] FC(F)(F)CCOc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.045] [0.] FC(F)Oc1cc(ccc1)[C@]1(N=C(N)N(C)C1=O)c1ccc(OC(F)F)cc1
[0.005] [0.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)C#C
[0.018] [0.] FC(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1cc(ccc1)CC
[0.] [0.] FCCOc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1ccccc1
[0.] [0.] FC(F)(F)Oc1ccc(cc1)[C@@]1(N=C(N)N(C)C1=O)c1ccccc1
[0.001] [0.] Clc1ccc(cc1)C1(N=C(N)N(C)C1=O)c1ccccc1
[0.002] [0.] Clc1cc(ccc1)C1(N=C(N)N(C)C1=O)c1ccccc1
[0.007] [0.] O(C)c1ccc(cc1)C1(N=C(N)N(C)C1=O)c1ccccc1
[0.001] [0.] O=C1N(C)C(=NC1(c1ccccc1)c1ccccc1)N
[0.002] [0.] O(C)c1cc(ccc1)C1(N=C(N)N(C)C1=O)c1ccccc1
[1.] [1.] S1(=O)(=O)C[C@@H](Cc2cc(O[C@H](COCC)C(F)(F)F)c(N)c(F)c2)[C@H](O)[C@@H]([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.996] [1.] S1(=O)(=O)C[C@@H](Cc2cc(C[C@H](O)C(F)(F)F)c(N)c(F)c2)[C@H](O)[C@@H]([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.008] [0.] Brc1cc(cc(F)c1N)C[C@@H]1CS(=O)(=O)C[C@H]([NH2+]Cc2cc(ccc2)C(F)(F)C)[C@H]1O
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OC(C(F)(F)F)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(O[C@H](COC)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OC(C(F)(F)F)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(O)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OC(C(F)(F)F)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(CO)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(O[C@@H](C(F)(F)F)C)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(O[C@H](COCCOC)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCC(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCC(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.999] [1.] S1(=O)(=O)CC(Cc2cc(CC)c(NC(=O)C)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCC)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(O[C@@H](COCC)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.997] [1.] S1(=O)(=O)CC(Cc2cc(OCC(F)(F)F)c(N)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCCF)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OC(C)C)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.994] [1.] S1(=O)(=O)CC(Cc2cc(OC(C(F)(F)F)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(OC(F)(F)F)ccc2)C1
[0.995] [1.] S1(=O)(=O)CC(Cc2cc(OCCC)c(N)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(CC)c(NC(=O)C[NH+](C)C)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.99] [1.] Brc1cc(ccc1O)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)(C)C)C1O
[0.99] [1.] Brc1cc(cc(F)c1N)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)(C)C)C1O
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCCC)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.999] [1.] Brc1cc(ccc1OC(=O)NC)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)C)C1O
[1.] [1.] S1(=O)(=O)CC(Cc2cc(F)c(NC(=O)C[NH+](C)C)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCCC(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.998] [1.] S1(=O)(=O)CC(Cc2cc(CC(OC)C(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[1.] [1.] S1(=O)(=O)CC(Cc2cc(OCCOC)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.002] [0.] S1(=O)(=O)CC(Cc2cc(O)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.004] [0.] S1(=O)(=O)CC(Cc2cc(OC(F)(F)F)c(N)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.004] [0.] S1(=O)(=O)CC(Cc2cc(CCC)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.001] [0.] S1(=O)(=O)CC(Cc2cc(CCC(F)(F)F)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.003] [0.] Brc1cc(ccc1N)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)(C)C)C1O
[0.] [0.] S1(=O)(=O)CC(Cc2cc(CCCC)c(O)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1
[0.] [0.] S1(=O)(=O)CC(Cc2cc(CCC)c(O)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1
[0.013] [0.] Brc1cc(ccc1O)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)C)C1O
[0.006] [0.] S1(=O)(=O)CC(Cc2cc(F)c(N)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.] [0.] S1(=O)(=O)CC(Cc2cc(CC)c(O)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1
[0.006] [0.] Brc1cc(ccc1)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)(C)C)C1O
[0.007] [0.] S1(=O)(=O)CC(Cc2cc(OCCC)ccc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.] [0.] Brc1cc(ccc1)CC1CS(=O)(=O)CC([NH2+]Cc2cc(ccc2)C(C)C)C1O
[0.002] [0.] S1(=O)(=O)CC(Cc2cc(CC)c(N)c(F)c2)C(O)C([NH2+]Cc2cc(ccc2)C(C)(C)C)C1
[0.] [0.] S1(=O)(=O)CC(Cc2cc(CCO)c(O)cc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1
[0.] [0.] S1(=O)(=O)CC(Cc2ccccc2)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1
[0.] [0.] S1(=O)(=O)CC(Cc2cc(ccc2)COCCC)C(O)C([NH2+]Cc2cc(ccc2)C(C)C)C1

1列目が予測の値、2列目がラベルの値(1:阻害する、0:阻害しない)、3列目が各分子を表示しています。train_datasetに対しては、ほとんどの分子を正しく予測できていることがわかるかと思います。test_dataset についても、同様に確認してみてください。

DeepChemのModelクラスには、他にも様々な機能が用意されています。詳細は、こちらのリンク等を参考にしてください。

コメント

タイトルとURLをコピーしました