code: def _fit_and_score_ensemble(self, X, y, cv, **fit_params):
          
          fit_params_steps = self._split_fit_params(fit_params)
  
          folds = list(cv.split(X, y))
  
          # Take care of custom kernel functions
          base_estimators, kernel_cache = self._get_base_estimators(X)
  
          out = Parallel(
              n_jobs=self.n_jobs, verbose=self.verbose
          )(
              delayed(_fit_and_score_fold)(clone(estimator),
                                           X if i not in kernel_cache else kernel_cache[i],
                                           y,
                                           self.scorer,
                                           train_index, test_index,
                                           fit_params_steps[name],
                                           i, fold)
              for i, (name, estimator) in enumerate(base_estimators)
              for fold, (train_index, test_index) in enumerate(folds))
  
          if len(kernel_cache) > 0:
              out = self._restore_base_estimators(kernel_cache, out, X, folds)
  
          return self._create_base_ensemble(out, len(base_estimators), len(folds))
docs: Create a cross-validated model by training a model for each fold with the same model parameters