HierarchyEnsembleForecaster
Aggregates hierarchical data, fit forecasters and make predictions.
Can apply different univariate forecaster either on different level of aggregation or on different hierarchical nodes.
HierarchyEnsembleForecaster is passed forecaster/level or forecaster/node pairs. Level can only be int >= 0 with 0 signifying the topmost level of aggregation. Node can only be a tuple of strings or list of tuples.
Behaviour in fit, predict: For level pairs f_i, l_i passed, applies forecaster f_i to level l_i. For node pairs f_i, n_i passed, applies forecaster f_i on each node of n_i. If default argument is passed, applies default forecaster on the remaining levels/nodes which are not mentioned in argument forecasters. predict results are concatenated to one container with same columns as in fit.
Quickstart
from sktime.forecasting.compose import HierarchyEnsembleForecaster
estimator = HierarchyEnsembleForecaster(forecasters, by='level', default=None, backend=None, backend_params=None)Parameters(5)
- forecasterssktime forecaster, or list of tuples
(str, estimator, int or list of tuple/s) if forecaster, clones of
forecasterare applied to all aggregated levels. if list of tuples, with name = str, estimator is forecaster, level/node as int/tuples respectively. all levels/nodes must be present inforecastersattribute ifdefaultattribute is None- by{‘node’, ‘level’, default=’level’}
if
'level', applies a univariate forecaster on all the hierarchical nodes within a level of aggregation if'node', applies separate univariate forecaster for each hierarchical node.- defaultsktime forecaster {default = None}
if passed, applies
defaultforecaster on the nodes/levels not mentioned in theforecasterargument.- backendstring, by default “None”.
Parallelization backend to use for runs. Runs parallel evaluate if specified and
strategy="refit".“None”: executes loop sequentially, simple list comprehension
“loky”, “multiprocessing” and “threading”: uses
joblib.Parallelloops“joblib”: custom and 3rd party
joblibbackends, e.g.,spark“dask”: uses
dask, requiresdaskpackage in environment“dask_lazy”: same as “dask”, but changes the return to (lazy)
dask.dataframe.DataFrame.“ray”: uses
ray, requiresraypackage 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 standardpicklelibrary used in “multiprocessing”.- backend_paramsdict, optional
additional parameters passed to the backend as config. Directly passed to
utils.parallel.parallelize. Valid keys depend on the value ofbackend:“None”: no additional parameters,
backend_paramsis ignored“loky”, “multiprocessing” and “threading”: default
joblibbackends any valid keys forjoblib.Parallelcan be passed here, e.g.,n_jobs, with the exception ofbackendwhich is directly controlled bybackend. Ifn_jobsis not passed, it will default to-1, other parameters will default tojoblibdefaults.“joblib”: custom and 3rd party
joblibbackends, e.g.,spark. any valid keys forjoblib.Parallelcan be passed here, e.g.,n_jobs,backendmust be passed as a key ofbackend_paramsin this case. Ifn_jobsis not passed, it will default to-1, other parameters will default tojoblibdefaults.“dask”: any valid keys for
dask.computecan be passed, e.g.,scheduler“ray”: The following keys can be passed:
“ray_remote_args”: dictionary of valid keys for
ray.init- “shutdown_ray”: bool, default=True; False prevents
rayfrom shutting down after parallelization.
- “shutdown_ray”: bool, default=True; False prevents
Examples
>>> from sktime.forecasting.compose import HierarchyEnsembleForecaster >>> from sktime.forecasting.naive import NaiveForecaster >>> from sktime.forecasting.trend import PolynomialTrendForecaster, TrendForecaster >>> from sktime.utils._testing.hierarchical import _bottom_hier_datagen >>> y = _bottom_hier_datagen ( ... no_bottom_nodes = 7, ... no_levels = 2, ... random_seed = 123, ... ) >>> # Example of by = 'level' >>> forecasters = [ ... ('naive', NaiveForecaster (), 0), ... ('trend', TrendForecaster (), 1), ... ] >>> forecaster = HierarchyEnsembleForecaster ( ... forecasters = forecasters, ... by = 'level', ... default = PolynomialTrendForecaster (degree = 2), ... ) >>> forecaster. fit (y, fh = [1, 2, 3 ]) HierarchyEnsembleForecaster( ... ) >>> y_pred = forecaster. predict () >>> # Example of by = 'node' >>> forecasters = [ ... ('trend', TrendForecaster (), [("__total", "__total")]), ... ('poly', PolynomialTrendForecaster (degree = 2), [('l2_node01', 'l1_node01')]), ... ] >>> forecaster = HierarchyEnsembleForecaster ( ... forecasters = forecasters, ... by = 'node', default = NaiveForecaster () ... ) >>> forecaster. fit (y, fh = [1, 2, 3 ]) HierarchyEnsembleForecaster( ... ) >>> y_pred = forecaster. predict ()