class_docstr: Bayesian search over hyperparameters for a forecaster.
  
  Experimental: This feature is under development and interface may likely to change.
  
  Parameters
  ----------
  forecaster : sktime forecaster, BaseForecaster instance or interface compatible
      The forecaster to tune, must implement the sktime forecaster interface.
      sklearn regressors can be used, but must first be converted to forecasters
      via one of the reduction compositors, e.g., via ``make_reduction``
  cv : cross-validation generator or an iterable
      Splitter used for generating validation folds.
      e.g. SlidingWindowSplitter()
  param_distributions : dict or a list of dict/tuple. See below for details.
      1. If dict, a dictionary that represents the search space over the parameters of
      the provided estimator. The keys are parameter names (strings), and the values
      follows the following format. A list to store categorical parameters and a
      tuple for integer and real parameters with the following format
      (int/float, int/float, "prior") e.g (1e-6, 1e-1, "log-uniform").
      2. If a list of dict, each dictionary corresponds to a parameter space,
      following the same structure described in case 1 above. the search will be
      performed sequentially for each parameter space, with the number of samples
      set to n_iter.
      3. If a list of tuple, tuple must contain (dict, int) where the int refers to
      n_iter for that search space. dict must follow the same structure as in case 1.
      This is useful if you want to perform a search with different number of
      iterations for each parameter space.
  n_iter : int, default=10
      Number of parameter settings that are sampled. n_iter trades
      off runtime vs quality of the solution. Consider increasing n_points
      if you want to try more parameter settings in parallel.
  n_points : int, default=1
      Number of parameter settings to sample in parallel.
      If this does not align with n_iter, the last iteration will sample less points
  
  scoring : sktime metric (BaseMetric), str, or callable, optional (default=None)
      scoring metric to use in tuning the forecaster
  
      * sktime metric objects (BaseMetric) descendants can be searched
      with the ``registry.all_estimators`` search utility,
      for instance via ``all_estimators("metric", as_dataframe=True)``
  
      * If callable, must have signature
      `(y_true: 1D np.ndarray, y_pred: 1D np.ndarray) -> float`,
      assuming np.ndarrays being of the same length, and lower being better.
      Metrics in sktime.performance_metrics.forecasting are all of this form.
  
      * If str, uses registry.resolve_alias to resolve to one of the above.
        Valid strings are valid registry.craft specs, which include
        string repr-s of any BaseMetric object, e.g., "MeanSquaredError()";
        and keys of registry.ALIAS_DICT referring to metrics.
  
      * If None, defaults to MeanAbsolutePercentageError()
  
  optimizer_kwargs: dict, optional
      Arguments passed to Optimizer to control the behaviour of the bayesian search.
      For example, {'base_estimator': 'RF'} would use a Random Forest surrogate
      instead of the default Gaussian Process. Please refer to the `skopt.Optimizer`
      documentation for more information.
  random_state : int, RandomState instance or None, default=None
      Pseudo random number generator state used for random uniform sampling
      from lists of possible values instead of scipy.stats distributions.
      Pass an int for reproducible output across multiple
      function calls.
  strategy : {"refit", "update", "no-update_params"}, optional, default="refit"
      data ingestion strategy in fitting cv, passed to `evaluate` internally
      defines the ingestion mode when the forecaster sees new data when window expands
      "refit" = a new copy of the forecaster is fitted to each training window
      "update" = forecaster is updated with training window data, in sequence provided
      "no-update_params" = fit to first training window, re-used without fit or update
  update_behaviour: str, optional, default = "full_refit"
      one of {"full_refit", "inner_only", "no_update"}
      behaviour of the forecaster when calling update
      "full_refit" = both tuning parameters and inner estimator refit on all data seen
      "inner_only" = tuning parameters are not re-tuned, inner estimator is updated
      "no_update" = neither tuning parameters nor inner estimator are updated
  refit : bool, optional (default=True)
      True = refit the forecaster with the best parameters on the entire data in fit
      False = no refitting takes place. The forecaster cannot be used to predict.
      This is to be used to tune the hyperparameters, and then use the estimator
      as a parameter estimator, e.g., via get_fitted_params or PluginParamsForecaster.
  verbose : int, optional (default=0)
  error_score : "raise" or numeric, default=np.nan
      Value to assign to the score if an exception occurs in estimator fitting. If set
      to "raise", the exception is raised. If a numeric value is given,
      FitFailedWarning is raised.
  return_n_best_forecasters: int, default=1
      In case the n best forecaster should be returned, this value can be set
      and the n best forecasters will be assigned to n_best_forecasters_
  pre_dispatch : str, optional (default='2*n_jobs')
  n_jobs : int, optional (default=None)
      Number of jobs to run in parallel.
      None means 1 unless in a joblib.parallel_backend context.
      -1 means using all processors.
  
  backend : {"dask", "loky", "multiprocessing", "threading"}, by default "loky".
      Runs parallel evaluate if specified and `strategy` is set as "refit".
  
      - "None": executes loop sequentally, simple list comprehension
      - "loky", "multiprocessing" and "threading": uses ``joblib.Parallel`` loops
      - "joblib": custom and 3rd party ``joblib`` backends, e.g., ``spark``
      - "dask": uses ``dask``, requires ``dask`` package in environment
  
      Recommendation: Use "dask" or "loky" for parallel evaluate.
      "threading" is unlikely to see speed ups due to the GIL and the serialization
      backend (``cloudpickle``) for "dask" and "loky" is generally more robust
      than the standard ``pickle`` library used in "multiprocessing".
  
  tune_by_instance : bool, optional (default=False)
      Whether to tune parameter by each time series instance separately,
      in case of Panel or Hierarchical data passed to the tuning estimator.
      Only applies if time series passed are Panel or Hierarchical.
      If True, clones of the forecaster will be fit to each instance separately,
      and are available in fields of the forecasters_ attribute.
      Has the same effect as applying ForecastByLevel wrapper to self.
      If False, the same best parameter is selected for all instances.
  tune_by_variable : bool, optional (default=False)
      Whether to tune parameter by each time series variable separately,
      in case of multivariate data passed to the tuning estimator.
      Only applies if time series passed are strictly multivariate.
      If True, clones of the forecaster will be fit to each variable separately,
      and are available in fields of the forecasters_ attribute.
      Has the same effect as applying ColumnEnsembleForecaster wrapper to self.
      If False, the same best parameter is selected for all variables.
  
  backend_params : dict, optional
      additional parameters passed to the backend as config.
      Directly passed to ``utils.parallel.parallelize``.
      Valid keys depend on the value of ``backend``:
  
      - "None": no additional parameters, ``backend_params`` is ignored
      - "loky", "multiprocessing" and "threading": default ``joblib`` backends
        any valid keys for ``joblib.Parallel`` can be passed here, e.g., ``n_jobs``,
        with the exception of ``backend`` which is directly controlled by ``backend``.
        If ``n_jobs`` is not passed, it will default to ``-1``, other parameters
        will default to ``joblib`` defaults.
      - "joblib": custom and 3rd party ``joblib`` backends, e.g., ``spark``.
        any valid keys for ``joblib.Parallel`` can be passed here, e.g., ``n_jobs``,
        ``backend`` must be passed as a key of ``backend_params`` in this case.
        If ``n_jobs`` is not passed, it will default to ``-1``, other parameters
        will default to ``joblib`` defaults.
      - "dask": any valid keys for ``dask.compute`` can be passed, e.g., ``scheduler``
  
  Attributes
  ----------
  best_index_ : int
  best_score_: float
      Score of the best model
  best_params_ : dict
      Best parameter values across the parameter grid
  best_forecaster_ : estimator
      Fitted estimator with the best parameters
  cv_results_ : dict
      Results from grid search cross validation
  n_best_forecasters_: list of tuples ("rank", <forecaster>)
      The "rank" is in relation to best_forecaster_
  n_best_scores_: list of float
      The scores of n_best_forecasters_ sorted from best to worst
      score of forecasters
  forecasters_ : pd.DataFramee
      DataFrame with all fitted forecasters and their parameters.
      Only present if tune_by_instance=True or tune_by_variable=True,
      and at least one of the two is applicable.
      In this case, the other attributes are not present in self,
      only in the fields of forecasters_.
  
  Examples
  --------
  >>> from sktime.datasets import load_shampoo_sales
  >>> from sktime.forecasting.model_selection import ForecastingSkoptSearchCV
  >>> from sktime.split import ExpandingWindowSplitter
  >>> from sklearn.ensemble import GradientBoostingRegressor
  >>> from sktime.forecasting.compose import make_reduction
  >>> y = load_shampoo_sales()
  >>> fh = [1,2,3,4]
  >>> cv = ExpandingWindowSplitter(fh=fh)
  >>> forecaster = make_reduction(GradientBoostingRegressor(random_state=10))
  >>> param_distributions = {
  ...     "estimator__learning_rate" : (1e-4, 1e-1, "log-uniform"),
  ...     "window_length" : (1, 10, "uniform"),
  ...     "estimator__criterion" : ["friedman_mse", "squared_error"]}
  >>> sscv = ForecastingSkoptSearchCV(
  ...     forecaster=forecaster,
  ...     param_distributions=param_distributions,
  ...     cv=cv,
  ...     n_iter=5,
  ...     random_state=10)  # doctest: +SKIP
  >>> sscv.fit(y)  # doctest: +SKIP
  ForecastingSkoptSearchCV(...)
  >>> y_pred = sscv.predict(fh)  # doctest: +SKIP
