docstr: Define the actual experiment process, including execution, result saving, and cleanup
docstr_tok: ["Define","the","actual","experiment","process",",","including","execution",",","result","saving",",","and","cleanup"]
code: def experiment_workflow(self):
      """Define the actual experiment process, including execution, result saving, and cleanup"""
      if self.hyperparameter_key.exists is True:
          _ex = f"{self!r} has already been run"
          if self.do_raise_repeated is True:
              self._clean_up()
              raise RepeatedExperimentError(_ex)
          G.debug(_ex)
          G.warn("WARNING: Duplicate experiment!")
  
      self._initialize_random_seeds()
      self.execute()
  
      #################### Save Experiment Results ####################
      recorders = RecorderList(
          file_blacklist=G.Env.file_blacklist,
          extra_recorders=G.Env.experiment_recorders,
      )
      recorders.format_result()
      G.log(f"Saving results for Experiment: '{self.experiment_id}'")
      recorders.save_result()
      self._clean_up()
  
imports: from hyperparameter_hunter.algorithm_handlers import identify_algorithm, identify_algorithm_hyperparameters
  from hyperparameter_hunter.data import TrainDataset, OOFDataset, HoldoutDataset, TestDataset
  from hyperparameter_hunter.experiment_core import ExperimentMeta
  from hyperparameter_hunter.feature_engineering import FeatureEngineer
  from hyperparameter_hunter.i_o.exceptions import EnvironmentInactiveError, EnvironmentInvalidError, RepeatedExperimentError
  from hyperparameter_hunter.i_o.recorders import RecorderList
  from hyperparameter_hunter.keys.makers import HyperparameterKeyMaker
  from hyperparameter_hunter.metrics import ScoringMixIn, get_formatted_target_metric
  from hyperparameter_hunter.models import model_selector
  from hyperparameter_hunter.settings import G
  from hyperparameter_hunter.utils.file_utils import RetryMakeDirs
  from abc import abstractmethod
  from copy import deepcopy
  from inspect import isclass
  import numpy
  import pandas
  import random
  import shutil
  from sys import exc_info
  from uuid import uuid4
  import warnings
  import sklearn.utils
label_desc: Use image node_id 4 for calling the BaseExperiment obj's underlying member method code with example usage: obj.experiment_workflow() without return types