docstr: Prepare data prior to executing fitting protocol (cross-validation), by 1) Initializing
  formal :mod:`~hyperparameter_hunter.data.datasets` attributes, 2) Invoking
  `feature_engineer` to perform "pre_cv"-stage preprocessing, and 3) Updating datasets to
  include their (transformed) counterparts in `feature_engineer`
docstr_tok: ["Prepare","data","prior","to","executing","fitting","protocol","(","cross-validation",")",",","by","1",")","Initializing","formal",":","mod",":","`","~hyperparameter_hunter.data.datasets","`","attributes",",","2",")","Invoking","`","feature_engineer","`","to","perform","``","pre_cv","''","-stage","preprocessing",",","and","3",")","Updating","datasets","to","include","their","(","transformed",")","counterparts","in","`","feature_engineer","`"]
code: def on_exp_start(self):
      """Prepare data prior to executing fitting protocol (cross-validation), by 1) Initializing
      formal :mod:`~hyperparameter_hunter.data.datasets` attributes, 2) Invoking
      `feature_engineer` to perform "pre_cv"-stage preprocessing, and 3) Updating datasets to
      include their (transformed) counterparts in `feature_engineer`"""
      #################### Build Datasets ####################
      data_kwargs = dict(
          feature_selector=self.feature_selector,
          target_column=self.target_column,
      )
      self.data_train = TrainDataset(
          self.train_dataset, require_data=True, **data_kwargs
      )
      self.data_oof = OOFDataset(self.train_dataset, **data_kwargs)
      self.data_holdout = HoldoutDataset(
          self.holdout_dataset, **data_kwargs
      )
      self.data_test = TestDataset(
          self.test_dataset, feature_selector=self.feature_selector
      )
  
      #################### Perform Pre-CV Feature Engineering ####################
      self.feature_engineer(
          "pre_cv",
          train_inputs=deepcopy(self.data_train.input.d),
          train_targets=deepcopy(self.data_train.target.d),
          holdout_inputs=deepcopy(self.data_holdout.input.d),
          holdout_targets=deepcopy(self.data_holdout.target.d),
          test_inputs=deepcopy(self.data_test.input.d),
      )
      self.data_train.input.T.d = self.feature_engineer.datasets[
          "train_inputs"
      ]
      self.data_train.target.T.d = self.feature_engineer.datasets[
          "train_targets"
      ]
      self.data_holdout.input.T.d = self.feature_engineer.datasets[
          "holdout_inputs"
      ]
      self.data_holdout.target.T.d = self.feature_engineer.datasets[
          "holdout_targets"
      ]
      self.data_test.input.T.d = self.feature_engineer.datasets[
          "test_inputs"
      ]
  
      G.log("Initial preprocessing stage complete", 4)
      super().on_exp_start()
  
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 8 for calling the BaseExperiment obj's underlying member method code with example usage: obj.on_exp_start() without return types