code: def define_holdout_set(
      train_set: pd.DataFrame,
      holdout_set: Union[pd.DataFrame, callable, str, None],
      target_column: Union[str, List[str]],
  ) -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]:
      """Create `holdout_set` (if necessary) by loading a DataFrame from a .csv file, or by separating
      `train_set`, and return the updated (`train_set`, `holdout_set`) pair
  
      Parameters
      ----------
      train_set: Pandas.DataFrame
          Training DataFrame. Will be split into train/holdout data, if `holdout_set` is callable
      holdout_set: Pandas.DataFrame, callable, str, or None
          If pd.DataFrame, this is the holdout dataset. If callable, expects a function that takes
          (`train_set`, `target_column`) as input and returns the new (`train_set`, `holdout_set`). If
          str, will attempt to read file at path via :func:`pandas.read_csv`. Else, no holdout set
      target_column: Str, or list
          If str, denotes the column name in provided datasets that contains the target output. If
          list, should be a list of strs designating multiple target columns
  
      Returns
      -------
      train_set: Pandas.DataFrame
          `train_set` if `holdout_set` is not callable. Else `train_set` modified by `holdout_set`
      holdout_set: Pandas.DataFrame, or None
          Original DataFrame, or DataFrame read from str filepath, or a portion of `train_set` if
          `holdout_set` is callable, or None"""
      #################### Update `holdout_set` ####################
      if callable(holdout_set):
          train_set, holdout_set = holdout_set(train_set, target_column)
      elif isinstance(holdout_set, str):
          holdout_set = pd.read_csv(holdout_set)
      #################### Validate `holdout_set` ####################
      try:
          if holdout_set is None or np.array_equal(
              train_set.columns, holdout_set.columns
          ):
              return train_set, holdout_set
      except AttributeError:
          raise TypeError(
              f"holdout_set must be None, DataFrame, callable, or str, not {holdout_set}"
          )
      raise ValueError(
          f"Mismatched columns\n{train_set.columns}\n!=\n{holdout_set.columns}"
      )
  
imports: from hyperparameter_hunter.callbacks.bases import BaseCallback
  from hyperparameter_hunter.i_o.reporting import ReportingHandler
  from hyperparameter_hunter.keys.makers import CrossExperimentKeyMaker
  from hyperparameter_hunter.metrics import format_metrics
  from hyperparameter_hunter.sentinels import DatasetSentinel
  from hyperparameter_hunter.settings import G, ASSETS_DIRNAME, RESULT_FILE_SUB_DIR_PATHS
  from hyperparameter_hunter.utils.boltons_utils import remap
  from hyperparameter_hunter.utils.file_utils import make_dirs, ParametersFromFile
  from hyperparameter_hunter.utils.general_utils import Alias
  from hyperparameter_hunter.utils.result_utils import format_predictions, default_do_full_save
  from inspect import signature, isclass
  import numpy
  import os.path
  import pandas
  from pandas.api.types import is_numeric_dtype
  from typing import List, Optional, Tuple, Union
  from sklearn.model_selection import _split
label_desc: Use image node_id 1 for calling a global function with example usage: define_holdout_set(train_set, holdout_set, target_column) and returns: train_set,  holdout_set