このカテゴリーの記事では、「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 して下さい。
import deepchem as dc
dc.__version__
1行目でDeepChem をインポートし、dc…の形で使えるようにしています。2行目はDeepChemのバージョンを表示する指示で、2.6.0.dev とバージョンが表示されました。
次の入力から実際のチュートリアルの内容に入っていきます。
チュートリアル1と2同様、以下を実行することで、Delaney 溶解度データをロードしてみましょう。
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv', splitter='random')
これまで同様、dc.molnet.load_delaneyというローダー関数でDelaney 溶解度データ を読み出しています。このload_delaneyは、dc.molnetのサブモジュールになっていますが、他に多くのローダー関数が用意されており、様々なデータを読み出すことが出来ます。以下を実行することで、全てのローダー関数を確認することができます。
[method for method in dir(dc.molnet) if "load_" in method ]
これらローダー関数、およびそれで読み出し可能なデータセットはDeepChem コミュニティで管理され、新しいものが追加されています。以下を実行し、何個のローダー関数が用意されているか、確認してみましょう。
len([method for method in dir(dc.molnet) if "load_" in method ])
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 について、単に以下を実行してみましょう。
tasks
このデータセットでは、溶解度(mol/L)の対数値が tasks となっています。
次に、以下を実行して、datasets を見てみましょう。
datasets
datasets は3つ(train, valid, test)のセットになっています。これらを以下のように、別の変数に分割してみます。
train, valid, test = datasets
train
valid
test
以下のように、train データセットのデータポイント(分子)の1つを確認してみましょう。
train.X[0]
dc.feat.ConvMolFeaturizerによって生成された dc.feat.mol_graphs.ConvMol オブジェクトであることが表示されました。
最後に、transformersフィールドを見てみましょう。
transformers
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)、詳細はリンクから論文を確認してください。)を使用してみましょう。
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer = 'ECFP', splitter = 'scaffold')
(train, valid, test) = datasets
train
train.X[0]
GraphConvModel とは異なり、dc.feat.CircularFingerprint によって、numpy 配列が生成されていることがわかります。これを特徴量として使用することができるわけです。また、splitter = “scaffold” とすることで、datasets の分割法を変えていますが、この splitter の詳細については、今後のチュートリアルで説明されます。
今回、チュートリアル3 An Introduction To MoleculeNet を通して、DeepChemのデータセット、データローダーをさらに学びました。他のデータセットを読み込んだり、異なるfeaturizer オプションを試して、どのようなデータを読み出せるか、確認してみてください。
コメント