From ea8c5b805e2761db80c068855f856bbef5d80823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Thu, 23 Mar 2023 14:13:01 +0100 Subject: [PATCH] Add KDBNew and TANNew tests --- bayesclass/__init__.py | 1 + bayesclass/clfs.py | 44 +++++- .../test_KDBNew/line_dashes_KDBNew.png | Bin 0 -> 51400 bytes .../test_TANNew/line_dashes_TANNew.png | Bin 0 -> 41803 bytes bayesclass/tests/test_KDB.py | 1 - bayesclass/tests/test_KDBNew.py | 127 ++++++++++++++++++ bayesclass/tests/test_TAN.py | 13 +- bayesclass/tests/test_TANNew.py | 121 +++++++++++++++++ pyproject.toml | 1 + 9 files changed, 298 insertions(+), 10 deletions(-) create mode 100644 bayesclass/tests/baseline_images/test_KDBNew/line_dashes_KDBNew.png create mode 100644 bayesclass/tests/baseline_images/test_TANNew/line_dashes_TANNew.png create mode 100644 bayesclass/tests/test_KDBNew.py create mode 100644 bayesclass/tests/test_TANNew.py diff --git a/bayesclass/__init__.py b/bayesclass/__init__.py index 0ef73dd..803f64a 100644 --- a/bayesclass/__init__.py +++ b/bayesclass/__init__.py @@ -17,4 +17,5 @@ __all__ = [ "KDB", "AODE", "KDBNew", + "AODENew", ] diff --git a/bayesclass/clfs.py b/bayesclass/clfs.py index 7db719b..566fb76 100644 --- a/bayesclass/clfs.py +++ b/bayesclass/clfs.py @@ -460,6 +460,21 @@ class AODE(BayesBase, BaseEnsemble): class TANNew(TAN): + def __init__( + self, + show_progress=False, + random_state=None, + discretizer_depth=1e6, + discretizer_length=3, + discretizer_cuts=0, + ): + self.discretizer_depth = discretizer_depth + self.discretizer_length = discretizer_length + self.discretizer_cuts = discretizer_cuts + super().__init__( + show_progress=show_progress, random_state=random_state + ) + def fit(self, X, y, **kwargs): self.estimator = Proposal(self) return self.estimator.fit(X, y, **kwargs) @@ -470,6 +485,22 @@ class TANNew(TAN): class KDBNew(KDB): + def __init__( + self, + k=2, + show_progress=False, + random_state=None, + discretizer_depth=1e6, + discretizer_length=3, + discretizer_cuts=0, + ): + self.discretizer_depth = discretizer_depth + self.discretizer_length = discretizer_length + self.discretizer_cuts = discretizer_cuts + super().__init__( + k=k, show_progress=show_progress, random_state=random_state + ) + def fit(self, X, y, **kwargs): self.estimator = Proposal(self) return self.estimator.fit(X, y, **kwargs) @@ -478,14 +509,25 @@ class KDBNew(KDB): return self.estimator.predict(X) +class AODENew(AODE): + pass + + class Proposal: def __init__(self, estimator): self.estimator = estimator self.class_type = estimator.__class__ def fit(self, X, y, **kwargs): + # Check parameters + super(self.class_type, self.estimator)._check_params(X, y, kwargs) # Discretize train data - self.discretizer = FImdlp(n_jobs=1) + self.discretizer = FImdlp( + n_jobs=1, + max_depth=self.estimator.discretizer_depth, + min_length=self.estimator.discretizer_length, + max_cuts=self.estimator.discretizer_cuts, + ) self.Xd = self.discretizer.fit_transform(X, y) kwargs = self.update_kwargs(y, kwargs) # Build the model diff --git a/bayesclass/tests/baseline_images/test_KDBNew/line_dashes_KDBNew.png b/bayesclass/tests/baseline_images/test_KDBNew/line_dashes_KDBNew.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd33129c4904fce60a7c5a8ae037d4688ad68ae GIT binary patch literal 51400 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 YL`Xgf^oXc!^CY}1%&p9F_qbg68|7jRYybcN literal 0 HcmV?d00001 diff --git a/bayesclass/tests/baseline_images/test_TANNew/line_dashes_TANNew.png b/bayesclass/tests/baseline_images/test_TANNew/line_dashes_TANNew.png new file mode 100644 index 0000000000000000000000000000000000000000..3f555994596929d4cb4d97e1c477d42fba9c1dca GIT binary patch literal 41803 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%0Az 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 literal 0 HcmV?d00001 diff --git a/bayesclass/tests/test_KDB.py b/bayesclass/tests/test_KDB.py index 41b977d..acda865 100644 --- a/bayesclass/tests/test_KDB.py +++ b/bayesclass/tests/test_KDB.py @@ -55,7 +55,6 @@ def test_KDB_nodes_edges(clf, data): def test_KDB_states(clf, data): assert clf.states_ == 0 - clf = KDB(k=3, random_state=17) clf.fit(*data) assert clf.states_ == 23 assert clf.depth_ == clf.states_ diff --git a/bayesclass/tests/test_KDBNew.py b/bayesclass/tests/test_KDBNew.py new file mode 100644 index 0000000..e8948ae --- /dev/null +++ b/bayesclass/tests/test_KDBNew.py @@ -0,0 +1,127 @@ +import pytest +import numpy as np +from sklearn.datasets import load_iris +from sklearn.preprocessing import KBinsDiscretizer +from matplotlib.testing.decorators import image_comparison +from matplotlib.testing.conftest import mpl_test_settings +from pgmpy.models import BayesianNetwork + + +from bayesclass.clfs import KDBNew +from .._version import __version__ + + +@pytest.fixture +def data(): + X, y = load_iris(return_X_y=True) + enc = KBinsDiscretizer(encode="ordinal") + return enc.fit_transform(X), y + + +@pytest.fixture +def clf(): + return KDBNew(k=3) + + +def test_KDBNew_default_hyperparameters(data, clf): + # Test default values of hyperparameters + assert not clf.show_progress + assert clf.random_state is None + assert clf.theta == 0.03 + clf = KDBNew(show_progress=True, random_state=17, k=3) + assert clf.show_progress + assert clf.random_state == 17 + assert clf.k == 3 + clf.fit(*data) + assert clf.class_name_ == "class" + assert clf.feature_names_in_ == [ + "feature_0", + "feature_1", + "feature_2", + "feature_3", + ] + + +def test_KDBNew_version(clf): + """Check KDBNew version.""" + assert __version__ == clf.version() + + +def test_KDBNew_nodes_edges(clf, data): + assert clf.nodes_edges() == (0, 0) + clf.fit(*data) + assert clf.nodes_leaves() == (5, 10) + + +def test_KDBNew_states(clf, data): + assert clf.states_ == 0 + clf.fit(*data) + assert clf.states_ == 23 + assert clf.depth_ == clf.states_ + + +def test_KDBNew_classifier(data, clf): + clf.fit(*data) + attribs = ["classes_", "X_", "y_", "feature_names_in_", "class_name_"] + for attr in attribs: + assert hasattr(clf, attr) + X = data[0] + y = data[1] + y_pred = clf.predict(X) + assert y_pred.shape == (X.shape[0],) + assert sum(y == y_pred) == 148 + + +@image_comparison( + baseline_images=["line_dashes_KDBNew"], + remove_text=True, + extensions=["png"], +) +def test_KDBNew_plot(data, clf): + # mpl_test_settings will automatically clean these internal side effects + mpl_test_settings + dataset = load_iris(as_frame=True) + clf.fit(*data, features=dataset["feature_names"]) + clf.plot("KDBNew Iris") + + +def test_KDBNew_wrong_num_features(data, clf): + with pytest.raises( + ValueError, + match="Number of features does not match the number of columns in X", + ): + clf.fit(*data, features=["feature_1", "feature_2"]) + + +def test_KDBNew_wrong_hyperparam(data, clf): + with pytest.raises(ValueError, match="Unexpected argument: wrong_param"): + clf.fit(*data, wrong_param="wrong_param") + + +def test_KDBNew_error_size_predict(data, clf): + X, y = data + clf.fit(X, y) + with pytest.raises(ValueError): + X_diff_size = np.ones((10, X.shape[1] + 1)) + clf.predict(X_diff_size) + + +def test_KDBNew_dont_do_cycles(): + clf = KDBNew(k=4) + dag = BayesianNetwork() + clf.feature_names_in_ = [ + "feature_0", + "feature_1", + "feature_2", + "feature_3", + ] + nodes = list(range(4)) + weights = np.ones((4, 4)) + for idx in range(1, 4): + dag.add_edge(clf.feature_names_in_[0], clf.feature_names_in_[idx]) + dag.add_edge(clf.feature_names_in_[1], clf.feature_names_in_[2]) + dag.add_edge(clf.feature_names_in_[1], clf.feature_names_in_[3]) + dag.add_edge(clf.feature_names_in_[2], clf.feature_names_in_[3]) + for idx in range(4): + clf._add_m_edges(dag, idx, nodes, weights) + assert len(dag.edges()) == 6 diff --git a/bayesclass/tests/test_TAN.py b/bayesclass/tests/test_TAN.py index ddba503..95ec46a 100644 --- a/bayesclass/tests/test_TAN.py +++ b/bayesclass/tests/test_TAN.py @@ -19,16 +19,16 @@ def data(): @pytest.fixture def clf(): - return TAN() + return TAN(random_state=17) def test_TAN_default_hyperparameters(data, clf): # Test default values of hyperparameters assert not clf.show_progress - assert clf.random_state is None - clf = TAN(show_progress=True, random_state=17) - assert clf.show_progress assert clf.random_state == 17 + clf = TAN(show_progress=True) + assert clf.show_progress + assert clf.random_state is None clf.fit(*data) assert clf.head_ == 0 assert clf.class_name_ == "class" @@ -47,21 +47,18 @@ def test_TAN_version(clf): def test_TAN_nodes_edges(clf, data): assert clf.nodes_edges() == (0, 0) - clf = TAN(random_state=17) clf.fit(*data, head="random") assert clf.nodes_leaves() == (5, 7) def test_TAN_states(clf, data): assert clf.states_ == 0 - clf = TAN(random_state=17) clf.fit(*data) assert clf.states_ == 23 assert clf.depth_ == clf.states_ -def test_TAN_random_head(data): - clf = TAN(random_state=17) +def test_TAN_random_head(clf, data): clf.fit(*data, head="random") assert clf.head_ == 3 diff --git a/bayesclass/tests/test_TANNew.py b/bayesclass/tests/test_TANNew.py new file mode 100644 index 0000000..2208f26 --- /dev/null +++ b/bayesclass/tests/test_TANNew.py @@ -0,0 +1,121 @@ +import pytest +import numpy as np +from sklearn.datasets import load_iris +from sklearn.preprocessing import KBinsDiscretizer +from matplotlib.testing.decorators import image_comparison +from matplotlib.testing.conftest import mpl_test_settings + + +from bayesclass.clfs import TANNew +from .._version import __version__ + + +@pytest.fixture +def data(): + X, y = load_iris(return_X_y=True) + enc = KBinsDiscretizer(encode="ordinal") + return enc.fit_transform(X), y + + +@pytest.fixture +def clf(): + return TANNew(random_state=17) + + +def test_TANNew_default_hyperparameters(data, clf): + # Test default values of hyperparameters + assert not clf.show_progress + assert clf.random_state == 17 + clf = TANNew(show_progress=True) + assert clf.show_progress + assert clf.random_state is None + clf.fit(*data) + assert clf.head_ == 0 + assert clf.class_name_ == "class" + assert clf.feature_names_in_ == [ + "feature_0", + "feature_1", + "feature_2", + "feature_3", + ] + + +def test_TANNew_version(clf): + """Check TANNew version.""" + assert __version__ == clf.version() + + +def test_TANNew_nodes_edges(clf, data): + assert clf.nodes_edges() == (0, 0) + clf.fit(*data, head="random") + assert clf.nodes_leaves() == (5, 7) + + +def test_TANNew_states(clf, data): + assert clf.states_ == 0 + clf.fit(*data) + assert clf.states_ == 22 + assert clf.depth_ == clf.states_ + + +def test_TANNew_random_head(clf, data): + clf.fit(*data, head="random") + assert clf.head_ == 3 + + +def test_TANNew_classifier(data, clf): + clf.fit(*data) + attribs = [ + "classes_", + "X_", + "y_", + "head_", + "feature_names_in_", + "class_name_", + ] + for attr in attribs: + assert hasattr(clf, attr) + X = data[0] + y = data[1] + y_pred = clf.predict(X) + assert y_pred.shape == (X.shape[0],) + assert sum(y == y_pred) == 145 + + +@image_comparison( + baseline_images=["line_dashes_TANNew"], + remove_text=True, + extensions=["png"], +) +def test_TANNew_plot(data, clf): + # mpl_test_settings will automatically clean these internal side effects + mpl_test_settings + dataset = load_iris(as_frame=True) + clf.fit(*data, features=dataset["feature_names"], head=0) + clf.plot("TANNew Iris head=0") + + +def test_TANNew_wrong_num_features(data, clf): + with pytest.raises( + ValueError, + match="Number of features does not match the number of columns in X", + ): + clf.fit(*data, features=["feature_1", "feature_2"]) + + +def test_TANNew_wrong_hyperparam(data, clf): + with pytest.raises(ValueError, match="Unexpected argument: wrong_param"): + clf.fit(*data, wrong_param="wrong_param") + + +def test_TANNew_head_out_of_range(data, clf): + with pytest.raises(ValueError, match="Head index out of range"): + clf.fit(*data, head=4) + + +def test_TANNew_error_size_predict(data, clf): + X, y = data + clf.fit(X, y) + with pytest.raises(ValueError): + X_diff_size = np.ones((10, X.shape[1] + 1)) + clf.predict(X_diff_size) diff --git a/pyproject.toml b/pyproject.toml index 9fa621d..b8c0021 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "pgmpy", "networkx", "matplotlib", + "fimdlp", ] requires-python = ">=3.8" classifiers = [