def _clean_up_optimization(): """Perform any cleanup necessary after completion of the optimization loop. Most notably, this handles removal of temporary model files created for Keras optimization""" for (root, dirs, files) in walk(TEMP_MODULES_DIR_PATH, topdown=False): for file in files: if file.startswith("__temp_"): remove(f"{root}/{file}") try: rmdir(root) except OSError: G.warn_(f"Unidentified file found in temporary directory: {root}")
def _ask(self): """Suggest next point at which to evaluate the objective Returns ------- Some point in :attr:`space`, which is random while less than `n_initial_points` observations have been `tell`-ed. After that, `base_estimator` is used to determine the next point Notes ----- If the suggested point has already been evaluated, a random point will be returned instead, optionally accompanied by a warning message (depending on :attr:`warn_on_re_ask`)""" if self._n_initial_points > 0 or self.base_estimator is None: # Does not copy `self.rng` in order to keep advancing random state return self.space.rvs(random_state=self.rng)[0] else: if not self.models: raise RuntimeError( "Random evaluations exhausted and no model has been fit") #################### Check for Repeated Suggestion #################### next_x = self._next_x # Check distances between `next_x` and all evaluated points min_delta_x = min( [self.space.distance(next_x, xi) for xi in self.Xi]) if abs(min_delta_x) <= 1e-8: # `next_x` has already been evaluated if self.warn_on_re_ask: G.warn_("Repeated suggestion: {}".format(next_x)) # Set `_next_x` to random point, then re-invoke `_ask` to validate new point self._next_x = self.space.rvs(random_state=self.rng)[0] return self._ask() # Return point computed from last call to `tell` return next_x
def set_experiment_guidelines( self, model_initializer, model_init_params, model_extra_params=None, feature_selector=None, preprocessing_pipeline=None, preprocessing_params=None, notes=None, do_raise_repeated=True, ): """Provide the arguments necessary to instantiate :class:`experiments.CrossValidationExperiment`. This method has the same signature as :meth:`experiments.BaseExperiment.__init__` except where noted Parameters ---------- model_initializer: Class, or functools.partial, or class instance The algorithm class being used to initialize a model model_init_params: Dict, or object The dictionary of arguments given when creating a model instance with `model_initializer` via the `__init__` method of :class:`models.Model`. Any kwargs that are considered valid by the `__init__` method of `model_initializer` are valid in `model_init_params` model_extra_params: Dict, or None, default=None A dictionary of extra parameters passed to :class:`models.Model`. This is used to provide parameters to models' non-initialization methods (like `fit`, `predict`, `predict_proba`, etc.), and for neural networks feature_selector: List of str, callable, list of booleans, default=None The value provided when splitting apart the input data for all provided DataFrames. `feature_selector` is provided as the second argument for calls to `pandas.DataFrame.loc` in :meth:`BaseExperiment._initial_preprocessing`. If None, `feature_selector` is set to all columns in :attr:`train_dataset`, less :attr:`target_column`, and :attr:`id_column` preprocessing_pipeline: ... ... Experimental... preprocessing_params: ... ... Experimental... notes: String, or None, default=None Additional information about the Experiment that will be saved with the Experiment's description result file. This serves no purpose other than to facilitate saving Experiment details in a more readable format do_raise_repeated: Boolean, default=False If True and this Experiment locates a previous Experiment's results with matching Environment and Hyperparameter Keys, a RepeatedExperimentError will be raised. Else, a warning will be logged Notes ----- The `auto_start` kwarg is not available here because :meth:`BaseOptimizationProtocol._execute_experiment` sets it to False in order to check for duplicated keys before running the whole Experiment. This is the most notable difference between calling :meth:`set_experiment_guidelines` and instantiating :class:`experiments.CrossValidationExperiment`""" self.model_initializer = model_initializer self.model_init_params = identify_algorithm_hyperparameters( self.model_initializer) try: self.model_init_params.update(model_init_params) except TypeError: self.model_init_params.update(dict(build_fn=model_init_params)) self.model_extra_params = model_extra_params self.feature_selector = feature_selector self.preprocessing_pipeline = preprocessing_pipeline self.preprocessing_params = preprocessing_params self.notes = notes self.do_raise_repeated = do_raise_repeated if self.do_raise_repeated is False: G.warn_( 'WARNING: Setting `do_raise_repeated`=False will allow Experiments to be unnecessarily duplicated' ) self.algorithm_name, self.module_name = identify_algorithm( self.model_initializer) self._validate_guidelines() #################### Deal with Keras #################### if self.module_name == 'keras': reusable_build_fn, reusable_wrapper_params, dummy_layers, dummy_compile_params = keras_prep_workflow( self.model_initializer, self.model_init_params['build_fn'], self.model_extra_params, self.source_script) self.model_init_params = dict(build_fn=reusable_build_fn) self.model_extra_params = reusable_wrapper_params self.dummy_layers = dummy_layers self.dummy_compile_params = dummy_compile_params # FLAG: Deal with capitalization conflicts when comparing similar experiments: `optimizer`='Adam' vs 'adam' self.set_dimensions()