Skip to content

Commit 983d982

Browse files
lestevebetatim
andauthored
MNT Remove deprecated iprint and disp usage in scipy 1.15 LBFGS (scikit-learn#31642)
Co-authored-by: Tim Head <betatim@gmail.com>
1 parent 969ed53 commit 983d982

File tree

7 files changed

+29
-6
lines changed

7 files changed

+29
-6
lines changed

sklearn/linear_model/_glm/_newton_solver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from ..._loss.loss import HalfSquaredError
1616
from ...exceptions import ConvergenceWarning
17+
from ...utils.fixes import _get_additional_lbfgs_options_dict
1718
from ...utils.optimize import _check_optimize_result
1819
from .._linear_loss import LinearModelLoss
1920

@@ -187,9 +188,9 @@ def fallback_lbfgs_solve(self, X, y, sample_weight):
187188
options={
188189
"maxiter": max_iter,
189190
"maxls": 50, # default is 20
190-
"iprint": self.verbose - 1,
191191
"gtol": self.tol,
192192
"ftol": 64 * np.finfo(np.float64).eps,
193+
**_get_additional_lbfgs_options_dict("iprint", self.verbose - 1),
193194
},
194195
args=(X, y, sample_weight, self.l2_reg_strength, self.n_threads),
195196
)

sklearn/linear_model/_glm/glm.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from ...utils import check_array
2222
from ...utils._openmp_helpers import _openmp_effective_n_threads
2323
from ...utils._param_validation import Hidden, Interval, StrOptions
24+
from ...utils.fixes import _get_additional_lbfgs_options_dict
2425
from ...utils.optimize import _check_optimize_result
2526
from ...utils.validation import _check_sample_weight, check_is_fitted, validate_data
2627
from .._linear_loss import LinearModelLoss
@@ -273,12 +274,12 @@ def fit(self, X, y, sample_weight=None):
273274
options={
274275
"maxiter": self.max_iter,
275276
"maxls": 50, # default is 20
276-
"iprint": self.verbose - 1,
277277
"gtol": self.tol,
278278
# The constant 64 was found empirically to pass the test suite.
279279
# The point is that ftol is very small, but a bit larger than
280280
# machine precision for float64, which is the dtype used by lbfgs.
281281
"ftol": 64 * np.finfo(float).eps,
282+
**_get_additional_lbfgs_options_dict("iprint", self.verbose - 1),
282283
},
283284
args=(X, y, sample_weight, l2_reg_strength, n_threads),
284285
)

sklearn/linear_model/_huber.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from ..utils._mask import axis0_safe_slice
1111
from ..utils._param_validation import Interval
1212
from ..utils.extmath import safe_sparse_dot
13+
from ..utils.fixes import _get_additional_lbfgs_options_dict
1314
from ..utils.optimize import _check_optimize_result
1415
from ..utils.validation import _check_sample_weight, validate_data
1516
from ._base import LinearModel
@@ -329,7 +330,11 @@ def fit(self, X, y, sample_weight=None):
329330
method="L-BFGS-B",
330331
jac=True,
331332
args=(X, y, self.epsilon, self.alpha, sample_weight),
332-
options={"maxiter": self.max_iter, "gtol": self.tol, "iprint": -1},
333+
options={
334+
"maxiter": self.max_iter,
335+
"gtol": self.tol,
336+
**_get_additional_lbfgs_options_dict("iprint", -1),
337+
},
333338
bounds=bounds,
334339
)
335340

sklearn/linear_model/_logistic.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
)
3131
from ..utils._param_validation import Hidden, Interval, StrOptions
3232
from ..utils.extmath import row_norms, softmax
33+
from ..utils.fixes import _get_additional_lbfgs_options_dict
3334
from ..utils.metadata_routing import (
3435
MetadataRouter,
3536
MethodMapping,
@@ -464,9 +465,9 @@ def _logistic_regression_path(
464465
options={
465466
"maxiter": max_iter,
466467
"maxls": 50, # default is 20
467-
"iprint": iprint,
468468
"gtol": tol,
469469
"ftol": 64 * np.finfo(float).eps,
470+
**_get_additional_lbfgs_options_dict("iprint", iprint),
470471
},
471472
)
472473
n_iter_i = _check_optimize_result(

sklearn/neighbors/_nca.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from ..preprocessing import LabelEncoder
2626
from ..utils._param_validation import Interval, StrOptions
2727
from ..utils.extmath import softmax
28+
from ..utils.fixes import _get_additional_lbfgs_options_dict
2829
from ..utils.multiclass import check_classification_targets
2930
from ..utils.random import check_random_state
3031
from ..utils.validation import check_array, check_is_fitted, validate_data
@@ -312,7 +313,10 @@ def fit(self, X, y):
312313
"jac": True,
313314
"x0": transformation,
314315
"tol": self.tol,
315-
"options": dict(maxiter=self.max_iter, disp=disp),
316+
"options": dict(
317+
maxiter=self.max_iter,
318+
**_get_additional_lbfgs_options_dict("disp", disp),
319+
),
316320
"callback": self._callback,
317321
}
318322

sklearn/neural_network/_multilayer_perceptron.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
)
3232
from ..utils._param_validation import Interval, Options, StrOptions
3333
from ..utils.extmath import safe_sparse_dot
34+
from ..utils.fixes import _get_additional_lbfgs_options_dict
3435
from ..utils.metaestimators import available_if
3536
from ..utils.multiclass import (
3637
_check_partial_fit_first_call,
@@ -585,8 +586,8 @@ def _fit_lbfgs(
585586
options={
586587
"maxfun": self.max_fun,
587588
"maxiter": self.max_iter,
588-
"iprint": iprint,
589589
"gtol": self.tol,
590+
**_get_additional_lbfgs_options_dict("iprint", iprint),
590591
},
591592
args=(
592593
X,

sklearn/utils/fixes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,16 @@ def _in_unstable_openblas_configuration():
394394
return False
395395

396396

397+
# TODO: Remove when Scipy 1.15 is the minimum supported version. In scipy 1.15,
398+
# the internal info details (via 'iprint' and 'disp' options) were dropped,
399+
# following the LBFGS rewrite from Fortran to C, see
400+
# https://github.com/scipy/scipy/issues/23186#issuecomment-2987801035. For
401+
# scipy 1.15, 'iprint' and 'disp' have no effect and for scipy >= 1.16 a
402+
# DeprecationWarning is emitted.
403+
def _get_additional_lbfgs_options_dict(key, value):
404+
return {} if sp_version >= parse_version("1.15") else {key: value}
405+
406+
397407
# TODO(pyarrow): Remove when minimum pyarrow version is 17.0.0
398408
PYARROW_VERSION_BELOW_17 = False
399409
try:

0 commit comments

Comments
 (0)