機械犬のまなび:化学×機械学習

ケモインフォマティクスを活用する化学企業の研究者です。新しい分野のため、ネット上に勉強しやすい情報が少なく感じました。そんな悩みを持つ方に向けて「化学×機械学習」に関連した話題を提供します!

【ケモインフォマティクス入門:コード付き】化合物の溶解度予測①【データ取得〜記述子作成】

今回はケモインフォマティクス入門編ということで、化合物の溶解度予測を行います。

本当は各ステップで説明したいことがありますが、読みやすさを考えて、新しい記事を作成してリンクを貼る方式で進めようと考えています。

細かい説明を済ませて足場を固めてから今回のような実践的な内容に移っても良いですが、「とりあえずやってみる」というのが初見の分野ではおすすめです。

コード付きで説明していきますので、あまりプログラミングの経験がない方でも試せる内容になっています。

ぜひお試しください!


溶解度予測の大まかな流れ

今回、化合物の溶解度予測をする流れは以下の通りです。

1. データセットの取得

2. RDKitを用いてSMILESを記述子に変換

3. データの前処理

4. Scikit-learnを用いて記述子と溶解度の関係を学習

5. 学習に用いていないデータに対する溶解度の予測精度の評価


本記事では1~2. について説明します。

 

1. データセットの取得

溶解度予測モデルの学習や予測精度の評価に用いるためのデータを取得します。

実務で用いる場合は、社内に存在するデータや論文・特許などの文献値データをExcelなどで収集することが多いかと思います。

ここではそういったデータに対する包括的な説明はできないので、ネット上で公開されているデータを採用します。

 
今回は下記の論文に付属するデータセットを用います。

ESOL: Estimating Aqueous Solubility Directly from Molecular Structure

J. Chem. Inf. Comput. Sci., 2004, 44, 1000-1005.

 
Supporinf Information Availableの中に化合物の溶解度データセットがコンマ区切りデータとしてテキストファイルで公開されています。

csvファイルで保存するならば、テキストファイルを開いてNumbersなどに貼り付けてcsv形式で保存すればできますね。

 
どのようなデータセットなのかを確認してみましょう。

import pandas as pd
df = pd.read_csv('solubility_dataset.csv')

df = pd.read_csv('solubility_dataset.csv')
df.head()
f:id:machine-dog:20200715141012p:plain
溶解度データセット


サンプル数は1144個の化合物があり、それぞれに対して以下の情報が与えられていることがわかります。

  • Compound ID
  • measured log(solubility:mol/L) → 溶解度測定値
  • ESOL predicted log(solubility:mol/L) → 論文中での溶解度予測値
  • SMILES

2. RDKitを用いてSMILESを記述子に変換

SMILESは文字列の形式なので、データ予測には不向きです。コンピュータの扱いやすい記述子(数字)の形式に変換しましょう。

今回はRDKitという化学分野で機械学習の内容を扱うソフトウェアのようなものを使ってSMILESを変換します。RDKitの処理により記述子を200個生成します。

この部分の処理はネット上で検索してもあまり丁寧に説明している記事が無い印象です。RDKitの処理部分んフォーカスした記事もいずれ作っていこうと思います。

from rdkit import Chem
from rdkit.Chem import AllChem, Draw, PandasTools, Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors

#RDKitでSMILES読み込んで、sdf作成
IDs = df["Compound ID"]
measured_solubilities = df["measured log(solubility:mol/L)"]
predicted_solubilities = df["ESOL predicted log(solubility:mol/L)"]
SMILES = df["SMILES"]


mols = [Chem.MolFromSmiles(SMILES) for SMILES in SMILES]
for mol in mols:
    Chem.AddHs(mol)
    AllChem.Compute2DCoords(mol)

writer = Chem.SDWriter('solubility_dataset.sdf')
for (mol,ID, measured_solubility, predicted_solubility ,SMILES) in zip(mols,IDs,measured_solubilities,
                                                                          predicted_solubilities, SMILES):
    mol.SetProp("ID",str(ID))
    mol.SetProp("measured_solubility",str(measured_solubility))
    mol.SetProp("predicted_solubility",str(predicted_solubility))
    mol.SetProp("SMILES",str(SMILES))
    writer.write(mol)
writer.close()


#RDKitでsdf読み込んで、記述子に変換
mols = Chem.SDMolSupplier('solubility_dataset.sdf')

IDs = "Compound ID"
measured_solubilities = "measured log(solubility:mol/L)"
predicted_solubilities = "ESOL predicted log(solubility:mol/L)"
SMILES = "SMILES"
mols = [mol for mol in mols if mol is not None] #入力構造に不備があるとNoneになるため

