Skip to content

Commit 1bd9c1d

Browse files
authored
FIX GridSearchCV regression in 1.5 with parameter grid with heterogeneous parameter values (scikit-learn#29078)
1 parent 6a18882 commit 1bd9c1d

File tree

3 files changed

+89
-26
lines changed

3 files changed

+89
-26
lines changed

doc/whats_new/v1.5.rst

+43-25
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,24 @@ For a short description of the main highlights of the release, please refer to
1313

1414
.. include:: changelog_legend.inc
1515

16+
.. _changes_1_5_1:
17+
18+
Version 1.5.1
19+
=============
20+
21+
**TODO**
22+
23+
Changelog
24+
---------
25+
26+
:mod:`sklearn.model_selection`
27+
..............................
28+
29+
- |Fix| Fix a regression in :class:`model_selection.GridSearchCV` for parameter
30+
grids that have heterogeneous parameter values.
31+
:pr:`29078` by :user:`Loïc Estève <lesteve>`
32+
33+
1634
.. _changes_1_5:
1735

1836
Version 1.5.0
@@ -550,29 +568,29 @@ Changelog
550568
Thanks to everyone who has contributed to the maintenance and improvement of
551569
the project since version 1.4, including:
552570

553-
101AlexMartin, Abdulaziz Aloqeely, Adam J. Stewart, Adam Li, Adarsh Wase, Adrin
554-
Jalali, Advik Sinha, Akash Srivastava, Akihiro Kuno, Alan Guedes, Alexis
555-
IMBERT, Ana Paula Gomes, Anderson Nelson, Andrei Dzis, Arnaud Capitaine, Arturo
556-
Amor, Aswathavicky, Bharat Raghunathan, Brendan Lu, Bruno, Cemlyn, Christian
557-
Lorentzen, Christian Veenhuis, Cindy Liang, Claudio Salvatore Arcidiacono,
558-
Connor Boyle, Conrad Stevens, crispinlogan, davidleon123, DerWeh, Dipan Banik,
559-
Duarte São José, DUONG, Eddie Bergman, Edoardo Abati, Egehan Gunduz, Emad
560-
Izadifar, Erich Schubert, Filip Karlo Došilović, Franck Charras, Gael
561-
Varoquaux, Gönül Aycı, Guillaume Lemaitre, Gyeongjae Choi, Harmanan Kohli,
562-
Hong Xiang Yue, Ian Faust, itsaphel, Ivan Wiryadi, Jack Bowyer, Javier Marin
563-
Tur, Jérémie du Boisberranger, Jérôme Dockès, Jiawei Zhang, Joel Nothman,
564-
Johanna Bayer, John Cant, John Hopfensperger, jpcars, jpienaar-tuks, Julian
565-
Libiseller-Egger, Julien Jerphanion, KanchiMoe, Kaushik Amar Das, keyber,
566-
Koustav Ghosh, kraktus, Krsto Proroković, ldwy4, LeoGrin, lihaitao, Linus
567-
Sommer, Loic Esteve, Lucy Liu, Lukas Geiger, manasimj, Manuel Labbé, Manuel
568-
Morales, Marco Edward Gorelli, Maren Westermann, Marija Vlajic, Mark Elliot,
569-
Mateusz Sokół, Mavs, Michael Higgins, Michael Mayer, miguelcsilva, Miki
570-
Watanabe, Mohammed Hamdy, myenugula, Nathan Goldbaum, Naziya Mahimkar, Neto,
571-
Olivier Grisel, Omar Salman, Patrick Wang, Pierre de Fréminville, Priyash
572-
Shah, Puneeth K, Rahil Parikh, raisadz, Raj Pulapakura, Ralf Gommers, Ralph
573-
Urlus, Randolf Scholz, Reshama Shaikh, Richard Barnes, Rodrigo Romero, Saad
574-
Mahmood, Salim Dohri, Sandip Dutta, SarahRemus, scikit-learn-bot, Shaharyar
575-
Choudhry, Shubham, sperret6, Stefanie Senger, Suha Siddiqui, Thanh Lam DANG,
576-
thebabush, Thomas J. Fan, Thomas Lazarus, Thomas Li, Tialo, Tim Head, Tuhin
577-
Sharma, VarunChaduvula, Vineet Joshi, virchan, Waël Boukhobza, Weyb, Will
571+
101AlexMartin, Abdulaziz Aloqeely, Adam J. Stewart, Adam Li, Adarsh Wase, Adrin
572+
Jalali, Advik Sinha, Akash Srivastava, Akihiro Kuno, Alan Guedes, Alexis
573+
IMBERT, Ana Paula Gomes, Anderson Nelson, Andrei Dzis, Arnaud Capitaine, Arturo
574+
Amor, Aswathavicky, Bharat Raghunathan, Brendan Lu, Bruno, Cemlyn, Christian
575+
Lorentzen, Christian Veenhuis, Cindy Liang, Claudio Salvatore Arcidiacono,
576+
Connor Boyle, Conrad Stevens, crispinlogan, davidleon123, DerWeh, Dipan Banik,
577+
Duarte São José, DUONG, Eddie Bergman, Edoardo Abati, Egehan Gunduz, Emad
578+
Izadifar, Erich Schubert, Filip Karlo Došilović, Franck Charras, Gael
579+
Varoquaux, Gönül Aycı, Guillaume Lemaitre, Gyeongjae Choi, Harmanan Kohli,
580+
Hong Xiang Yue, Ian Faust, itsaphel, Ivan Wiryadi, Jack Bowyer, Javier Marin
581+
Tur, Jérémie du Boisberranger, Jérôme Dockès, Jiawei Zhang, Joel Nothman,
582+
Johanna Bayer, John Cant, John Hopfensperger, jpcars, jpienaar-tuks, Julian
583+
Libiseller-Egger, Julien Jerphanion, KanchiMoe, Kaushik Amar Das, keyber,
584+
Koustav Ghosh, kraktus, Krsto Proroković, ldwy4, LeoGrin, lihaitao, Linus
585+
Sommer, Loic Esteve, Lucy Liu, Lukas Geiger, manasimj, Manuel Labbé, Manuel
586+
Morales, Marco Edward Gorelli, Maren Westermann, Marija Vlajic, Mark Elliot,
587+
Mateusz Sokół, Mavs, Michael Higgins, Michael Mayer, miguelcsilva, Miki
588+
Watanabe, Mohammed Hamdy, myenugula, Nathan Goldbaum, Naziya Mahimkar, Neto,
589+
Olivier Grisel, Omar Salman, Patrick Wang, Pierre de Fréminville, Priyash
590+
Shah, Puneeth K, Rahil Parikh, raisadz, Raj Pulapakura, Ralf Gommers, Ralph
591+
Urlus, Randolf Scholz, Reshama Shaikh, Richard Barnes, Rodrigo Romero, Saad
592+
Mahmood, Salim Dohri, Sandip Dutta, SarahRemus, scikit-learn-bot, Shaharyar
593+
Choudhry, Shubham, sperret6, Stefanie Senger, Suha Siddiqui, Thanh Lam DANG,
594+
thebabush, Thomas J. Fan, Thomas Lazarus, Thomas Li, Tialo, Tim Head, Tuhin
595+
Sharma, VarunChaduvula, Vineet Joshi, virchan, Waël Boukhobza, Weyb, Will
578596
Dean, Xavier Beltran, Xiao Yuan, Xuefeng Xu, Yao Xiao

sklearn/model_selection/_search.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,7 @@ def _store(key_name, array, weights=None, splits=False, rank=False):
10901090
param_list = list(param_result.values())
10911091
try:
10921092
arr_dtype = np.result_type(*param_list)
1093-
except TypeError:
1093+
except (TypeError, ValueError):
10941094
arr_dtype = object
10951095
if len(param_list) == n_candidates and arr_dtype != object:
10961096
# Exclude `object` else the numpy constructor might infer a list of

sklearn/model_selection/tests/test_search.py

+45
Original file line numberDiff line numberDiff line change
@@ -2641,3 +2641,48 @@ def test_score_rejects_params_with_no_routing_enabled(SearchCV, param_search):
26412641

26422642
# End of Metadata Routing Tests
26432643
# =============================
2644+
2645+
2646+
def test_cv_results_dtype_issue_29074():
2647+
"""Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/29074"""
2648+
2649+
class MetaEstimator(BaseEstimator, ClassifierMixin):
2650+
def __init__(
2651+
self,
2652+
base_clf,
2653+
parameter1=None,
2654+
parameter2=None,
2655+
parameter3=None,
2656+
parameter4=None,
2657+
):
2658+
self.base_clf = base_clf
2659+
self.parameter1 = parameter1
2660+
self.parameter2 = parameter2
2661+
self.parameter3 = parameter3
2662+
self.parameter4 = parameter4
2663+
2664+
def fit(self, X, y=None):
2665+
self.base_clf.fit(X, y)
2666+
return self
2667+
2668+
def score(self, X, y):
2669+
return self.base_clf.score(X, y)
2670+
2671+
# Values of param_grid are such that np.result_type gives slightly
2672+
# different errors, in particular ValueError and TypeError
2673+
param_grid = {
2674+
"parameter1": [None, {"option": "A"}, {"option": "B"}],
2675+
"parameter2": [None, [1, 2]],
2676+
"parameter3": [{"a": 1}],
2677+
"parameter4": ["str1", "str2"],
2678+
}
2679+
grid_search = GridSearchCV(
2680+
estimator=MetaEstimator(LogisticRegression()),
2681+
param_grid=param_grid,
2682+
cv=3,
2683+
)
2684+
2685+
X, y = make_blobs(random_state=0)
2686+
grid_search.fit(X, y)
2687+
for param in param_grid:
2688+
assert grid_search.cv_results_[f"param_{param}"].dtype == object

0 commit comments

Comments
 (0)