1From 1fb59eb42f4bef229b953de313c7e78f0857ea42 Mon Sep 17 00:00:00 2001
2From: Philip Wilk <p.wilk@student.reading.ac.uk>
3Date: Sun, 23 Mar 2025 16:14:51 +0000
4Subject: [PATCH] StackingCVClassifier/fit: ensure compatibility with
5 *scikit-learn* versions 1.4 and above by dynamically selecting between
6 `fit_params` and `params`
7
8---
9 mlxtend/classifier/stacking_cv_classification.py | 5 ++++-
10 mlxtend/regressor/stacking_cv_regression.py | 6 +++++-
11 2 files changed, 9 insertions(+), 2 deletions(-)
12
13diff --git a/mlxtend/classifier/stacking_cv_classification.py b/mlxtend/classifier/stacking_cv_classification.py
14index 5bff6907..f4c45b8c 100644
15--- a/mlxtend/classifier/stacking_cv_classification.py
16+++ b/mlxtend/classifier/stacking_cv_classification.py
17@@ -15,6 +15,7 @@ from sklearn.base import TransformerMixin, clone
18 from sklearn.model_selection import cross_val_predict
19 from sklearn.model_selection._split import check_cv
20 from sklearn.preprocessing import LabelEncoder
21+from sklearn import __version__ as sklearn_version
22
23 from ..externals.estimator_checks import check_is_fitted
24 from ..externals.name_estimators import _name_estimators
25@@ -266,6 +267,8 @@ class StackingCVClassifier(
26 if self.verbose > 1:
27 print(_name_estimators((model,))[0][1])
28
29+ param_name = "fit_params" if sklearn_version < "1.4" else "params"
30+
31 prediction = cross_val_predict(
32 model,
33 X,
34@@ -273,10 +276,10 @@ class StackingCVClassifier(
35 groups=groups,
36 cv=final_cv,
37 n_jobs=self.n_jobs,
38- fit_params=fit_params,
39 verbose=self.verbose,
40 pre_dispatch=self.pre_dispatch,
41 method="predict_proba" if self.use_probas else "predict",
42+ **{param_name: fit_params},
43 )
44
45 if not self.use_probas:
46diff --git a/mlxtend/regressor/stacking_cv_regression.py b/mlxtend/regressor/stacking_cv_regression.py
47index a1faf2ff..d2fb1c49 100644
48--- a/mlxtend/regressor/stacking_cv_regression.py
49+++ b/mlxtend/regressor/stacking_cv_regression.py
50@@ -19,6 +19,7 @@ from sklearn.base import RegressorMixin, TransformerMixin, clone
51 from sklearn.model_selection import cross_val_predict
52 from sklearn.model_selection._split import check_cv
53 from sklearn.utils import check_X_y
54+from sklearn import __version__ as sklearn_version
55
56 from ..externals.estimator_checks import check_is_fitted
57 from ..externals.name_estimators import _name_estimators
58@@ -211,6 +212,9 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin):
59 fit_params = None
60 else:
61 fit_params = dict(sample_weight=sample_weight)
62+
63+ param_name = "fit_params" if sklearn_version < "1.4" else "params"
64+
65 meta_features = np.column_stack(
66 [
67 cross_val_predict(
68@@ -221,8 +225,8 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin):
69 cv=kfold,
70 verbose=self.verbose,
71 n_jobs=self.n_jobs,
72- fit_params=fit_params,
73 pre_dispatch=self.pre_dispatch,
74+ **{param_name: fit_params},
75 )
76 for regr in self.regr_
77 ]
78--
792.47.1
80