Hellinger#
- class capymoa.drift.detectors.Hellinger[source]#
Bases:
BaseDataDriftDetectorHellinger Distance
Measures the similarity between two probability distributions by comparing binned proportions. The Hellinger distance is symmetric and bounded in
[0, 1], where 0 means the distributions are identical and 1 means they have no overlap.Related to the Bhattacharyya coefficient:
H = sqrt(1 - BC)whereBC = sum(sqrt(p * q)).Drift is declared when the distance exceeds
threshold. Applied independently to each feature using the configured threshold. Overall drift is reported when any feature flags drift. This detector does not return p-values, and thecorrectionparameter has no effect on its drift decisions. No Bonferroni correction is applied.Example:#
>>> import numpy as np >>> from capymoa.drift.detectors import Hellinger >>> rng = np.random.default_rng(42) >>> detector = Hellinger(window_size=50, num_bins=20, threshold=0.1) >>> detector.fit(rng.normal(0, 1, size=(200, 2))) >>> for x in rng.normal(3, 1, size=(50, 2)): ... detector.add_element(x) >>> detector.detected_change() True
Reference:#
Hellinger, Ernst. “Neue Begründung der Theorie quadratischer Formen von unendlichvielen Veränderlichen.” Journal für die reine und angewandte Mathematik 136 (1909): 210-271.
- __init__(
- window_size: int,
- num_bins: int = 10,
- threshold: float = 0.1,
- correction: Literal['bonferroni', 'none'] = 'bonferroni',
- auto_fit_samples: int | None = None,
Create a Hellinger data drift detector.
- Parameters:
window_size – Number of observations in the sliding window.
num_bins – Number of equal-width bins for proportion estimation.
threshold – Distance above which drift is declared (per feature). Must be in
(0, 1].correction – Accepted for interface consistency with other detectors, but has no effect: this detector does not produce p-values, so no multiple-testing correction is applied to its drift decisions.
auto_fit_samples – Number of initial samples for auto-fit.
- Raises:
ValueError – If num_bins < 1 or threshold not in
(0, 1].
- _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.