From df22721efa628ae6223b1d49fb6688ff34b16eae Mon Sep 17 00:00:00 2001 From: Maaz Ali Date: Mon, 30 Mar 2026 10:43:17 +0500 Subject: [PATCH 1/3] [Fix] GridSearchCV scoring=None defaults to CRPS If scoring= None, set it to CRPS(). --- skpro/model_selection/_tuning.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/skpro/model_selection/_tuning.py b/skpro/model_selection/_tuning.py index dbac1b22c..25e058910 100644 --- a/skpro/model_selection/_tuning.py +++ b/skpro/model_selection/_tuning.py @@ -8,6 +8,7 @@ import pandas as pd from sklearn.model_selection import ParameterGrid, ParameterSampler, check_cv +from skpro.metrics import CRPS from skpro.benchmarking.evaluate import evaluate from skpro.regression.base._delegate import _DelegatedProbaRegressor from skpro.utils.parallel import parallelize @@ -108,6 +109,8 @@ def _fit(self, X, y, C=None): # scoring = check_scoring(self.scoring, obj=self) scoring = self.scoring + if scoring is None: + scoring = CRPS() scoring_name = f"test_{scoring.name}" backend = self.backend From e81b17d12a308a15a2f86464e3a3adea679a7a72 Mon Sep 17 00:00:00 2001 From: Maaz Ali Date: Mon, 30 Mar 2026 15:19:26 +0500 Subject: [PATCH 2/3] [Fix] Supports backend in RandomizedSearchCV Added backend parameter in RandomizedSearchCV constructor. --- skpro/model_selection/_tuning.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skpro/model_selection/_tuning.py b/skpro/model_selection/_tuning.py index 25e058910..8d8a79942 100644 --- a/skpro/model_selection/_tuning.py +++ b/skpro/model_selection/_tuning.py @@ -663,6 +663,7 @@ def __init__( verbose=0, return_n_best_estimators=1, random_state=None, + backend="loky", error_score=np.nan, backend_params=None, ): @@ -673,6 +674,7 @@ def __init__( cv=cv, verbose=verbose, return_n_best_estimators=return_n_best_estimators, + backend=backend, error_score=error_score, backend_params=backend_params, ) From f1acab54c78bcc58e18eed41d5374bd8bb5e7f0b Mon Sep 17 00:00:00 2001 From: Maaz Ali Date: Wed, 29 Apr 2026 16:28:53 +0500 Subject: [PATCH 3/3] Added a parameter set to get_test_params that sets backend explicitly to "none" --- skpro/model_selection/_tuning.py | 6 ++-- skpro/model_selection/tests/__init__.py | 1 + skpro/model_selection/tests/test_tuning.py | 37 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 skpro/model_selection/tests/__init__.py create mode 100644 skpro/model_selection/tests/test_tuning.py diff --git a/skpro/model_selection/_tuning.py b/skpro/model_selection/_tuning.py index 8d8a79942..ec7c8b353 100644 --- a/skpro/model_selection/_tuning.py +++ b/skpro/model_selection/_tuning.py @@ -491,7 +491,8 @@ def get_test_params(cls, parameter_set="default"): "scoring": PinballLoss(), "error_score": "raise", } - params = [param1, param2, params3] + param_no_backend = {**param1, "backend": "None"} + params = [param1, param2, params3, param_no_backend] return params @@ -737,6 +738,7 @@ def get_test_params(cls, parameter_set="default"): "scoring": PinballLoss(), "error_score": "raise", } - params = [param1, param2, params3] + param_no_backend = {**param1, "backend": "None"} + params = [param1, param2, params3, param_no_backend] return params diff --git a/skpro/model_selection/tests/__init__.py b/skpro/model_selection/tests/__init__.py new file mode 100644 index 000000000..90ba1208e --- /dev/null +++ b/skpro/model_selection/tests/__init__.py @@ -0,0 +1 @@ +"""Tests for model selection utilities.""" \ No newline at end of file diff --git a/skpro/model_selection/tests/test_tuning.py b/skpro/model_selection/tests/test_tuning.py new file mode 100644 index 000000000..7adaaee85 --- /dev/null +++ b/skpro/model_selection/tests/test_tuning.py @@ -0,0 +1,37 @@ +"""Tests for model selection tuning utilities.""" + +import pandas as pd +import pytest +from sklearn.model_selection import KFold + +from skpro.model_selection import GridSearchCV, RandomizedSearchCV +from skpro.regression.dummy import DummyProbaRegressor +from skpro.tests.test_switch import run_test_module_changed + + +def _get_test_data(): + X = pd.DataFrame({"x": [1, 2, 3, 4]}) + y = pd.DataFrame({"y": [1.0, 2.0, 3.0, 4.0]}) + return X, y + + +@pytest.mark.skipif( + not run_test_module_changed("skpro.model_selection"), + reason="Test only if skpro.model_selection has been changed", +) +def test_randomizedsearch_accepts_backend_argument(): + """RandomizedSearchCV should accept backend argument documented in API.""" + X, y = _get_test_data() + + rscv = RandomizedSearchCV( + estimator=DummyProbaRegressor(), + cv=KFold(n_splits=2), + param_distributions={"strategy": ["empirical"]}, + n_iter=1, + scoring=None, + backend="threading", + backend_params={"n_jobs": 1}, + ) + rscv.fit(X, y) + + assert rscv.backend == "threading" \ No newline at end of file