class_docstr_tok: ["Bayesian","search","over","hyperparameters","for","a","forecaster",".","Experimental",":","This","feature","is","under","development","and","interface","may","likely","to","change",".","Parameters","--","--","--","--","--","forecaster",":","sktime","forecaster",",","BaseForecaster","instance","or","interface","compatible","The","forecaster","to","tune",",","must","implement","the","sktime","forecaster","interface",".","sklearn","regressors","can","be","used",",","but","must","first","be","converted","to","forecasters","via","one","of","the","reduction","compositors",",","e.g.",",","via","``","make_reduction","``","cv",":","cross-validation","generator","or","an","iterable","Splitter","used","for","generating","validation","folds",".","e.g",".","SlidingWindowSplitter","(",")","param_distributions",":","dict","or","a","list","of","dict\/tuple",".","See","below","for","details",".","1",".","If","dict",",","a","dictionary","that","represents","the","search","space","over","the","parameters","of","the","provided","estimator",".","The","keys","are","parameter","names","(","strings",")",",","and","the","values","follows","the","following","format",".","A","list","to","store","categorical","parameters","and","a","tuple","for","integer","and","real","parameters","with","the","following","format","(","int\/float",",","int\/float",",","``","prior","''",")","e.g","(","1e-6",",","1e-1",",","``","log-uniform","''",")",".","2",".","If","a","list","of","dict",",","each","dictionary","corresponds","to","a","parameter","space",",","following","the","same","structure","described","in","case","1","above",".","the","search","will","be","performed","sequentially","for","each","parameter","space",",","with","the","number","of","samples","set","to","n_iter",".","3",".","If","a","list","of","tuple",",","tuple","must","contain","(","dict",",","int",")","where","the","int","refers","to","n_iter","for","that","search","space",".","dict","must","follow","the","same","structure","as","in","case","1",".","This","is","useful","if","you","want","to","perform","a","search","with","different","number","of","iterations","for","each","parameter","space",".","n_iter",":","int",",","default=10","Number","of","parameter","settings","that","are","sampled",".","n_iter","trades","off","runtime","vs","quality","of","the","solution",".","Consider","increasing","n_points","if","you","want","to","try","more","parameter","settings","in","parallel",".","n_points",":","int",",","default=1","Number","of","parameter","settings","to","sample","in","parallel",".","If","this","does","not","align","with","n_iter",",","the","last","iteration","will","sample","less","points","scoring",":","sktime","metric","(","BaseMetric",")",",","str",",","or","callable",",","optional","(","default=None",")","scoring","metric","to","use","in","tuning","the","forecaster","*","sktime","metric","objects","(","BaseMetric",")","descendants","can","be","searched","with","the","``","registry.all_estimators","``","search","utility",",","for","instance","via","``","all_estimators","(","``","metric","''",",","as_dataframe=True",")","``","*","If","callable",",","must","have","signature","`","(","y_true",":","1D","np.ndarray",",","y_pred",":","1D","np.ndarray",")","-",">","float","`",",","assuming","np.ndarrays","being","of","the","same","length",",","and","lower","being","better",".","Metrics","in","sktime.performance_metrics.forecasting","are","all","of","this","form",".","*","If","str",",","uses","registry.resolve_alias","to","resolve","to","one","of","the","above",".","Valid","strings","are","valid","registry.craft","specs",",","which","include","string","repr-s","of","any","BaseMetric","object",",","e.g.",",","``","MeanSquaredError","(",")","''",";","and","keys","of","registry.ALIAS_DICT","referring","to","metrics",".","*","If","None",",","defaults","to","MeanAbsolutePercentageError","(",")","optimizer_kwargs",":","dict",",","optional","Arguments","passed","to","Optimizer","to","control","the","behaviour","of","the","bayesian","search",".","For","example",",","{","'base_estimator","'",":","'RF","'","}","would","use","a","Random","Forest","surrogate","instead","of","the","default","Gaussian","Process",".","Please","refer","to","the","`","skopt.Optimizer","`","documentation","for","more","information",".","random_state",":","int",",","RandomState","instance","or","None",",","default=None","Pseudo","random","number","generator","state","used","for","random","uniform","sampling","from","lists","of","possible","values","instead","of","scipy.stats","distributions",".","Pass","an","int","for","reproducible","output","across","multiple","function","calls",".","strategy",":","{","``","refit","''",",","``","update","''",",","``","no-update_params","''","}",",","optional",",","default=","''","refit","''","data","ingestion","strategy","in","fitting","cv",",","passed","to","`","evaluate","`","internally","defines","the","ingestion","mode","when","the","forecaster","sees","new","data","when","window","expands","``","refit","''","=","a","new","copy","of","the","forecaster","is","fitted","to","each","training","window","``","update","''","=","forecaster","is","updated","with","training","window","data",",","in","sequence","provided","``","no-update_params","''","=","fit","to","first","training","window",",","re-used","without","fit","or","update","update_behaviour",":","str",",","optional",",","default","=","``","full_refit","''","one","of","{","``","full_refit","''",",","``","inner_only","''",",","``","no_update","''","}","behaviour","of","the","forecaster","when","calling","update","``","full_refit","''","=","both","tuning","parameters","and","inner","estimator","refit","on","all","data","seen","``","inner_only","''","=","tuning","parameters","are","not","re-tuned",",","inner","estimator","is","updated","``","no_update","''","=","neither","tuning","parameters","nor","inner","estimator","are","updated","refit",":","bool",",","optional","(","default=True",")","True","=","refit","the","forecaster","with","the","best","parameters","on","the","entire","data","in","fit","False","=","no","refitting","takes","place",".","The","forecaster","can","not","be","used","to","predict",".","This","is","to","be","used","to","tune","the","hyperparameters",",","and","then","use","the","estimator","as","a","parameter","estimator",",","e.g.",",","via","get_fitted_params","or","PluginParamsForecaster",".","verbose",":","int",",","optional","(","default=0",")","error_score",":","``","raise","''","or","numeric",",","default=np.nan","Value","to","assign","to","the","score","if","an","exception","occurs","in","estimator","fitting",".","If","set","to","``","raise","''",",","the","exception","is","raised",".","If","a","numeric","value","is","given",",","FitFailedWarning","is","raised",".","return_n_best_forecasters",":","int",",","default=1","In","case","the","n","best","forecaster","should","be","returned",",","this","value","can","be","set","and","the","n","best","forecasters","will","be","assigned","to","n_best_forecasters_","pre_dispatch",":","str",",","optional","(","default=","'","2","*","n_jobs","'",")","n_jobs",":","int",",","optional","(","default=None",")","Number","of","jobs","to","run","in","parallel",".","None","means","1","unless","in","a","joblib.parallel_backend","context",".","-1","means","using","all","processors",".","backend",":","{","``","dask","''",",","``","loky","''",",","``","multiprocessing","''",",","``","threading","''","}",",","by","default","``","loky","''",".","Runs","parallel","evaluate","if","specified","and","`","strategy","`","is","set","as","``","refit","''",".","-","``","None","''",":","executes","loop","sequentally",",","simple","list","comprehension","-","``","loky","''",",","``","multiprocessing","''","and","``","threading","''",":","uses","``","joblib.Parallel","``","loops","-","``","joblib","''",":","custom","and","3rd","party","``","joblib","``","backends",",","e.g.",",","``","spark","``","-","``","dask","''",":","uses","``","dask","``",",","requires","``","dask","``","package","in","environment","Recommendation",":","Use","``","dask","''","or","``","loky","''","for","parallel","evaluate",".","``","threading","''","is","unlikely","to","see","speed","ups","due","to","the","GIL","and","the","serialization","backend","(","``","cloudpickle","``",")","for","``","dask","''","and","``","loky","''","is","generally","more","robust","than","the","standard","``","pickle","``","library","used","in","``","multiprocessing","''",".","tune_by_instance",":","bool",",","optional","(","default=False",")","Whether","to","tune","parameter","by","each","time","series","instance","separately",",","in","case","of","Panel","or","Hierarchical","data","passed","to","the","tuning","estimator",".","Only","applies","if","time","series","passed","are","Panel","or","Hierarchical",".","If","True",",","clones","of","the","forecaster","will","be","fit","to","each","instance","separately",",","and","are","available","in","fields","of","the","forecasters_","attribute",".","Has","the","same","effect","as","applying","ForecastByLevel","wrapper","to","self",".","If","False",",","the","same","best","parameter","is","selected","for","all","instances",".","tune_by_variable",":","bool",",","optional","(","default=False",")","Whether","to","tune","parameter","by","each","time","series","variable","separately",",","in","case","of","multivariate","data","passed","to","the","tuning","estimator",".","Only","applies","if","time","series","passed","are","strictly","multivariate",".","If","True",",","clones","of","the","forecaster","will","be","fit","to","each","variable","separately",",","and","are","available","in","fields","of","the","forecasters_","attribute",".","Has","the","same","effect","as","applying","ColumnEnsembleForecaster","wrapper","to","self",".","If","False",",","the","same","best","parameter","is","selected","for","all","variables",".","backend_params",":","dict",",","optional","additional","parameters","passed","to","the","backend","as","config",".","Directly","passed","to","``","utils.parallel.parallelize","``",".","Valid","keys","depend","on","the","value","of","``","backend","``",":","-","``","None","''",":","no","additional","parameters",",","``","backend_params","``","is","ignored","-","``","loky","''",",","``","multiprocessing","''","and","``","threading","''",":","default","``","joblib","``","backends","any","valid","keys","for","``","joblib.Parallel","``","can","be","passed","here",",","e.g.",",","``","n_jobs","``",",","with","the","exception","of","``","backend","``","which","is","directly","controlled","by","``","backend","``",".","If","``","n_jobs","``","is","not","passed",",","it","will","default","to","``","-1","``",",","other","parameters","will","default","to","``","joblib","``","defaults",".","-","``","joblib","''",":","custom","and","3rd","party","``","joblib","``","backends",",","e.g.",",","``","spark","``",".","any","valid","keys","for","``","joblib.Parallel","``","can","be","passed","here",",","e.g.",",","``","n_jobs","``",",","``","backend","``","must","be","passed","as","a","key","of","``","backend_params","``","in","this","case",".","If","``","n_jobs","``","is","not","passed",",","it","will","default","to","``","-1","``",",","other","parameters","will","default","to","``","joblib","``","defaults",".","-","``","dask","''",":","any","valid","keys","for","``","dask.compute","``","can","be","passed",",","e.g.",",","``","scheduler","``","Attributes","--","--","--","--","--","best_index_",":","int","best_score_",":","float","Score","of","the","best","model","best_params_",":","dict","Best","parameter","values","across","the","parameter","grid","best_forecaster_",":","estimator","Fitted","estimator","with","the","best","parameters","cv_results_",":","dict","Results","from","grid","search","cross","validation","n_best_forecasters_",":","list","of","tuples","(","``","rank","''",",","<","forecaster",">",")","The","``","rank","''","is","in","relation","to","best_forecaster_","n_best_scores_",":","list","of","float","The","scores","of","n_best_forecasters_","sorted","from","best","to","worst","score","of","forecasters","forecasters_",":","pd.DataFramee","DataFrame","with","all","fitted","forecasters","and","their","parameters",".","Only","present","if","tune_by_instance=True","or","tune_by_variable=True",",","and","at","least","one","of","the","two","is","applicable",".","In","this","case",",","the","other","attributes","are","not","present","in","self",",","only","in","the","fields","of","forecasters_",".","Examples","--","--","--","--",">",">",">","from","sktime.datasets","import","load_shampoo_sales",">",">",">","from","sktime.forecasting.model_selection","import","ForecastingSkoptSearchCV",">",">",">","from","sktime.split","import","ExpandingWindowSplitter",">",">",">","from","sklearn.ensemble","import","GradientBoostingRegressor",">",">",">","from","sktime.forecasting.compose","import","make_reduction",">",">",">","y","=","load_shampoo_sales","(",")",">",">",">","fh","=","[","1,2,3,4","]",">",">",">","cv","=","ExpandingWindowSplitter","(","fh=fh",")",">",">",">","forecaster","=","make_reduction","(","GradientBoostingRegressor","(","random_state=10",")",")",">",">",">","param_distributions","=","{","...","``","estimator__learning_rate","''",":","(","1e-4",",","1e-1",",","``","log-uniform","''",")",",","...","``","window_length","''",":","(","1",",","10",",","``","uniform","''",")",",","...","``","estimator__criterion","''",":","[","``","friedman_mse","''",",","``","squared_error","''","]","}",">",">",">","sscv","=","ForecastingSkoptSearchCV","(","...","forecaster=forecaster",",","...","param_distributions=param_distributions",",","...","cv=cv",",","...","n_iter=5",",","...","random_state=10",")","#","doctest",":","+SKIP",">",">",">","sscv.fit","(","y",")","#","doctest",":","+SKIP","ForecastingSkoptSearchCV","(","...",")",">",">",">","y_pred","=","sscv.predict","(","fh",")","#","doctest",":","+SKIP"]
docstr: Check whether the search space argument is correct.
  
  from skopt.BayesSearchCV._check_search_space
