From 4aff885ae4bb5160062e7e83bae1653d552a5281 Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Wed, 18 Jan 2017 04:44:28 -0600 Subject: [PATCH] FIX Ensure coef_ is an ndarray when fitting LassoLars (#8160) * Fix gh-1615: ensure self.coef_ is an ndarray --- doc/whats_new.rst | 4 ++++ sklearn/linear_model/least_angle.py | 5 ++--- sklearn/linear_model/tests/test_least_angle.py | 11 +++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 868f39576a13e..9d76f5377c0e1 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -194,6 +194,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 ------------------- diff --git a/sklearn/linear_model/least_angle.py b/sklearn/linear_model/least_angle.py index 1b040df898b8e..e125d73967f2f 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,7 +682,7 @@ 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_ = [ @@ -690,7 +690,6 @@ def fit(self, X, y, Xy=None): self.coef_)] self.n_iter_ = self.n_iter_[0] 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( 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_,