code: def best_model(self) -> Optional[LudwigModel]:
      checkpoint = self._experiment_analysis.best_checkpoint
      if checkpoint is None:
          logger.warning("No best model found")
          return None
  
      ckpt_type, ckpt_path = checkpoint.get_internal_representation()
      if ckpt_type == "uri":
          # Read remote URIs using Ludwig's internal remote file loading APIs, as
          # Ray's do not handle custom credentials at the moment.
          with use_credentials(self._creds):
              return LudwigModel.load(os.path.join(ckpt_path, "model"))
      else:
          with checkpoint.as_directory() as ckpt_path:
              return LudwigModel.load(os.path.join(ckpt_path, "model"))
  
imports: import argparse
  import copy
  import logging
  import os
  import warnings
  from typing import Any, Dict, List, Optional, Union
  import numpy
  import pandas
  import yaml
  from ludwig.api import LudwigModel
  from ludwig.api_annotations import PublicAPI
  from ludwig.automl.base_config import create_default_config, DatasetInfo, get_dataset_info, get_features_config, get_reference_configs
  from ludwig.backend import Backend, initialize_backend
  from ludwig.constants import AUTO, AUTOML_DEFAULT_IMAGE_ENCODER, AUTOML_DEFAULT_TABULAR_MODEL, AUTOML_DEFAULT_TEXT_ENCODER, BINARY, CATEGORY, ENCODER, HYPEROPT, IMAGE, INPUT_FEATURES, NAME, NUMBER, OUTPUT_FEATURES, TABULAR, TEXT, TRAINER, TYPE
  from ludwig.contrib import add_contrib_callback_args
  from ludwig.data.cache.types import CacheableDataset
  from ludwig.datasets import load_dataset_uris
  from ludwig.globals import LUDWIG_VERSION
  from ludwig.hyperopt.run import hyperopt
  from ludwig.schema.model_config import ModelConfig
  from ludwig.types import ModelConfigDict
  from ludwig.utils.automl.ray_utils import _ray_init
  from ludwig.utils.automl.utils import _add_transfer_config, get_model_type, set_output_feature_metric
  from ludwig.utils.data_utils import load_dataset, use_credentials
  from ludwig.utils.defaults import default_random_seed
  from ludwig.utils.fs_utils import open_file
  from ludwig.utils.heuristics import get_auto_learning_rate
  from ludwig.utils.misc_utils import merge_dict
  from ludwig.utils.print_utils import print_ludwig
label_desc: Use image node_id 4 for calling the AutoTrainResults obj's underlying member method code with example usage: obj.best_model() and returns: None, LudwigModel, LudwigModel