code: def _check_search_space(self, search_space):
      """Check whether the search space argument is correct.
  
      from skopt.BayesSearchCV._check_search_space
      """
      from skopt.space import check_dimension
  
      if len(search_space) == 0:
          raise ValueError(
              "The search_spaces parameter should contain at least one"
              "non-empty search space, got %s" % search_space
          )
  
      # check if space is a single dict, convert to list if so
      if isinstance(search_space, dict):
          search_space = [search_space]
  
      # check if the structure of the space is proper
      if isinstance(search_space, list):
          # convert to just a list of dicts
          dicts_only = []
  
          # 1. check the case when a tuple of space, n_iter is provided
          for elem in search_space:
              if isinstance(elem, tuple):
                  if len(elem) != 2:
                      raise ValueError(
                          "All tuples in list of search spaces should have"
                          "length 2, and contain (dict, int), got %s"
                          % elem
                      )
                  subspace, n_iter = elem
  
                  if (not isinstance(n_iter, int)) or n_iter < 0:
                      raise ValueError(
                          "Number of iterations in search space should be"
                          "positive integer, got %s in tuple %s "
                          % (n_iter, elem)
                      )
  
                  # save subspaces here for further checking
                  dicts_only.append(subspace)
              elif isinstance(elem, dict):
                  dicts_only.append(elem)
              else:
                  raise TypeError(
                      "A search space should be provided as a dict or"
                      "tuple (dict, int), got %s" % elem
                  )
  
          # 2. check all the dicts for correctness of contents
          for subspace in dicts_only:
              for params_name, param_value in subspace.items():
                  if params_name != "forecaster":
                      check_dimension(param_value)
      else:
          raise TypeError(
              "Search space should be provided as a dict or list of dict,"
              "got %s" % search_space
          )
  
imports: from collections.abc import Sequence
  from typing import Dict, List, Optional, Union
  import numpy
  import pandas
  from joblib import Parallel, delayed
  from sklearn.model_selection import ParameterGrid, ParameterSampler, check_cv
  from sktime.datatypes import mtype_to_scitype
  from sktime.exceptions import NotFittedError
  from sktime.forecasting.base._delegate import _DelegatedForecaster
  from sktime.forecasting.model_evaluation import evaluate
  from sktime.performance_metrics.base import BaseMetric
  from sktime.split.base import BaseSplitter
  from sktime.utils.parallel import parallelize
  from sktime.utils.validation.forecasting import check_scoring
  from sktime.utils.warnings import warn
label_desc: Use image node_id 6 for calling the ForecastingSkoptSearchCV obj's underlying member method code with example usage: obj._check_search_space(search_space) without return types