From 93a685cafff3f12cb7e1a59898b0dd003dbcdc08 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 3 May 2019 15:22:29 +0200 Subject: [PATCH 1/4] FIX estimator can be None and pass sample weight at fit in voting estimators --- doc/whats_new/v0.22.rst | 8 ++++++++ sklearn/ensemble/tests/test_voting.py | 20 ++++++++++++++++++++ sklearn/ensemble/voting.py | 2 ++ 3 files changed, 30 insertions(+) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index ba94680c4efc3..f04223c92b75d 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -39,6 +39,14 @@ Changelog :pr:`123456` by :user:`Joe Bloggs `. where 123456 is the *pull request* number, not the issue number. +:mod:`sklearn.ensemble` +....................... + +- |Fix| :class:`sklearn.ensemble.VotingClassifier` and + :class:`sklearn.ensemble.VotingRegressor` were failing during ``fit`` in one + of the estimators was set to ``None`` and ``sample_weight`` was not ``None``. + :pr:`13779` by :user:`Guillaume Lemaitre `. + Changes to estimator checks --------------------------- diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index 2a19bc9a64dc0..e4b6eeb66b708 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -8,9 +8,11 @@ from sklearn.utils.testing import assert_equal from sklearn.utils.testing import assert_raise_message from sklearn.exceptions import NotFittedError +from sklearn.linear_model import LinearRegression from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier +from sklearn.ensemble import RandomForestRegressor from sklearn.ensemble import VotingClassifier, VotingRegressor from sklearn.model_selection import GridSearchCV from sklearn import datasets @@ -507,3 +509,21 @@ def test_transform(): eclf3.transform(X).swapaxes(0, 1).reshape((4, 6)), eclf2.transform(X) ) + + +@pytest.mark.parametrize( + "X, y, voter", + [(X, y, VotingClassifier([('lr', LogisticRegression()), + ('rf', RandomForestClassifier())])), + (X_r, y_r, VotingRegressor([('lr', LinearRegression()), + ('rf', RandomForestRegressor())]))] +) +def test_none_estimator_with_weights(X, y, voter): + # check that an estimator can be set to None and passing some weight + # regression test for + # https://github.com/scikit-learn/scikit-learn/issues/13777 + voter.fit(X, y, sample_weight=np.ones(y.shape)) + voter.set_params(lr=None) + voter.fit(X, y, sample_weight=np.ones(y.shape)) + y_pred = voter.predict(X) + assert y_pred.shape == y.shape diff --git a/sklearn/ensemble/voting.py b/sklearn/ensemble/voting.py index 35821201b6617..eefa0b0ac2c17 100644 --- a/sklearn/ensemble/voting.py +++ b/sklearn/ensemble/voting.py @@ -78,6 +78,8 @@ def fit(self, X, y, sample_weight=None): if sample_weight is not None: for name, step in self.estimators: + if step is None: + continue if not has_fit_parameter(step, 'sample_weight'): raise ValueError('Underlying estimator \'%s\' does not' ' support sample weights.' % name) From 36b70b222559006b1685b23ca0d6532392162cc7 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 3 May 2019 15:50:39 +0200 Subject: [PATCH 2/4] decorate for warning --- sklearn/ensemble/tests/test_voting.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index e4b6eeb66b708..0a4a9eab8c160 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -511,12 +511,16 @@ def test_transform(): ) +@pytest.mark.filterwarnings('ignore: Default solver will be changed') # 0.22 +@pytest.mark.filterwarnings('ignore: Default multi_class will') # 0.22 @pytest.mark.parametrize( "X, y, voter", - [(X, y, VotingClassifier([('lr', LogisticRegression()), - ('rf', RandomForestClassifier())])), - (X_r, y_r, VotingRegressor([('lr', LinearRegression()), - ('rf', RandomForestRegressor())]))] + [(X, y, VotingClassifier( + [('lr', LogisticRegression()), + ('rf', RandomForestClassifier(n_estimators=5))])), + (X_r, y_r, VotingRegressor( + [('lr', LinearRegression()), + ('rf', RandomForestRegressor(n_estimators=5))]))] ) def test_none_estimator_with_weights(X, y, voter): # check that an estimator can be set to None and passing some weight From 333ca48462f4b32c46b6bbb31c8d11a61918ee8b Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 3 May 2019 16:24:19 +0200 Subject: [PATCH 3/4] remove useless module root --- doc/whats_new/v0.22.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index f04223c92b75d..3453eac2da601 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -42,8 +42,8 @@ Changelog :mod:`sklearn.ensemble` ....................... -- |Fix| :class:`sklearn.ensemble.VotingClassifier` and - :class:`sklearn.ensemble.VotingRegressor` were failing during ``fit`` in one +- |Fix| :class:`ensemble.VotingClassifier` and + :class:`ensemble.VotingRegressor` were failing during ``fit`` in one of the estimators was set to ``None`` and ``sample_weight`` was not ``None``. :pr:`13779` by :user:`Guillaume Lemaitre `. From 889bc2003972c30a00562a1c81aaa0a072938b42 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Mon, 6 May 2019 11:23:53 +0200 Subject: [PATCH 4/4] update whats new --- doc/whats_new/v0.21.rst | 5 +++++ doc/whats_new/v0.22.rst | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/doc/whats_new/v0.21.rst b/doc/whats_new/v0.21.rst index bf18d8350646e..0efed6b9fcff2 100644 --- a/doc/whats_new/v0.21.rst +++ b/doc/whats_new/v0.21.rst @@ -319,6 +319,11 @@ Support for Python 3.4 and below has been officially dropped. :pr:`12599` by :user:`Trevor Stephens` and :user:`Nicolas Hug`. +- |Fix| :class:`ensemble.VotingClassifier` and + :class:`ensemble.VotingRegressor` were failing during ``fit`` in one + of the estimators was set to ``None`` and ``sample_weight`` was not ``None``. + :pr:`13779` by :user:`Guillaume Lemaitre `. + :mod:`sklearn.externals` ........................ diff --git a/doc/whats_new/v0.22.rst b/doc/whats_new/v0.22.rst index 3453eac2da601..ba94680c4efc3 100644 --- a/doc/whats_new/v0.22.rst +++ b/doc/whats_new/v0.22.rst @@ -39,14 +39,6 @@ Changelog :pr:`123456` by :user:`Joe Bloggs `. where 123456 is the *pull request* number, not the issue number. -:mod:`sklearn.ensemble` -....................... - -- |Fix| :class:`ensemble.VotingClassifier` and - :class:`ensemble.VotingRegressor` were failing during ``fit`` in one - of the estimators was set to ``None`` and ``sample_weight`` was not ``None``. - :pr:`13779` by :user:`Guillaume Lemaitre `. - Changes to estimator checks ---------------------------