docs: def models_grid(self, **kwargs):
          '''
          Make a grid of models by taking the cartesian product of all specified
          model parameter lists.
  
          Parameters
          -----------
          The valid kwarg parameters are the entries of this
          HyperparameterDefaults instance. Each parameter must be a list
          giving the values to search across.
  
          Returns
          -----------
          list of dict giving the parameters for each model. The length of the
          list is the product of the lengths of the input lists.
          '''
  
          # Check parameters
          self.check_valid_keys(kwargs)
          for (key, value) in kwargs.items():
              if not isinstance(value, list):
                  raise ValueError(
                      "All parameters must be lists, but %s is %s"
                      % (key, str(type(value))))
  
          # Make models, using defaults.
          parameters = dict(
              (key, [value]) for (key, value) in self.defaults.items())
          parameters.update(kwargs)
          parameter_names = list(parameters)
          parameter_values = [parameters[name] for name in parameter_names]
  
          models = [
              dict(zip(parameter_names, model_values))
              for model_values in itertools.product(*parameter_values)
          ]
          return models