#はじめに
予測モデルを作成するのはいいけど、そもそも予測する時に、モデル作成時の前提条件と完璧に同じにしてる?って話。機会学習システムの運用上、非常に重要な話だと思われる。
特にケモインフォマティクスの分野では様々な商用、フリーソフトを組み合わせてモデルを作ることが多い。化合物の前処理はAツールで行い、次にBツールで記述子計算して、さらにCツールで予測モデルを作って。。。という感じでモデルを作ったはいいが、使う人が同じ前処理をしなかった場合にどのようなことが起こるのか今回、検証してみた。
#環境
- Python 3.7
- RDKit 2020.03.05
- Scikit-learn 0.23
#検証シナリオ
前処理にも色々あるが、たまたま見つかったということもあり今回は以下のシナリオで進めた。
- 化合物データを取り扱う際、水素が明示的に付与されている場合とそうでない場合(自明なものは省略する場合)がある。
- RDKitのMorganフィンガープリントでは、水素が明示的に付与されているかどうかによって、出力される説明変数の値がそこそこ異なる。
- 今回、予測モデル作成時と予測時に与える入力化合物において、明示的に水素を付与するかどうかの条件をそろえた場合と、そろえなかった場合で、予測値にどの程度ぶれが発生するか検証してみた。
#RDKit Morgan フィンガープリントの計算方法
そそもRDKitのMorganフィンガープリントって何?って話だが、ソースで示すとこんな感じ。
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles("CCC")
mol = Chem.AddHs(mol)
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=3, nBits=2048, useFeatures=False, useChirality=False)
1行目で"CCC"というのが化合物をあらわすSMILESという文字列から化合物オブジェクトを生成し、2行目で化合物に水素を明示的に付加し、3行目で記述子計算を行っている。記述子計算結果は2048ビットの配列であり、各ビットは0または1となる。
これをつかって予測モデルを作成したり、予測をしたりするわけだが、以降は、Chem.AddHs(mol)
を、予測モデル作成時と予測時で共につけなかった場合と、予測モデル作成時のみつけた場合で予測結果がどのように異なるかを確認した。
やってみた&考察
学習データ約100件、予測対象データ約10000件のデータにおいて、以下3パターンの組み合わせで予測した結果同士の相関を表にまとめた。
- 予測モデル作成:水素なし、予測:水素あり
- 予測モデル作成:水素あり、予測:水素あり
- 予測モデル作成:水素あり、予測:水素なし
学習データに水素を明示的に付与して記述子計算して作成した予測モデルに対し、予測対象データに水素を省略して記述子計算・予測を行った場合の予測値は、水素を明示的に付与して予測した場合の予測値と比べ、たったの0.48程度の相関しかない。この2つの関係をプロットしたものは以下の通りとなる。かなりの誤差である。
この0.48という数値は、水素あり、なしの条件を、予測モデル作成時と予測時でそろえて予測を行った者同士の相関0.58よりも低い。Morganフィンガープリントの入力として水素あり、なしのどっちが妥当かという議論もあるが(明示されていないケースもある)、まずは入力の条件をきちんと揃えることが重要だと思われる。
#結論
予測モデルを作成する場合と、予測をする場合の、前処理の条件は確実に揃えるようにする。前処理も含めてシステム側で提供するのが一番であるが、何等かの事情によりそこまでできない場合、ドキュメントにしっかり書くようにしよう。