Commit 637858c8 authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Many changes

parent 41477b40
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -397,7 +397,10 @@ def _df_to_numpy(df, feature_types, tasks):
  # perform common train/test split across all tasks
  n_samples = df.shape[0]
  n_tasks = len(tasks)
  y = df[tasks].values
  #y = df[tasks].values
  print("df.keys()")
  print(df.keys())
  y = np.array([df[task].values for task in tasks])
  y = np.reshape(y, (n_samples, n_tasks))
  w = np.ones((n_samples, n_tasks))
  missing = np.zeros_like(y).astype(int)
+2 −2
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ class Model(object):

    return X, y, w

  def predict(self, dataset, transformers):
  def predict(self, dataset, transformers=[]):
    """
    Uses self to make predictions on provided Dataset object.

@@ -157,7 +157,7 @@ class Model(object):
    y_pred = np.reshape(y_pred, (n_samples, n_tasks))
    return y_pred

  def predict_proba(self, dataset, transformers, n_classes=2):
  def predict_proba(self, dataset, transformers=[], n_classes=2):
    """
    TODO: Do transformers even make sense here?

+1 −4
Original line number Diff line number Diff line
@@ -186,13 +186,11 @@ class TensorflowGraph(object):

  def fit(self,
          dataset,
          summaries=False,
          max_checkpoints_to_keep=5):
    """Fit the model.

    Args:
      dataset: Dataset object that represents data on disk.
      summaries: If True, add summaries for model parameters.
      max_checkpoints_to_keep: Integer. Maximum number of checkpoints to keep;
        older checkpoints will be deleted.

@@ -225,7 +223,7 @@ class TensorflowGraph(object):
          y_bs, y_preds = [], []
          ########## DEBUG
          for (X_b, y_b, w_b, ids_b) in dataset.iterbatches(batch_size):
            # Run training op and compute summaries.
            # Run training op.
            feed_dict = self.construct_feed_dict(X_b, y_b, w_b, ids_b)
            #fetches = self.output + [
            #    train_op.values()[0], self.loss, self.updates]
@@ -314,7 +312,6 @@ class TensorflowGraph(object):
          raise ValueError(
              'Unrecognized rank combination for output: %s' %
              (batch_output.shape,))
        batch_weights = batch_weights.transpose((1, 0))
        output.append(batch_output)

        outputs = np.array(from_one_hot(
+3 −3
Original line number Diff line number Diff line
@@ -191,9 +191,9 @@ class TensorflowMultiTaskClassifier(TensorflowClassifier):
      self.restore()
    ######### DEBUG
    with self.graph.as_default():
      ########### DEBUG
      #assert not model_ops.is_training()
      ########### DEBUG
      ########## DEBUG
      assert not model_ops.is_training()
      ########## DEBUG
      self.require_attributes(['output'])

      # run eval data through the model
+111 −2
Original line number Diff line number Diff line
@@ -422,6 +422,7 @@ class TestOverfitAPI(TestAPI):
    """Test tensorflow models can overfit 0/1 datasets with few actives."""
    tasks = ["task0"]
    task_types = {task: "classification" for task in tasks}
    #n_samples = 100
    n_samples = 100
    n_features = 3
    n_tasks = len(tasks)
@@ -440,13 +441,13 @@ class TestOverfitAPI(TestAPI):
    model_params = {
      "layer_sizes": [1500],
      "dropouts": [.0],
      "learning_rate": 0.001,
      "learning_rate": 0.003,
      "momentum": .9,
      "batch_size": n_samples,
      "num_classification_tasks": 1,
      "num_classes": n_classes,
      "num_features": n_features,
      "weight_init_stddevs": [.3],
      "weight_init_stddevs": [1.],
      "bias_init_consts": [1.],
      "nb_epoch": 200,
      "penalty": 0.0,
@@ -474,3 +475,111 @@ class TestOverfitAPI(TestAPI):
    scores = evaluator.compute_model_performance([classification_metric])

    assert scores[classification_metric.name] > .8

  def test_tf_skewed_missing_classification_overfit(self):
    """TF, skewed data, few actives

    Test tensorflow models overfit 0/1 datasets with missing data and few
    actives. This is intended to be as close to singletask MUV datasets as
    possible.
    """
    
    tasks = ["task0"]
    task_types = {task: "classification" for task in tasks}
    #n_samples = 250
    #n_samples = 500
    #n_samples = 1000
    #n_samples = 2000
    #n_samples = 5000
    n_samples = 5120
    #n_features = 3
    n_features = 6
    n_tasks = len(tasks)
    n_classes = 2
    
    # Generate dummy dataset
    np.random.seed(123)
    #p = .002
    #p = .2
    #p = .1
    #p = .05
    #p = .01
    #p = .005
    p = .002
    ids = np.arange(n_samples)
    X = np.random.rand(n_samples, n_features)
    y = np.random.binomial(1, p, size=(n_samples, n_tasks))
    w = np.ones((n_samples, n_tasks))
    print("np.count_nonzero(y)")
    print(np.count_nonzero(y))
    #w = np.random.binomial(1, p, size=(n_samples, n_tasks))
    #print("np.amin(w), np.amax(w)")
    #print(np.amin(w), np.amax(w))

    #print("y_nonzero.shape")
    #print(y_nonzero.shape)
    #print("np.count_nonzero(y_nonzero)")
    #print(np.count_nonzero(y_nonzero))
    ##### DEBUG
    y_flat, w_flat = np.squeeze(y), np.squeeze(w)
    y_nonzero = y_flat[w_flat != 0]
    num_nonzero = np.count_nonzero(y_nonzero)
    weight_nonzero = len(y_nonzero)/num_nonzero
    print("weight_nonzero")
    print(weight_nonzero)
    w_flat[y_flat != 0] = weight_nonzero
    w = np.reshape(w_flat, (n_samples, n_tasks))
    print("np.amin(w), np.amax(w)")
    print(np.amin(w), np.amax(w))
    ##### DEBUG
  
    dataset = Dataset.from_numpy(self.train_dir, tasks, X, y, w, ids)

    model_params = {
      "layer_sizes": [1200],
      "dropouts": [.0],
      "learning_rate": 0.003,
      "momentum": .9,
      #"batch_size": n_samples,
      #"batch_size": n_samples/2,
      #"batch_size": n_samples/4,
      #"batch_size": n_samples/8,
      #"batch_size": n_samples/16,
      #"batch_size": n_samples/32,
      "batch_size": n_samples/64,
      # TODO(rbharath): Is there a bug in the padding code? Why does it fail to
      # learn for non-multiples?
      #"batch_size": 600,
      "num_classification_tasks": 1,
      "num_classes": n_classes,
      "num_features": n_features,
      "weight_init_stddevs": [1.],
      "bias_init_consts": [1.],
      "nb_epoch": 250,
      "penalty": 0.0,
      "optimizer": "adam",
      "data_shape": dataset.get_data_shape()
    }
    print("model_params['batch_size']")
    print(model_params['batch_size'])

    verbosity = "high"
    classification_metric = Metric(metrics.roc_auc_score, verbosity=verbosity)
    model = TensorflowModel(
        tasks, task_types, model_params, self.model_dir,
        tf_class=TensorflowMultiTaskClassifier,
        verbosity=verbosity)

    # Fit trained model
    model.fit(dataset)
    model.save()

    y_pred_model = model.predict(dataset, transformers=[])
    y_pred_proba_model = model.predict_proba(dataset, transformers=[])

    # Eval model on train
    transformers = []
    evaluator = Evaluator(model, dataset, transformers, verbosity=verbosity)
    scores = evaluator.compute_model_performance([classification_metric])

    assert scores[classification_metric.name] > .8
Loading