機械学習で物性予測!
こんにちは!CheMLです.
前回はpythonのscipyライブラリを使ったピークフィッテイングについて紹介しました.機械学習手法を紹介するといいつつ初っ端から全然機械学習関係ない記事でした(汗).
今回はいよいよ機械学習(Tensorflow)を使った化学データの解析です.各種分子の構造式とHOMOエネルギーとの相関をニューラルネットワークで学習して,分子構造からHOMOエネルギーを推定しよう!という作戦です.
結論から申し上げますと,トレーニングデータ・テストデータともに良好なフィッティングができまして,分子構造からかなり正確にHOMOエネルギーを予測することができました.
Tensor flowとは...
まず初めに,今回機械学習のエンジンとして用いたTensorflowについて簡単に紹介します.
pythonでの機械学習では,十中八九次の2種類の機械学習ライブラリが使われます.
- scikit-learn
- Tensor flow
TensorflowはGoogleが開発する機械学習ライブラリで,ニューラルネットワークを中心に様々な学習プログラムを簡単に実装できます.また,GPU計算を簡単に導入できることも特徴の一つです.個人的には人工ニューラルネットワーク(ANN: artificial neural network)に関してはTensor flowの方が使い勝手がいいと思いますので今回はTensorflowを使っていきます.
QMデータセットについて
今回入力に使用するデータセットはQM9というデータベースです.(QM9データセットはこちらからダウンロードできます.)
QM9は,GDB-17というデータベースからC, N, O, Fが9個以下の分子(133,885種)を抽出し,最適化構造と各種物性値をまとめたものです.(GDB-17データセットはこちらからダウンロードできます.)QM9の他にも異なる条件で分子を集めたQM7やQM8などのデータベースが公開されています.
QM9には各分子のB3LYP/6-31G(2df,p)レベルでの最適化構造がSDF形式で,各種物性値がCSV形式で含まれています.そのため,構造と物性値の相関関係を調査するのに適したデータセットです.
ピロールのHOMOエネルギーを予測しよう!
それでは具体例としてピロールのHOMOエネルギーをニューラルネットワークで予測してみましょう.今回は時短のため,QM9データセットの中からピロールと類似した化学構造を持つ化合物を抽出して19,273分子を使いました.このうち20%をテストデータ,80%をトレーニングデータにしています.
プログラムの流れは以下の通りです.
- データの読み込み
- 分子構造でフィルタリング
- 外れ値を除去(平均値から標準偏差の3倍以上離れたサンプルは除去)
- 分子構造をフィンガープリントに変換(今回はMorganフィンガープリントを使用しました)
- フィンガープリントをxに,HOMOエネルギーをyに格納
- フィンガープリントをnumpy array型に変換
- 変数のオートスケーリング
- ニューラルネットワークによる学習
- トレーニングデータとテストデータのプロット
- 学習したモデルからピロールのHOMOエネルギーの推定
やることが多いので結構大変です...ちなみに今回学習に使用したニューラルネットワークの構成は以下の通りです.
________________________________________________________________
Layer (type) Output Shape Param #
=======================================
dense (Dense) (None, 100) 409700
________________________________________________________________
dense_1 (Dense) (None, 10) 1010
________________________________________________________________
dense_2 (Dense) (None, 1) 11
=======================================
インプットレイヤーを100個のニューロンで構成し,10個のニューロンでできた中間層を挿入しています.なお,すべての層にL2ノルム正則化を施してオーバーフィッティングを防いでいます.
最適化アルゴリズムはAdamで,学習率を5e-4に指定しています.最大epochは150回ですが,early_stopオプションを付けているので,損失関数の変化が小さくなると自動的に学習を終了します.(実際には118epochで終了しました)
ちなみに,プログラムが正常に進んでいるか確認するためにところどころに経過時間を表示するコードを挟んでいます.
長くなりましたが,以下がソースコードです.
gist14989bb644dc328f6001380d638cd0d0
学習と推定の結果
学習の結果,トレーニングデータの決定係数R2値は0.8857,テストデータは0.8316でした!なかなか高い相関だと思います.以下が実行結果のグラフです.
学習されたモデルを使ったピロールのHOMOエネルギーの推定結果は-0.211 hartreeでした!実際のピロール(ID: gdb_50)のHOMOエネルギーは-0.203 hartreeなので誤差は3.79%です.なかなかよく一致しているのではないでしょうか.
まとめ
以上のように,ニューラルネットワークを使うと物性値の予測が簡単に行えるようになります.このような経験的な手法で物性値を推定する方法にはClogPやJoback methodが有名です.ClogPはlogP(溶解の分配係数)を,Jobackは熱力学諸量を経験的に推定するための手法です.どちらも化学の現場ではよくつかわれています.
ニューラルネットワークや最適化,フィンガープリントに関する詳しい話はまた改めて記事にする予定です.
ご意見・ご感想はコメント欄,またはこちらまで.フォローしていただけるとやる気が出ます!
実行環境
Spyder(anaconda3)
python 3.7.9
windows10
*2020年9月現在では最新版のpython3.8.5に対応していないライブラリも多いため,計算化学ユースにおいてはpython3.7の使用をお勧めします.