Source code for renate.shift.ks_detector
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import torch
from scipy.stats import kstest
from renate.shift.detector import ShiftDetectorWithFeatureExtractor
[docs]
class KolmogorovSmirnovCovariateShiftDetector(ShiftDetectorWithFeatureExtractor):
"""A Kolmogorov-Smirnov (KS) test on each feature.
A KS test is a univariate two-sample test, which we perform separately for each feature. To
aggregate these tests without running into multiple-testing problems, we use a Bonferroni
correction, as proposed in
Rabanser et al. Failing Loudly: An Empirical Study of Methods for Detecting Dataset Shift.
NeurIPS 2019.
"""
def _fit_with_features(self, X: torch.Tensor) -> None:
self._X_ref = X
def _score_with_features(self, X: torch.Tensor) -> float:
n_features = X.size(1)
p_vals = [
kstest(X[:, i].numpy(), self._X_ref[:, i].numpy()).pvalue for i in range(n_features)
]
# Bonferroni correction: Reject only if the minimal p-value among the multiple tests is
# lower than `alpha / num_tests`, where `alpha` is the significance level. Equivalently, we
# multiply the p-value by `num_tests`.
p_val = min(1.0, min(p_vals) * n_features)
return 1.0 - p_val