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のモデルを使うときと同様でした。
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')