descriptor_names = [descriptor_name[0] for descriptor_name in Descriptors._descList]
desc_calc = MoleculeDescriptors.MolecularDescriptorCalculator(descriptor_names)
descriptors = pd.DataFrame([desc_calc.CalcDescriptors(mol) for mol in mols])
descriptors.columns = descriptor_names

#元のdfにくっつけて、SMILES削除、Nameをindex
df = pd.concat([df, descriptors], axis=1)
df = df.drop(['SMILES'], axis=1)
df = df.set_index("Compound ID")

df.to_csv('solubility_dataset_Descriptor.csv')

df.head()
f:id:machine-dog:20200715140515p:plain
SMILESを記述子に変換した結果


上記のようなコードでSMILESからsdfに変換し、sdfから記述子に変換して元のデータにくっつけるような操作ができます。dataframeの列数が202となっており、最初の2つは実測溶解度、計算溶解度なので、SMILESから生成した記述子は200個になることが分かります。

RDKitの使い方に慣れていないとややおまじない的な感じになってしまいますね。この記事に肉付けする形で説明を施していきたいと思います。


最後に説明変数と目的変数を分離して本記事をまとめようと思います。

features = df.iloc[:, 2:]
target = df['ESOL predicted log(solubility:mol/L)']

print('shape of features: {}'.format(features.shape))
print('shape of target: {}'.format(target.shape))
f:id:machine-dog:20200715141141p:plain:w300:left
説明変数と目的変数のサイズ


上記の操作で説明変数は1144化合物に対して200の特徴量を持ち、目的変数は実測の溶解度とすることができました。


まとめ

本記事では溶解度データセットをダウンロードし、SMILESを200個の説明変数に変換する処理を行いました。

今回は「まずは試してみる」を目標にしたので、各段階で説明しなければよくわからない部分もあったかと思います。

今後の記事でそういった下準備的な知識も補完できるようにしていきたいと思いますので、どうぞよろしくお願いします。

【化学との関わりも説明】機械学習で最もよく用いられる「教師あり学習」の概要

機械学習とは非常に幅広い範囲の情報処理技術を指します。

具体的な処理内容についての説明に入る前に、機械学習手法の中でも重要となる基本的な(=適用範囲の広い)領域についての説明をしようと思います。

現在の化学メーカーで検討されているものは大抵がここで説明されるような範囲で扱われるものかと思われます。

 

機械学習の大まかな分類

巷ではディープラーニングで画像処理をするだとか、囲碁や将棋でプロに勝利した、などといった応用範囲が有名かと思われます。

化学(科学)の範囲で何らかの予測をする場合によく使われる機械学習手法というものがある程度確立されているので、そこに焦点を当てていきたいと思います。

具体的には次の画像で示される青い部分がそこにあたります。

f:id:machine-dog:20200706224816p:plain

機械学習の大まかな分類

 

最新の研究結果も見ていくと全てが教師あり学習で行われている訳ではありませんが、重要な部分を占めているのは確かだと考えていただければと思います。

次の図に示されるように、一般的に見ても教師あり学習(Supervised learning)の応用例が飛び抜けて多いことが分かるかと思われます。

f:id:machine-dog:20200706230300p:plain

Transfer Learning - Machine Learning's Next Frontier より

教師あり学習とは

我々がメインで見ていく教師あり学習とは何でしょうか。

端的にまとめてしまうと、説明変数(X)と目的変数(y)の関係をデータから学習するタスクと見ることができます。Xとyの関係式さえ出来てしまえば、予測したいXを用意することで未知のyの値を求めることができます。

教師あり学習の分かりやすい例を挙げると、Xとyの関係を線形で表す場合でXが一次元のシンプルな場合を考えます。機械学習によりXとyの関係式、 y = w_1 x_1 + w_0 w_1 w_0をデータから学習することになります。このくらいならExcelでもできそうなレベルの話ですね。

ここで、説明変数(X)は容易に得られる情報が使われ、目的変数(y)は得るのにコスト(手間)がかかるような情報を用いることが多いです。

化学業界でよく適用される例として高性能な樹脂の最適な製造法の予測を挙げることができます。説明変数(X)としては樹脂組成や製造時の温度、反応時間などを用いて、目的変数(y)として樹脂のガラス転位温度を予測するタスクを考えることができます。この場合では、実験せずとも分かる情報が説明変数(X)に用いられ、実験しないと分からない情報を目的変数(y)に用いられています。うまく狙いのガラス転位温度を予測できれば、実験の回数を減らすことが期待できますね。

 

回帰と分類

