From df22721efa628ae6223b1d49fb6688ff34b16eae Mon Sep 17 00:00:00 2001 From: Maaz Ali Date: Mon, 30 Mar 2026 10:43:17 +0500 Subject: [PATCH 1/2] [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 d793842ab6dbfc77b1a94554da4a89d2cec8ae5d Mon Sep 17 00:00:00 2001 From: Maaz Ali Date: Wed, 1 Apr 2026 12:55:58 +0500 Subject: [PATCH 2/2] Added tests for both RandomizedSearchCV() and GridSearchCV() when scoring= None, should default to CRPS() --- skpro/model_selection/tests/__init__.py | 1 + skpro/model_selection/tests/test_tuning.py | 53 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) 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/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..a2995b2a3 --- /dev/null +++ b/skpro/model_selection/tests/test_tuning.py @@ -0,0 +1,53 @@ +"""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_gridsearch_scoring_none_defaults_to_crps(): + """GridSearchCV should use CRPS when scoring is None.""" + X, y = _get_test_data() + + gscv = GridSearchCV( + estimator=DummyProbaRegressor(), + cv=KFold(n_splits=2), + param_grid={"strategy": ["empirical"]}, + scoring=None, + ) + gscv.fit(X, y) + + assert "mean_test_CRPS" in gscv.cv_results_.columns + + +def test_randomizedsearch_scoring_none_defaults_to_crps(): + """RandomizedSearchCV should use CRPS when scoring is None.""" + X, y = _get_test_data() + + rscv = RandomizedSearchCV( + estimator=DummyProbaRegressor(), + cv=KFold(n_splits=2), + param_distributions={"strategy": ["empirical"]}, + n_iter=1, + scoring=None, + backend_params={"n_jobs": 1}, + ) + rscv.fit(X, y) + + assert "mean_test_CRPS" in rscv.cv_results_.columns + +