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

Merge pull request #163 from rbharath/singletask_debug

Fixes to get MUV numbers with Logistic Regression
parents 883a617d bbefb82c
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ class Dataset(object):
        metadata_rows = []
        metadata_rows.append(
            write_dataset_single(val=None, data_dir=self.data_dir, raw_data=raw_data,
                                 basename="data"))
                                 basename="data", tasks=tasks))
        self.metadata_df = pd.DataFrame(
            metadata_rows,
            columns=('df_file', 'task_names', 'ids',
@@ -121,6 +121,7 @@ class Dataset(object):
        self.save_to_disk()

    else:
      log("Loading pre-existing metadata file.", self.verbosity)
      if os.path.exists(self._get_metadata_filename()):
        self.metadata_df = load_from_disk(self._get_metadata_filename())
      else:
@@ -171,22 +172,24 @@ class Dataset(object):
    The order of shards returned is guaranteed to remain fixed.
    """
    for _, row in self.metadata_df.iterrows():
      X = load_from_disk(row['X-transformed'])
      y = load_from_disk(row['y-transformed'])
      w = load_from_disk(row['w-transformed'])
      ids = load_from_disk(row['ids'])
      X = np.array(load_from_disk(row['X-transformed']))
      y = np.array(load_from_disk(row['y-transformed']))
      w = np.array(load_from_disk(row['w-transformed']))
      ids = np.array(load_from_disk(row['ids']), dtype=object)
      yield (X, y, w, ids)

  def iterbatches(self, batch_size=None, epoch=0):
    """
    Returns minibatches from dataset.
    """
    if batch_size == None:
      batch_size = len(self)
    for i, (X, y, w, ids) in enumerate(self.itershards()):
      nb_sample = np.shape(X)[0]
      if batch_size is None:
        shard_batch_size = nb_sample
      else:
        shard_batch_size = batch_size 
      interval_points = np.linspace(
          0, nb_sample, np.ceil(float(nb_sample)/batch_size)+1, dtype=int)
          0, nb_sample, np.ceil(float(nb_sample)/shard_batch_size)+1, dtype=int)
      for j in range(len(interval_points)-1):
        indices = range(interval_points[j], interval_points[j+1])
        X_batch = X[indices, :]
@@ -194,7 +197,7 @@ class Dataset(object):
        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, batch_size)
            X_batch, y_batch, w_batch, ids_batch, shard_batch_size)
        yield (X_batch, y_batch, w_batch, ids_batch)

  @staticmethod
@@ -214,10 +217,20 @@ class Dataset(object):
      Xs.append(X_b)
      ys.append(y_b)
      ws.append(w_b)
      ids.append(np.squeeze(ids_b))
      ids.append(np.atleast_1d(np.squeeze(ids_b)))
    np.concatenate(ids)
    return (np.vstack(Xs), np.vstack(ys), np.vstack(ws),
            np.concatenate(ids))

  def get_ids(self):
    """
    Returns all molecule-ids for this dataset.
    """
    ids = []
    for (_, _, _, ids_b) in self.itershards():
      ids.append(np.atleast_1d(np.squeeze(ids_b)))
    return np.concatenate(ids)

  def get_labels(self):
    """
    Returns all labels for this dataset.
+9 −0
Original line number Diff line number Diff line
@@ -75,6 +75,15 @@ class TestBasicDatasetAPI(TestDatasetAPI):
    assert w.shape == (N_samples, N_tasks)
    assert ids.shape == (N_samples,)

  def test_consistent_ordering(self):
    """Test that ordering of labels is consistent over time."""
    solubility_dataset = self._load_solubility_data()

    ids1 = solubility_dataset.get_ids()
    ids2 = solubility_dataset.get_ids()

    assert np.array_equal(ids1, ids2)

  def test_get_statistics(self):
    """Test statistics computation of this dataset."""
    solubility_dataset = self._load_solubility_data()
+3 −9
Original line number Diff line number Diff line
@@ -76,11 +76,8 @@ class HyperparamOpt(object):
      model.save()
    
      evaluator = Evaluator(model, valid_dataset, output_transformers)
      df, scores_df, multitask_scores = evaluator.compute_model_performance(
          [metric], valid_csv_out, valid_stats_out)
      if not metric.is_multitask:
        valid_score = scores_df.iloc[0][metric.name]
      else:
      multitask_scores = evaluator.compute_model_performance(
          [metric], valid_csv_out.name, valid_stats_out)
      valid_score = multitask_scores[metric.name]
      all_scores[hyperparameter_tuple] = valid_score
    
@@ -107,11 +104,8 @@ class HyperparamOpt(object):
    train_csv_out = tempfile.NamedTemporaryFile()
    train_stats_out = tempfile.NamedTemporaryFile()
    train_evaluator = Evaluator(best_model, train_dataset, output_transformers)
    train_df, train_score, multitask_scores = train_evaluator.compute_model_performance(
    multitask_scores = train_evaluator.compute_model_performance(
        [metric], train_csv_out, train_stats_out)
    if not metric.is_multitask:
      train_score = train_score.iloc[0][metric.name]
    else:
    train_score = multitask_scores[metric.name]
    log("Best hyperparameters: %s" % str(best_hyperparams),
        self.verbosity, "low")
+23 −7
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ from deepchem.metrics import Metric
from deepchem.models.multitask import SingletaskToMultitask 
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor 
from deepchem.datasets import Dataset

def rf_model_builder(tasks, task_types, params_dict, model_dir, verbosity=None):
    """Builds random forests given hyperparameters.
@@ -33,6 +34,7 @@ def rf_model_builder(tasks, task_types, params_dict, model_dir, verbosity=None):
    max_features = params_dict["max_features"]
    return SklearnModel(
        tasks, task_types, params_dict, model_dir,
        mode="regression",
        model_instance=RandomForestRegressor(n_estimators=n_estimators,
                                             max_features=max_features))

@@ -72,18 +74,32 @@ class TestHyperparamOptAPI(TestAPI):
    splittype = "scaffold"
    compound_featurizers = [CircularFingerprint(size=1024)]
    complex_featurizers = []
    output_transformer_classes = []
    input_transformer_classes = []
    output_transformers = []
    tasks = ["task0", "task1", "task2", "task3", "task4", "task5", "task6",
             "task7", "task8", "task9", "task10", "task11", "task12",
             "task13", "task14", "task15", "task16"]
    task_types = {task: "classification" for task in tasks}
    input_file = "multitask_example.csv"
    train_dataset, valid_dataset, _, output_transformers, = \
        self._featurize_train_test_split(
            splittype, compound_featurizers, 
            complex_featurizers, input_transformer_classes,
            output_transformer_classes, input_file, tasks)
      
    n_features = 10
    n_tasks = len(tasks)
    # Define train dataset
    n_train = 100
    X_train = np.random.rand(n_train, n_features)
    y_train = np.random.randint(2, size=(n_train, n_tasks))
    w_train = np.ones_like(y_train)
    ids_train = ["C"] * n_train
    train_dataset = Dataset.from_numpy(self.train_dir, tasks,
                                       X_train, y_train, w_train, ids_train)

    # Define validation dataset
    n_valid = 10
    X_valid = np.random.rand(n_valid, n_features)
    y_valid = np.random.randint(2, size=(n_valid, n_tasks))
    w_valid = np.ones_like(y_valid)
    ids_valid = ["C"] * n_valid
    valid_dataset = Dataset.from_numpy(self.valid_dir, tasks,
                                       X_valid, y_valid, w_valid, ids_valid)
    params_dict = {
        "batch_size": [32],
        "data_shape": [train_dataset.get_data_shape()],
+1 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ class TestTFHyperparamOptAPI(TestAPI):
  """
  Test hyperparameter optimization API.
  """
  def test_multitask_keras_mlp_ECFP_classification_hyperparam_opt(self):
  def test_multitask_tf_mlp_ECFP_classification_hyperparam_opt(self):
    """Straightforward test of Tensorflow multitask deepchem classification API."""
    splittype = "scaffold"
    output_transformers = []
Loading