From a06c0a5a10fb7da95f34362bbe3c4ef3ff1f3b68 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:05:16 -0400 Subject: [PATCH] add separate unit and regression tests for different sklearn versions --- ...erence.pkl => kmeans-v1.2.2_reference.pkl} | Bin .../kmeans-v1.3_reference.pkl | Bin 0 -> 81655 bytes test/regression/test_regression.py | 112 +++++++++++++++++- .../samplers/extrapolative/test_kmeans.py | 104 +++++++++++++++- 4 files changed, 213 insertions(+), 3 deletions(-) rename test/regression/reference_splits/{kmeans_reference.pkl => kmeans-v1.2.2_reference.pkl} (100%) create mode 100644 test/regression/reference_splits/kmeans-v1.3_reference.pkl diff --git a/test/regression/reference_splits/kmeans_reference.pkl b/test/regression/reference_splits/kmeans-v1.2.2_reference.pkl similarity index 100% rename from test/regression/reference_splits/kmeans_reference.pkl rename to test/regression/reference_splits/kmeans-v1.2.2_reference.pkl diff --git a/test/regression/reference_splits/kmeans-v1.3_reference.pkl b/test/regression/reference_splits/kmeans-v1.3_reference.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c601286a48814ebcee6c0f46e8e73dcd2a1f5c91 GIT binary patch literal 81655 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 literal 0 HcmV?d00001 diff --git a/test/regression/test_regression.py b/test/regression/test_regression.py index d6bc8e2d..d44fcdf7 100644 --- a/test/regression/test_regression.py +++ b/test/regression/test_regression.py @@ -4,6 +4,7 @@ from datetime import datetime import numpy as np +import pkg_resources from astartes import train_val_test_split from astartes.samplers import ( @@ -12,6 +13,17 @@ IMPLEMENTED_INTERPOLATION_SAMPLERS, ) +SKLEARN_GEQ_13 = ( # get the sklearn version + int( + pkg_resources.get_distribution( + "scikit-learn", + ).version.split( + "." + )[1] + ) + >= 3 +) + class Test_regression(unittest.TestCase): """ @@ -34,8 +46,20 @@ def setUpClass(self): self.reference_splits = { name: os.path.join(self.reference_splits_dir, name + "_reference.pkl") for name in ALL_SAMPLERS - if name not in ("scaffold",) + if name + not in ( + "scaffold", + "kmeans", + ) } + self.reference_splits["kmeans-v1.3"] = os.path.join( + self.reference_splits_dir, + "kmeans-v1.3_reference.pkl", + ) + self.reference_splits["kmeans-v1.2.2"] = os.path.join( + self.reference_splits_dir, + "kmeans-v1.2.2_reference.pkl", + ) def test_timebased_regression(self): """Regression test TimeBased, which has labels to check as well.""" @@ -94,7 +118,7 @@ def test_interpolation_regression(self): def test_extrapolation_regression(self): """Regression testing of extrapolative methods relative to static results.""" for sampler_name in IMPLEMENTED_EXTRAPOLATION_SAMPLERS: - if sampler_name in ("scaffold", "time_based"): + if sampler_name in ("scaffold", "time_based", "kmeans"): continue ( X_train, @@ -133,6 +157,90 @@ def test_extrapolation_regression(self): "Sampler {:s} failed regression testing.".format(sampler_name), ) + @unittest.skipUnless( + SKLEARN_GEQ_13, + "sklearn version less than 1.3 detected", + ) + def test_kmeans_regression_sklearn_v13(self): + """Regression testing of KMeans in sklearn v1.3 or newer.""" + ( + X_train, + X_val, + X_test, + y_train, + y_val, + y_test, + clusters_train, + clusters_val, + clusters_test, + ) = train_val_test_split( + self.X, + self.y, + sampler="kmeans", + random_state=42, + ) + all_output = [ + X_train, + X_val, + X_test, + y_train, + y_val, + y_test, + clusters_train, + clusters_val, + clusters_test, + ] + with open(self.reference_splits["kmeans-v1.3"], "rb") as f: + reference_output = pkl.load(f) + for i, j in zip(all_output, reference_output): + np.testing.assert_array_equal( + i, + j, + "Sampler kmeans failed regression testing.", + ) + + @unittest.skipIf( + SKLEARN_GEQ_13, + "sklearn version 1.3 or newer detected", + ) + def test_kmeans_regression_sklearn_v12(self): + """Regression testing of KMeans in sklearn v1.2 or earlier.""" + ( + X_train, + X_val, + X_test, + y_train, + y_val, + y_test, + clusters_train, + clusters_val, + clusters_test, + ) = train_val_test_split( + self.X, + self.y, + sampler="kmeans", + random_state=42, + ) + all_output = [ + X_train, + X_val, + X_test, + y_train, + y_val, + y_test, + clusters_train, + clusters_val, + clusters_test, + ] + with open(self.reference_splits["kmeans-v1.2.2"], "rb") as f: + reference_output = pkl.load(f) + for i, j in zip(all_output, reference_output): + np.testing.assert_array_equal( + i, + j, + "Sampler kmeans failed regression testing.", + ) + if __name__ == "__main__": unittest.main() diff --git a/test/unit/samplers/extrapolative/test_kmeans.py b/test/unit/samplers/extrapolative/test_kmeans.py index 947b441e..24414dd9 100644 --- a/test/unit/samplers/extrapolative/test_kmeans.py +++ b/test/unit/samplers/extrapolative/test_kmeans.py @@ -1,11 +1,23 @@ import unittest import numpy as np +import pkg_resources from astartes import train_test_split from astartes.samplers import KMeans from astartes.utils.warnings import ImperfectSplittingWarning +SKLEARN_GEQ_13 = ( # get the sklearn version + int( + pkg_resources.get_distribution( + "scikit-learn", + ).version.split( + "." + )[1] + ) + >= 3 +) + class Test_kmeans(unittest.TestCase): """ @@ -35,7 +47,11 @@ def setUpClass(self): ] ) - def test_kmeans_sampling(self): + @unittest.skipIf( + SKLEARN_GEQ_13, + "sklearn version 1.3 or newer detected", + ) + def test_kmeans_sampling_v12(self): """Use kmeans in the train_test_split and verify results.""" with self.assertWarns(ImperfectSplittingWarning): ( @@ -117,6 +133,92 @@ def test_kmeans_sampling(self): "Test clusters incorrect.", ) + @unittest.skipUnless( + SKLEARN_GEQ_13, + "sklearn version less than 1.3 detected", + ) + def test_kmeans_sampling_v13(self): + """Use kmeans in the train_test_split and verify results.""" + with self.assertWarns(ImperfectSplittingWarning): + ( + X_train, + X_test, + y_train, + y_test, + labels_train, + labels_test, + clusters_train, + clusters_test, + ) = train_test_split( + self.X, + self.y, + labels=self.labels, + test_size=0.75, + train_size=0.25, + sampler="kmeans", + random_state=42, + hopts={ + "n_clusters": 2, + }, + ) + # test that the known arrays equal the result from above + self.assertIsNone( + np.testing.assert_array_equal( + X_train, + np.array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 1, 0, 0, 0]]), + ), + "Train X incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + X_test, + np.array([[1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]), + ), + "Test X incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + y_train, + np.array([1, 2, 3]), + ), + "Train y incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + y_test, + np.array([4, 5]), + ), + "Test y incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + labels_train, + np.array(["one", "two", "three"]), + ), + "Train labels incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + labels_test, + np.array(["four", "five"]), + ), + "Test labels incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + clusters_train, + np.array([0, 0, 0]), + ), + "Train clusters incorrect.", + ) + self.assertIsNone( + np.testing.assert_array_equal( + clusters_test, + np.array([1, 1]), + ), + "Test clusters incorrect.", + ) + def test_kmeans(self): """Directly instantiate and test KMeans.""" kmeans_instance = KMeans(