From d35650d52d0b5b6eaf24e607bd6834728dd9a07d Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 31 Jul 2020 18:14:14 +0200 Subject: [PATCH 1/5] TST enable to run common test on stacking and voting estimators --- setup.cfg | 2 +- sklearn/utils/_testing.py | 2 +- sklearn/utils/estimator_checks.py | 22 +++++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/setup.cfg b/setup.cfg index 1a09d8872e9b1..7efa226c6374e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,7 +13,7 @@ addopts = --ignore maint_tools --ignore asv_benchmarks --doctest-modules - --disable-pytest-warnings + # --disable-pytest-warnings -rxXs filterwarnings = diff --git a/sklearn/utils/_testing.py b/sklearn/utils/_testing.py index 1dd04f5d92885..d3a1d3bfaa9a5 100644 --- a/sklearn/utils/_testing.py +++ b/sklearn/utils/_testing.py @@ -58,7 +58,7 @@ _dummy = TestCase('__init__') assert_raises = _dummy.assertRaises -SkipTest = unittest.case.SkipTest +SkipTest = unittest.SkipTest assert_dict_equal = _dummy.assertDictEqual assert_raises_regex = _dummy.assertRaisesRegex diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py index a61de0767f697..21889046bd554 100644 --- a/sklearn/utils/estimator_checks.py +++ b/sklearn/utils/estimator_checks.py @@ -28,7 +28,9 @@ from ._testing import ignore_warnings from ._testing import create_memmap_backed_data from . import is_scalar_nan + from ..discriminant_analysis import LinearDiscriminantAnalysis +from ..linear_model import LogisticRegression from ..linear_model import Ridge from ..base import (clone, ClusterMixin, is_classifier, is_regressor, @@ -335,10 +337,24 @@ def _construct_instance(Estimator): estimator = Estimator(Ridge()) else: estimator = Estimator(LinearDiscriminantAnalysis()) + elif required_parameters in (['estimators'],): + # Heterogeneous ensemble classes (i.e. stacking, voting) + if issubclass(Estimator, RegressorMixin): + estimator = Estimator(estimators=[ + ("est1", Ridge(alpha=0.1)), + ("est2", Ridge(alpha=1)) + ]) + else: + estimator = Estimator(estimators=[ + ("est1", LogisticRegression(C=0.1)), + ("est2", LogisticRegression(C=1)) + ]) else: - raise SkipTest("Can't instantiate estimator {} which requires " - "parameters {}".format(Estimator.__name__, - required_parameters)) + msg = (f"Can't instantiate estimator {Estimator.__name__} " + f"parameters {required_parameters}") + # raise additional warning to be shown by pytest + warnings.warn(msg, SkipTestWarning) + raise SkipTest(msg) else: estimator = Estimator() return estimator From 334d56ed27e5be62bca2cc333f69fdfd72fdea32 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 31 Jul 2020 18:15:44 +0200 Subject: [PATCH 2/5] revert config changes --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 7efa226c6374e..1a09d8872e9b1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,7 +13,7 @@ addopts = --ignore maint_tools --ignore asv_benchmarks --doctest-modules - # --disable-pytest-warnings + --disable-pytest-warnings -rxXs filterwarnings = From 3e582699a140760e9ec5214b39a68ca83a423082 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Fri, 31 Jul 2020 18:16:31 +0200 Subject: [PATCH 3/5] revert unecessary change in _testing --- sklearn/utils/_testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/utils/_testing.py b/sklearn/utils/_testing.py index d3a1d3bfaa9a5..1dd04f5d92885 100644 --- a/sklearn/utils/_testing.py +++ b/sklearn/utils/_testing.py @@ -58,7 +58,7 @@ _dummy = TestCase('__init__') assert_raises = _dummy.assertRaises -SkipTest = unittest.SkipTest +SkipTest = unittest.case.SkipTest assert_dict_equal = _dummy.assertDictEqual assert_raises_regex = _dummy.assertRaisesRegex From 78f90952af32159e3edd79ef93295107aac5b5c1 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 13 Aug 2020 17:07:10 +0200 Subject: [PATCH 4/5] TST remove check_estimator from local files --- sklearn/ensemble/tests/test_stacking.py | 20 -------------------- sklearn/ensemble/tests/test_voting.py | 19 ------------------- 2 files changed, 39 deletions(-) diff --git a/sklearn/ensemble/tests/test_stacking.py b/sklearn/ensemble/tests/test_stacking.py index 88dd76cb0b49d..0ba155a8d1bf3 100644 --- a/sklearn/ensemble/tests/test_stacking.py +++ b/sklearn/ensemble/tests/test_stacking.py @@ -44,8 +44,6 @@ from sklearn.utils._testing import assert_allclose from sklearn.utils._testing import assert_allclose_dense_sparse from sklearn.utils._testing import ignore_warnings -from sklearn.utils.estimator_checks import check_estimator -from sklearn.utils.estimator_checks import check_no_attributes_set_in_init X_diabetes, y_diabetes = load_diabetes(return_X_y=True) X_iris, y_iris = load_iris(return_X_y=True) @@ -368,24 +366,6 @@ def test_stacking_randomness(estimator, X, y): ) -# These warnings are raised due to _BaseComposition -@pytest.mark.filterwarnings("ignore:TypeError occurred during set_params") -@pytest.mark.filterwarnings("ignore:Estimator's parameters changed after") -@pytest.mark.parametrize( - "estimator", - [StackingClassifier( - estimators=[('lr', LogisticRegression(random_state=0)), - ('tree', DecisionTreeClassifier(random_state=0))]), - StackingRegressor( - estimators=[('lr', LinearRegression()), - ('tree', DecisionTreeRegressor(random_state=0))])], - ids=['StackingClassifier', 'StackingRegressor'] -) -def test_check_estimators_stacking_estimator(estimator): - check_estimator(estimator) - check_no_attributes_set_in_init(estimator.__class__.__name__, estimator) - - def test_stacking_classifier_stratify_default(): # check that we stratify the classes for the default CV clf = StackingClassifier( diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index 7e8852f2d0f19..7fa1fce0f755d 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -7,8 +7,6 @@ from sklearn.utils._testing import assert_almost_equal, assert_array_equal from sklearn.utils._testing import assert_array_almost_equal from sklearn.utils._testing import assert_raise_message -from sklearn.utils.estimator_checks import check_estimator -from sklearn.utils.estimator_checks import check_no_attributes_set_in_init from sklearn.exceptions import NotFittedError from sklearn.linear_model import LinearRegression from sklearn.linear_model import LogisticRegression @@ -490,23 +488,6 @@ def test_none_estimator_with_weights(X, y, voter): assert y_pred.shape == y.shape -@pytest.mark.parametrize( - "estimator", - [VotingRegressor( - estimators=[('lr', LinearRegression()), - ('tree', DecisionTreeRegressor(random_state=0))]), - VotingClassifier( - estimators=[('lr', LogisticRegression(random_state=0)), - ('tree', DecisionTreeClassifier(random_state=0))])], - ids=['VotingRegressor', 'VotingClassifier'] -) -def test_check_estimators_voting_estimator(estimator): - # FIXME: to be removed when meta-estimators can specified themselves - # their testing parameters (for required parameters). - check_estimator(estimator) - check_no_attributes_set_in_init(estimator.__class__.__name__, estimator) - - @pytest.mark.parametrize( "est", [VotingRegressor( From 75fc8862adbb98ac7e8ebff3f6c9d01de69d5bb2 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 13 Aug 2020 17:41:42 +0200 Subject: [PATCH 5/5] PEP8 --- sklearn/ensemble/tests/test_stacking.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sklearn/ensemble/tests/test_stacking.py b/sklearn/ensemble/tests/test_stacking.py index 0ba155a8d1bf3..d6b4c385b9073 100644 --- a/sklearn/ensemble/tests/test_stacking.py +++ b/sklearn/ensemble/tests/test_stacking.py @@ -27,8 +27,6 @@ from sklearn.svm import LinearSVC from sklearn.svm import LinearSVR from sklearn.svm import SVC -from sklearn.tree import DecisionTreeClassifier -from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import scale