diff --git a/doc/whats_new/v1.1.rst b/doc/whats_new/v1.1.rst index f0d00501d3368..57bb1bd36720b 100644 --- a/doc/whats_new/v1.1.rst +++ b/doc/whats_new/v1.1.rst @@ -173,6 +173,13 @@ Changelog instead of `__init__`. :pr:`21434` by :user:`Krum Arnaudov `. + +:mod:`sklearn.decomposition.KernelPCA` +...................................... +- |Fix| :class:`decomposition.KernelPCA` now validates input parameters in + `fit` instead of `__init__`. + :pr:`21567` by :user:`Maggie Chege `. + :mod:`sklearn.svm` .................. diff --git a/sklearn/decomposition/_kernel_pca.py b/sklearn/decomposition/_kernel_pca.py index 0efcf2d4fd341..bf08c7e215ccc 100644 --- a/sklearn/decomposition/_kernel_pca.py +++ b/sklearn/decomposition/_kernel_pca.py @@ -257,8 +257,6 @@ def __init__( copy_X=True, n_jobs=None, ): - if fit_inverse_transform and kernel == "precomputed": - raise ValueError("Cannot fit_inverse_transform with a precomputed kernel.") self.n_components = n_components self.kernel = kernel self.kernel_params = kernel_params @@ -429,6 +427,8 @@ def fit(self, X, y=None): self : object Returns the instance itself. """ + if self.fit_inverse_transform and self.kernel == "precomputed": + raise ValueError("Cannot fit_inverse_transform with a precomputed kernel.") X = self._validate_data(X, accept_sparse="csr", copy=self.copy_X) self._centerer = KernelCenterer() K = self._get_kernel(X) diff --git a/sklearn/decomposition/tests/test_kernel_pca.py b/sklearn/decomposition/tests/test_kernel_pca.py index 72b40ec83e308..848b9bb1b9bbf 100644 --- a/sklearn/decomposition/tests/test_kernel_pca.py +++ b/sklearn/decomposition/tests/test_kernel_pca.py @@ -78,8 +78,12 @@ def test_kernel_pca_invalid_parameters(): Tests fitting inverse transform with a precomputed kernel raises a ValueError. """ - with pytest.raises(ValueError): - KernelPCA(10, fit_inverse_transform=True, kernel="precomputed") + estimator = KernelPCA( + n_components=10, fit_inverse_transform=True, kernel="precomputed" + ) + err_ms = "Cannot fit_inverse_transform with a precomputed kernel" + with pytest.raises(ValueError, match=err_ms): + estimator.fit(np.random.randn(10, 10)) def test_kernel_pca_consistent_transform(): diff --git a/sklearn/tests/test_common.py b/sklearn/tests/test_common.py index a777e0e716eb1..483c0c7641a63 100644 --- a/sklearn/tests/test_common.py +++ b/sklearn/tests/test_common.py @@ -410,7 +410,6 @@ def test_transformers_get_feature_names_out(transformer): "FeatureUnion", "GridSearchCV", "HalvingGridSearchCV", - "KernelPCA", "Pipeline", "SGDOneClassSVM", "TheilSenRegressor",