code: def stop_by_no_improvement(
      logs: ListLogListType,
      extractor: ExtractorFnType,
      metric_name: str,
      early_stop: int = 3,
      threshold: float = 0.001,
  ) -> bool:
      """
      Checks for logs to see if feature selection should stop
  
      Parameters
      ----------
      logs : list of list of dict
          A list of log-like lists of dictionaries evaluations.
  
      extractor: function str -> float
          A extractor that take a string and returns the value of that string on a dict
  
      metric_name: str
          String with the name of the column that refers to the metric column to be extracted
  
      early_stop: int (default 3)
          Number of iteration without improval before stopping
  
      threshold: float (default 0.001)
          Threshold for model performance comparison
  
      Returns
      ----------
      stop: bool
          A boolean whether to stop recursion or not
      """
  
      if len(logs) < early_stop:
          return False
  
      limited_logs = list(take(early_stop, logs))
      curr_auc = get_avg_metric_from_extractor(
          limited_logs[-1], extractor, metric_name
      )
  
      return all(
          [
              (
                  curr_auc
                  - get_avg_metric_from_extractor(
                      log, extractor, metric_name
                  )
              )
              <= threshold
              for log in limited_logs[:-1]
          ]
      )
  
file_path: fklearn/src/fklearn/tuning/stoppers.py
imports: from typing import Callable
  from toolz.curried import curry, take, first
  from fklearn.tuning.utils import get_best_performing_log, get_avg_metric_from_extractor, get_used_features
  from fklearn.types import ExtractorFnType, ListLogListType
label_desc: Use image node_id 3 for calling a global function with example usage: stop_by_no_improvement(logs, extractor, metric_name, early_stop, threshold) and returns: all, False