class_docstr: Supervised Time Series Forest (STSF).
  
  An ensemble of decision trees built on intervals selected through a supervised
  process as described in _[1].
  Overview: Input n series length m
  For each tree
      - sample X using class-balanced bagging
      - sample intervals for all 3 representations and 7 features using supervised
      - method
      - find mean, median, std, slope, iqr, min and max using their corresponding
      - interval for each rperesentation, concatenate to form new data set
      - build decision tree on new data set
  Ensemble the trees with averaged probability estimates.
  
  Parameters
  ----------
  n_estimators : int, default=200
      Number of estimators to build for the ensemble.
  n_jobs : int, default=1
      The number of jobs to run in parallel for both `fit` and `predict`.
      ``-1`` means using all processors.
  random_state : int or None, default=None
      Seed for random number generation.
  
  Attributes
  ----------
  n_classes_ : int
      The number of classes.
  n_instances_ : int
      The number of train cases.
  series_length_ : int
      The length of each series.
  classes_ : list
      The classes labels.
  intervals : array-like of shape [n_estimators][3][7][n_intervals][2]
      Stores indexes of all start and end points for all estimators. Each estimator
      contains indexes for each representation and feature combination.
  estimators_ : list of shape (n_estimators) of DecisionTreeClassifier
      The collections of estimators trained in fit.
  
  Notes
  -----
  For the Java version, see
  `TSML <https://github.com/uea-machine-learning/tsml/blob/master/src/main/
   java/tsml/classifiers/interval_based/STSF.java>`_.
  
  References
  ----------
  .. [1] Cabello, Nestor, et al. "Fast and Accurate Time Series Classification
     Through Supervised Interval Search." IEEE ICDM 2020
  
  Examples
  --------
  >>> from sktime.classification.interval_based import SupervisedTimeSeriesForest
  >>> from sktime.datasets import load_unit_test
  >>> X_train, y_train = load_unit_test(split="train", return_X_y=True)
  >>> X_test, y_test = load_unit_test(split="test", return_X_y=True)
  >>> clf = SupervisedTimeSeriesForest(n_estimators=5)
  >>> clf.fit(X_train, y_train)
  SupervisedTimeSeriesForest(n_estimators=5)
  >>> y_pred = clf.predict(X_test)
docstr: Fit an estimator - a clone of base_estimator - on input data (X, y).
  
  Transformed using the supervised intervals for each feature and representation.
docstr_tok: ["Fit","an","estimator","-","a","clone","of","base_estimator","-","on","input","data","(","X",",","y",")",".","Transformed","using","the","supervised","intervals","for","each","feature","and","representation","."]
code: def _fit_estimator(self, X, X_p, X_d, y, balance_cases, idx):
      """Fit an estimator - a clone of base_estimator - on input data (X, y).
  
      Transformed using the supervised intervals for each feature and representation.
      """
      estimator = clone(self._base_estimator)
      rs = 5465 if self.random_state == 0 else self.random_state
      rs = (
          None
          if self.random_state is None
          else (rs * 37 * (idx + 1)) % np.iinfo(np.int32).max
      )
      estimator.set_params(random_state=rs)
      rng = check_random_state(rs)
  
      class_counts = np.zeros(0)
      while class_counts.shape[0] != self.n_classes_:
          bag = np.concatenate(
              (
                  rng.choice(self.n_instances_, size=self.n_instances_),
                  balance_cases,
              )
          )
          _, class_counts = np.unique(y[bag], return_counts=True)
      n_instances = bag.shape[0]
      bag = bag.astype(int)
  
      transformed_x = np.zeros((n_instances, 0), dtype=np.float32)
  
      intervals = self._get_intervals(X[bag], y[bag], rng)
      transformed_x = np.concatenate(
          (transformed_x, self._transform(X[bag], intervals)),
          axis=1,
      )
  
      intervals_p = self._get_intervals(X_p[bag], y[bag], rng)
      transformed_x = np.concatenate(
          (transformed_x, self._transform(X_p[bag], intervals_p)),
          axis=1,
      )
  
      intervals_d = self._get_intervals(X_d[bag], y[bag], rng)
      transformed_x = np.concatenate(
          (transformed_x, self._transform(X_d[bag], intervals_d)),
          axis=1,
      )
  
      return [
          estimator.fit(transformed_x, y[bag]),
          [intervals, intervals_p, intervals_d],
      ]
  
imports: import math
  import numpy
  from joblib import Parallel, delayed
  from scipy import signal, stats
  from sklearn.base import clone
  from sklearn.preprocessing import StandardScaler
  from sklearn.tree import DecisionTreeClassifier
  from sklearn.utils.validation import check_random_state
  from sktime.classification.base import BaseClassifier
  from sktime.utils.slope_and_trend import _slope
label_desc: Use image node_id 8 for calling the SupervisedTimeSeriesForest obj's underlying member method code with example usage: obj._fit_estimator(X, X_p, X_d, y, balance_cases, idx) and returns: list