From 843cc8dd053e692f3601ae66f370035dc86661c2 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:02:55 -0400 Subject: [PATCH 1/6] update readme with note sklearn 1.3.0 limitations --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e948978..6e11ce2 100644 --- a/README.md +++ b/README.md @@ -127,11 +127,15 @@ To that end, the default behavior of `astartes` is to use `42` as the random see Running `astartes` with the default settings will always produce the exact same results. We have verified this behavior on Debian Ubuntu, Windows, and Intel Macs from Python versions 3.7 through 3.11 (with appropriate dependencies for each version). +#### Known Reproducibility Limitations + > **Note** > We are limited in our ability to test on M1 Macs, but from our limited manual testing we achieve perfect reproducbility in all cases _except occasionally_ with `KMeans` on Apple silicon. It has produced _slightly_ different results between platforms regardless of `random_state`, with up to two clusters being assigned differently resulting in data splits which are >99% identical. `astartes` is still consistent between runs on the same platform in all cases, and other samplers are not impacted by this apparent bug. + - `sklearn` v1.3.0 introduced backwards-incompatible changes in the `KMeans` sampler that changed how the random initialization affects the results, even given the same random seed. Different version of `sklearn` will affect the performance of `astartes` and we recommend including the exact version of `scikit-learn` and `astartes` used, when applicable. + ## Evaluate the Impact of Splitting Algorithms The `generate_regression_results_dict` function allows users to quickly evaluate the impact of different splitting techniques on any model supported by `sklearn`. All results are stored in a dictionary format and can be displayed in a neatly formatted table using the optional `print_results` argument. From cafe4cf593d265f5a4976b8a710f9743f6ba9d38 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:03:06 -0400 Subject: [PATCH 2/6] bump version for patch release --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 027dbce..d5d4ba6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "astartes" -version = "1.1.0" +version = "1.1.1" authors = [ { name = "Jackson Burns", email = "jwburns@mit.edu" }, { name = "Himaghna Bhattacharjee", email = "himaghna@udel.edu" }, From dda46f15cebf271152f8070c54eb0e741721a875 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:03:15 -0400 Subject: [PATCH 3/6] add tabulate to default reqs --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d5d4ba6..82b9d31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ classifiers = [ ] urls = { Homepage = "https://github.com/JacksonBurns/astartes" } requires-python = ">=3.7" -dependencies = ["scikit_learn", "numpy", "scipy", "pandas"] +dependencies = ["scikit_learn", "tabulate", "numpy", "scipy", "pandas"] [project.optional-dependencies] molecules = ["aimsim"] From 6e24b1ac74656aea57a8abb60cbc61c6a74f58d0 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:04:57 -0400 Subject: [PATCH 4/6] change reproduce paper to checkout the appropriate version --- .github/workflows/reproduce_paper.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reproduce_paper.yml b/.github/workflows/reproduce_paper.yml index fc264c6..33a598d 100644 --- a/.github/workflows/reproduce_paper.yml +++ b/.github/workflows/reproduce_paper.yml @@ -8,12 +8,10 @@ on: - cron: "0 8 * * 1" push: branches: [main] - pull_request: - branches: [main] workflow_dispatch: concurrency: - group: actions-id-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + group: actions-id-${{ github.workflow }} cancel-in-progress: true jobs: @@ -25,6 +23,7 @@ jobs: name: Reproduce Paper Data Splits steps: - uses: actions/checkout@v3 + - run: git checkout v1.0.0 - uses: mamba-org/setup-micromamba@main with: environment-name: temp @@ -38,6 +37,7 @@ jobs: - name: Install Dependencies run: | python -m pip install -e .[molecules] + python -m pip install scikit-learn==1.2.2 python -m pip install notebook - name: Backup Reference Splits run: | From a06c0a5a10fb7da95f34362bbe3c4ef3ff1f3b68 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:05:16 -0400 Subject: [PATCH 5/6] 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 d6bc8e2..d44fcdf 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 947b441..24414dd 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( From 9de8085bb7a746e573d50af6c94facbeef1dcca5 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Sat, 1 Jul 2023 13:09:01 -0400 Subject: [PATCH 6/6] fix sklearn version check formatting --- test/regression/test_regression.py | 9 +-------- test/unit/samplers/extrapolative/test_kmeans.py | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/test/regression/test_regression.py b/test/regression/test_regression.py index d44fcdf..b3f8186 100644 --- a/test/regression/test_regression.py +++ b/test/regression/test_regression.py @@ -14,14 +14,7 @@ ) SKLEARN_GEQ_13 = ( # get the sklearn version - int( - pkg_resources.get_distribution( - "scikit-learn", - ).version.split( - "." - )[1] - ) - >= 3 + int(pkg_resources.get_distribution("scikit-learn").version.split(".")[1]) >= 3 ) diff --git a/test/unit/samplers/extrapolative/test_kmeans.py b/test/unit/samplers/extrapolative/test_kmeans.py index 24414dd..8ed97ab 100644 --- a/test/unit/samplers/extrapolative/test_kmeans.py +++ b/test/unit/samplers/extrapolative/test_kmeans.py @@ -8,14 +8,7 @@ from astartes.utils.warnings import ImperfectSplittingWarning SKLEARN_GEQ_13 = ( # get the sklearn version - int( - pkg_resources.get_distribution( - "scikit-learn", - ).version.split( - "." - )[1] - ) - >= 3 + int(pkg_resources.get_distribution("scikit-learn").version.split(".")[1]) >= 3 )