docstr: Perform a statistical test of the probabilities predicted by the model against
  what we'd expect under the no-change null.
  
  Parameters
  ----------
  y_oof
      Out of fold targets (0 ref, 1 cur)
  probs_oof
      Probabilities predicted by the model
  n_ref
      Size of reference window used in training model
  n_cur
      Size of current window used in training model
  
  Returns
  -------
  p-value and notion of performance of classifier relative to expectation under null
docstr_tok: ["Perform","a","statistical","test","of","the","probabilities","predicted","by","the","model","against","what","we","'d","expect","under","the","no-change","null",".","Parameters","--","--","--","--","--","y_oof","Out","of","fold","targets","(","0","ref",",","1","cur",")","probs_oof","Probabilities","predicted","by","the","model","n_ref","Size","of","reference","window","used","in","training","model","n_cur","Size","of","current","window","used","in","training","model","Returns","--","--","--","-","p-value","and","notion","of","performance","of","classifier","relative","to","expectation","under","null"]
code: def test_probs(
      self,
      y_oof: np.ndarray,
      probs_oof: np.ndarray,
      n_ref: int,
      n_cur: int,
  ) -> Tuple[float, float]:
      """
      Perform a statistical test of the probabilities predicted by the model against
      what we'd expect under the no-change null.
  
      Parameters
      ----------
      y_oof
          Out of fold targets (0 ref, 1 cur)
      probs_oof
          Probabilities predicted by the model
      n_ref
          Size of reference window used in training model
      n_cur
          Size of current window used in training model
  
      Returns
      -------
      p-value and notion of performance of classifier relative to expectation under null
      """
      probs_oof = probs_oof[:, 1]  # [1-p, p]
  
      if self.binarize_preds:
          baseline_accuracy = max(n_ref, n_cur) / (
              n_ref + n_cur
          )  # exp under null
          n_oof = y_oof.shape[0]
          n_correct = (y_oof == probs_oof.round()).sum()
          p_val = binom_test(
              n_correct, n_oof, baseline_accuracy, alternative="greater"
          )
          accuracy = n_correct / n_oof
          # relative error reduction, in [0,1]
          # e.g. (90% acc -> 99% acc) = 0.9, (50% acc -> 59% acc) = 0.18
          dist = 1 - (1 - accuracy) / (1 - baseline_accuracy)
          dist = max(0, dist)  # below 0 = no evidence for drift
      else:
          probs_ref = probs_oof[y_oof == 0]
          probs_cur = probs_oof[y_oof == 1]
          dist, p_val = ks_2samp(
              probs_ref, probs_cur, alternative="greater"
          )
  
      return p_val, dist
  
imports: import logging
  from abc import abstractmethod
  from typing import Callable, Dict, List, Optional, Tuple, Union, Any
  import numpy
  from alibi_detect.base import BaseDetector, concept_drift_dict, DriftConfigMixin
  from alibi_detect.cd.utils import get_input_shape, update_reference
  from alibi_detect.utils.frameworks import has_pytorch, has_tensorflow
  from alibi_detect.utils.statstest import fdr
  from scipy.stats import binom_test, ks_2samp
  from sklearn.model_selection import StratifiedKFold
label_desc: Use image node_id 4 for calling the BaseClassifierDrift obj's underlying member method code with example usage: obj.test_probs(y_oof, probs_oof, n_ref, n_cur) and returns: p_val,  dist