機械学習メモ

化学を機械学習で何か

四日目 XenonPyを使ったモデル作成

モデル作成

XenonPyの記述子クラスと、これまで作成した交差検証関数をつかって、モデルを作成し、HOMO-LUMOギャップに対する予測精度を上げる方法を探索した。

目指す目的は、短い学習時間で最良の結果を得ることである。

人間の頭でパラメーターを変更して行った結果、誤差・決定係数ともに改善させることに成功した。学習モデルはRadon Forestを用いている。(はてなの仕様だと思うけど、表を横にスクロールしてください。R2とMAE載せてますよ)


FP radius n_bits n_estimators max_features R2 MAE
PatternFP',"MACCS" 2048 500 None 0.92 0.24
PatternFP',"MACCS" 128 500 None 0.91 0.27
PatternFP',"MACCS" 16 500 sqrt 0.90 0.29
PatternFP',"ECFP","MACCS",'LayeredFP' 10 16 100 None 0.90 0.30
PatternFP',"MACCS" 16 500 sqrt 0.89 0.33
PatternFP',"ECFP","MACCS",'LayeredFP' 10 16 10 None 0.89 0.31
PatternFP',"MACCS" 16 10 sqrt 0.87 0.36
LayeredFP',"MACCS" 16 10 sqrt 0.87 0.36
AtomPairFP',"MACCS" 16 10 Sqrt 0.86 0.38
TopologicalTorsionFP',"MACCS" 16 10 sqrt 0.86 0.37
ECFP',"MACCS" 3 16 10 Sqrt 0.85 0.39
FCFP',"MACCS" 3 16 10 sqrt 0.85 0.38
MHFP',"MACCS" 16 10 sqrt 0.85 0.38
RDKitFP',"MACCS" 16 10 sqrt 0.84 0.40


記述子の要素数を2048にし、RadomForestのn_estimatorsの値を500にし、max_featuresをNoneにすると、かなり学習に時間がかかってしまう。

2分程度で終わる条件は下記となった。

PatternFP',"ECFP","MACCS",'LayeredFP' 10 16 100 None 0.90 0.30

つまり、学習モデルを単純化させた場合、記述子側をある程度複雑にする必要がある。これは下記のURLにて最後に書かれている言葉と同じであるが、どれだけ複雑にする必要があるのか、必要条件を得ることは現時点ではできない。

chemintelligence.com

RDKitやMordredなどに頼らずに、別の方法で記述子を作成する方法は、量子化学計算を毎回実行し、記述子を得ること、こういう方法もあるだろう。しかし、逆解析や多数の未知化合物を予測する場合、計算時間が足枷となってしまう問題がある。

別の方法も存在しつつあり、DScribeなども探索範疇に入れてもいいかもしれないし、もっと良いものがあるかもしれない。

https://www.sciencedirect.com/science/article/pii/S0010465519303042

DScribe is a Python package for transforming atomic structures into fixed-size numerical fingerprints. These fingerprints are often called “descriptors” and they can be used in various tasks, including machine learning, visualization, similarity analysis, etc. To get started you can check the basic tutorial.

singroup.github.io

トレンドとしてはGraph convolutional neural networkがよく使われることが多いだろうし、転移学習もあるだろう。

RandomForestではなく、Gradientboostを使うと高エネルギー側で記述が格段に悪くなる。

lightgbmをXenonPyで使うために、wrapperを準備してやれば、利用しやすい。

import lightgbm as lgb
Target="HOMO-LUMO gap"
FP_H= Fingerprints(featurizers=['PatternFP',"ECFP","MACCS",'LayeredFP'],radius=10,n_bits=32,counting=True, input_type='smiles')

class lightgbm_class():
    def __init__(self):
        self.params= {"objective": "regression","metrics": "mae",}  
        return
    def fit(self,train,teacher):
        lgb_train = lgb.Dataset(train.to_numpy(), teacher)
        self.model=lgb.train(self.params,lgb_train)
    def predict(self,data):
        return self.model.predict(data)
      

model=lightgbm_class()
mdls[Target]=CrossValidation(sp,prop.index(Target),FP_H,model)

xgboostも同じようなノリで記載はできるはずだ。lightgbmでやった結果、やはり、高エネルギー側で記述が悪い結果となってしまった。