AndersonDarling#
- class capymoa.drift.detectors.AndersonDarling[source]#
Bases:
BaseDataDriftDetectorAnderson-Darling K-Sample Test
Univariate statistical test that compares two samples by measuring the integrated squared difference between their empirical CDFs, weighted to give more sensitivity in the tails than the Kolmogorov-Smirnov test.
Applied per feature, with Bonferroni correction by default.
Note
p-values are bounded between 0.001 and 0.25 by
scipy.stats.anderson_ksamp(). Withcorrection="bonferroni",fit()raisesValueErrorifalpha / n_featuresfalls at or below the 0.001 floor, since drift could then never be declared regardless of the data.Example:#
>>> import numpy as np >>> from capymoa.drift.detectors import AndersonDarling >>> rng = np.random.default_rng(42) >>> detector = AndersonDarling(window_size=50) >>> detector.fit(rng.normal(0, 1, size=(200, 2))) >>> for x in rng.normal(0.8, 1, size=(50, 2)): ... detector.add_element(x) >>> detector.detected_change() True
Reference:#
Scholz, Fritz W., and Michael A. Stephens. “K-sample Anderson-Darling tests.” Journal of the American Statistical Association 82.399 (1987): 918-924.
- __init__(
- window_size: int,
- alpha: float = 0.05,
- correction: Literal['bonferroni', 'none'] = 'bonferroni',
- auto_fit_samples: int | None = None,
Create an Anderson-Darling data drift detector.
- Parameters:
window_size – Number of observations in the sliding window.
alpha – Significance level for drift decisions.
correction – Multiple-testing correction across features.
auto_fit_samples – Number of initial samples for auto-fit.
- _fit(X: ndarray) None[source]#
Store or preprocess the reference data.
Called by
fit()after validation. X is guaranteed to be a 2-Dnp.ndarraywith shape(n_samples, n_features).At minimum, implementations should set
self._X_ref = X.
- _test( ) DataDriftResult[source]#
Run the underlying statistical test or distance measure.
When
IS_UNIVARIATE = Truethis receives one feature at a time: both arrays are 1-D with shapes(n_ref,)and(n_test,). The subclass should setstatisticandp_value(if available) on the returned result.If
p_valueis set, the base class applies the configuredcorrectionand ignores the per-featureis_driftflag. Example:def _test(self, x_ref, x_test): stat, p = scipy.stats.ks_2samp(x_ref, x_test) return DataDriftResult( is_drift=False, statistic=stat, p_value=p )
If
p_valueis leftNone(distance- or score-based tests), the base class uses the per-featureis_driftflag directly andcorrectionhas no effect – the subclass is responsible for its own per-feature decision (e.g. comparing a distance to a threshold).When
IS_UNIVARIATE = Falsethis receives all features: both arrays are 2-D with shapes(n_ref, n_features)and(n_test, n_features). The subclass is responsible for the fullDataDriftResultincludingis_drift.
- add_element(element: float | ndarray) None[source]#
Add one observation and check for drift.
The observation is appended to a sliding window of size
window_size. Once full, the detector compares the window against the reference on every call.If the detector is not yet fitted and
auto_fit_samplesis set, those initial observations build the reference. No comparison happens until then. If it is not fitted and auto-fit is not enabled, this raisesRuntimeError.- Parameters:
element – A single observation – a scalar for univariate data, or a 1-D array for multivariate data.
- Raises:
RuntimeError – If the detector is not fitted and auto-fit mode is not enabled. Call
fit()first, or construct withauto_fit_samples.ValueError – If the observation has a different number of features than the reference.
- compare(
- X_test: ndarray,
One-shot batch comparison against the reference.
Unlike
add_element(), this does not update the internal window or detection history. It is useful for offline evaluation.auto_fit_samplesdoes not apply here; callfit()first.- Parameters:
X_test – Test data with the same number of features as the reference.
- Raises:
RuntimeError – If
fit()has not been called.ValueError – If X_test has a different number of features than the reference.
- Returns:
Comparison result.
- fit( ) None[source]#
Set the reference distribution.
This detector has
REQUIRES_FITset toTrue. Callfit()beforeadd_element()orcompare(), unlessauto_fit_sampleswas set soadd_element()can collect the reference. Callingfit()again replaces the reference (a sliding reference window).- Parameters:
X – Reference data, shape
(n_samples,)or(n_samples, n_features). May also be a pandas DataFrame, in which case column names are extracted automatically.feature_names – Optional names for each feature. If provided, must have length equal to the number of features. Overrides column names extracted from a DataFrame. When set, per-feature dicts in
DataDriftResultuse these names as keys instead of integer indices.
- Raises:
ValueError – If X is empty or feature_names length does not match the number of features.
- classmethod from_params( ) Any[source]#
Construct an instance from parameters produced by
get_params.
- reset(clean_history: bool = False) None[source]#
Reset the detector state.
- Parameters:
clean_history – If
True, also clear the reference data and detection history. IfFalse(default), only the sliding window and current result are cleared; the reference and detection indices are preserved.
- IS_UNIVARIATE: bool = True#
If
Truethe test is applied to each feature separately and results are combined. IfFalsethe test runs on the joint distribution.
- REQUIRES_FIT: bool = True#
Data drift detectors need a reference distribution. Call
fit()or setauto_fit_samplessoadd_element()can collect it.
- property is_fitted: bool#
Whether the reference distribution has been set.
Trueafterfit(), or afteradd_element()has collectedauto_fit_samplesobservations.
- property result: DataDriftResult | None#
Most recent comparison result, or
Noneduring warm-up.