Commit 3895d0fd authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Local improvements.

parent 51b2bf7f
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -146,10 +146,6 @@ def fit_multitask_mlp(paths, task_types, task_transforms, desc_transforms,
  r2s = compute_r2_scores(results, local_task_types)
  if r2s:
    print "Mean R^2: %f" % np.mean(np.array(r2s.values()))
  #rms = compute_rms_scores(results, local_task_types)
  #if rms:
  #  print "Mean RMS: %f" % np.mean(np.array(rms.values()))
  #return (aucs, r2s, rms)

def fit_singletask_mlp(paths, task_types, task_transforms,
                       desc_transforms, splittype="random",
@@ -177,7 +173,9 @@ def fit_singletask_mlp(paths, task_types, task_transforms,
    desc_weight=desc_weight)
  ret_vals = {}
  aucs, r2s, rms = {}, {}, {}
  for index, target in enumerate(singletasks):
  sorted_targets = sorted(singletasks.keys())
  for index, target in enumerate(sorted_targets):
    print "Training model %d" % index
    (train, X_train, y_train, W_train, test, X_test, y_test, W_test) = (
        singletasks[target])
    model = train_multitask_model(X_train, y_train, W_train,
@@ -198,10 +196,13 @@ def fit_singletask_mlp(paths, task_types, task_transforms,
    r2s.update(target_r2s)
    rms.update(target_rms)
  if aucs:
    print aucs
    print "Mean AUC: %f" % np.mean(np.array(aucs.values()))
  if r2s:
    print r2s
    print "Mean R^2: %f" % np.mean(np.array(r2s.values()))
  if rms:
    print rms
    print "Mean RMS: %f" % np.mean(np.array(rms.values()))

def train_multitask_model(X, y, W, task_types, desc_transforms, add_descriptors=False,
+6 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
Code for processing datasets using scikit-learn.
"""
import numpy as np
from deep_chem.utils.analysis import results_to_csv
from deep_chem.utils.load import load_and_transform_dataset
from deep_chem.utils.preprocess import multitask_to_singletask
from deep_chem.utils.preprocess import train_test_random_split
@@ -51,7 +52,8 @@ def fit_singletask_models(paths, modeltype, task_types, task_transforms,
      add_descriptors=add_descriptors)
  singletask = multitask_to_singletask(dataset)
  aucs, r2s, rms = {}, {}, {}
  for target in singletask:
  for index, target in enumerate(sorted(singletask.keys())):
    print "Building model %d" % index
    data = singletask[target]
    if splittype == "random":
      train, test = train_test_random_split(data, seed=seed)
@@ -94,10 +96,13 @@ def fit_singletask_models(paths, modeltype, task_types, task_transforms,
    r2s.update(target_r2s)
    rms.update(target_rms)
  if aucs:
    print results_to_csv(aucs)
    print "Mean AUC: %f" % np.mean(np.array(aucs.values()))
  if r2s:
    print results_to_csv(r2s)
    print "Mean R^2: %f" % np.mean(np.array(r2s.values()))
  if rms:
    print results_to_csv(rms)
    print "Mean RMS: %f" % np.mean(np.array(rms.values()))


+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ def main():
      nb_epoch=args.n_epochs, decay=args.decay, validation_split=args.validation_split)
  else:
    fit_singletask_models(paths.values(), args.model, task_types,
        task_transforms, splittype="scaffold")
        task_transforms, splittype=args.splittype)

if __name__ == "__main__":
  main()
+6 −0
Original line number Diff line number Diff line
@@ -7,6 +7,12 @@ __license__ = "LGPL"

import numpy as np

def results_to_csv(results_dict):
  """Pretty prints results as CSV line."""
  targets = sorted(results_dict.keys())
  print ",".join(targets)
  print ",".join([str(results_dict[target]) for target in targets])

def summarize_distribution(y):
  """Analyzes regression dataset.

+20 −6
Original line number Diff line number Diff line
@@ -48,12 +48,6 @@ def transform_outputs(dataset, task_transforms, desc_transforms={},
    transforms.update(desc_transforms)
  for task, target in enumerate(endpoints):
    task_transforms = transforms[target]
    print "Task %d has NaNs?" % task
    print np.any(np.isnan(y[:, task]))
    print "Task %d data" % task
    print y[:, task]
    print "Task %d distribution" % task
    summarize_distribution(y[:, task])
    for task_transform in task_transforms:
      if task_transform == "log":
        y[:, task] = np.log(y[:, task])
@@ -170,6 +164,7 @@ def multitask_to_singletask(dataset):
  # Generate single-task data structures
  labels = dataset.itervalues().next()["labels"]
  sorted_targets = sorted(labels.keys())
  # TODO(rbharath): Replace this with a dictionary comprehension
  singletask = {}
  for target in sorted_targets:
    singletask[target] = {} 
@@ -197,6 +192,8 @@ def train_test_random_split(dataset, frac_train=.8, seed=None):
  ----------
  dataset: dict 
    A dictionary of type produced by load_datasets. 
  frac_train: float
    Proportion of data in train set.
  seed: int (optional)
    Seed to initialize np.random.
  """
@@ -211,6 +208,23 @@ def train_test_random_split(dataset, frac_train=.8, seed=None):
    test[key] = dataset[key]
  return train, test

def train_test_random_split_simple(dataset, frac_train=.8, seed=None):
  """Splits provided data in train/test splits without separating datasets.

  As opposed to train_test_random_split, this function does not ensure that the
  same compound cannot appear in both train and test (for different targets).

  Parameters
  ----------
  dataset: dict 
    A dictionary of type produced by load_datasets. 
  frac_train: float
    Proportion of data in train set.
  seed: int (optional)
    Seed to initialize np.random.
  """
  pass

def train_test_scaffold_split(dataset, frac_train=.8):
  """Splits provided data into train/test splits by scaffold.