From fcc822cfef3125c6177fa1fd963d376a38e12769 Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 7 Dec 2021 08:56:48 -0500 Subject: [PATCH 01/20] added check_scalar --- sklearn/linear_model/_glm/glm.py | 21 +++++++++++++++------ sklearn/linear_model/_glm/tests/test_glm.py | 3 ++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 216026a66d797..f0ffe57fbeb45 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -13,6 +13,7 @@ from ...base import BaseEstimator, RegressorMixin from ...utils.optimize import _check_optimize_result +from ...utils import check_scalar from ...utils.validation import check_is_fitted, _check_sample_weight from ..._loss.glm_distribution import ( ExponentialDispersionModel, @@ -227,12 +228,20 @@ def fit(self, X, y, sample_weight=None): "'lbfgs'; got {0}".format(self.solver) ) solver = self.solver - if not isinstance(self.max_iter, numbers.Integral) or self.max_iter <= 0: - raise ValueError( - "Maximum number of iteration must be a positive " - "integer;" - " got (max_iter={0!r})".format(self.max_iter) - ) + # if not isinstance(self.max_iter, numbers.Integral) or self.max_iter <= 0: + # raise ValueError( + # "Maximum number of iteration must be a positive " + # "integer;" + # " got (max_iter={0!r})".format(self.max_iter) + # ) + check_scalar( + self.max_iter, + name="max_iter", + target_type=numbers.Integral, + min_val=1, + max_val=None, + include_boundaries="left", + ) if not isinstance(self.tol, numbers.Number) or self.tol <= 0: raise ValueError( "Tolerance for stopping criteria must be " diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 2180f3c88f87b..1160dc1317a87 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -140,7 +140,8 @@ def test_glm_solver_argument(solver): glm.fit(X, y) -@pytest.mark.parametrize("max_iter", ["not a number", 0, -1, 5.5, [1]]) +# @pytest.mark.parametrize("max_iter", ["not a number", 0, -1, 5.5, [1]]) +@pytest.mark.parametrize("max_iter", [10]) def test_glm_max_iter_argument(max_iter): """Test GLM for invalid max_iter argument.""" y = np.array([1, 2]) From 24391d19e8686514c95060578d4d3dc287e6ee5e Mon Sep 17 00:00:00 2001 From: reshamas Date: Fri, 10 Dec 2021 13:15:35 -0500 Subject: [PATCH 02/20] added tests for max_iter --- sklearn/linear_model/_glm/glm.py | 1 + sklearn/linear_model/_glm/tests/test_glm.py | 33 +++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index f0ffe57fbeb45..0b626f6a78c79 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -100,6 +100,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): max_iter : int, default=100 The maximal number of iterations for the solver. + Values should be >=1. tol : float, default=1e-4 Stopping criterion. For the lbfgs solver, diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 1160dc1317a87..67db848bc6118 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -140,14 +140,37 @@ def test_glm_solver_argument(solver): glm.fit(X, y) -# @pytest.mark.parametrize("max_iter", ["not a number", 0, -1, 5.5, [1]]) -@pytest.mark.parametrize("max_iter", [10]) -def test_glm_max_iter_argument(max_iter): +@pytest.mark.parametrize( + "params, err_type, err_msg", + [ + ({"max_iter": 0}, ValueError, "max_iter == 0, must be >= 1"), + ({"max_iter": -1}, ValueError, "max_iter == -1, must be >= 1"), + ( + {"max_iter": "not a number"}, + TypeError, + "max_iter must be an instance of , not ", + ), + ( + {"max_iter": [1]}, + TypeError, + "max_iter must be an instance of ," + " not ", + ), + ( + {"max_iter": 5.5}, + TypeError, + "max_iter must be an instance of ," + " not ", + ), + ], +) +def test_glm_scalar_argument(params, err_type, err_msg): """Test GLM for invalid max_iter argument.""" y = np.array([1, 2]) X = np.array([[1], [2]]) - glm = GeneralizedLinearRegressor(max_iter=max_iter) - with pytest.raises(ValueError, match="must be a positive integer"): + glm = GeneralizedLinearRegressor(**params) + with pytest.raises(err_type, match=err_msg): glm.fit(X, y) From 4e9a84c4c4fd5c180147d5d8eb38127b9f100ac7 Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 13 Dec 2021 16:01:31 -0500 Subject: [PATCH 03/20] added tests for alpha --- sklearn/linear_model/_glm/glm.py | 20 ++++++++++++++------ sklearn/linear_model/_glm/tests/test_glm.py | 6 ++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 0b626f6a78c79..d7440d6f6b3d4 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -211,12 +211,20 @@ def fit(self, X, y, sample_weight=None): "got (link={0})".format(self.link) ) - if not isinstance(self.alpha, numbers.Number) or self.alpha < 0: - raise ValueError( - "Penalty term must be a non-negative number; got (alpha={0})".format( - self.alpha - ) - ) + # if self.alpha is not None and not isinstance(alpha, (np.ndarray, tuple)): + # if not isinstance(self.alpha, numbers.Number) or self.alpha < 0: + # raise ValueError( + # "Penalty term must be a non-negative number; got (alpha={0})".format( + # self.alpha + # ) + # ) + check_scalar( + self.alpha, + name="alpha", + target_type=numbers.Real, + min_val=0.0, + include_boundaries="left", + ) if not isinstance(self.fit_intercept, bool): raise ValueError( "The argument fit_intercept must be bool; got {0}".format( diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 67db848bc6118..ad4e333b3befc 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -163,6 +163,12 @@ def test_glm_solver_argument(solver): "max_iter must be an instance of ," " not ", ), + ({"alpha": -1}, ValueError, "alpha == -1, must be >= 0.0"), + ( + {"alpha": "1"}, + TypeError, + "alpha must be an instance of , not ", + ), ], ) def test_glm_scalar_argument(params, err_type, err_msg): From cbafadf424c0745a789a2b5a429f7866e71c8876 Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 13 Dec 2021 16:09:05 -0500 Subject: [PATCH 04/20] adding tests for tol --- sklearn/linear_model/_glm/glm.py | 8 ++++++++ sklearn/linear_model/_glm/tests/test_glm.py | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index d7440d6f6b3d4..630b27da6e0be 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,6 +73,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). + Values should be >=0. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be @@ -107,6 +108,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): the iteration will stop when ``max{|g_j|, j = 1, ..., d} <= tol`` where ``g_j`` is the j-th component of the gradient (derivative) of the objective function. + Values should be >=0. warm_start : bool, default=False If set to ``True``, reuse the solution of the previous call to ``fit`` @@ -251,6 +253,12 @@ def fit(self, X, y, sample_weight=None): max_val=None, include_boundaries="left", ) + check_scalar( + self.tol, + name="tol", + target_type=numbers.Real, + min_val=0, + ) if not isinstance(self.tol, numbers.Number) or self.tol <= 0: raise ValueError( "Tolerance for stopping criteria must be " diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index ad4e333b3befc..851433a81b2d2 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -169,6 +169,12 @@ def test_glm_solver_argument(solver): TypeError, "alpha must be an instance of , not ", ), + ({"tol": -1.0}, ValueError, "tol == -1.0, must be >= 0."), + ( + {"tol": "1"}, + TypeError, + "tol must be an instance of , not ", + ), ], ) def test_glm_scalar_argument(params, err_type, err_msg): From 1e56683f0ab5137babfe37fdea95f87aded71b87 Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 13 Dec 2021 16:23:32 -0500 Subject: [PATCH 05/20] added tests for verbose --- sklearn/linear_model/_glm/glm.py | 8 ++++++++ sklearn/linear_model/_glm/tests/test_glm.py | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 630b27da6e0be..485307a6b1a61 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -116,6 +116,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): verbose : int, default=0 For the lbfgs solver set verbose to any positive number for verbosity. + Values should be >=0. Attributes ---------- @@ -259,6 +260,13 @@ def fit(self, X, y, sample_weight=None): target_type=numbers.Real, min_val=0, ) + check_scalar( + self.verbose, + name="verbose", + target_type=numbers.Integral, + min_val=0, + include_boundaries="left", + ) if not isinstance(self.tol, numbers.Number) or self.tol <= 0: raise ValueError( "Tolerance for stopping criteria must be " diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 851433a81b2d2..54db4f25ccba1 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -175,6 +175,13 @@ def test_glm_solver_argument(solver): TypeError, "tol must be an instance of , not ", ), + ({"verbose": -1}, ValueError, "verbose == -1, must be >= 0."), + ( + {"verbose": "1"}, + TypeError, + "verbose must be an instance of , not ", + ), ], ) def test_glm_scalar_argument(params, err_type, err_msg): From a0c1055c96efcb0535ce5391c2d1f44d22540119 Mon Sep 17 00:00:00 2001 From: reshamas Date: Wed, 15 Dec 2021 13:56:48 -0500 Subject: [PATCH 06/20] remove extra checks for alpha and tol --- sklearn/linear_model/_glm/tests/test_glm.py | 26 +++++---------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 54db4f25ccba1..6fa4b8a68ebe1 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -110,16 +110,6 @@ def test_glm_link_auto(family, expected_link_class): assert isinstance(glm._link_instance, expected_link_class) -@pytest.mark.parametrize("alpha", ["not a number", -4.2]) -def test_glm_alpha_argument(alpha): - """Test GLM for invalid alpha argument.""" - y = np.array([1, 2]) - X = np.array([[1], [2]]) - glm = GeneralizedLinearRegressor(family="normal", alpha=alpha) - with pytest.raises(ValueError, match="Penalty term must be a non-negative"): - glm.fit(X, y) - - @pytest.mark.parametrize("fit_intercept", ["not bool", 1, 0, [True]]) def test_glm_fit_intercept_argument(fit_intercept): """Test GLM for invalid fit_intercept argument.""" @@ -182,6 +172,12 @@ def test_glm_solver_argument(solver): "verbose must be an instance of , not ", ), + ( + {"verbose": 1.0}, + TypeError, + "verbose must be an instance of , not ", + ), ], ) def test_glm_scalar_argument(params, err_type, err_msg): @@ -193,16 +189,6 @@ def test_glm_scalar_argument(params, err_type, err_msg): glm.fit(X, y) -@pytest.mark.parametrize("tol", ["not a number", 0, -1.0, [1e-3]]) -def test_glm_tol_argument(tol): - """Test GLM for invalid tol argument.""" - y = np.array([1, 2]) - X = np.array([[1], [2]]) - glm = GeneralizedLinearRegressor(tol=tol) - with pytest.raises(ValueError, match="stopping criteria must be positive"): - glm.fit(X, y) - - @pytest.mark.parametrize("warm_start", ["not bool", 1, 0, [True]]) def test_glm_warm_start_argument(warm_start): """Test GLM for invalid warm_start argument.""" From ca2b8efc5d30e31f6a4fd154343c1f3572653654 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Thu, 16 Dec 2021 15:43:23 -0500 Subject: [PATCH 07/20] remove default parameters in function call Co-authored-by: Thomas J. Fan --- sklearn/linear_model/_glm/glm.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 485307a6b1a61..d58f2a5188d06 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -251,8 +251,6 @@ def fit(self, X, y, sample_weight=None): name="max_iter", target_type=numbers.Integral, min_val=1, - max_val=None, - include_boundaries="left", ) check_scalar( self.tol, From 0bafb3b9b11c5ec963c0c308b034a37e5491f0a7 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Thu, 16 Dec 2021 15:43:51 -0500 Subject: [PATCH 08/20] remove default calls Co-authored-by: Thomas J. Fan --- sklearn/linear_model/_glm/glm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index d58f2a5188d06..6f100175dfd34 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -263,7 +263,6 @@ def fit(self, X, y, sample_weight=None): name="verbose", target_type=numbers.Integral, min_val=0, - include_boundaries="left", ) if not isinstance(self.tol, numbers.Number) or self.tol <= 0: raise ValueError( From 9a586977f56f7bb9b7e6259c0260dc5e1985154b Mon Sep 17 00:00:00 2001 From: reshamas Date: Thu, 16 Dec 2021 15:50:15 -0500 Subject: [PATCH 09/20] add range --- sklearn/linear_model/_glm/glm.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 6f100175dfd34..21f01ad054427 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,7 +73,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). - Values should be >=0. + Values should be in the range `[ 0.0, inf)`. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be @@ -101,14 +101,14 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): max_iter : int, default=100 The maximal number of iterations for the solver. - Values should be >=1. + Values should be in the range `[ 1, inf)`. tol : float, default=1e-4 Stopping criterion. For the lbfgs solver, the iteration will stop when ``max{|g_j|, j = 1, ..., d} <= tol`` where ``g_j`` is the j-th component of the gradient (derivative) of the objective function. - Values should be >=0. + Values should be in the range `[ 0.0, inf)`. warm_start : bool, default=False If set to ``True``, reuse the solution of the previous call to ``fit`` @@ -116,7 +116,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): verbose : int, default=0 For the lbfgs solver set verbose to any positive number for verbosity. - Values should be >=0. + Values should be in the range `[ 1, inf)`. Attributes ---------- @@ -214,13 +214,6 @@ def fit(self, X, y, sample_weight=None): "got (link={0})".format(self.link) ) - # if self.alpha is not None and not isinstance(alpha, (np.ndarray, tuple)): - # if not isinstance(self.alpha, numbers.Number) or self.alpha < 0: - # raise ValueError( - # "Penalty term must be a non-negative number; got (alpha={0})".format( - # self.alpha - # ) - # ) check_scalar( self.alpha, name="alpha", @@ -240,12 +233,6 @@ def fit(self, X, y, sample_weight=None): "'lbfgs'; got {0}".format(self.solver) ) solver = self.solver - # if not isinstance(self.max_iter, numbers.Integral) or self.max_iter <= 0: - # raise ValueError( - # "Maximum number of iteration must be a positive " - # "integer;" - # " got (max_iter={0!r})".format(self.max_iter) - # ) check_scalar( self.max_iter, name="max_iter", From 43545670e9e0c1253f4b847d49f4b52f1388e3e7 Mon Sep 17 00:00:00 2001 From: reshamas Date: Wed, 22 Dec 2021 11:24:49 -0500 Subject: [PATCH 10/20] fixing flake8 error --- sklearn/linear_model/_glm/glm.py | 21 +++++++++++---------- sklearn/linear_model/_glm/tests/test_glm.py | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 21f01ad054427..12c4bd2b0ec2b 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,7 +73,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). - Values should be in the range `[ 0.0, inf)`. + Values should be in the range `[0.0, inf)`. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be @@ -101,14 +101,14 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): max_iter : int, default=100 The maximal number of iterations for the solver. - Values should be in the range `[ 1, inf)`. + Values should be in the range `[1, inf)`. tol : float, default=1e-4 Stopping criterion. For the lbfgs solver, the iteration will stop when ``max{|g_j|, j = 1, ..., d} <= tol`` where ``g_j`` is the j-th component of the gradient (derivative) of the objective function. - Values should be in the range `[ 0.0, inf)`. + Values should be in the range `(0.0, inf)`. warm_start : bool, default=False If set to ``True``, reuse the solution of the previous call to ``fit`` @@ -116,7 +116,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): verbose : int, default=0 For the lbfgs solver set verbose to any positive number for verbosity. - Values should be in the range `[ 1, inf)`. + Values should be in the range `[1, inf)`. Attributes ---------- @@ -243,7 +243,8 @@ def fit(self, X, y, sample_weight=None): self.tol, name="tol", target_type=numbers.Real, - min_val=0, + min_val=0.0, + include_boundaries="neither", ) check_scalar( self.verbose, @@ -251,11 +252,11 @@ def fit(self, X, y, sample_weight=None): target_type=numbers.Integral, min_val=0, ) - if not isinstance(self.tol, numbers.Number) or self.tol <= 0: - raise ValueError( - "Tolerance for stopping criteria must be " - "positive; got (tol={0!r})".format(self.tol) - ) + # if not isinstance(self.tol, numbers.Number) or self.tol <= 0: + # raise ValueError( + # "Tolerance for stopping criteria must be " + # "positive; got (tol={0!r})".format(self.tol) + # ) if not isinstance(self.warm_start, bool): raise ValueError( "The argument warm_start must be bool; got {0}".format(self.warm_start) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 6fa4b8a68ebe1..8d29dca2074d8 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -159,12 +159,24 @@ def test_glm_solver_argument(solver): TypeError, "alpha must be an instance of , not ", ), - ({"tol": -1.0}, ValueError, "tol == -1.0, must be >= 0."), + ({"tol": -1.0}, ValueError, "tol == -1.0, must be > 0."), + ({"tol": 0.0}, ValueError, "tol == 0.0, must be > 0.0"), + ({"tol": 0}, ValueError, "tol == 0, must be > 0.0"), ( {"tol": "1"}, TypeError, "tol must be an instance of , not ", ), + ( + {"tol": 1}, + TypeError, + "tol must be an instance of , not ", + ), + ( + {"tol": [1e-3]}, + TypeError, + "tol must be an instance of , not ", + ), ({"verbose": -1}, ValueError, "verbose == -1, must be >= 0."), ( {"verbose": "1"}, @@ -181,7 +193,7 @@ def test_glm_solver_argument(solver): ], ) def test_glm_scalar_argument(params, err_type, err_msg): - """Test GLM for invalid max_iter argument.""" + """Test GLM for invalid parameter arguments.""" y = np.array([1, 2]) X = np.array([[1], [2]]) glm = GeneralizedLinearRegressor(**params) From 0c177682c6e522a8e140befac76967381219f749 Mon Sep 17 00:00:00 2001 From: reshamas Date: Wed, 22 Dec 2021 11:26:47 -0500 Subject: [PATCH 11/20] comment out tol=1 check --- sklearn/linear_model/_glm/tests/test_glm.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 8d29dca2074d8..0742d91dbe652 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -167,11 +167,11 @@ def test_glm_solver_argument(solver): TypeError, "tol must be an instance of , not ", ), - ( - {"tol": 1}, - TypeError, - "tol must be an instance of , not ", - ), + # ( + # {"tol": 1}, + # TypeError, + # "tol must be an instance of ", + # ), ( {"tol": [1e-3]}, TypeError, From 3ef2a203dc07c29029fb25a74a9be114807922a0 Mon Sep 17 00:00:00 2001 From: reshamas Date: Thu, 23 Dec 2021 10:43:34 -0500 Subject: [PATCH 12/20] add multiple estimators in parametrization --- sklearn/linear_model/_glm/tests/test_glm.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 0742d91dbe652..3d387f2495545 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -130,6 +130,10 @@ def test_glm_solver_argument(solver): glm.fit(X, y) +@pytest.mark.parametrize( + "estimator", + [GeneralizedLinearRegressor, PoissonRegressor, GammaRegressor, TweedieRegressor], +) @pytest.mark.parametrize( "params, err_type, err_msg", [ @@ -192,11 +196,11 @@ def test_glm_solver_argument(solver): ), ], ) -def test_glm_scalar_argument(params, err_type, err_msg): +def test_glm_scalar_argument(estimator, params, err_type, err_msg): """Test GLM for invalid parameter arguments.""" y = np.array([1, 2]) X = np.array([[1], [2]]) - glm = GeneralizedLinearRegressor(**params) + glm = estimator(**params) with pytest.raises(err_type, match=err_msg): glm.fit(X, y) From 0c625279d893b23c2c57074aba01b4a1fd4919f8 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:44:00 -0500 Subject: [PATCH 13/20] Update wording for interval range: "should be" to "must be" Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/glm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 12c4bd2b0ec2b..3dbbd00d61719 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,7 +73,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). - Values should be in the range `[0.0, inf)`. + Values must be in the range `[0.0, inf)`. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be From 97ac32e229587df235a38878f7a0d295911d9bc9 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:44:37 -0500 Subject: [PATCH 14/20] remove commented isinstance check Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/glm.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 3dbbd00d61719..a801af7abd6a9 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -252,11 +252,6 @@ def fit(self, X, y, sample_weight=None): target_type=numbers.Integral, min_val=0, ) - # if not isinstance(self.tol, numbers.Number) or self.tol <= 0: - # raise ValueError( - # "Tolerance for stopping criteria must be " - # "positive; got (tol={0!r})".format(self.tol) - # ) if not isinstance(self.warm_start, bool): raise ValueError( "The argument warm_start must be bool; got {0}".format(self.warm_start) From f9bc8a0ff45b317263b537b3e9fd18bd4f1da7ee Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:44:58 -0500 Subject: [PATCH 15/20] capitalize "estimator" to "Estimator" Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/tests/test_glm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 3d387f2495545..a686ef0c524b4 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -131,7 +131,7 @@ def test_glm_solver_argument(solver): @pytest.mark.parametrize( - "estimator", + "Estimator", [GeneralizedLinearRegressor, PoissonRegressor, GammaRegressor, TweedieRegressor], ) @pytest.mark.parametrize( From 22f496298c1a2f66228a74dfd282c6d79858d6cd Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:45:17 -0500 Subject: [PATCH 16/20] remove commented portion for checking tol Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/tests/test_glm.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index a686ef0c524b4..df4da3a28f114 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -171,11 +171,6 @@ def test_glm_solver_argument(solver): TypeError, "tol must be an instance of , not ", ), - # ( - # {"tol": 1}, - # TypeError, - # "tol must be an instance of ", - # ), ( {"tol": [1e-3]}, TypeError, From 3f9b7a9cccfb026c3de3003fbcc49af41f820465 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:45:40 -0500 Subject: [PATCH 17/20] estimator should be "Estimator" Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/tests/test_glm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index df4da3a28f114..321c52e8611fe 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -191,7 +191,7 @@ def test_glm_solver_argument(solver): ), ], ) -def test_glm_scalar_argument(estimator, params, err_type, err_msg): +def test_glm_scalar_argument(Estimator, params, err_type, err_msg): """Test GLM for invalid parameter arguments.""" y = np.array([1, 2]) X = np.array([[1], [2]]) From f94b36dfabf4e3b045a01dc6e60ab67a6758e082 Mon Sep 17 00:00:00 2001 From: Reshama Shaikh Date: Fri, 7 Jan 2022 09:45:54 -0500 Subject: [PATCH 18/20] estimator should be "Estimator" Co-authored-by: Julien Jerphanion --- sklearn/linear_model/_glm/tests/test_glm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/_glm/tests/test_glm.py b/sklearn/linear_model/_glm/tests/test_glm.py index 321c52e8611fe..b90e273cbd246 100644 --- a/sklearn/linear_model/_glm/tests/test_glm.py +++ b/sklearn/linear_model/_glm/tests/test_glm.py @@ -195,7 +195,7 @@ def test_glm_scalar_argument(Estimator, params, err_type, err_msg): """Test GLM for invalid parameter arguments.""" y = np.array([1, 2]) X = np.array([[1], [2]]) - glm = estimator(**params) + glm = Estimator(**params) with pytest.raises(err_type, match=err_msg): glm.fit(X, y) From 2b765a546d7ad99fdef095d558a84b534d8e7165 Mon Sep 17 00:00:00 2001 From: reshamas Date: Fri, 7 Jan 2022 09:48:13 -0500 Subject: [PATCH 19/20] for interval range, change from should to must --- sklearn/linear_model/_glm/glm.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 12c4bd2b0ec2b..802d53547d24a 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,7 +73,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). - Values should be in the range `[0.0, inf)`. + Values must be in the range `[0.0, inf)`. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be @@ -101,14 +101,14 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): max_iter : int, default=100 The maximal number of iterations for the solver. - Values should be in the range `[1, inf)`. + Values must be in the range `[1, inf)`. tol : float, default=1e-4 Stopping criterion. For the lbfgs solver, the iteration will stop when ``max{|g_j|, j = 1, ..., d} <= tol`` where ``g_j`` is the j-th component of the gradient (derivative) of the objective function. - Values should be in the range `(0.0, inf)`. + Values must be in the range `(0.0, inf)`. warm_start : bool, default=False If set to ``True``, reuse the solution of the previous call to ``fit`` @@ -116,7 +116,7 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): verbose : int, default=0 For the lbfgs solver set verbose to any positive number for verbosity. - Values should be in the range `[1, inf)`. + Values must be in the range `[1, inf)`. Attributes ---------- From 9f04ec8aa9ae9ca7f9dc7a5a3c9d540858dcd939 Mon Sep 17 00:00:00 2001 From: reshamas Date: Thu, 13 Jan 2022 14:28:41 -0500 Subject: [PATCH 20/20] removing interval ranges; added to PR#22076 --- sklearn/linear_model/_glm/glm.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index fbcd7bf5ecfbf..dfbdc2bf590fb 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -73,7 +73,6 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): regularization strength. ``alpha = 0`` is equivalent to unpenalized GLMs. In this case, the design matrix `X` must have full column rank (no collinearities). - Values must be in the range `[0.0, inf)`. fit_intercept : bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be @@ -101,14 +100,12 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): max_iter : int, default=100 The maximal number of iterations for the solver. - Values must be in the range `[1, inf)`. tol : float, default=1e-4 Stopping criterion. For the lbfgs solver, the iteration will stop when ``max{|g_j|, j = 1, ..., d} <= tol`` where ``g_j`` is the j-th component of the gradient (derivative) of the objective function. - Values must be in the range `(0.0, inf)`. warm_start : bool, default=False If set to ``True``, reuse the solution of the previous call to ``fit`` @@ -116,7 +113,6 @@ class GeneralizedLinearRegressor(RegressorMixin, BaseEstimator): verbose : int, default=0 For the lbfgs solver set verbose to any positive number for verbosity. - Values must be in the range `[1, inf)`. Attributes ----------