どこから見てもメンダコ

軟体動物門頭足綱八腕類メンダコ科

Deepchem④(XGBで回帰)

kaggleで大人気のxgboostもDeepchemで使用することができます。

XGBoost Documentation — xgboost 0.80 documentation

準備

例によってdelaney水溶解度データセットを読み込みます。featurizerは適当にRDKitDescriptors()にしました。

import deepchem as dc

#データのロード
csv = "datasets/delaney-processed.csv"

featurizer = dc.feat.RDKitDescriptors()
loader = dc.data.CSVLoader(
      tasks=['measured log solubility in mols per litre'],
      smiles_field="smiles",
      featurizer=featurizer)
    
dataset = loader.featurize(csv)


#分子骨格でデータセットを分割
splitter = dc.splits.ScaffoldSplitter(dataset)
train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(dataset,frac_train=0.8,
                                                                             frac_valid=0.1,frac_test=0.1)

#yを標準化
transformers = [dc.trans.NormalizationTransformer(transform_y=True,
                                                  dataset=train_dataset)]
for transformer in transformers:
    train_dataset = transformer.transform(train_dataset)
    valid_dataset = transformer.transform(valid_dataset)
    test_dataset = transformer.transform(test_dataset)

featurizerをRDKitDescriptors()にするとrdkit.Chem.Descriptorsによって計算された100種ちょっとの分子記述子が入力となります。

>>>dataset.X.shape
(1128, 111)

XGboostでモデル作成

sklearnのモデルを使うときと同様でした。

horomary.hatenablog.com

import xgboost

def XGBmodel_builder(model_params, model_dir):
    xgb_model = xgboost.XGBRegressor(**model_params)
    return dc.models.XGBoostModel(xgb_model, model_dir)


params_dict = {'n_estimators': [10,80,120],
               'max_depth':[5,10,20],
               'min_child_weight':[0.5, 0.75, 1.0],
               'gamma':[0,2,5,10]}

metric = dc.metrics.Metric(dc.metrics.r2_score)
optimizer = dc.hyper.HyperparamOpt(XGBmodel_builder,verbose=False)
best_model, best_model_hyperparams, all_model_results = optimizer.hyperparam_search(params_dict, train_dataset, valid_dataset, transformers, metric=metric)

上はグリッドサーチでパラメータチューニングをしています。高速と評判のXGBでも結構時間がかかります。

精度検証

import matplotlib.pyplot as plt
%matplotlib inline

predicted_test = best_model.predict(test_dataset)
true_test = test_dataset.y

plt.scatter(predicted_test, true_test)
plt.xlabel('Predicted log-solubility in mols/liter')
plt.ylabel('True log-solubility in mols/liter')
plt.title('GB-predicted vs. true log-solubilities')

f:id:horomary:20181022233054p:plain

続き

horomary.hatenablog.com