diff --git a/examples/plot_pruning.py b/examples/plot_pruning.py index 65d8f3e..67f506c 100644 --- a/examples/plot_pruning.py +++ b/examples/plot_pruning.py @@ -18,6 +18,8 @@ # ------------------------------ # We use ``iris`` dataset and logistic regression model to demonstrate data pruning. # The baseline model is a logistic regression model trained on the entire dataset. +# Here, 110 samples are used as the training data, which is intentionally made +# imbalanced, to test data pruning methods. # The coefficients of the model trained on the pruned dataset will be compared to # the baseline model with R-squared score. # The higher R-squared score, the better the pruning. @@ -25,14 +27,17 @@ from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression -data, labels = load_iris(return_X_y=True) -baseline_lr = LogisticRegression(max_iter=1000).fit(data, labels) +iris = load_iris(as_frame=True) +baseline_lr = LogisticRegression(max_iter=1000).fit(iris["data"], iris["target"]) +X_train = iris["data"].values[10:120] +y_train = iris["target"].values[10:120] # %% # Random data pruning # ------------------- -# There are 150 samples in the dataset. The pruned dataset for -# random pruning method is selected randomly. +# There are 110 samples in the training dataset. +# The random pruning method selected samples assuming a uniform distribution +# over all data. import numpy as np @@ -78,14 +83,65 @@ def _fastcan_pruning( return pruned_lr.coef_, pruned_lr.intercept_ +# %% +# Visualize selected samples +# -------------------------------------------------- +# Use principal component analysis (PCA) to visualize the distribution of the samples, +# and to compare the difference between the selection of ``Random`` pruning and +# ``FastCan`` pruning. +# For clearer viewing of the selection, only 10 samples are selected from the training +# data by the pruning methods. +# The results show that ``FastCan`` selects 3 setosa, 4 versicolor, +# and 3 virginica, while ``Random`` select 6, 2, and 2, respectively. +# The imbalanced selection of ``Random`` is caused by the imbalanced training data, +# while ``FastCan``, benefited from the dictionary learning (k-means), can overcome +# the imbalance issue. + +import matplotlib.pyplot as plt +from sklearn.decomposition import PCA + + +def plot_pca(X, y, target_names, n_samples_to_select, random_state): + pca = PCA(2).fit(X) + pcs_all = pca.transform(X) + + kmeans = KMeans( + n_clusters=10, + random_state=random_state, + ).fit(X) + atoms = kmeans.cluster_centers_ + pcs_atoms = pca.transform(atoms) + + ids_fastcan = minibatch(X.T, atoms.T, n_samples_to_select, batch_size=1, verbose=0) + pcs_fastcan = pca.transform(X[ids_fastcan]) + + rng = np.random.default_rng(random_state) + ids_random = rng.choice(X.shape[0], n_samples_to_select, replace=False) + pcs_random = pca.transform(X[ids_random]) + + plt.scatter(pcs_fastcan[:, 0], pcs_fastcan[:, 1], s=50, marker="o", label="FastCan") + plt.scatter(pcs_random[:, 0], pcs_random[:, 1], s=50, marker="*", label="Random") + plt.scatter(pcs_atoms[:, 0], pcs_atoms[:, 1], s=100, marker="+", label="Atoms") + cmap = plt.get_cmap("Dark2") + for i, label in enumerate(target_names): + mask = y == i + plt.scatter( + pcs_all[mask, 0], pcs_all[mask, 1], s=5, label=label, color=cmap(i + 2) + ) + plt.xlabel("The First Principle Component") + plt.ylabel("The Second Principle Component") + plt.legend(ncol=2) + + +plot_pca(X_train, y_train, iris.target_names, 10, 123) + # %% # Compare pruning methods # ----------------------- -# 100 samples are selected from 150 original data with ``Random`` pruning and +# 80 samples are selected from 110 training data with ``Random`` pruning and # ``FastCan`` pruning. The results show that ``FastCan`` pruning gives a higher -# mean value of R-squared and a lower standard deviation. +# median value of R-squared and a lower standard deviation. -import matplotlib.pyplot as plt from sklearn.metrics import r2_score @@ -94,7 +150,7 @@ def plot_box(X, y, baseline, n_samples_to_select: int, n_random: int): r2_random = np.zeros(n_random) for i in range(n_random): coef, intercept = _fastcan_pruning( - X, y, n_samples_to_select, i, n_atoms=50, batch_size=2 + X, y, n_samples_to_select, i, n_atoms=40, batch_size=2 ) r2_fastcan[i] = r2_score( np.c_[coef, intercept], np.c_[baseline.coef_, baseline.intercept_] @@ -111,4 +167,4 @@ def plot_box(X, y, baseline, n_samples_to_select: int, n_random: int): plt.show() -plot_box(data, labels, baseline_lr, n_samples_to_select=100, n_random=100) +plot_box(X_train, y_train, baseline_lr, n_samples_to_select=80, n_random=100) diff --git a/pixi.lock b/pixi.lock index fb2cbbb..4789146 100644 --- a/pixi.lock +++ b/pixi.lock @@ -97,7 +97,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.2-hdb6dae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.4-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.5-ha54dae1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda @@ -171,7 +171,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.2-h3f77e49_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.14.2-h3e1e5eb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.4-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.5-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18-18.1.8-default_hb458b26_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.8-default_hb458b26_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda @@ -342,8 +342,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda @@ -365,7 +365,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda @@ -419,7 +419,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py313h536fd9c_0.conda @@ -452,7 +452,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.24.0-py313h6071e0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.25.0-py313h4b2b08d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py313h8ef605b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda @@ -652,7 +652,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.4-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.5-ha54dae1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py313h717bdf5_1.conda @@ -687,7 +687,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py313h63b0ddb_0.conda @@ -720,7 +720,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.24.0-py313h72dc32c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.25.0-py313h72dc32c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py313hedeaec8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py313h7e69c36_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda @@ -901,7 +901,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.14.2-h3e1e5eb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.4-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.5-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18-18.1.8-default_hb458b26_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.8-default_hb458b26_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py313ha9b7d5b_1.conda @@ -936,7 +936,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py313h90d716c_0.conda @@ -969,7 +969,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.24.0-py313hb5fa170_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.25.0-py313hb5fa170_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py313hecba28c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py313h9a24e0a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda @@ -1115,7 +1115,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.4-default_h6e92b77_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.5-default_h6e92b77_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.24-h76ddb4d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda @@ -1172,7 +1172,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.0-had0cd8c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py313ha7868ed_0.conda @@ -1205,7 +1205,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.24.0-py313h54fc02f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.25.0-py313ha8a9a3c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py313h4f67946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py313h2eca4b9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda @@ -1438,7 +1438,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.9-py313h22842b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.10-py313h22842b3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda @@ -1465,7 +1465,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.10-h9ccd52b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.9-py312h60e8e2e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.10-py312h60e8e2e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda @@ -1493,7 +1493,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-h81fe080_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.9-py313hd3a9b03_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.10-py313hd3a9b03_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda @@ -1518,7 +1518,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.13.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.3-h261c0b1_101_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.9-py313h9f3c1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.10-py313h9f3c1d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tokenize-rt-6.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda @@ -4669,35 +4669,35 @@ packages: purls: [] size: 13330734 timestamp: 1744062341062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda - sha256: 5c28304eaabc2aaeb47e2ba847ae41e0ad7e2a520a7e19a2c5e846c69b417a5b - md5: 96f8d5b2e94c9ba4fef19f1adf068a15 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda + sha256: 53d79fbc33be064c9f0c63a720bf55be1fe242d47e7ffdfe5cd3277723e62a0c + md5: 79a1be1cd92a7f2b62e6c0a7c2da8bf8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libllvm20 >=20.1.4,<20.2.0a0 + - libllvm20 >=20.1.5,<20.2.0a0 - libstdcxx >=13 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 20897372 - timestamp: 1746074729385 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda - sha256: bdcfeb2dde582bec466f86c1fb1f8cbbd413653f60c030040fe1c842fc6da1b4 - md5: 2d933632c8004be47deb2be61bf013be + size: 20869635 + timestamp: 1747354153985 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda + sha256: 5b2d76c4878e5faf5fe630164e27279589c5e68ab5ea62bb2eb72af0e7fdd510 + md5: 9a912cce23df3fea9d2adb75e505b153 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libllvm20 >=20.1.4,<20.2.0a0 + - libllvm20 >=20.1.5,<20.2.0a0 - libstdcxx >=13 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 12096222 - timestamp: 1746074937700 -- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.4-default_h6e92b77_0.conda - sha256: 893e31c1aa7adf81714bfaf3fff9960105da090bad68c50b79c84a20a21c089a - md5: 80c3ee2ffb5f35f2b6c4b10d636b04fb + size: 12111036 + timestamp: 1747354449255 +- conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.5-default_h6e92b77_0.conda + sha256: 8457a52ffb65aac5101bd9fa43fd6c676d7188c8354f7f739846ea9646a24104 + md5: 2013532e0911dcc50ab4a2fd09d1d9a5 depends: - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -4707,8 +4707,8 @@ packages: license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 28345584 - timestamp: 1746101072765 + size: 28346370 + timestamp: 1747355711842 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 md5: d4529f4dff3057982a7617c7ac58fde3 @@ -5457,21 +5457,21 @@ packages: purls: [] size: 25982718 timestamp: 1743989933062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda - sha256: 56a375dc36df1a4e2061e30ebbacbc9599a11277422a9a3145fd228f772bab53 - md5: 96c33bbd084ef2b2463503fb7f1482ae +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda + sha256: c8bb2c5744e4da00f63d53524897a6cb8fa0dcd7853a6ec6e084e8c5aff001d9 + md5: 8d2f5a2f019bd76ccba5eb771852d411 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - - libxml2 >=2.13.7,<2.14.0a0 + - libxml2 >=2.13.8,<2.14.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 43004201 - timestamp: 1746052658083 + size: 42996429 + timestamp: 1747318745242 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda sha256: eeff241bddc8f1b87567dd6507c9f441f7f472c27f0860a07628260c000ef27c md5: a76fd702c93cd2dfd89eff30a5fd45a8 @@ -6145,30 +6145,28 @@ packages: purls: [] size: 55476 timestamp: 1727963768015 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.4-ha54dae1_0.conda - sha256: 5830f3a9109e52cb8476685e9ccd4ff207517c95ff453c47e6ed35221715b879 - md5: 985619d7704847d30346abb6feeb8351 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.5-ha54dae1_0.conda + sha256: f858ef4cbc7f449da06e7e5cf62d6db0f8269e4e723144be35b0ef3531e28591 + md5: 7b6a67507141ea93541943f0c011a872 depends: - __osx >=10.13 constrains: - - openmp 20.1.4|20.1.4.* + - openmp 20.1.5|20.1.5.* license: Apache-2.0 WITH LLVM-exception - license_family: APACHE purls: [] - size: 306636 - timestamp: 1746134503342 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.4-hdb05f8b_0.conda - sha256: b8e8547116dba85890d7b39bfad1c86ed69a6b923caed1e449c90850d271d4d5 - md5: 00cbae3f2127efef6db76bd423a09807 + size: 306529 + timestamp: 1747367226775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.5-hdb05f8b_0.conda + sha256: 3515d520338a334c987ce2737dfba1ebd66eb1e360582c7511738ad3dc8a9145 + md5: 66771cb733ad80bd46b66f856601001a depends: - __osx >=11.0 constrains: - - openmp 20.1.4|20.1.4.* + - openmp 20.1.5|20.1.5.* license: Apache-2.0 WITH LLVM-exception - license_family: APACHE purls: [] - size: 282599 - timestamp: 1746134861758 + size: 282100 + timestamp: 1747367434936 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda sha256: 084f1504b38608542f6ff816f9ff7e7ae9ec38b454604144e8ac0d0ec0415f82 md5: cc07ff74d2547da1f1452c42b67bafd6 @@ -7508,17 +7506,17 @@ packages: - pkg:pypi/platformdirs?source=compressed-mapping size: 23531 timestamp: 1746710438805 -- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - sha256: 122433fc5318816b8c69283aaf267c73d87aa2d09ce39f64c9805c9a3b264819 - md5: e9dcbce5f45f9ee500e728ae58b605b6 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 depends: - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/pluggy?source=hash-mapping - size: 23595 - timestamp: 1733222855563 + - pkg:pypi/pluggy?source=compressed-mapping + size: 24246 + timestamp: 1747339794916 - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab md5: 3e01e386307acc60b2f89af0b2e161aa @@ -8636,9 +8634,9 @@ packages: - pyright==1.1.394 ; extra == 'lint' - pytest>=8 ; extra == 'test' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.24.0-py313h6071e0b_0.conda - sha256: dffb2a7b07d9670b45b15bb0279e076980a0f7c9b88594f42e5f7ade1ae58f44 - md5: 3306151813da4d27a7e028ce51a0c87f +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.25.0-py313h4b2b08d_0.conda + sha256: ad1f0551640d7be54cc1911d0ae644db62a0515dd06ae365c993c2ef3138b535 + md5: 9066e83941e3aa02927ca8f1a394ad98 depends: - python - __glibc >=2.17,<3.0.a0 @@ -8647,14 +8645,13 @@ packages: constrains: - __glibc >=2.17 license: MIT - license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 393294 - timestamp: 1743037947499 -- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.24.0-py313h72dc32c_0.conda - sha256: 012ccc4669f08e9e02756a5c51d79ddb16f83c311687be54ba474ed5860e7b91 - md5: 0a9b64f508700152937eda5248bdb28d + size: 391606 + timestamp: 1747323054801 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.25.0-py313h72dc32c_0.conda + sha256: dc6a8d945ca53e39176f603e9d285aac1d22b49d04a8a4a1e9d7a1ac9b5b7274 + md5: 020c1798e4290155e9ab406b71ec45de depends: - python - __osx >=10.13 @@ -8662,30 +8659,28 @@ packages: constrains: - __osx >=10.13 license: MIT - license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 371947 - timestamp: 1743037524198 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.24.0-py313hb5fa170_0.conda - sha256: 9fd38791a81fe5965e855bcb55ff28e98016aaed57bae6481a343f49ef29d0a6 - md5: cc72593d9ca3b72c472471fd525c0d0f + size: 370872 + timestamp: 1747322922136 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.25.0-py313hb5fa170_0.conda + sha256: db7fd7b71d3e6a96e1f2942f74b22ffbb348d17efae8283b9de278865ee5907c + md5: 81f00abbd1529ae9df6353e3251f8b5b depends: - python - - __osx >=11.0 - python 3.13.* *_cp313 + - __osx >=11.0 - python_abi 3.13.* *_cp313 constrains: - __osx >=11.0 license: MIT - license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 362852 - timestamp: 1743037548292 -- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.24.0-py313h54fc02f_0.conda - sha256: bcceb24e0462794507642caad40b4e0910942c5b70ba5e8640870157750bad5b - md5: 67eb9aea984cdc3ce949ba23402e8d89 + size: 360977 + timestamp: 1747322953364 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.25.0-py313ha8a9a3c_0.conda + sha256: 08e9e86d0ec2abf0305258ec7b0804900bdfc700624593efaaf0aa8c6ccd2fe4 + md5: cc10047e8277349f374be85782ff6048 depends: - python - vc >=14.2,<15 @@ -8696,14 +8691,13 @@ packages: - ucrt >=10.0.20348.0 - python_abi 3.13.* *_cp313 license: MIT - license_family: MIT purls: - pkg:pypi/rpds-py?source=hash-mapping - size: 255547 - timestamp: 1743037492141 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.9-py313h22842b3_0.conda - sha256: b560f202f5940857b7a25e708a1734522de59bb024011e45408242bfcd21a22f - md5: 3dc9b639c9a5915d48dd69161f6c8a49 + size: 252942 + timestamp: 1747322892457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.11.10-py313h22842b3_0.conda + sha256: fc984515bc6796265219f6693be2758a95367170f6cdc84e1c1c99f3211e8ed2 + md5: 037038af264acd19afa75b6fe45ca3bf depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8714,11 +8708,11 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT - size: 9211172 - timestamp: 1746841218728 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.9-py312h60e8e2e_0.conda - sha256: 04f11dd2c4dcc9a881a7d25818f4aa7b04654c4853d2101053701476abfef1a4 - md5: 49736f343a261ee7c73103548614ebd7 + size: 9211424 + timestamp: 1747341807178 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.11.10-py312h60e8e2e_0.conda + sha256: 1cedda01fb815707ac61a9e512579e3587359d6bf56fca4c8367f610e934d63a + md5: 57e4957884b258e878bd27842a35ea40 depends: - __osx >=10.13 - libcxx >=18 @@ -8728,11 +8722,11 @@ packages: - __osx >=10.13 license: MIT license_family: MIT - size: 8629558 - timestamp: 1746841407034 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.9-py313hd3a9b03_0.conda - sha256: e79d09aad227c97e7a8875865fa2553b076fdc3d8fd3fd4bb173a7fb7169df17 - md5: a4e3b2f0cd18bc670201877ed3e81086 + size: 8653256 + timestamp: 1747342077204 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.11.10-py313hd3a9b03_0.conda + sha256: 776bcdcd83ffcc63d4357e26c77bbfac4c70bbc3d046df576878361f2a804955 + md5: fee0110ee61c8ec8a78780a8fa63cde1 depends: - __osx >=11.0 - libcxx >=18 @@ -8743,11 +8737,11 @@ packages: - __osx >=11.0 license: MIT license_family: MIT - size: 8194821 - timestamp: 1746841562098 -- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.9-py313h9f3c1d7_0.conda - sha256: 5dc8a7428b8681376c351adbfa88a590ffa52fb2760923bbb6f8dc94f91cbfe1 - md5: cb6ca8d853dea68725b7aa1b93c886e3 + size: 8202679 + timestamp: 1747342224233 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.11.10-py313h9f3c1d7_0.conda + sha256: b0445e4783fddb24a7e4a657dfc601d35f17f125c1c89b438063f209210b9c44 + md5: 6ff6ed6e335071db4c092582c3e4e55c depends: - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 @@ -8756,8 +8750,8 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 8273013 - timestamp: 1746841801808 + size: 8271533 + timestamp: 1747343205574 - pypi: https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/scikit-learn/1.8.dev0/scikit_learn-1.8.dev0-cp313-cp313t-macosx_10_13_x86_64.whl name: scikit-learn version: 1.8.dev0