MoleculeNetの概要 DeepChem チュートリアル 3

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 An Introduction To MoleculeNet をやってみたいと思います。深層学習が注目されたきっかけとなった画像分類においては、多くの画像とその分類を紐づけたデータを利用することで、学習モデルの性能を検証し、比較することができます。例えば、画像データ ImageNet や、手書き文字データ MNIST などが有名です。

一方、ケモインフォマティクスに深層学習を適用した場合、それぞれの学習モデルを評価、比較するための標準的なデータセットがありませんでした。そこで、分子機械学習の標準ベンチマークデータになるべく発表されたのが、MoleculeNet です。下記の論文が2018年に発表されています。今回のチュートリアルは、このデータセットの紹介になっています。


●論文: MoleculeNet: a benchmark for molecular machine learning Chem. Sci., 9, 513-530 (2018)

https://pubs.rsc.org/en/content/articlelanding/2018/sc/c7sc02664a


MoleculeNetの概要

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

$ jupyter notebook

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

In [1]:
import deepchem as dc
dc.__version__
Out[1]:
'2.6.0.dev'

1行目でDeepChem をインポートし、dc…の形で使えるようにしています。2行目はDeepChemのバージョンを表示する指示で、2.6.0.dev とバージョンが表示されました。

次の入力から実際のチュートリアルの内容に入っていきます。

チュートリアル1と2同様、以下を実行することで、Delaney 溶解度データをロードしてみましょう。

In [2]:
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv', splitter='random')

これまで同様、dc.molnet.load_delaneyというローダー関数でDelaney 溶解度データ を読み出しています。このload_delaneyは、dc.molnetのサブモジュールになっていますが、他に多くのローダー関数が用意されており、様々なデータを読み出すことが出来ます。以下を実行することで、全てのローダー関数を確認することができます。

In [3]:
[method for method in dir(dc.molnet) if "load_" in method ]
Out[3]:
['load_Platinum_Adsorption',
 '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_freesolv',
 '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_pdbbind',
 'load_perovskite',
 'load_ppb',
 'load_qm7',
 'load_qm8',
 'load_qm9',
 'load_sampl',
 'load_sider',
 'load_sweet',
 'load_thermosol',
 'load_tox21',
 'load_toxcast',
 'load_uspto',
 'load_uv',
 'load_zinc15']

これらローダー関数、およびそれで読み出し可能なデータセットはDeepChem コミュニティで管理され、新しいものが追加されています。以下を実行し、何個のローダー関数が用意されているか、確認してみましょう。

In [4]:
len([method for method in dir(dc.molnet) if "load_" in method ])
Out[4]:
42

42種類のローダーおよびデータセットが使用できることがわかります。


MoleculeNetのデータセットカテゴリー

MoleculeNetに用意されているそれぞれのデータセットの詳細はこちらのリンクを参照して下さい。MoleculeNet 論文には、各データセットの原著論文の詳細が記載されています。例えば、以下のデータセットおよびそのローダーが用意されています。

●Quantum Mechanical Datasets : 量子力学データセット

dc.molnet.load_qm7: V1
dc.molnet.load_qm7b_from_mat: V1
dc.molnet.load_qm8: V1
dc.molnet.load_qm9: V1

様々な分子の量子力学的性質のデータセットとして、上記QM7, QM7b, QM8, QM9 が用意されています。

●Physical Chemistry Datasets : 物理化学データセット

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

様々な分子の物理化学的性質のデータセットとして、上記の6つが用意されています。チュートリアル1、2と使用してきた、Delaney 溶解度データ もこちらにあります。

●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 このローダーは、BACEデータセットの分類タスクをロードします。
dc.molnet.load_bace_regression: V1 このローダは、BACEデータセットの回帰タスクをロードします。
dc.molnet.load_kaggle: V2 このデータセットはMerckの創薬kaggleコンテストからのものです。
dc.molnet.load_factors: V2
dc.molnet.load_uv: V2
dc.molnet.load_kinase: V2

これらのデータセットは、タンパク質への低分子の結合親和性など、さまざまな生化学/生物物理学データセットとなっています。

他にもデータセットが用意されていますが、V1となっているのは原著論文に記載されているもので、V2が付されているものは、後に追加されたものです。


MoleculeNet ローダーの詳細

ローダー関数の詳細をみていきましょう。全てのローダー関数は、dc.molnet.load_Xという形をしています。これを実行すると、引数(tasks, datasets, transformers)のタプルを返します。それぞれ、読み出されるデータは以下のようになっています。

tasks : これは、タスク名のリストです。各サンプル(分子)に関連する異なる実験値、物理量に対応しています。MoleculeNetのデータセットの多くは「マルチタスク」です。つまり、あるデータポイント(分子)には複数のラベル(実験値、物理量)が関連付けられていることがあります。
datasets : これは、3つのdc.data.Datasetオブジェクト(train, valid, test)のタプルです。データセットのトレーニングセット、バリデーションセット、およびテストセットに対応します。
transformers : 各データセットに適用されたdc.trans.Transformerオブジェクトのリストです。

では具体例として、上記で呼び出したdc.molnet.load_delaney関数をみていきます。まず、tasks について、単に以下を実行してみましょう。

In [5]:
tasks
Out[5]:
['measured log solubility in mols per litre']

このデータセットでは、溶解度(mol/L)の対数値が tasks となっています。

