Commit d937f57b authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Cleaned up MUV simple example

parent 1fa8044a
Loading
Loading
Loading
Loading
+0 −23
Original line number Diff line number Diff line
@@ -196,8 +196,6 @@ class Dataset(object):
        y_batch = y[indices]
        w_batch = w[indices]
        ids_batch = ids[indices]
        #(X_batch, y_batch, w_batch, ids_batch) = self._pad_batch(
        #    X_batch, y_batch, w_batch, ids_batch, shard_batch_size)
        yield (X_batch, y_batch, w_batch, ids_batch)

  @staticmethod
@@ -249,27 +247,6 @@ class Dataset(object):
      ws.append(np.array(w_b))
    return np.vstack(ws)

  #def _pad_batch(self, X_b, y_b, w_b, ids_b, batch_size):
  #  """Fix batch to have exactly batch_size elements.
 
  #  Due to rounding issues, some batches will not have exactly batch_size
  #  elements. Handle these batches by zero padding all arrays.
  #  """
  #  n, feature_shape = np.shape(X_b)[0], np.shape(X_b)[1:]
  #  _, num_tasks = np.shape(y_b)
  #  if n == batch_size:
  #    return (X_b, y_b, w_b, ids_b)
  #  else:
  #    X_batch = np.zeros((batch_size,) + feature_shape)
  #    y_batch = np.zeros((batch_size, num_tasks))
  #    w_batch = np.zeros((batch_size, num_tasks))
  #    ids_batch = np.zeros((batch_size,), dtype=object)
  #    X_batch[:n] = X_b
  #    y_batch[:n] = y_b
  #    w_batch[:n] = w_b
  #    ids_batch[:n] = ids_b
  #  return X_batch, y_batch, w_batch, ids_batch

  def __len__(self):
    """
    Finds number of elements in dataset.
+2 −2
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ valid_dir = os.path.join(base_dir, "valid_dataset")
test_dir = os.path.join(base_dir, "test_dataset")
model_dir = os.path.join(base_dir, "model")

# Remove existing model directory since TF doesn't overwrite by default...
# Remove existing model directory since keras doesn't overwrite by default...
if os.path.exists(model_dir):
  shutil.rmtree(model_dir)
os.makedirs(model_dir)
@@ -153,7 +153,7 @@ for transformer in transformers:
for transformer in transformers:
    transformer.transform(test_dataset)

# Fit tensorflow models
# Fit keras models
MUV_task_types = {task: "classification" for task in MUV_tasks}
classification_metric = Metric(metrics.roc_auc_score, np.mean,
                               verbosity=verbosity,
+14 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ from __future__ import unicode_literals

import os
import numpy as np
import shutil
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from deepchem.utils.save import load_from_disk
@@ -48,6 +49,10 @@ valid_dir = os.path.join(base_dir, "valid_dataset")
test_dir = os.path.join(base_dir, "test_dataset")
model_dir = os.path.join(base_dir, "model")

if os.path.exists(model_dir):
  shutil.rmtree(model_dir)
os.makedirs(model_dir)

# Load MUV dataset
print("About to load MUV dataset.")
dataset_file = os.path.join(
@@ -105,14 +110,20 @@ full_dataset = Dataset(data_dir=full_dir, samples=featurized_samples,
print("full_dataset.get_task_names()")
print(full_dataset.get_task_names())
y = full_dataset.get_labels()
#if os.path.exists(train_dir):
#  shutil.rmtree(train_dir)
train_dataset = Dataset(data_dir=train_dir, samples=train_samples, 
                        featurizers=featurizers, tasks=MUV_tasks,
                        verbosity=verbosity, reload=reload)
y_train  = train_dataset.get_labels()
#if os.path.exists(valid_dir):
#  shutil.rmtree(valid_dir)
valid_dataset = Dataset(data_dir=valid_dir, samples=valid_samples, 
                        featurizers=featurizers, tasks=MUV_tasks,
                        verbosity=verbosity, reload=reload)
y_valid = valid_dataset.get_labels()
#if os.path.exists(test_dir):
#  shutil.rmtree(test_dir)
test_dataset = Dataset(data_dir=test_dir, samples=test_samples, 
                       featurizers=featurizers, tasks=MUV_tasks,
                       verbosity=verbosity, reload=reload)
@@ -161,6 +172,9 @@ params_dict = {
def model_builder(tasks, task_types, model_params, model_dir, verbosity=None):
  return SklearnModel(tasks, task_types, model_params, model_dir,
                      model_instance=LogisticRegression(class_weight="balanced"),
                      #model_instance=RandomForestClassifier(
                      #    class_weight="balanced",
                      #    n_estimators=500),
                      verbosity=verbosity)
model = SingletaskToMultitask(MUV_tasks, MUV_task_types, params_dict, model_dir,
                              model_builder, verbosity=verbosity)
+76 −71
Original line number Diff line number Diff line
@@ -86,22 +86,13 @@ featurized_samples = featurizer.featurize(

assert len(featurized_samples) == len(dataset)
# Train/Valid/Test Split dataset
#print("About to perform train/valid/test split.")
#splitter = RandomSplitter(verbosity=verbosity)
#frac_train, frac_valid, frac_test = .8, .1, .1
#train_samples, valid_samples, test_samples = \
#    splitter.train_valid_test_split(
#        featurized_samples, train_dir, valid_dir, test_dir,
#        log_every_n=1000, reload=reload)
#
#len_train_samples, len_valid_samples, len_test_samples = \
#  len(train_samples), len(valid_samples), len(test_samples)
#assert relative_difference(
#    len(train_samples), frac_train * len(featurized_samples)) < 1e-3
#assert relative_difference(
#    len(valid_samples), frac_valid * len(featurized_samples)) < 1e-3
#assert relative_difference(
#    len(test_samples), frac_test * len(featurized_samples)) < 1e-3
print("About to perform train/valid/test split.")
splitter = RandomSplitter(verbosity=verbosity)
frac_train, frac_valid, frac_test = .8, .1, .1
train_samples, valid_samples, test_samples = \
    splitter.train_valid_test_split(
        featurized_samples, train_dir, valid_dir, test_dir,
        log_every_n=1000, reload=reload)

# Generate datasets
print("About to create datasets")
@@ -112,18 +103,45 @@ full_dataset = Dataset(data_dir=full_dir, samples=featurized_samples,
                        verbosity=verbosity, reload=reload)
print("len(full_dataset)")
print(len(full_dataset))
# Do train/valid split.
#num_train = 2048
#num_train = 4096
#num_train = 8192
num_train = 12800 
#num_train = 13000
#num_train = 16384 ## BROKEN
num_valid = 1024
X, y, w, ids = full_dataset.to_numpy()

w_flat = w.flatten()
#y_flat = y.flatten()
y = full_dataset.get_labels()
train_dataset = Dataset(data_dir=train_dir, samples=train_samples, 
                        featurizers=featurizers, tasks=MUV_tasks,
                        verbosity=verbosity, reload=reload)
y_train  = train_dataset.get_labels()
valid_dataset = Dataset(data_dir=valid_dir, samples=valid_samples, 
                        featurizers=featurizers, tasks=MUV_tasks,
                        verbosity=verbosity, reload=reload)
y_valid = valid_dataset.get_labels()
test_dataset = Dataset(data_dir=test_dir, samples=test_samples, 
                       featurizers=featurizers, tasks=MUV_tasks,
                       verbosity=verbosity, reload=reload)
y_test = test_dataset.get_labels()
len_train_dataset, len_valid_dataset, len_test_dataset = \
  len(train_dataset), len(valid_dataset), len(test_dataset)

input_transformers = []
output_transformers = []
weight_transformers = [BalancingTransformer(transform_w=True, dataset=train_dataset)]
transformers = input_transformers + output_transformers + weight_transformers
for transformer in transformers:
    transformer.transform(train_dataset)
for transformer in transformers:
    transformer.transform(valid_dataset)
for transformer in transformers:
    transformer.transform(test_dataset)

## Do train/valid split.
##num_train = 2048
##num_train = 4096
##num_train = 8192
#num_train = 12800 
##num_train = 13000
##num_train = 16384 ## BROKEN
#num_valid = 1024
#X, y, w, ids = full_dataset.to_numpy()
#
#w_flat = w.flatten()
##y_flat = y.flatten()


####### DEBUG
@@ -133,30 +151,30 @@ w_flat = w.flatten()
#    print(weight_nonzero)
#    w[y_flat != 0] = weight_nonzero
####### DEBUG

X, y, w, ids = X[w_flat != 0], y[w_flat != 0], w[w_flat != 0], ids[w_flat != 0]
print("Shape after removing zeros")
print("X.shape")
print(X.shape)
X_train, X_valid = X[:num_train], X[num_train:num_train+num_valid]
y_train, y_valid = y[:num_train], y[num_train:num_train+num_valid]
w_train, w_valid = w[:num_train], w[num_train:num_train+num_valid]
ids_train, ids_valid = ids[:num_train], ids[num_train:num_train+num_valid]


if os.path.exists(train_dir):
  shutil.rmtree(train_dir)
train_dataset = Dataset.from_numpy(train_dir, MUV_tasks, X_train, y_train,
                                   w_train, ids_train)
print("len(train_dataset)")
print(len(train_dataset))
if os.path.exists(valid_dir):
  shutil.rmtree(valid_dir)
valid_dataset = Dataset.from_numpy(valid_dir, MUV_tasks, X_valid, y_valid,
                                   w_valid, ids_valid)
print("len(valid_dataset)")
print(len(valid_dataset))

#
#X, y, w, ids = X[w_flat != 0], y[w_flat != 0], w[w_flat != 0], ids[w_flat != 0]
#print("Shape after removing zeros")
#print("X.shape")
#print(X.shape)
#X_train, X_valid = X[:num_train], X[num_train:num_train+num_valid]
#y_train, y_valid = y[:num_train], y[num_train:num_train+num_valid]
#w_train, w_valid = w[:num_train], w[num_train:num_train+num_valid]
#ids_train, ids_valid = ids[:num_train], ids[num_train:num_train+num_valid]
#
#
#if os.path.exists(train_dir):
#  shutil.rmtree(train_dir)
#train_dataset = Dataset.from_numpy(train_dir, MUV_tasks, X_train, y_train,
#                                   w_train, ids_train)
#print("len(train_dataset)")
#print(len(train_dataset))
#if os.path.exists(valid_dir):
#  shutil.rmtree(valid_dir)
#valid_dataset = Dataset.from_numpy(valid_dir, MUV_tasks, X_valid, y_valid,
#                                   w_valid, ids_valid)
#print("len(valid_dataset)")
#print(len(valid_dataset))
#
#y = full_dataset.get_labels()
#train_dataset = Dataset(data_dir=train_dir, samples=train_samples, 
#                        featurizers=featurizers, tasks=MUV_tasks,
@@ -195,19 +213,19 @@ classification_metric = Metric(metrics.roc_auc_score, np.mean,
                               verbosity=verbosity,
                               mode="classification")
params_dict = { 
    "batch_size": 128,
    #"batch_size": 5120,
    "nb_epoch": 50,
    "batch_size": 64,
    "nb_epoch": 10,
    "data_shape": train_dataset.get_data_shape(),
    "layer_sizes": [1000],
    "weight_init_stddevs": [1.],
    "weight_init_stddevs": [.1],
    "bias_init_consts": [1.],
    "dropouts": [.25],
    "num_classification_tasks": len(MUV_tasks),
    "num_classes": 2,
    "penalty": .0,
    "optimizer": "adam",
    "learning_rate": .0003,
    "optimizer": "momentum",
    "learning_rate": .001,
    "momentum": .9,
}   

model = TensorflowModel(MUV_tasks, MUV_task_types, params_dict, model_dir,
@@ -219,19 +237,6 @@ model = TensorflowModel(MUV_tasks, MUV_task_types, params_dict, model_dir,
model.fit(train_dataset)
model.save()

############# DEBUG
#import sklearn
#y_train_pred_proba = np.squeeze(model.predict_proba(train_dataset))
#y_train = train_dataset.get_labels()
#w_train = train_dataset.get_weights()
#print("y_train.shape, y_train_pred_proba.shape")
#print(y_train.shape, y_train_pred_proba.shape)
#print("sklearn.metrics.roc_auc_score(to_one_hot(y_train), y_train_pred_proba)")
#print(sklearn.metrics.roc_auc_score(to_one_hot(y_train), y_train_pred_proba))
#print("sklearn.metrics.roc_auc_score(to_one_hot(y_train), y_train_pred_proba, sample_weight=w_train)")
#print(sklearn.metrics.roc_auc_score(to_one_hot(y_train), y_train_pred_proba, sample_weight=w_train))
############# DEBUG

train_evaluator = Evaluator(model, train_dataset, transformers, verbosity=verbosity)
train_scores = train_evaluator.compute_model_performance([classification_metric])