diff --git a/doc/whats_new/v0.15.rst b/doc/whats_new/v0.15.rst index 7ef7284b8..04f8c002b 100644 --- a/doc/whats_new/v0.15.rst +++ b/doc/whats_new/v0.15.rst @@ -11,6 +11,11 @@ Changelog Bug fixes ......... +- Fix :meth:`~imblearn.metrics.pairwise.ValueDifferenceMetric.pairwise` to + validate the number of features in `X` and `Y` instead of silently ignoring + extra features. + :issue:`1198` by :user:`A Aswanth Raj `. + Enhancements ............ diff --git a/imblearn/metrics/pairwise.py b/imblearn/metrics/pairwise.py index 701e7475a..209f55fcb 100644 --- a/imblearn/metrics/pairwise.py +++ b/imblearn/metrics/pairwise.py @@ -210,11 +210,15 @@ def pairwise(self, X, Y=None): The VDM pairwise distance. """ check_is_fitted(self) - X = check_array(X, ensure_non_negative=True, dtype=np.int32) + X = validate_data( + self, X=X, reset=False, ensure_non_negative=True, dtype=np.int32 + ) n_samples_X = X.shape[0] if Y is not None: - Y = check_array(Y, ensure_non_negative=True, dtype=np.int32) + Y = validate_data( + self, X=Y, reset=False, ensure_non_negative=True, dtype=np.int32 + ) n_samples_Y = Y.shape[0] else: n_samples_Y = n_samples_X diff --git a/imblearn/metrics/tests/test_pairwise.py b/imblearn/metrics/tests/test_pairwise.py index d28157d97..9973036d4 100644 --- a/imblearn/metrics/tests/test_pairwise.py +++ b/imblearn/metrics/tests/test_pairwise.py @@ -170,3 +170,15 @@ def test_value_difference_value_unfitted(data): with pytest.raises(NotFittedError): ValueDifferenceMetric().pairwise(X_encoded) + + +@pytest.mark.parametrize("invalid_arg", ["X", "Y"]) +def test_value_difference_metric_wrong_n_features(data, invalid_arg): + X, y = data + X_encoded = OrdinalEncoder(dtype=np.int32).fit_transform(X) + X_invalid = np.column_stack([X_encoded, np.zeros(X_encoded.shape[0])]) + vdm = ValueDifferenceMetric().fit(X_encoded, y) + + pairwise_args = (X_invalid,) if invalid_arg == "X" else (X_encoded, X_invalid) + with pytest.raises(ValueError, match="X has 4 features"): + vdm.pairwise(*pairwise_args)