[docs]classTuner(ABC):"""Base Tuner class. Tuners implement different strategies for sampling from a search space. They're used in EvalML to search the space of pipeline hyperparameters. Args: pipeline_hyperparameter_ranges (dict): a set of hyperparameter ranges corresponding to a pipeline's parameters. random_seed (int): The random state. Defaults to 0. """def__init__(self,pipeline_hyperparameter_ranges,random_seed=0):self._pipeline_hyperparameter_ranges=pipeline_hyperparameter_rangesself._parameter_names_map=dict()self._search_space_names=[]self._search_space_ranges=[]self.random_seed=random_seedifnotisinstance(pipeline_hyperparameter_ranges,dict):raiseValueError("pipeline_hyperparameter_ranges must be a dict but is of type {}".format(type(pipeline_hyperparameter_ranges),),)self._component_names=list(pipeline_hyperparameter_ranges.keys())forcomponent_name,component_rangesinpipeline_hyperparameter_ranges.items():ifnotisinstance(component_ranges,dict):raiseValueError("pipeline_hyperparameter_ranges has invalid entry for {}: {}".format(component_name,component_ranges,),)forparameter_name,parameter_rangeincomponent_ranges.items():ifparameter_rangeisNone:raiseValueError("pipeline_hyperparameter_ranges has invalid dimensions for "+"{} parameter {}: None.".format(component_name,parameter_name,),)ifnotisinstance(parameter_range,(Real,Integer,Categorical,list,tuple),):continueflat_parameter_name="{}: {}".format(component_name,parameter_name)self._parameter_names_map[flat_parameter_name]=(component_name,parameter_name,)self._search_space_names.append(flat_parameter_name)self._search_space_ranges.append(parameter_range)def_convert_to_flat_parameters(self,pipeline_parameters):"""Convert from pipeline parameters to a flat list of values."""flat_parameter_values=[]forflat_parameter_nameinself._search_space_names:component_name,parameter_name=self._parameter_names_map[flat_parameter_name]if(component_namenotinpipeline_parametersorparameter_namenotinpipeline_parameters[component_name]):raiseTypeError('Pipeline parameters missing required field "{}" for component "{}"'.format(parameter_name,component_name,),)flat_parameter_values.append(pipeline_parameters[component_name][parameter_name],)returnflat_parameter_valuesdef_convert_to_pipeline_parameters(self,flat_parameters):"""Convert from a flat list of values to a dict of pipeline parameters."""pipeline_parameters={component_name:dict()forcomponent_nameinself._component_names}forflat_parameter_name,parameter_valueinzip(self._search_space_names,flat_parameters,):component_name,parameter_name=self._parameter_names_map[flat_parameter_name]pipeline_parameters[component_name][parameter_name]=parameter_valuereturnpipeline_parameters
[docs]defget_starting_parameters(self,hyperparameter_ranges,random_seed=0):"""Gets the starting parameters given the pipeline hyperparameter range. Arguments: hyperparameter_ranges (dict): The custom hyperparameter ranges passed in during search. Used to determine the starting parameters. random_seed (int): The random seed to use. Defaults to 0. Returns: dict: The starting parameters, randomly chosen, to initialize a pipeline with. """starting_parameters={}forname,param_dictinhyperparameter_ranges.items():component_parameters={}forparam_name,valueinparam_dict.items():ifisinstance(value,(Integer,Real)):# get a random value in the spacecomponent_parameters[param_name]=value.rvs(random_state=random_seed,)[0]elifisinstance(value,Categorical):# Categoricalcomponent_parameters[param_name]=value.rvs(random_state=random_seed,)elifisinstance(value,(list,tuple)):# list value from our internal hyperparameter_rangescomponent_parameters[param_name]=value[0]starting_parameters[name]=component_parametersreturnstarting_parameters
[docs]@abstractmethoddefadd(self,pipeline_parameters,score):"""Register a set of hyperparameters with the score obtained from training a pipeline with those hyperparameters. Args: pipeline_parameters (dict): a dict of the parameters used to evaluate a pipeline score (float): the score obtained by evaluating the pipeline with the provided parameters Returns: None """
[docs]@abstractmethoddefpropose(self):"""Returns a suggested set of parameters to train and score a pipeline with, based off the search space dimensions and prior samples. Returns: dict: Proposed pipeline parameters """
[docs]defis_search_space_exhausted(self):"""Optional. If possible search space for tuner is finite, this method indicates whether or not all possible parameters have been scored. Returns: bool: Returns true if all possible parameters in a search space has been scored. """returnFalse