def test_no_multiply(): """trying to multiply terms raises an error """ with pytest.raises(NotImplementedError): SplineTerm(0) * LinearTerm(1) term_list = SplineTerm(0) + LinearTerm(1) with pytest.raises(NotImplementedError): term_list * term_list
def test_build_from_info(): """we can rebuild terms from info """ terms = [Intercept(), LinearTerm(0), SplineTerm(0), FactorTerm(0), TensorTerm(0,1)] for term in terms: assert Term.build_from_info(term.info) == term assert te(0, 1) == TensorTerm(SplineTerm(0, n_splines=10), SplineTerm(1, n_splines=10))
def test_term_list_removes_duplicates(): """prove that we remove duplicated terms""" term = SplineTerm(0) term_list = term + term assert isinstance(term_list, TermList) assert len(term_list) == 1
def test_pop_term_from_term_list(): term_list = SplineTerm(0) + LinearTerm(1) + Intercept() term_list_2 = deepcopy(term_list) # by default we pop the last assert term_list_2.pop() == term_list[-1] assert term_list_2.pop(0) == term_list[0] with pytest.raises(ValueError): term_list_2.pop(1) == term_list[0]
def test_num_coefs(mcycle_X_y, wage_X_y): """make sure this method gives correct values """ X, y = mcycle_X_y term = Intercept().compile(X) assert term.n_coefs == 1 term = LinearTerm(0).compile(X) assert term.n_coefs == 1 term = SplineTerm(0).compile(X) assert term.n_coefs == term.n_splines X, y = wage_X_y term = FactorTerm(2).compile(X) assert term.n_coefs == 5 term_a = SplineTerm(0).compile(X) term_b = SplineTerm(1).compile(X) term = TensorTerm(term_a, term_b).compile(X) assert term.n_coefs == term_a.n_coefs * term_b.n_coefs
def test_compose_penalties(self): """penalties should be composable, and this is done by adding all penalties on a single term, NOT multiplying them. so a term with a derivative penalty and a None penalty should be equvalent to a term with a derivative penalty. """ base_term = SplineTerm(0) term = SplineTerm(feature=0, penalties=['auto', 'none']) # penalties should be equivalent assert (term.build_penalties() == base_term.build_penalties()).A.all() # multitple penalties should be additive, not multiplicative, # so 'none' penalty should have no effect assert np.abs(term.build_penalties().A).sum() > 0
def test_wrong_length(): """iterable params must all match lengths """ with pytest.raises(ValueError): SplineTerm(0, lam=[0, 1, 2], penalties=['auto', 'auto'])
def test_no_auto_dtype(self): with pytest.raises(ValueError): SplineTerm(feature=0, dtype='auto')
def test_term_list_from_info(): """we can remake a term list from info """ term_list = SplineTerm(0) + LinearTerm(1) assert Term.build_from_info(term_list.info) == term_list