class_docstr: Base class for heterogeneous ensemble forecasters.
class_docstr_tok: ["Base","class","for","heterogeneous","ensemble","forecasters","."]
code: def _check_forecasters(self):
      if (
          self.forecasters is None
          or len(self.forecasters) == 0
          or not isinstance(self.forecasters, list)
      ):
          raise ValueError(
              "Invalid 'estimators' attribute, 'estimators' should be a list"
              " of (string, estimator) tuples."
          )
      names, forecasters = zip(*self.forecasters)
      # defined by MetaEstimatorMixin
      self._check_names(names)
  
      has_estimator = any(
          est not in (None, "drop") for est in forecasters
      )
      if not has_estimator:
          raise ValueError(
              "All estimators are dropped. At least one is required "
              "to be an estimator."
          )
  
      for forecaster in forecasters:
          if forecaster not in (None, "drop") and not isinstance(
              forecaster, BaseForecaster
          ):
              raise ValueError(
                  f"The estimator {forecaster.__class__.__name__} should be a "
                  f"Forecaster."
              )
      return names, forecasters
  
file_path: sktime/sktime/forecasting/base/_meta.py
imports: from joblib import Parallel, delayed
  from sktime.base import _HeterogenousMetaEstimator
  from sktime.forecasting.base._base import BaseForecaster
label_desc: Use image node_id 2 for calling the _HeterogenousEnsembleForecaster obj's underlying member method code with example usage: obj._check_forecasters() and returns: names,  forecasters