Skip to content

Commit 1bcddcb

Browse files
MAINT Deprecate scoring='max_error' and replace it by scoring='neg_max_error' (scikit-learn#29462)
Co-authored-by: Loïc Estève <loic.esteve@ymail.com>
1 parent 9d39f57 commit 1bcddcb

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

doc/modules/model_evaluation.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Scoring Function
9292

9393
**Regression**
9494
'explained_variance' :func:`metrics.explained_variance_score`
95-
'max_error' :func:`metrics.max_error`
95+
'neg_max_error' :func:`metrics.max_error`
9696
'neg_mean_absolute_error' :func:`metrics.mean_absolute_error`
9797
'neg_mean_squared_error' :func:`metrics.mean_squared_error`
9898
'neg_root_mean_squared_error' :func:`metrics.root_mean_squared_error`

doc/whats_new/v1.6.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ Changelog
219219
:pr:`29210` by :user:`Marc Torrellas Socastro <marctorsoc>` and
220220
:user:`Stefanie Senger <StefanieSenger>`.
221221

222+
- |API| scoring="neg_max_error" should be used instead of
223+
scoring="max_error" which is now deprecated.
224+
:pr:`29462` by :user:`Farid "Freddie" Taba <artificialfintelligence>`.
225+
222226
:mod:`sklearn.model_selection`
223227
..............................
224228

sklearn/metrics/_scorer.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ def __init__(self, score_func, sign, kwargs, response_method="predict"):
219219
self._sign = sign
220220
self._kwargs = kwargs
221221
self._response_method = response_method
222+
# TODO (1.8): remove in 1.8 (scoring="max_error" has been deprecated in 1.6)
223+
self._deprecation_msg = None
222224

223225
def _get_pos_label(self):
224226
if "pos_label" in self._kwargs:
@@ -270,6 +272,12 @@ def __call__(self, estimator, X, y_true, sample_weight=None, **kwargs):
270272
score : float
271273
Score function applied to prediction of estimator on X.
272274
"""
275+
# TODO (1.8): remove in 1.8 (scoring="max_error" has been deprecated in 1.6)
276+
if self._deprecation_msg is not None:
277+
warnings.warn(
278+
self._deprecation_msg, category=DeprecationWarning, stacklevel=2
279+
)
280+
273281
_raise_for_params(kwargs, self, None)
274282

275283
_kwargs = copy.deepcopy(kwargs)
@@ -420,7 +428,12 @@ def get_scorer(scoring):
420428
"""
421429
if isinstance(scoring, str):
422430
try:
423-
scorer = copy.deepcopy(_SCORERS[scoring])
431+
if scoring == "max_error":
432+
# TODO (1.8): scoring="max_error" has been deprecated in 1.6,
433+
# remove in 1.8
434+
scorer = max_error_scorer
435+
else:
436+
scorer = copy.deepcopy(_SCORERS[scoring])
424437
except KeyError:
425438
raise ValueError(
426439
"%r is not a valid scoring value. "
@@ -758,7 +771,15 @@ def make_scorer(
758771
# Standard regression scores
759772
explained_variance_scorer = make_scorer(explained_variance_score)
760773
r2_scorer = make_scorer(r2_score)
774+
neg_max_error_scorer = make_scorer(max_error, greater_is_better=False)
761775
max_error_scorer = make_scorer(max_error, greater_is_better=False)
776+
# TODO (1.8): remove in 1.8 (scoring="max_error" has been deprecated in 1.6)
777+
deprecation_msg = (
778+
"Scoring method max_error was renamed to "
779+
"neg_max_error in version 1.6 and will "
780+
"be removed in 1.8."
781+
)
782+
max_error_scorer._deprecation_msg = deprecation_msg
762783
neg_mean_squared_error_scorer = make_scorer(mean_squared_error, greater_is_better=False)
763784
neg_mean_squared_log_error_scorer = make_scorer(
764785
mean_squared_log_error, greater_is_better=False
@@ -867,7 +888,7 @@ def negative_likelihood_ratio(y_true, y_pred):
867888
_SCORERS = dict(
868889
explained_variance=explained_variance_scorer,
869890
r2=r2_scorer,
870-
max_error=max_error_scorer,
891+
neg_max_error=neg_max_error_scorer,
871892
matthews_corrcoef=matthews_corrcoef_scorer,
872893
neg_median_absolute_error=neg_median_absolute_error_scorer,
873894
neg_mean_absolute_error=neg_mean_absolute_error_scorer,

sklearn/metrics/tests/test_score_objects.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
"mean_absolute_percentage_error",
7979
"mean_squared_error",
8080
"median_absolute_error",
81-
"max_error",
81+
"neg_max_error",
8282
"neg_mean_poisson_deviance",
8383
"neg_mean_gamma_deviance",
8484
]
@@ -706,6 +706,16 @@ def test_scoring_is_not_metric():
706706
check_scoring(KMeans(), scoring=cluster_module.rand_score)
707707

708708

709+
def test_deprecated_scorer():
710+
X, y = make_regression(n_samples=10, n_features=1, random_state=0)
711+
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
712+
reg = DecisionTreeRegressor()
713+
reg.fit(X_train, y_train)
714+
deprecated_scorer = get_scorer("max_error")
715+
with pytest.warns(DeprecationWarning):
716+
deprecated_scorer(reg, X_test, y_test)
717+
718+
709719
@pytest.mark.parametrize(
710720
(
711721
"scorers,expected_predict_count,"

0 commit comments

Comments
 (0)