code: def _infer_base_model_names(self):
      stack_column_names = self.feature_metadata.get_features(
          required_special_types=[S_STACK]
      )
  
      if self.problem_type == QUANTILE:
          columns_class_0 = [
              column
              for column in stack_column_names
              if column.endswith(
                  "_{}".format(str(self.quantile_levels[0]))
              )
          ]
          base_model_names = [
              column.rsplit("_", 1)[0] for column in columns_class_0
          ]
      elif self.num_pred_cols_per_model > 1:
          columns_class_0 = [
              column
              for column in stack_column_names
              if column.endswith("_0")
          ]
          base_model_names = [column[:-2] for column in columns_class_0]
      else:
          base_model_names = stack_column_names
      return base_model_names
  
imports: import logging
  from autogluon.common.features.types import S_STACK
  from ...constants import MULTICLASS, QUANTILE, SOFTCLASS
  from ..abstract.abstract_model import AbstractModel
  from .ensemble_selection import EnsembleSelection, SimpleWeightedEnsemble
label_desc: Use image node_id 10 for calling the GreedyWeightedEnsembleModel obj's underlying member method code with example usage: obj._infer_base_model_names() and returns: base_model_names