肉眼天文台

食メモとかたまに囲碁とか趣味についての雑記です

独学でPythonその4~DeepChem遊んでみたの巻~

DeepChemがすごいらしいというので、以下のサイトを参考に遊んでみた。

qiita.com

 

 

 

まずは例のごとくosしてパスを通す。

import os
import deepchem as dc

current_dir = os.path.dirname(os.path.realpath("__file__"))
dataset_file = "medium_muv.csv.gz"
full_dataset_file = "muv.csv.gz"

# We use a small version of MUV to make online rendering of notebooks easy. Replace with full_dataset_file
# In order to run the full version of this notebook
dc.utils.download_url("https://s3-us-west-1.amazonaws.com/deepchem.io/datasets/%s" % dataset_file,
current_dir)

dataset = dc.utils.save.load_from_disk(dataset_file)
print("Columns of dataset: %s" % str(dataset.columns.values))
print("Number of examples in dataset: %s" % str(dataset.shape[0]))

 

出力結果

Columns of dataset: ['MUV-466' 'MUV-548' 'MUV-600' 'MUV-644' 'MUV-652' 'MUV-689' 'MUV-692'
'MUV-712' 'MUV-713' 'MUV-733' 'MUV-737' 'MUV-810' 'MUV-832' 'MUV-846'
'MUV-852' 'MUV-858' 'MUV-859' 'mol_id' 'smiles']
Number of examples in dataset: 10000

 

サンプルデータセットを手に入れた☆☆☆

 

 

正直、このコマンド打ち込んだあとビビりましたね。

smilesから起こして普通にきれいに分子表示されてるやん。。。ってね。

アダマンチルちょっとキモいけど、全然普通。

from rdkit import Chem
from rdkit.Chem import Draw
from itertools import islice
from IPython.display import Image, display, HTML

def display_images(filenames):
"""Helper to pretty-print images."""
for filename in filenames:
display(Image(filename))

def mols_to_pngs(mols, basename="test"):
"""Helper to write RDKit mols to png files."""
filenames =
for i, mol in enumerate(mols):
filename = "MUV_%s%d.png" % (basename, i)
Draw.MolToFile(mol, filename)
filenames.append(filename)
return filenames

num_to_display = 12
molecules =
for _, data in islice(dataset.iterrows(), num_to_display):
molecules.append(Chem.MolFromSmiles(data["smiles"]))
display_images(mols_to_pngs(molecules))

 

出力結果

f:id:Wjenga:20200609214945p:plain

以下略

 

num_to_displayの数を増やせばもっといっぱい表示できる模様。

 

ここで謎の操作が現れた。

MUV_tasks = ['MUV-692', 'MUV-689', 'MUV-846', 'MUV-859', 'MUV-644',
'MUV-548', 'MUV-852', 'MUV-600', 'MUV-810', 'MUV-712',
'MUV-737', 'MUV-858', 'MUV-713', 'MUV-733', 'MUV-652',
'MUV-466', 'MUV-832']

featurizer = dc.feat.CircularFingerprint(size=1024)
loader = dc.data.CSVLoader(
tasks=MUV_tasks, smiles_field="smiles",
featurizer=featurizer)
dataset = loader.featurize(dataset_file)

 

 

どうやら、すでに組まれたfeaturizerを利用してsmiles形式から勝手に特徴量(fingerprintと呼ばれている)を取得してデータを取り込むらしい。 

以下参照

fantom-zona.hatenablog.com

 

いつもの前処理

splitter = dc.splits.RandomSplitter(dataset_file)
train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(
dataset)
#NOTE THE RENAMING:
valid_dataset, test_dataset = test_dataset, valid_dataset

 

いつもの前処理だけどこれも事前に組まれたdc.splits.ScaffoldSplitterを使うと

なんかいい感じにしてくれるらしいです。

 

いざ!学習!

import numpy as np
import numpy.random

params_dict = {"activation": ["relu"],
"momentum": [.9],
"batch_size": [50],
"init": ["glorot_uniform"],
"data_shape": [train_dataset.get_data_shape()],
"learning_rate": [1e-3],
"decay": [1e-6],
"nb_epoch": [1],
"nesterov": [False],
"dropouts": [(.5,)],
"nb_layers": [1],
"batchnorm": [False],
"layer_sizes": [(1000,)],
"weight_init_stddevs": [(.1,)],
"bias_init_consts": [(1.,)],
"penalty": [0.],
}


n_features = train_dataset.get_data_shape()[0]
def model_builder(model_params, model_dir):
model = dc.models.MultitaskClassifier(
len(MUV_tasks), n_features, **model_params)
return model

metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean)
optimizer = dc.hyper.HyperparamOpt(model_builder)
best_dnn, best_hyperparams, all_results = optimizer.hyperparam_search(
params_dict, train_dataset, valid_dataset, [], metric)

 

出力結果

Fitting model 1/1
hyperparameters: {'activation': 'relu', 'momentum': 0.9, 'batch_size': 50, 'init': 'glorot_uniform', 'data_shape': (1024,), 'learning_rate': 0.001, 'decay': 1e-06, 'nb_epoch': 1, 'nesterov': False, 'dropouts': (0.5,), 'nb_layers': 1, 'batchnorm': False, 'layer_sizes': (1000,), 'weight_init_stddevs': (0.1,), 'bias_init_consts': (1.0,), 'penalty': 0.0}

 

Model 1/1, Metric mean-roc_auc_score, Validation set 0: 0.532706
best_validation_score so far: 0.532706
Best hyperparameters: ('relu', 0.9, 50, 'glorot_uniform', (1024,), 0.001, 1e-06, 1, False, (0.5,), 1, False, (1000,), (0.1,), (1.0,), 0.0)
train_score: 1.000000
validation_score: 0.532706

 

なるほどわからん。

 

dc.splits.ScaffoldSplitter使って、いい感じにしてくれたらしい方の出力結果

Fitting model 1/1
hyperparameters: {'activation': 'relu', 'momentum': 0.9, 'batch_size': 50, 'init': 'glorot_uniform', 'data_shape': (1024,), 'learning_rate': 0.001, 'decay': 1e-06, 'nb_epoch': 1, 'nesterov': False, 'dropouts': (0.5,), 'nb_layers': 1, 'batchnorm': False, 'layer_sizes': (1000,), 'weight_init_stddevs': (0.1,), 'bias_init_consts': (1.0,), 'penalty': 0.0}

 

Model 1/1, Metric mean-roc_auc_score, Validation set 0: 0.735025
best_validation_score so far: 0.735025
Best hyperparameters: ('relu', 0.9, 50, 'glorot_uniform', (1024,), 0.001, 1e-06, 1, False, (0.5,), 1, False, (1000,), (0.1,), (1.0,), 0.0)
train_score: 1.000000
validation_score: 0.735025

 

たしかにスコアが良くなっとるな。

なるほど、なるほど、わからん。