このカテゴリーの記事では、「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を実行してみました。以下を参考にしてください。
DeepChemを少しずつ学んでいきたいと思います。今回は、チュートリアル2 Working With Datasets をやってみたいと思います。
DeepChemのチュートリアル2
今回もJupyter notebookを起動し、notebook上で実行していきます。
$ jupyter notebook
まずはセルに以下を入力し、Run して下さい。
import deepchem as dc
dc.__version__
1行目でDeepChem をインポートし、dc…の形で使えるようにしています。2行目はDeepChemのバージョンを表示する指示で、2.6.0.dev とバージョンが表示されました。
次の入力から実際のチュートリアルの内容に入っていきます。
2 Working With Datasetsチュートリアルは、その名の通り、DeepChemのデータセットの形式・構造について学ぶ内容になっています。前回と同様、以下を実行することで、Delaney 溶解度データを使用します。
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv')
train_dataset, valid_dataset, test_dataset = datasets
1行目の指示で、Delaney 溶解度データ を読み出しています。化学構造を機械学習で扱える形にしなればなりません。ここでは、featurizer=’GraphConv’と指定することで、GraphConvModel として読み出されています。
2行目の指示では、読み込んだデータセットを、トレーニング(train_dataset) 、バリデーション(valid_dataset)、テスト(test_dataset)の3つの異なるデータセットに分けています。これらデータセットの内容は、print を実行して表示することができます。test_dataset についてみてみましょう。
print(test_dataset)
これらデータセットは、”DiskDataset “というラベルで始まっています。”DiskDataset “はデータをDeepChemにおいてデータを格納する形式の一つで、大きなデータを扱うときに使用されます(他の形式として、”NumpyDataset”、”ImageDataset”があります。)。
データセットの中身ですが、まずは、サンプルのリストが格納されています。各サンプルが、1つのデータ点です。Delaney 溶解度データの場合、サンプルは分子であり、ある分子がある1つのデータ点として扱われます。他のデータセットでは、サンプルは、測定値、細胞株、画像等に対応し、それらあるサンプルがある1つのデータ点となります。これらデータセットに、以下の情報が格納されています。
まずは、特徴量 です。これは、機械学習モデルに対する入力値で、X(X1, X2, X3, … Xn)で表されることが普通です。
次に表示されているのが、y と表される ラベルデータです。これは機械学習モデルの予測対象となる値です。つまり、今回のチュートリアルにおいては、溶解度の値ということになります。
w は、重みの値です。これは、どのデータが重要であることを示すために使用されます。
ids は、サンプルを識別するためのIDです。単なる番号の場合もありますが、このデータセットでは、ID は 各分子の SMILES になっています。
X、y、wの1次元目のサイズは、113となっています。つまり,このデータセット、test_dataset には113個のサンプル、データ点が含まれているということがわかります。
最後に、task_names: [‘measured log solubility in mols per litre’] と表示されています。これは、このデータセットには単一のタスク、即ち、溶解度の値が格納されていることを示しています。
データへのアクセス
それでは、データセットに含まれる、あるデータ(ある1つのサンプル、ある1つのデータ点)を表示してみましょう。
一番簡単なのは、X、y、w、idsの各プロパティに直接アクセスすることです。それぞれのプロパティは、対応する情報をNumPy 配列として返します。
test_dataset.y
.y とすることで、test_dataset の y 値にアクセスすることができました。113個の y 値(溶解度データ)が表示されているはずです。しかし、この方法では、すべてのサンプルのデータを一度にメモリに読み込むことになりますので、注意が必要です。今回のような小さなデータセットであれば問題ありませんが、大規模なデータセットであれば、メモリの上限を越えてしまいます。
より良い方法は、以下のような for 文を用いて、繰り返し処理することです。これにより、一度に全てのデータを読み込むことなく、大きなデータセットでも表示することができます。itersamples()メソッドを使えば、サンプルを1つずつ繰り返し処理することができます。
for X, y, w, id in test_dataset.itersamples():
print(y, id)
先程と同じ溶解度の値( y 値)がそのIDとあわせて表示されています。
深層学習において、モデルの学習を行う際、サンプルをいくつかのかたまり(バッチ)にわけ、バッチ毎に学習を行うという手法(ミニバッチ学習)が一般的です。以下のように、iterbatches()を使うことで、どれだけのサンプルを1つのバッチとするかを指定することができます。
for X, y, w, ids in test_dataset.iterbatches(batch_size=50):
print(y.shape)
この例では、バッチサイズを50と指定することで、test_dataset の 113サンプルを50、50、13(残り)の3つのバッチに分割しています。
データにアクセスする最後の方法は、to_dataframe()です。これはデータをPandas の DataFrameにコピーします。この方法では、すべてのデータを一度にメモリに格納する必要があるので、小さなデータセットでのみ使用するようにしてください。
test_dataset.to_dataframe()
Pandas はPython によるデータ分析に必須のライブラリです。下記の記事等も参考にして下さい。
データセットの作成
このチュートリアルの最後に、自前のデータセットを作成する方法をみてみます。”NumpyDataset”の作成はとても簡単で、データを含む配列をコンストラクタに渡すだけです。ランダムな配列を作成し、それを”NumpyDataset” にしてみましょう。
以下を実行してみてください。
import numpy as np
X = np.random.random((10, 5))
y = np.random.random((10, 2))
dataset = dc.data.NumpyDataset(X=X, y=y)
print(dataset)
この例では、重み w と ID を指定していません。これらはオプションであり、Xだけが必須です(y もオプションですが、今回は指定しています。)。重み w と ID をを省略したので,自動的に w と ids の配列が作成され,すべての重みは 1 に設定され,ID は整数列に設定されています。以下のように、dataframeで確認してみてください。
dataset.to_dataframe()
10サンプルからなる “NumpyDataset” が作成されていることが確認できました。
“DiskDataset”は、データがNumPyの配列であれば、DiskDataset.from_numpy()を呼び出すことで作成・保存することができます。このチュートリアルでは、以下のように、Python 標準ライブラリの tempfile を利用して、一時ディレクトリに保存しています。
import tempfile
with tempfile.TemporaryDirectory() as data_dir:
disk_dataset = dc.data.DiskDataset.from_numpy(X=X, y=y, data_dir=data_dir)
print(disk_dataset)
メモリに収まりきらないような、ビッグデータの場合はどうしたらよいでしょうか。例えば、何億種類もの分子のデータが入った巨大なファイルをどのように扱えばよいでしょうか? このようなファイルからDiskDatasetを作成するプロセスは少し複雑ですが、DeepChemのDataLoader フレームワークで、作業を自動化することができます。これについては、 今後のチュートリアルで取り上げられます。
今回、チュートリアル2 Working With Datasets を通して、DeepChemのデータセットについて学びました。NumpyやPandasに慣れていれば、問題なく使用できそうですね。
コメント