docstr: Fits and scores a model over the given feature subset (ex. features remaining in a particular feature pruning round).
  Returns the fitted model, its score, and time elapsed. If this is the first time we are fitting a model in the pruning
  procedure, save time and score statistics.
docstr_tok: ["Fits","and","scores","a","model","over","the","given","feature","subset","(","ex",".","features","remaining","in","a","particular","feature","pruning","round",")",".","Returns","the","fitted","model",",","its","score",",","and","time","elapsed",".","If","this","is","the","first","time","we","are","fitting","a","model","in","the","pruning","procedure",",","save","time","and","score","statistics","."]
code: def fit_score_model(
      self,
      X: pd.DataFrame,
      y: pd.Series,
      X_val: pd.DataFrame,
      y_val: pd.Series,
      features: List[str],
      model_name: str,
      **kwargs,
  ) -> Tuple[AbstractModel, float, float]:
      """
      Fits and scores a model over the given feature subset (ex. features remaining in a particular feature pruning round).
      Returns the fitted model, its score, and time elapsed. If this is the first time we are fitting a model in the pruning
      procedure, save time and score statistics.
      """
      time_start = time.time()
      model = self.model_class(**self.model_params)
      if self.replace_bag:
          model = model.convert_to_template_child()
      model.rename(model_name)
      X = X[features]
      X_val = None if self.is_bagged else X_val[features]
      if "time_limit" in kwargs:
          time_remaining = self.time_limit - (
              time.time() - self.time_start
          )
          kwargs["time_limit"] = time_remaining
      model.fit(X=X, y=y, X_val=X_val, y_val=y_val, **kwargs)
      time_fit = time.time() - time_start
      score = (
          model.score_with_oof(y)
          if self.is_bagged
          else model.score(X=X_val, y=y_val)
      )
      time_fit_score = time.time() - time_start
      if self.fit_score_time is None:
          self.fit_score_time = time_fit_score
      if self.model_predict_time is None:
          self.model_predict_time = (
              model.predict_time
              if self.is_bagged
              else time_fit_score - time_fit
          )
      return model, score, time_fit_score
  
imports: import logging
  import time
  import traceback
  import uuid
  from copy import deepcopy
  from typing import List, Set, Tuple, Union
  import numpy
  import pandas
  from autogluon.common.features.types import R_FLOAT
  from ..models.abstract.abstract_model import AbstractModel
  from ..models.ensemble.bagged_ensemble_model import BaggedEnsembleModel
  from ..utils.exceptions import TimeLimitExceeded
  from ..utils.utils import generate_train_test_split, unevaluated_fi_df_template
label_desc: Use image node_id 8 for calling the FeatureSelector obj's underlying member method code with example usage: obj.fit_score_model(X, y, X_val, y_val, features, model_name) and returns: model,  score,  time_fit_score