From 43b64a8184616ce69a6b9f959cea9e308ce19cb5 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Wed, 24 Jul 2019 16:38:00 +0200 Subject: [PATCH 1/6] FIX convert F-ordered array in Ridge with SAG solver --- doc/whats_new/v0.22.rst | 8 ++++++-- sklearn/linear_model/base.py | 1 + sklearn/linear_model/tests/test_ridge.py | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index bcef08ff1881b..de950e52a8043 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -115,7 +115,7 @@ Changelog :mod:`sklearn.linear_model` ........................... -- |Enhancement| :class:`linearmodel.BayesianRidge` now accepts hyperparameters +- |Enhancement| :class:`linear_model.BayesianRidge` now accepts hyperparameters ``alpha_init`` and ``lambda_init`` which can be used to set the initial value of the maximization procedure in :term:`fit`. :pr:`13618` by :user:`Yoshihiro Uchida `. @@ -127,7 +127,11 @@ Changelog - |Efficiency| The 'liblinear' logistic regression solver is now faster and requires less memory. - :pr:`14108`, pr:`14170` by :user:`Alex Henrie `. + :pr:`14108`, :pr:`14170` by :user:`Alex Henrie `. + +- |Fix| :class:`linear_model.Ridge` now accepts Fortran arrays and make a + conversion instead of failing. + :pr:`xx` by :user:`Guillaume Lemaitre `. :mod:`sklearn.metrics` ...................... diff --git a/sklearn/linear_model/base.py b/sklearn/linear_model/base.py index f528168519500..5b67f4c35619f 100644 --- a/sklearn/linear_model/base.py +++ b/sklearn/linear_model/base.py @@ -91,6 +91,7 @@ def make_dataset(X, y, sample_weight, random_state=None): seed=seed) intercept_decay = SPARSE_INTERCEPT_DECAY else: + X = np.ascontiguousarray(X) dataset = ArrayData(X, y, sample_weight, seed=seed) intercept_decay = 1.0 diff --git a/sklearn/linear_model/tests/test_ridge.py b/sklearn/linear_model/tests/test_ridge.py index 2b4275f59d503..c7c51c2d2dcaf 100644 --- a/sklearn/linear_model/tests/test_ridge.py +++ b/sklearn/linear_model/tests/test_ridge.py @@ -1210,3 +1210,10 @@ def test_ridge_regression_dtype_stability(solver, seed): assert results[np.float32].dtype == np.float32 assert results[np.float64].dtype == np.float64 assert_allclose(results[np.float32], results[np.float64], atol=atol) + + +def test_ridge_sag_with_X_fortran(): + # check that Fortran array are converted when using SAG solver + X, y = make_regression(random_state=42) + X = np.asfortranarray(X) + Ridge(solver='sag').fit(X, y) From e6b51882a2fd5fe4331734bb4e8de4864597a71e Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Wed, 24 Jul 2019 16:40:18 +0200 Subject: [PATCH 2/6] pr number --- doc/whats_new/v0.22.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index de950e52a8043..db6f721f531c4 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -131,7 +131,7 @@ Changelog - |Fix| :class:`linear_model.Ridge` now accepts Fortran arrays and make a conversion instead of failing. - :pr:`xx` by :user:`Guillaume Lemaitre `. + :pr:`14458` by :user:`Guillaume Lemaitre `. :mod:`sklearn.metrics` ...................... From 5c768d17da3bef2127d51243ade483208d2e0650 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 25 Jul 2019 14:26:16 +0200 Subject: [PATCH 3/6] address comments --- doc/whats_new/v0.22.rst | 4 ++-- sklearn/linear_model/tests/test_ridge.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index db6f721f531c4..be452cf335e2a 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -129,8 +129,8 @@ Changelog requires less memory. :pr:`14108`, :pr:`14170` by :user:`Alex Henrie `. -- |Fix| :class:`linear_model.Ridge` now accepts Fortran arrays and make a - conversion instead of failing. +- |Fix| :class:`linear_model.Ridge` with `solver='sag'` now accepts F-ordered + arrays and make a conversion instead of failing. :pr:`14458` by :user:`Guillaume Lemaitre `. :mod:`sklearn.metrics` diff --git a/sklearn/linear_model/tests/test_ridge.py b/sklearn/linear_model/tests/test_ridge.py index c7c51c2d2dcaf..cd1a5e94f39ed 100644 --- a/sklearn/linear_model/tests/test_ridge.py +++ b/sklearn/linear_model/tests/test_ridge.py @@ -1215,5 +1215,8 @@ def test_ridge_regression_dtype_stability(solver, seed): def test_ridge_sag_with_X_fortran(): # check that Fortran array are converted when using SAG solver X, y = make_regression(random_state=42) + # for the order of X and y to not be C-ordered arrays X = np.asfortranarray(X) + X = X[::2, :] + y = y[::2] Ridge(solver='sag').fit(X, y) From edd023dd2e96047e995d54864dc7ff537137f8cf Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 25 Jul 2019 14:43:52 +0200 Subject: [PATCH 4/6] address jeremie comments --- doc/whats_new/v0.22.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index be452cf335e2a..8cbcfd19640ba 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -130,7 +130,7 @@ Changelog :pr:`14108`, :pr:`14170` by :user:`Alex Henrie `. - |Fix| :class:`linear_model.Ridge` with `solver='sag'` now accepts F-ordered - arrays and make a conversion instead of failing. + and noon-contiguous arrays and make a conversion instead of failing. :pr:`14458` by :user:`Guillaume Lemaitre `. :mod:`sklearn.metrics` From 782d58c5e0aa7599d9fffce51df863b8a82535a9 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 25 Jul 2019 22:53:58 +0200 Subject: [PATCH 5/6] Update v0.22.rst --- doc/whats_new/v0.22.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index 8cbcfd19640ba..9ec08bbf94a6a 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -130,7 +130,7 @@ Changelog :pr:`14108`, :pr:`14170` by :user:`Alex Henrie `. - |Fix| :class:`linear_model.Ridge` with `solver='sag'` now accepts F-ordered - and noon-contiguous arrays and make a conversion instead of failing. + and non-contiguous arrays and makes a conversion instead of failing. :pr:`14458` by :user:`Guillaume Lemaitre `. :mod:`sklearn.metrics` From 17c56f2f756ef4fe25c21c24132e893e3fae200e Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 26 Jul 2019 13:47:16 +0200 Subject: [PATCH 6/6] remove contiguity check in ridge --- sklearn/linear_model/ridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/ridge.py b/sklearn/linear_model/ridge.py index da6a01b3ce2f6..f5dc5c28c690b 100644 --- a/sklearn/linear_model/ridge.py +++ b/sklearn/linear_model/ridge.py @@ -409,7 +409,7 @@ def _ridge_regression(X, y, alpha, sample_weight=None, solver='auto', _accept_sparse = _get_valid_accept_sparse(sparse.issparse(X), solver) X = check_array(X, accept_sparse=_accept_sparse, dtype=_dtype, order="C") - y = check_array(y, dtype=X.dtype, ensure_2d=False, order="C") + y = check_array(y, dtype=X.dtype, ensure_2d=False, order=None) check_consistent_length(X, y) n_samples, n_features = X.shape