From a8b91cc4716f5f93f9d7f21c641a87ce238ac643 Mon Sep 17 00:00:00 2001 From: Antoine Baker Date: Fri, 21 Feb 2025 17:53:07 +0100 Subject: [PATCH] mixin to request sample weight --- sklearn/base.py | 16 +++++++++++++++- sklearn/covariance/_empirical_covariance.py | 5 ++++- sklearn/linear_model/_coordinate_descent.py | 5 ++++- sklearn/metrics/_scorer.py | 14 +++++++++++++- sklearn/preprocessing/_data.py | 2 +- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/sklearn/base.py b/sklearn/base.py index dabaa93ac29b7..ce51d4e03f3f0 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -10,6 +10,7 @@ import re import warnings from collections import defaultdict +from typing import Union import numpy as np @@ -153,7 +154,20 @@ def _clone_parametrized(estimator, *, safe=True): return new_object -class BaseEstimator(_HTMLDocumentationLinkMixin, _MetadataRequester): +class _SampleWeightEstimatorMixin(_MetadataRequester): + """A Mixin to request ``sample_weight`` by default. + + This Mixin makes the object to request ``sample_weight`` by default as ``True`` + for both ``fit`` and ``score`` methods. + + .. versionadded:: 1.7 + """ + + __metadata_request__fit: dict[str, Union[bool, str]] = {"sample_weight": True} + __metadata_request__score: dict[str, Union[bool, str]] = {"sample_weight": True} + + +class BaseEstimator(_HTMLDocumentationLinkMixin, _SampleWeightEstimatorMixin): """Base class for all estimators in scikit-learn. Inheriting from this class provides default implementations of: diff --git a/sklearn/covariance/_empirical_covariance.py b/sklearn/covariance/_empirical_covariance.py index 955046fa37d4b..97985799eada9 100644 --- a/sklearn/covariance/_empirical_covariance.py +++ b/sklearn/covariance/_empirical_covariance.py @@ -184,7 +184,10 @@ class EmpiricalCovariance(BaseEstimator): """ # X_test should have been called X - __metadata_request__score = {"X_test": metadata_routing.UNUSED} + __metadata_request__score = { + "X_test": metadata_routing.UNUSED, + "sample_weight": True, + } _parameter_constraints: dict = { "store_precision": ["boolean"], diff --git a/sklearn/linear_model/_coordinate_descent.py b/sklearn/linear_model/_coordinate_descent.py index b98cf08925910..9d92ad8c7a739 100644 --- a/sklearn/linear_model/_coordinate_descent.py +++ b/sklearn/linear_model/_coordinate_descent.py @@ -879,7 +879,10 @@ class ElasticNet(MultiOutputMixin, RegressorMixin, LinearModel): # "check_input" is used for optimisation and isn't something to be passed # around in a pipeline. - __metadata_request__fit = {"check_input": metadata_routing.UNUSED} + __metadata_request__fit = { + "check_input": metadata_routing.UNUSED, + "sample_weight": True, + } _parameter_constraints: dict = { "alpha": [Interval(Real, 0, None, closed="left")], diff --git a/sklearn/metrics/_scorer.py b/sklearn/metrics/_scorer.py index 549b868cebe60..0125fd8313924 100644 --- a/sklearn/metrics/_scorer.py +++ b/sklearn/metrics/_scorer.py @@ -195,7 +195,19 @@ def get_metadata_routing(self): ) -class _BaseScorer(_MetadataRequester): +class _SampleWeightScorerMixin(_MetadataRequester): + """A Mixin to request ``sample_weight`` by default. + + This Mixin makes the object to request ``sample_weight`` by default as ``True`` + for the ``score`` method. + + .. versionadded:: 1.7 + """ + + __metadata_request__score = {"sample_weight": True} + + +class _BaseScorer(_SampleWeightScorerMixin): """Base scorer that is used as `scorer(estimator, X, y_true)`. Parameters diff --git a/sklearn/preprocessing/_data.py b/sklearn/preprocessing/_data.py index f0d1defe61ca9..a0a0eafc857a9 100644 --- a/sklearn/preprocessing/_data.py +++ b/sklearn/preprocessing/_data.py @@ -2431,7 +2431,7 @@ class KernelCenterer(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEsti # X is called K in these methods. __metadata_request__transform = {"K": metadata_routing.UNUSED} - __metadata_request__fit = {"K": metadata_routing.UNUSED} + __metadata_request__fit = {"K": metadata_routing.UNUSED, "sample_weight": True} def fit(self, K, y=None): """Fit KernelCenterer.