class_docstr: Contains the class for the Xcessiv stacked ensemble
code: def fit(self, X, y):
      print("Fitting {} base learners".format(len(self.base_learners)))
  
      all_learner_meta_features = []
      for idx, base_learner in enumerate(self.base_learners):
          single_learner_meta_features = []
          test_indices = []
          for num, (train_idx, test_idx) in enumerate(
              self.cv_function(X, y)
          ):
              print(
                  "Fold {} of base learner {}".format(num + 1, idx + 1)
              )
  
              base_learner.fit(X[train_idx], y[train_idx])
  
              preds = getattr(
                  base_learner, self.meta_feature_generators[idx]
              )(X[test_idx])
  
              if len(preds.shape) == 1:
                  preds = preds.reshape(-1, 1)
  
              single_learner_meta_features.append(preds)
  
              test_indices.append(test_idx)
  
          single_learner_meta_features = np.concatenate(
              single_learner_meta_features
          )
          all_learner_meta_features.append(single_learner_meta_features)
  
      all_learner_meta_features = np.concatenate(
          all_learner_meta_features, axis=1
      )
      test_indices = np.concatenate(
          test_indices
      )  # reorganized order due to CV
  
      print("Fitting meta-learner")
  
      self.secondary_learner.fit(
          all_learner_meta_features, y[test_indices]
      )
  
      return self
  
file_path: xcessiv/xcessiv/stacker.py
imports: import sklearn
  import numpy
label_desc: Use image node_id 4 for calling the XcessivStackedEnsemble obj's underlying member method code with example usage: obj.fit(X, y) and returns: self