class_docstr: Leaf Node of the Stochastic Gradient Trees (SGT).
  
  There is only one type of leaf in SGTs. It handles only gradient and hessian
  information about the target. The tree handles target transformation and encoding.
  
  Parameters
  ----------
  prediction
      The initial prediction of the leaf.
  depth
      The depth of the leaf in the tree.
  split_params
      Parameters passed to the feature quantizers.
class_docstr_tok: ["Leaf","Node","of","the","Stochastic","Gradient","Trees","(","SGT",")",".","There","is","only","one","type","of","leaf","in","SGTs",".","It","handles","only","gradient","and","hessian","information","about","the","target",".","The","tree","handles","target","transformation","and","encoding",".","Parameters","--","--","--","--","--","prediction","The","initial","prediction","of","the","leaf",".","depth","The","depth","of","the","leaf","in","the","tree",".","split_params","Parameters","passed","to","the","feature","quantizers","."]
code: def _eval_numerical_splits(
      self, feature_idx, candidate, sgt
  ) -> tuple[BranchFactory, bool]:
      skip_candidate = True
      quantizer = self._split_stats[feature_idx]  # type: ignore
  
      # Get updated quantizer params
      self.split_params[feature_idx].update(quantizer._get_params())  # type: ignore
  
      n_bins = len(quantizer)
      if n_bins == 1:  # Insufficient number of bins to perform splits
          return candidate, skip_candidate
  
      skip_candidate = False
      candidate.merit.loss_mean = math.inf
      candidate.merit.delta_pred = {}
  
      # Auxiliary gradient and hessian statistics
      left_ghs = GradHessStats()
      left_dlms = stats.Var()
      for thresh, ghs in quantizer:  # type: ignore
          left_ghs += ghs
          left_delta_pred = self.delta_prediction(
              left_ghs.mean, sgt.lambda_value
          )
          left_dlms += left_ghs.delta_loss_mean_var(left_delta_pred)
  
          right_ghs = self._update_stats - left_ghs
          right_delta_pred = self.delta_prediction(
              right_ghs.mean, sgt.lambda_value
          )
          right_dlms = right_ghs.delta_loss_mean_var(right_delta_pred)
  
          all_dlms = left_dlms + right_dlms
  
          loss_mean = all_dlms.mean.get()
          loss_var = all_dlms.get()
  
          if loss_mean < candidate.merit.loss_mean:
              candidate.merit.loss_mean = (
                  loss_mean + 2.0 * sgt.gamma / self.total_weight
              )
              candidate.merit.loss_var = loss_var
              candidate.merit.delta_pred[0] = left_delta_pred
              candidate.merit.delta_pred[1] = right_delta_pred
  
              candidate.split_info = thresh
  
      return candidate, skip_candidate
  
imports: from __future__ import annotations
  import collections
  import math
  import numbers
  import sys
  from collections.abc import Hashable
  from river import stats
  from river.base.typing import FeatureName
  from ..base import Leaf
  from ..splitter.sgt_quantizer import DynamicQuantizer, StaticQuantizer
  from ..utils import BranchFactory, GradHess, GradHessMerit, GradHessStats
  from .branch import NominalMultiwayBranch, NumericBinaryBranch
label_desc: Use image node_id 7 for calling the SGTLeaf obj's underlying member method code with example usage: obj._eval_numerical_splits(feature_idx, candidate, sgt) and returns: candidate,  skip_candidate, candidate,  skip_candidate