さて、機械学習の中には回帰と分類があると画像で示しました。回帰は目的変数が連続値の場合、分類は目的変数が離散値の場合で用いられます。

それぞれの具体例を挙げると、回帰の場合では上記のような物性値や合成反応の収率などがイメージしやすいかと思われます。分類の場合は、化合物の毒性の有無なんかが分かりやすいでしょうか。

やっていることはデータの処理になりますので、機械学習のやりやすい形に変換できればどのようなものを対象にしても機械学習を検討することができるかと思われます。

 

 

以上で今回の内容は終わりです。

前置きが長くなってしまいましたが、次回からは化学に関連したデータを用いて機械学習への適用を見ていこうと思います。

化学領域で機械学習を用いるということ

はじめまして。

化学メーカーで研究に携わる傍ら、機械学習を適用できないかと考えて仕事に(半ば無理やり)持ち込むようになりました。

今後の投稿では具体的に機械学習を用いる場合について記載していこうと考えていますが、今回は化学に機械学習を使うということについて個人的な考えを述べていこうと思います。

 

化学×機械学習で何ができるのか

化学での機械学習では学術研究から企業での製造プロセスまで、多くの領域に適用できます。既に産業・学術の領域において様々な検討例が報告されています。

有名な例を挙げると

  • 新規薬剤のターゲット分子の探索
  • 高性能ポリマーの探索
  • 全固体電池の電解液組成の検討
  • 工場におけるアンモニア排出量の変化を事前に予測→製造条件変更によるアンモニア排出の事前防止

などなど、、、ここには挙げきれないほどの応用例が既に知られています。

 

ざっくりまとめると、やっていることは容易に手に入る情報(実験前に分かる情報や計器のデータなど)から手に入れるのが容易でない情報(実験しないと分からない情報や)を予測することと言える例も多いかと思います。

これによって実験回数の大幅な減少や通常では見逃していた組成の発見、工場では危険物質の放出を防いだり歩留りを向上させたりすることも期待できます。

あなたの携わる領域ではどのようなことが出来るようになるのでしょうか。

 

化学メーカーで機械学習をやる利点

化学に機械学習を用いる分野はケモインフォマティクスと呼ばれる、学術的にもかなり新しい領域にあたります。

最先端の学術領域を化学メーカーで適用できる機会はそう多くありませんが、本分野については企業でも、企業だからこそ利用しやすい側面もあると考えています。

 

1. 機械学習の適用範囲があまりにも広い

機械学習を用いることで過去のデータを利用して、未来の予測や新しい情報の抽出ができます。

道や障害物のパターンを学習する自動運転や、顧客の行動パターンを学習する広告、最近では人間の顔の特徴を学習して写真の人物の性別を変えたり若返らせたりするアプリも登場していますよね。

化学の領域では未知の薬剤の活性や望む性能をもつ新規ポリマー構造の予測、数学的に最適な実験の計画、新規触媒の設計などの研究に近い領域への適用が思い浮かびます。しかし、直接測定できない分子量などを計器類の情報から予測するソフトセンサーなどの製造への応用も目立ちます。

つまり、蓄積してきたデータさえあれば何でも求められる可能性を秘めた手段であると言えます。

 

2. 蓄積してきた膨大なデータ

データは宝です。最近はこのような言葉も耳にするようになりました。

機械学習は世界中で精力的に検討が進められていますが、あらゆるデータを予測できる最高のアルゴリズムやデータセットなどは存在しません。

 

目的ごとに調整が必要になるのです。

つまり、それまでの研究・製造活動の中で得られたあらゆるデータが未来の予測に役立つ可能性を秘めています。

企業では一つのテーマを複数人で扱うことが多いなど、多くのデータが得られる環境が整っていると言えますよね。

そのようなデータをうまく活用して精度の良い予測ができれば、新しい知見が人類にもたらされるとともに、望みの化合物を最短ルートで手にできるかもしれません。

今、化学×機械学習をやる利点

新しい領域なので化学×機械学習を使いこなせる人材が明らかに少ない状態です。この状態でスキルを身につけるだけでも大きな市場価値があると言えると思います。特に、経験豊富な年長者で詳しい方は非常に少ないです。

主観ですが、化学業界にいる人間は他分野に比べて数字に強い人が少ないように思います。その一方で、機械学習を用いた研究開発は企業人であっても今後は必須になってくる領域が増えてくるのはほぼ確実に思われます。

大手化学メーカーの動きを見ても、明らかにここ数年で機械学習を適用しようという動きが活発化しています。近い内にどんどん成果が出てくるのではないでしょうか。

 

大きな流れが来る日はそう遠くないと思います。

ご興味ある方はぜひ挑戦してみてはいかがでしょうか!