class_docstr: Close implementation based on description in Nelson
  'Behavior of Machine Learning Algorithms in Adversarial Environments' Ch. 4.4
  
  | Textbook link: https://people.eecs.berkeley.edu/~adj/publications/paper-files/EECS-2010-140.pdf
class_docstr_tok: ["Close","implementation","based","on","description","in","Nelson","'Behavior","of","Machine","Learning","Algorithms","in","Adversarial","Environments","'","Ch",".","4.4","|","Textbook","link",":","https",":","\/\/people.eecs.berkeley.edu\/~adj\/publications\/paper-files\/EECS-2010-140.pdf"]
docstr: Returns True if a given performance shift is suspicious
  
  :param before_classifier: The classifier without untrusted data.
  :param perf_shift: A shift in performance.
  :return: True if a given performance shift is suspicious, false otherwise.
docstr_tok: ["Returns","True","if","a","given","performance","shift","is","suspicious",":","param","before_classifier",":","The","classifier","without","untrusted","data",".",":","param","perf_shift",":","A","shift","in","performance",".",":","return",":","True","if","a","given","performance","shift","is","suspicious",",","false","otherwise","."]
code: def is_suspicious(
      self, before_classifier: "CLASSIFIER_TYPE", perf_shift: float
  ) -> bool:
      """
      Returns True if a given performance shift is suspicious
  
      :param before_classifier: The classifier without untrusted data.
      :param perf_shift: A shift in performance.
      :return: True if a given performance shift is suspicious, false otherwise.
      """
      if self.calibrated:
          median, std_dev = self.get_calibration_info(before_classifier)
          return bool(perf_shift < median - 3 * std_dev)
  
      return bool(perf_shift < -self.eps)
  
file_path: adversarial-robustness-toolbox/art/defences/detector/poison/roni.py
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from copy import deepcopy
  from typing import Callable, List, Tuple, Union, TYPE_CHECKING
  import numpy
  from sklearn.model_selection import train_test_split
  from art.defences.detector.poison.ground_truth_evaluator import GroundTruthEvaluator
  from art.defences.detector.poison.poison_filtering_defence import PoisonFilteringDefence
  from art.utils import performance_diff
label_desc: Use image node_id 4 for calling the RONIDefense obj's underlying member method code with example usage: obj.is_suspicious(before_classifier, perf_shift) and returns: bool, bool