def check_get_params(Estimator): # Check get params works correctly estimator = _construct_instance(Estimator) params = estimator.get_params() assert isinstance(params, dict) _check_get_params_invariance(estimator.__class__.__name__, estimator)
def test_predict_time_index(Forecaster, fh, y_train): f = _construct_instance(Forecaster) f.fit(y_train, fh) y_pred = f.predict() assert_correct_pred_time_index(y_pred, y_train, fh)
def test_update_predict_single(Forecaster, fh): f = _construct_instance(Forecaster) f.fit(y_train, fh) y_pred = f.update_predict_single(y_test) assert_correct_pred_time_index(y_pred, y_test, fh)
def test_no_fh_in_fit_req(Forecaster): f = _construct_instance(Forecaster) # fh required in fit, raises error if not passed with pytest.raises(ValueError): f.fit(y_train)
def test_same_fh_in_fit_and_predict_req(Forecaster): f = _construct_instance(Forecaster) f.fit(y_train, FH0) np.testing.assert_array_equal(f.fh, FH0) f.predict(FH0) np.testing.assert_array_equal(f.fh, FH0)
def test_update_predict_single(Forecaster, fh): # Check correct time index of update-predict f = _construct_instance(Forecaster) f.fit(y_train, fh=fh) y_pred = f.update_predict_single(y_test) assert_correct_pred_time_index(y_pred.index, y_test.index[-1], fh)
def test_same_fh_in_fit_and_predict_opt(Forecaster): f = _construct_instance(Forecaster) # passing the same fh to both fit and predict works f.fit(y_train, FH0) f.predict(FH0) np.testing.assert_array_equal(f.fh, FH0)
def check_constructor(Estimator): # Check that the constructor behaves correctly estimator = _construct_instance(Estimator) # Check that init does not construct object of other class than itself assert isinstance(estimator, Estimator) # Ensure that each parameter is set in init init_params = _get_args(type(estimator).__init__) invalid_attr = set(init_params) - set(vars(estimator)) - {"self"} assert not invalid_attr, ( "Estimator %s should store all parameters" " as an attribute during init. Did not find " "attributes `%s`." % (estimator.__class__.__name__, sorted(invalid_attr))) # Ensure that init does nothing but set parameters # No logic/interaction with other parameters def param_filter(p): """Identify hyper parameters of an estimator""" return (p.name != 'self' and p.kind != p.VAR_KEYWORD and p.kind != p.VAR_POSITIONAL) init_params = [ p for p in signature(estimator.__init__).parameters.values() if param_filter(p) ] params = estimator.get_params() # Filter out required parameters with no default value and parameters # set for running tests required_params = getattr(estimator, '_required_parameters', []) test_config_params = ESTIMATOR_TEST_PARAMS.get(Estimator, {}).keys() init_params = [ param for param in init_params if param.name not in required_params and param.name not in test_config_params ] for param in init_params: assert param.default != param.empty, ( "parameter `%s` for %s has no default value and is not " "included in `_required_parameters`" % (param.name, estimator.__class__.__name__)) if type(param.default) is type: assert param.default in [np.float64, np.int64] else: assert (type(param.default) in [ str, int, float, bool, tuple, type(None), np.float64, types.FunctionType, joblib.Memory ]) param_value = params[param.name] if isinstance(param_value, np.ndarray): np.testing.assert_array_equal(param_value, param.default) else: if bool( isinstance(param_value, numbers.Real) and np.isnan(param_value)): # Allows to set default parameters to np.nan assert param_value is param.default, param.name else: assert param_value == param.default, param.name
def test_no_fh_opt(Forecaster): f = _construct_instance(Forecaster) f.fit(y_train) # not passing fh to either fit or predict raises error with pytest.raises(ValueError): f.predict()
def _construct_fit(Estimator, **kwargs): estimator = _construct_instance(Estimator) args = _make_args(estimator, "fit", **kwargs)[:2] return estimator.fit(*args)
def check_repr(Estimator): # Check we can call repr estimator = _construct_instance(Estimator) repr(estimator)
def check_transform_inverse_transform_equivalent(Estimator): estimator = _construct_instance(Estimator) X = _make_args(estimator, "fit")[0] Xt = estimator.fit_transform(X) Xit = estimator.inverse_transform(Xt) _assert_array_almost_equal(X, Xit)
def test_y_invalid_type_raises_error(Forecaster, y): with pytest.raises(TypeError, match=r"type"): f = _construct_instance(Forecaster) f.fit(y, fh=FH0)
def test_y_multivariate_raises_error(Forecaster): # Check that multivariate y raises an appropriate error message. y = _make_series(n_columns=2) with pytest.raises(ValueError, match=r"univariate"): f = _construct_instance(Forecaster) f.fit(y, fh=FH0)
def check_set_params(Estimator): # Check set_params works correctly estimator = _construct_instance(Estimator) params = estimator.get_params() assert estimator.set_params(**params) is estimator _check_set_params(estimator.__class__.__name__, estimator)
def test_fh_in_predict_opt(Forecaster): f = _construct_instance(Forecaster) f.fit(y_train) f.predict(FH0) np.testing.assert_array_equal(f.fh, FH0)
def check_clone(Estimator): # Check we can call clone from scikit-learn estimator = _construct_instance(Estimator) clone(estimator)
def test_transformed_data_has_same_index_as_input_data(Transformer): transformer = _construct_instance(Transformer) X, y = _make_args(transformer, "fit") Xt = transformer.fit_transform(X, y) np.testing.assert_array_equal(X.index, Xt.index)