From a46d105ebe88ad8e7890fdaffb0bc846afde3671 Mon Sep 17 00:00:00 2001 From: Andreas Mueller Date: Wed, 9 Nov 2016 14:34:04 -0500 Subject: [PATCH] [MRG + 2] Fixed parameter setting in SelectFromModel (#7764) * Fixed cloning ``estimator`` again when calling fit a second time in SelectFromModel * fix link in whatsnew --- doc/whats_new.rst | 3 +++ sklearn/feature_selection/from_model.py | 3 +-- sklearn/feature_selection/tests/test_from_model.py | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 08fbfedc79c92..cc26a63c68a82 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -141,6 +141,9 @@ Bug fixes functions were not accepting multi-label targets. :issue:`7676` by `Mohammed Affan`_ + - Fixed setting parameters when calling ``fit`` multiple times on + :class:`feature_selection.SelectFromModel`. :issue:`7756` by `Andreas Müller`_ + - Fixes issue in ``partial_fit`` method of :class:`multiclass.OneVsRestClassifier` when number of classes used in ``partial_fit`` was less than the total number of classes in the diff --git a/sklearn/feature_selection/from_model.py b/sklearn/feature_selection/from_model.py index e8a18031f1dc8..31a862b60166c 100644 --- a/sklearn/feature_selection/from_model.py +++ b/sklearn/feature_selection/from_model.py @@ -232,8 +232,7 @@ def fit(self, X, y=None, **fit_params): if self.prefit: raise NotFittedError( "Since 'prefit=True', call transform directly") - if not hasattr(self, "estimator_"): - self.estimator_ = clone(self.estimator) + self.estimator_ = clone(self.estimator) self.estimator_.fit(X, y, **fit_params) return self diff --git a/sklearn/feature_selection/tests/test_from_model.py b/sklearn/feature_selection/tests/test_from_model.py index a4789de0976bb..7f303cf8e2922 100644 --- a/sklearn/feature_selection/tests/test_from_model.py +++ b/sklearn/feature_selection/tests/test_from_model.py @@ -2,6 +2,7 @@ import scipy.sparse as sp from sklearn.utils.testing import assert_true +from sklearn.utils.testing import assert_equal from sklearn.utils.testing import assert_less from sklearn.utils.testing import assert_greater from sklearn.utils.testing import assert_array_almost_equal @@ -144,14 +145,13 @@ def test_partial_fit(): assert_array_equal(X_transform, transformer.transform(data)) -def test_warm_start(): - est = PassiveAggressiveClassifier(warm_start=True, random_state=0) +def test_calling_fit_reinitializes(): + est = LinearSVC(random_state=0) transformer = SelectFromModel(estimator=est) transformer.fit(data, y) - old_model = transformer.estimator_ + transformer.set_params(estimator__C=100) transformer.fit(data, y) - new_model = transformer.estimator_ - assert_true(old_model is new_model) + assert_equal(transformer.estimator_.C, 100) def test_prefit():