次に、以下を実行して、datasets を見てみましょう。

In [6]:
datasets
Out[6]:
(<DiskDataset X.shape: (902,), y.shape: (902, 1), w.shape: (902, 1), ids: ['CC(C)CC(C)O' 'Cn1ccc(=O)[nH]c1=O' 'CCCCCO' ...
  'CC(C)N(C(=O)CCl)c1ccccc1 ' 'NC(=S)N' 'Cc2cnc1cncnc1n2'], task_names: ['measured log solubility in mols per litre']>,
 <DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['CN(C(=O)NC(C)(C)c1ccccc1)c2ccccc2'
  'CCN(CC(C)=C)c1c(cc(cc1N(=O)=O)C(F)(F)F)N(=O)=O'
  'OCC(NC(=O)C(Cl)Cl)C(O)c1ccc(cc1)N(=O)=O' ...
  'c2ccc1nc(ccc1c2)c4ccc3ccccc3n4 ' 'ClC(=C(Cl)C(=C(Cl)Cl)Cl)Cl'
  'Oc1c(Br)cc(C#N)cc1Br '], task_names: ['measured log solubility in mols per litre']>,
 <DiskDataset X.shape: (113,), y.shape: (113, 1), w.shape: (113, 1), ids: ['ClC1=C(Cl)C2(Cl)C3C4CC(C=C4)C3C1(Cl)C2(Cl)Cl' 'Brc1ccc2ccccc2c1'
  'COc1cc(CC=C)ccc1O' ... 'CCN(=O)=O'
  'c1cc(O)c(O)c2OCC3(O)CC4=CC(=O)C(O)=CC4=C3c21' 'Clc1cc(Cl)c(Cl)c(Cl)c1'], task_names: ['measured log solubility in mols per litre']>)

datasets は3つ(train, valid, test)のセットになっています。これらを以下のように、別の変数に分割してみます。

In [7]:
train, valid, test = datasets
In [8]:
train
Out[8]:
<DiskDataset X.shape: (902,), y.shape: (902, 1), w.shape: (902, 1), ids: ['CC(C)CC(C)O' 'Cn1ccc(=O)[nH]c1=O' 'CCCCCO' ...
 'CC(C)N(C(=O)CCl)c1ccccc1 ' 'NC(=S)N' 'Cc2cnc1cncnc1n2'], 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: ['CN(C(=O)NC(C)(C)c1ccccc1)c2ccccc2'
 'CCN(CC(C)=C)c1c(cc(cc1N(=O)=O)C(F)(F)F)N(=O)=O'
 'OCC(NC(=O)C(Cl)Cl)C(O)c1ccc(cc1)N(=O)=O' ...
 'c2ccc1nc(ccc1c2)c4ccc3ccccc3n4 ' 'ClC(=C(Cl)C(=C(Cl)Cl)Cl)Cl'
 'Oc1c(Br)cc(C#N)cc1Br '], 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: ['ClC1=C(Cl)C2(Cl)C3C4CC(C=C4)C3C1(Cl)C2(Cl)Cl' 'Brc1ccc2ccccc2c1'
 'COc1cc(CC=C)ccc1O' ... 'CCN(=O)=O'
 'c1cc(O)c(O)c2OCC3(O)CC4=CC(=O)C(O)=CC4=C3c21' 'Clc1cc(Cl)c(Cl)c(Cl)c1'], task_names: ['measured log solubility in mols per litre']>

以下のように、train データセットのデータポイント(分子)の1つを確認してみましょう。

In [11]:
train.X[0]
Out[11]:
<deepchem.feat.mol_graphs.ConvMol at 0x7f7cc6938250>

dc.feat.ConvMolFeaturizerによって生成された dc.feat.mol_graphs.ConvMol オブジェクトであることが表示されました。

最後に、transformersフィールドを見てみましょう。

In [12]:
transformers
Out[12]:
[<deepchem.trans.transformers.NormalizationTransformer at 0x7f7d3c10cd90>]

dc.trans.NormalizationTransformerという1つの transformer が適用されていることがわかります。

このチュートリアルの最後に、GraphConvModel とは異なる featurizer を使用してみましょう。上記のように、featurizer = ‘xxx’ と指定することで、別の方法でデータセットを記述することが可能です。

featurizer として、dc.feat.CircularFingerprint、dc.feat.ConvMolFeaturizer、dc.feat.WeaveFeaturizer、dc.feat.SmilesToImage がよく使用されます。それぞれ、featurizer = ‘ECFP’、’GraphConv’、’Weave’、’smiles2img’ と指定することで使用することができます。以下では、ECFP、即ちCircularFingerprint (Extended-connectivity fingerprints (ECFPs)、詳細はリンクから論文を確認してください。)を使用してみましょう。

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.])

GraphConvModel とは異なり、dc.feat.CircularFingerprint によって、numpy 配列が生成されていることがわかります。これを特徴量として使用することができるわけです。また、splitter = “scaffold” とすることで、datasets の分割法を変えていますが、この splitter の詳細については、今後のチュートリアルで説明されます。


今回、チュートリアル3 An Introduction To MoleculeNet を通して、DeepChemのデータセット、データローダーをさらに学びました。他のデータセットを読み込んだり、異なるfeaturizer オプションを試して、どのようなデータを読み出せるか、確認してみてください。

コメント

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