def test_check_estimator(): # tests that the estimator actually fails on "bad" estimators. # not a complete test of all checks, which are very extensive. # check that we have a set_params and can clone msg = "it does not implement a 'get_params' methods" assert_raises_regex(TypeError, msg, check_estimator, object) # check that we have a fit method msg = "object has no attribute 'fit'" assert_raises_regex(AttributeError, msg, check_estimator, BaseEstimator) # check that fit does input validation msg = "TypeError not raised" assert_raises_regex(AssertionError, msg, check_estimator, BaseBadClassifier) # check that predict does input validation (doesn't accept dicts in input) msg = "Estimator doesn't check for NaN and inf in predict" assert_raises_regex(AssertionError, msg, check_estimator, NoCheckinPredict) # check that estimator state does not change # at transform/predict/predict_proba time msg = 'Estimator changes __dict__ during predict' assert_raises_regex(AssertionError, msg, check_estimator, ChangesDict) # check that `fit` only changes attributes that # are private (start with an _ or end with a _). msg = ('Estimator changes public attribute\(s\) during the fit method.' ' Estimators are only allowed to change attributes started' ' or ended with _, but wrong_attribute changed') assert_raises_regex(AssertionError, msg, check_estimator, ChangesWrongAttribute) # check that `fit` doesn't add any public attribute msg = ('Estimator adds public attribute\(s\) during the fit method.' ' Estimators are only allowed to add private attributes' ' either started with _ or ended' ' with _ but wrong_attribute added') assert_raises_regex(AssertionError, msg, check_estimator, SetsWrongAttribute) # check for sparse matrix input handling name = NoSparseClassifier.__name__ msg = ("Estimator " + name + " doesn't seem to fail gracefully on" " sparse data") # the check for sparse input handling prints to the stdout, # instead of raising an error, so as not to remove the original traceback. # that means we need to jump through some hoops to catch it. old_stdout = sys.stdout string_buffer = StringIO() sys.stdout = string_buffer try: check_estimator(NoSparseClassifier) except: pass finally: sys.stdout = old_stdout assert_true(msg in string_buffer.getvalue())
def test_check_estimator(Estimator, err_type, err_msg): with pytest.raises(err_type, message=err_msg): check_estimator(Estimator)
def test_all_estimators(name, Estimator): # don't run twice the sampler tests. Meta-estimator do not have a # fit_resample method. check_estimator(Estimator, run_sampler_tests=False)
def test_check_estimator(): # tests that the estimator actually fails on "bad" estimators. # not a complete test of all checks, which are very extensive. # check that we have a set_params and can clone msg = "it does not implement a 'get_params' methods" with raises(TypeError, match=msg): check_estimator(object) # check that we have a fit method msg = "object has no attribute 'fit'" with raises(AttributeError, match=msg): check_estimator(BaseEstimator) # check that fit does input validation msg = "TypeError not raised" with raises(AssertionError, match=msg): check_estimator(BaseBadClassifier) # check that predict does input validation (doesn't accept dicts in input) msg = "Estimator doesn't check for NaN and inf in predict" with raises(AssertionError, match=msg): check_estimator(NoCheckinPredict) # check that estimator state does not change # at transform/predict/predict_proba time msg = 'Estimator changes __dict__ during predict' with raises(AssertionError, match=msg): check_estimator(ChangesDict) # check that `fit` only changes attributes that # are private (start with an _ or end with a _). msg = ('Estimator changes public attribute\(s\) during the fit method.' ' Estimators are only allowed to change attributes started' ' or ended with _, but wrong_attribute changed') with raises(AssertionError, match=msg): check_estimator(ChangesWrongAttribute) # check that `fit` doesn't add any public attribute msg = ('Estimator adds public attribute\(s\) during the fit method.' ' Estimators are only allowed to add private attributes' ' either started with _ or ended' ' with _ but wrong_attribute added') with raises(AssertionError, match=msg): check_estimator(SetsWrongAttribute) # check for sparse matrix input handling name = NoSparseClassifier.__name__ msg = ("Estimator " + name + " doesn't seem to fail gracefully on" " sparse data") # the check for sparse input handling prints to the stdout, # instead of raising an error, so as not to remove the original traceback. # that means we need to jump through some hoops to catch it. old_stdout = sys.stdout string_buffer = StringIO() sys.stdout = string_buffer try: check_estimator(NoSparseClassifier) except: pass finally: sys.stdout = old_stdout assert msg in string_buffer.getvalue()