From a73fee3e8d17bd4f8a58427e69fec43a8eecf44b Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Thu, 5 Jan 2017 16:40:29 -0500 Subject: [PATCH 1/4] Fix gh-1615: ensure self.coef_ is an ndarray --- sklearn/linear_model/least_angle.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sklearn/linear_model/least_angle.py b/sklearn/linear_model/least_angle.py index 4384cb56535fe..0f390bc8ca425 100644 --- a/sklearn/linear_model/least_angle.py +++ b/sklearn/linear_model/least_angle.py @@ -689,6 +689,8 @@ def fit(self, X, y, Xy=None): a[0] for a in (self.alphas_, self.active_, self.coef_path_, self.coef_)] self.n_iter_ = self.n_iter_[0] + else: + self.coef_ = np.array(self.coef_) else: self.coef_ = np.empty((n_targets, n_features)) for k in xrange(n_targets): From 00d9d2a0cc240472a356a6e3682bb974933236de Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Fri, 6 Jan 2017 14:36:46 -0500 Subject: [PATCH 2/4] Adding regression test --- sklearn/linear_model/tests/test_least_angle.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sklearn/linear_model/tests/test_least_angle.py b/sklearn/linear_model/tests/test_least_angle.py index fbd559695e3b7..9651b1239d08d 100644 --- a/sklearn/linear_model/tests/test_least_angle.py +++ b/sklearn/linear_model/tests/test_least_angle.py @@ -366,8 +366,15 @@ def test_multitarget(): X = diabetes.data Y = np.vstack([diabetes.target, diabetes.target ** 2]).T n_targets = Y.shape[1] - - for estimator in (linear_model.LassoLars(), linear_model.Lars()): + estimators = [ + linear_model.LassoLars(), + linear_model.Lars(), + # regression test for gh-1615 + linear_model.LassoLars(fit_intercept=False), + linear_model.Lars(fit_intercept=False), + ] + + for estimator in estimators: estimator.fit(X, Y) Y_pred = estimator.predict(X) alphas, active, coef, path = (estimator.alphas_, estimator.active_, From 698a21e7a0a7f641f8742c135edb62b120393d3a Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Mon, 16 Jan 2017 11:34:28 -0500 Subject: [PATCH 3/4] Avoid intermediate list of arrays --- sklearn/linear_model/least_angle.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sklearn/linear_model/least_angle.py b/sklearn/linear_model/least_angle.py index 0f390bc8ca425..c31edebca79c1 100644 --- a/sklearn/linear_model/least_angle.py +++ b/sklearn/linear_model/least_angle.py @@ -665,9 +665,9 @@ def fit(self, X, y, Xy=None): self.alphas_ = [] self.n_iter_ = [] + self.coef_ = np.empty((n_targets, n_features)) if self.fit_path: - self.coef_ = [] self.active_ = [] self.coef_path_ = [] for k in xrange(n_targets): @@ -682,17 +682,14 @@ def fit(self, X, y, Xy=None): self.active_.append(active) self.n_iter_.append(n_iter_) self.coef_path_.append(coef_path) - self.coef_.append(coef_path[:, -1]) + self.coef_[k] = coef_path[:, -1] if n_targets == 1: self.alphas_, self.active_, self.coef_path_, self.coef_ = [ a[0] for a in (self.alphas_, self.active_, self.coef_path_, self.coef_)] self.n_iter_ = self.n_iter_[0] - else: - self.coef_ = np.array(self.coef_) else: - self.coef_ = np.empty((n_targets, n_features)) for k in xrange(n_targets): this_Xy = None if Xy is None else Xy[:, k] alphas, _, self.coef_[k], n_iter_ = lars_path( From 1ed02802941c9cc65f179492aead2bdfd95214d9 Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Tue, 17 Jan 2017 13:08:55 -0500 Subject: [PATCH 4/4] adding changelog entry --- doc/whats_new.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 66e8212947cf0..ebdbd2c03d666 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -182,6 +182,10 @@ Bug fixes would be raised on trying to stack matrices with different dimensions. :issue:`8093` by :user:`Peter Bull `. + - Fix a bug where :func:`sklearn.linear_model.LassoLars.fit` sometimes + left `coef_` as a list, rather than an ndarray. + :issue:`8160` by :user:`CJ Carey `. + API changes summary -------------------