scikit-learn-intelex 2025.4.0__py39-none-win_amd64.whl → 2025.5.0__py39-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of scikit-learn-intelex might be problematic. Click here for more details.
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/__main__.py +1 -1
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/_daal4py.cp39-win_amd64.pyd +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/doc/third-party-programs.txt +1 -1
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/__init__.py +83 -0
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/gbt_convertors.py +855 -0
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/logistic_regression_builders.py +217 -0
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/mb/model_builders.py → scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/tree_based_builders.py +99 -91
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/mpi_transceiver.cp39-win_amd64.pyd +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/_n_jobs_support.py +6 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/_utils.py +1 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/dbscan.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/k_means.py +6 -38
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/decomposition/_pca.py +12 -8
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/AdaBoostClassifier.py +2 -6
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/GBTDAAL.py +3 -7
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/_forest.py +41 -153
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_coordinate_descent.py +13 -15
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_linear.py +7 -10
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_ridge.py +22 -57
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_path.py +3 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/manifold/_t_sne.py +8 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/_pairwise.py +30 -7
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/dispatcher.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_base.py +6 -16
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_classification.py +4 -7
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_regression.py +3 -5
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/svm/svm.py +4 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/base.py +8 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/validation.py +82 -5
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/__init__.py +125 -83
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/_config.py +27 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/_device_offload.py +79 -83
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/_onedal_py_dpc.cp39-win_amd64.pyd +0 -0
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/_onedal_py_host.cp39-win_amd64.pyd +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/basic_statistics.py +21 -17
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/incremental_basic_statistics.py +44 -39
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/dbscan.py +35 -42
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/kmeans.py +83 -74
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/kmeans_init.py +57 -24
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/common/_backend.py +233 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/hyperparameters.py +4 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/tests/test_sycl.py +27 -12
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/covariance.py +27 -19
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/incremental_covariance.py +35 -32
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/_data_conversion.py +6 -10
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/tests/test_data.py +179 -78
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/incremental_pca.py +39 -25
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/pca.py +28 -16
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/tests/test_incremental_pca.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/forest.py +130 -93
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/incremental_linear_model.py +76 -57
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/linear_model.py +63 -37
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/logistic_regression.py +96 -68
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/neighbors.py +156 -119
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/get_tree.py +5 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/kernel_functions.py +21 -18
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/tests/test_kernel_functions.py +4 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/svm.py +80 -32
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_csr_svm.py +10 -9
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_nusvc.py +10 -10
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_nusvr.py +8 -8
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_svc.py +5 -5
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_svr.py +10 -10
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/utils/_device_selection.py +1 -13
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/_array_api.py +3 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/_dpep_helpers.py +16 -1
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/utils/_sycl_queue_manager.py +147 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/tests/test_validation.py +3 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/validation.py +47 -16
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/__init__.py +3 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/__main__.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/_config.py +48 -6
- scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/sklearnex/_device_offload.py +143 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/_utils.py +28 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +13 -20
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +34 -40
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +6 -8
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +2 -6
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +42 -60
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/pca.py +7 -17
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +4 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +207 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +106 -362
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +1 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +1 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +6 -6
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +41 -126
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/incremental_ridge.py +42 -85
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/linear.py +48 -39
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +34 -71
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +14 -18
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +60 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +2 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +1 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +1 -1
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +1 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +7 -54
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +3 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +31 -73
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +30 -70
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +5 -13
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +3 -13
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/incremental_pca.py +48 -62
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +10 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +8 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +13 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +10 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_covariance_spmd.py +7 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +13 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +9 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_pca_spmd.py +7 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/tests/test_forest_spmd.py +25 -8
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +6 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +12 -3
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +12 -5
- {scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/mb → scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors}/__init__.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +27 -5
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/_common.py +12 -25
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +35 -128
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +9 -21
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +33 -126
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +9 -21
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_common.py +26 -11
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +16 -23
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +4 -4
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/base.py +2 -2
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +8 -22
- {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/METADATA +2 -2
- scikit_learn_intelex-2025.5.0.dist-info/RECORD +257 -0
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/_daal4py.cp39-win_amd64.pyd +0 -0
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/_onedal_py_dpc.cp39-win_amd64.pyd +0 -0
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/_onedal_py_host.cp39-win_amd64.pyd +0 -0
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_base.py +0 -38
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_policy.py +0 -55
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_spmd_policy.py +0 -30
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/tests/test_policy.py +0 -76
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/utils/__init__.py +0 -49
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/_device_offload.py +0 -126
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -19
- scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -25
- scikit_learn_intelex-2025.4.0.dist-info/RECORD +0 -259
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/tests/test_dbscan.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/decomposition/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/tests/test_decision_forest.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/coordinate_descent.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/linear.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_loss.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/ridge.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_linear.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_ridge.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/manifold/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/_ranking.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/_split.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/tests/test_split.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/_models_info.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_patching.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_unsupervised.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/tests/test_kneighbors.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/svm/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/tests/test_utils.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/test_basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/test_incremental_basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/utils.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_dbscan.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_kmeans.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_kmeans_init.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/_estimator_checks.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/_mixin.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/tests/test_covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/tests/test_incremental_covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/tests/common.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/tests/test_random_forest.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_linear_regression.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_ridge_regression.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_linear_regression.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_logistic_regression.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_ridge.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/tests/test_knn_classification.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/test_common.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/utils/_dataframes_support.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/conftest.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_ridge.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_ridge.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/tests/test_incremental_pca.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/incremental_covariance.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/incremental_pca.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/incremental_linear_model.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_hyperparameters.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_patching.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/spmd.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/_array_api.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
- {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/tests/test_validation.py +0 -0
- {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/LICENSE.txt +0 -0
- {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/WHEEL +0 -0
- {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,855 @@
|
|
|
1
|
+
# ===============================================================================
|
|
2
|
+
# Copyright 2023 Intel Corporation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
# ===============================================================================
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
from collections import deque
|
|
19
|
+
from copy import deepcopy
|
|
20
|
+
from tempfile import NamedTemporaryFile
|
|
21
|
+
from typing import Any, Deque, Dict, List, Optional, Tuple
|
|
22
|
+
from warnings import warn
|
|
23
|
+
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
26
|
+
from .. import gbt_clf_model_builder, gbt_reg_model_builder
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CatBoostNode:
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
split: Optional[Dict] = None,
|
|
33
|
+
value: Optional[List[float]] = None,
|
|
34
|
+
right: Optional[int] = None,
|
|
35
|
+
left: Optional[float] = None,
|
|
36
|
+
cover: Optional[float] = None,
|
|
37
|
+
) -> None:
|
|
38
|
+
self.split = split
|
|
39
|
+
self.value = value
|
|
40
|
+
self.right = right
|
|
41
|
+
self.left = left
|
|
42
|
+
self.cover = cover
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class CatBoostModelData:
|
|
46
|
+
"""Wrapper around the CatBoost model dump for easier access to properties"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, data):
|
|
49
|
+
self.__data = data
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def n_features(self):
|
|
53
|
+
return len(self.__data["features_info"]["float_features"])
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def grow_policy(self):
|
|
57
|
+
return self.__data["model_info"]["params"]["tree_learner_options"]["grow_policy"]
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def oblivious_trees(self):
|
|
61
|
+
return self.__data["oblivious_trees"]
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def trees(self):
|
|
65
|
+
return self.__data["trees"]
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def n_classes(self):
|
|
69
|
+
"""Number of classes, returns -1 if it's not a classification model"""
|
|
70
|
+
if "class_params" in self.__data["model_info"]:
|
|
71
|
+
return len(self.__data["model_info"]["class_params"]["class_to_label"])
|
|
72
|
+
return -1
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def is_classification(self):
|
|
76
|
+
return "class_params" in self.__data["model_info"]
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def has_categorical_features(self):
|
|
80
|
+
return "categorical_features" in self.__data["features_info"]
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def is_symmetric_tree(self):
|
|
84
|
+
return self.grow_policy == "SymmetricTree"
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def float_features(self):
|
|
88
|
+
return self.__data["features_info"]["float_features"]
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def n_iterations(self):
|
|
92
|
+
if self.is_symmetric_tree:
|
|
93
|
+
return len(self.oblivious_trees)
|
|
94
|
+
else:
|
|
95
|
+
return len(self.trees)
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def bias(self):
|
|
99
|
+
if self.is_classification:
|
|
100
|
+
return 0
|
|
101
|
+
return self.__data["scale_and_bias"][1][0] / self.n_iterations
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def scale(self):
|
|
105
|
+
if self.is_classification:
|
|
106
|
+
return 1
|
|
107
|
+
else:
|
|
108
|
+
return self.__data["scale_and_bias"][0]
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def default_left(self):
|
|
112
|
+
dpo = self.__data["model_info"]["params"]["data_processing_options"]
|
|
113
|
+
nan_mode = dpo["float_features_binarization"]["nan_mode"]
|
|
114
|
+
return int(nan_mode.lower() == "min")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class Node:
|
|
118
|
+
"""Helper class holding Tree Node information"""
|
|
119
|
+
|
|
120
|
+
def __init__(
|
|
121
|
+
self,
|
|
122
|
+
cover: float,
|
|
123
|
+
is_leaf: bool,
|
|
124
|
+
default_left: bool,
|
|
125
|
+
feature: int,
|
|
126
|
+
value: float,
|
|
127
|
+
n_children: int = 0,
|
|
128
|
+
left_child: "Optional[Node]" = None,
|
|
129
|
+
right_child: "Optional[Node]" = None,
|
|
130
|
+
parent_id: Optional[int] = -1,
|
|
131
|
+
position: Optional[int] = -1,
|
|
132
|
+
) -> None:
|
|
133
|
+
self.cover = cover
|
|
134
|
+
self.is_leaf = is_leaf
|
|
135
|
+
self.default_left = default_left
|
|
136
|
+
self.__feature = feature
|
|
137
|
+
self.value = value
|
|
138
|
+
self.n_children = n_children
|
|
139
|
+
self.left_child = left_child
|
|
140
|
+
self.right_child = right_child
|
|
141
|
+
self.parent_id = parent_id
|
|
142
|
+
self.position = position
|
|
143
|
+
|
|
144
|
+
@staticmethod
|
|
145
|
+
def from_xgb_dict(
|
|
146
|
+
input_dict: Dict[str, Any], feature_names_to_indices: dict[str, int]
|
|
147
|
+
) -> "Node":
|
|
148
|
+
if "children" in input_dict:
|
|
149
|
+
left_child = Node.from_xgb_dict(
|
|
150
|
+
input_dict["children"][0], feature_names_to_indices
|
|
151
|
+
)
|
|
152
|
+
right_child = Node.from_xgb_dict(
|
|
153
|
+
input_dict["children"][1], feature_names_to_indices
|
|
154
|
+
)
|
|
155
|
+
n_children = 2 + left_child.n_children + right_child.n_children
|
|
156
|
+
else:
|
|
157
|
+
left_child = None
|
|
158
|
+
right_child = None
|
|
159
|
+
n_children = 0
|
|
160
|
+
is_leaf = "leaf" in input_dict
|
|
161
|
+
default_left = "yes" in input_dict and input_dict["yes"] == input_dict["missing"]
|
|
162
|
+
feature = input_dict.get("split")
|
|
163
|
+
if feature:
|
|
164
|
+
feature = feature_names_to_indices[feature]
|
|
165
|
+
return Node(
|
|
166
|
+
cover=input_dict["cover"],
|
|
167
|
+
is_leaf=is_leaf,
|
|
168
|
+
default_left=default_left,
|
|
169
|
+
feature=feature,
|
|
170
|
+
value=input_dict["leaf"] if is_leaf else input_dict["split_condition"],
|
|
171
|
+
n_children=n_children,
|
|
172
|
+
left_child=left_child,
|
|
173
|
+
right_child=right_child,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
@staticmethod
|
|
177
|
+
def from_lightgbm_dict(input_dict: Dict[str, Any]) -> "Node":
|
|
178
|
+
if "tree_structure" in input_dict:
|
|
179
|
+
tree = input_dict["tree_structure"]
|
|
180
|
+
else:
|
|
181
|
+
tree = input_dict
|
|
182
|
+
|
|
183
|
+
n_children = 0
|
|
184
|
+
if "left_child" in tree:
|
|
185
|
+
left_child = Node.from_lightgbm_dict(tree["left_child"])
|
|
186
|
+
n_children += 1 + left_child.n_children
|
|
187
|
+
else:
|
|
188
|
+
left_child = None
|
|
189
|
+
if "right_child" in tree:
|
|
190
|
+
right_child = Node.from_lightgbm_dict(tree["right_child"])
|
|
191
|
+
n_children += 1 + right_child.n_children
|
|
192
|
+
else:
|
|
193
|
+
right_child = None
|
|
194
|
+
|
|
195
|
+
is_leaf = "leaf_value" in tree
|
|
196
|
+
# get cover and value for leaf nodes or internal nodes
|
|
197
|
+
cover = tree.get("leaf_count", 0) or tree.get("internal_count", 0)
|
|
198
|
+
value = tree.get("leaf_value", 0) or tree.get("threshold", 0)
|
|
199
|
+
return Node(
|
|
200
|
+
cover=cover,
|
|
201
|
+
is_leaf=is_leaf,
|
|
202
|
+
default_left=tree.get("default_left", 0),
|
|
203
|
+
feature=tree.get("split_feature"),
|
|
204
|
+
value=value,
|
|
205
|
+
n_children=n_children,
|
|
206
|
+
left_child=left_child,
|
|
207
|
+
right_child=right_child,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
def get_value_closest_float_downward(self) -> np.float64:
|
|
211
|
+
"""Get the closest exact fp value smaller than self.value"""
|
|
212
|
+
return np.nextafter(np.single(self.value), np.single(-np.inf))
|
|
213
|
+
|
|
214
|
+
def get_children(self) -> "Optional[Tuple[Node, Node]]":
|
|
215
|
+
if not self.left_child or not self.right_child:
|
|
216
|
+
assert self.is_leaf
|
|
217
|
+
else:
|
|
218
|
+
return (self.left_child, self.right_child)
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def feature(self) -> int:
|
|
222
|
+
if isinstance(self.__feature, int):
|
|
223
|
+
return self.__feature
|
|
224
|
+
if isinstance(self.__feature, str) and self.__feature.isnumeric():
|
|
225
|
+
return int(self.__feature)
|
|
226
|
+
raise ValueError(
|
|
227
|
+
f"Feature names must be integers (got ({type(self.__feature)}){self.__feature})"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
class TreeView:
|
|
232
|
+
"""Helper class, treating a list of nodes as one tree"""
|
|
233
|
+
|
|
234
|
+
def __init__(self, tree_id: int, root_node: Node) -> None:
|
|
235
|
+
self.tree_id = tree_id
|
|
236
|
+
self.root_node = root_node
|
|
237
|
+
|
|
238
|
+
@property
|
|
239
|
+
def is_leaf(self) -> bool:
|
|
240
|
+
return self.root_node.is_leaf
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def value(self) -> float:
|
|
244
|
+
if not self.is_leaf:
|
|
245
|
+
raise ValueError("Tree is not a leaf-only tree")
|
|
246
|
+
if self.root_node.value is None:
|
|
247
|
+
raise ValueError("Tree is leaf-only but leaf node has no value")
|
|
248
|
+
return self.root_node.value
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def cover(self) -> float:
|
|
252
|
+
if not self.is_leaf:
|
|
253
|
+
raise ValueError("Tree is not a leaf-only tree")
|
|
254
|
+
return self.root_node.cover
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def n_nodes(self) -> int:
|
|
258
|
+
return self.root_node.n_children + 1
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class TreeList(list):
|
|
262
|
+
"""Helper class that is able to extract all information required by the
|
|
263
|
+
model builders from various objects"""
|
|
264
|
+
|
|
265
|
+
@staticmethod
|
|
266
|
+
def from_xgb_booster(
|
|
267
|
+
booster, max_trees: int, feature_names_to_indices: dict[str, int]
|
|
268
|
+
) -> "TreeList":
|
|
269
|
+
"""
|
|
270
|
+
Load a TreeList from an xgb.Booster object
|
|
271
|
+
Note: We cannot type-hint the xgb.Booster without loading xgb as dependency in pyx code,
|
|
272
|
+
therefore not type hint is added.
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
# Note: in XGBoost, it's possible to use 'int' type for features that contain
|
|
276
|
+
# non-integer floating points. In such case, the training procedure and JSON
|
|
277
|
+
# export from XGBoost will not treat them any differently from 'q'-type
|
|
278
|
+
# (numeric) features, but the per-tree JSON text dumps used here will output
|
|
279
|
+
# a split threshold rounded to the nearest integer for those 'int' features,
|
|
280
|
+
# even if the booster internally has thresholds with decimal points and outputs
|
|
281
|
+
# them as such in the full-model JSON dumps. Hence the need for this override
|
|
282
|
+
# mechanism. If this behavior changes in XGBoost, then this conversion and
|
|
283
|
+
# override can be removed.
|
|
284
|
+
orig_feature_types = None
|
|
285
|
+
try:
|
|
286
|
+
if hasattr(booster, "feature_types"):
|
|
287
|
+
feature_types = booster.feature_types
|
|
288
|
+
orig_feature_types = deepcopy(feature_types)
|
|
289
|
+
if feature_types:
|
|
290
|
+
for i in range(len(feature_types)):
|
|
291
|
+
if feature_types[i] == "int":
|
|
292
|
+
feature_types[i] = "float"
|
|
293
|
+
booster.feature_types = feature_types
|
|
294
|
+
|
|
295
|
+
tl = TreeList()
|
|
296
|
+
dump = booster.get_dump(dump_format="json", with_stats=True)
|
|
297
|
+
finally:
|
|
298
|
+
if orig_feature_types:
|
|
299
|
+
booster.feature_types = orig_feature_types
|
|
300
|
+
for tree_id, raw_tree in enumerate(dump):
|
|
301
|
+
if max_trees > 0 and tree_id == max_trees:
|
|
302
|
+
break
|
|
303
|
+
raw_tree_parsed = json.loads(raw_tree)
|
|
304
|
+
root_node = Node.from_xgb_dict(raw_tree_parsed, feature_names_to_indices)
|
|
305
|
+
tl.append(TreeView(tree_id=tree_id, root_node=root_node))
|
|
306
|
+
|
|
307
|
+
return tl
|
|
308
|
+
|
|
309
|
+
@staticmethod
|
|
310
|
+
def from_lightgbm_booster_dump(dump: Dict[str, Any]) -> "TreeList":
|
|
311
|
+
"""
|
|
312
|
+
Load a TreeList from a lgbm Booster dump
|
|
313
|
+
Note: We cannot type-hint the the Model without loading lightgbm as dependency in pyx code,
|
|
314
|
+
therefore not type hint is added.
|
|
315
|
+
"""
|
|
316
|
+
tl = TreeList()
|
|
317
|
+
for tree_id, tree_dict in enumerate(dump["tree_info"]):
|
|
318
|
+
root_node = Node.from_lightgbm_dict(tree_dict)
|
|
319
|
+
tl.append(TreeView(tree_id=tree_id, root_node=root_node))
|
|
320
|
+
|
|
321
|
+
return tl
|
|
322
|
+
|
|
323
|
+
def __setitem__(self):
|
|
324
|
+
raise NotImplementedError(
|
|
325
|
+
"Use TreeList.from_*() methods to initialize a TreeList"
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def get_lightgbm_params(booster):
|
|
330
|
+
return booster.dump_model()
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def get_xgboost_params(booster):
|
|
334
|
+
return json.loads(booster.save_config())
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def get_catboost_params(booster):
|
|
338
|
+
with NamedTemporaryFile() as fp:
|
|
339
|
+
booster.save_model(fp.name, "json")
|
|
340
|
+
fp.seek(0)
|
|
341
|
+
model_data = json.load(fp)
|
|
342
|
+
return model_data
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def get_gbt_model_from_tree_list(
|
|
346
|
+
tree_list: TreeList,
|
|
347
|
+
n_iterations: int,
|
|
348
|
+
is_regression: bool,
|
|
349
|
+
n_features: int,
|
|
350
|
+
n_classes: int,
|
|
351
|
+
base_score: Optional[float] = None,
|
|
352
|
+
):
|
|
353
|
+
"""Return a GBT Model from TreeList"""
|
|
354
|
+
|
|
355
|
+
if is_regression:
|
|
356
|
+
mb = gbt_reg_model_builder(n_features=n_features, n_iterations=n_iterations)
|
|
357
|
+
else:
|
|
358
|
+
mb = gbt_clf_model_builder(
|
|
359
|
+
n_features=n_features, n_iterations=n_iterations, n_classes=n_classes
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
class_label = 0
|
|
363
|
+
for counter, tree in enumerate(tree_list, start=1):
|
|
364
|
+
# find out the number of nodes in the tree
|
|
365
|
+
if is_regression:
|
|
366
|
+
tree_id = mb.create_tree(tree.n_nodes)
|
|
367
|
+
else:
|
|
368
|
+
tree_id = mb.create_tree(n_nodes=tree.n_nodes, class_label=class_label)
|
|
369
|
+
|
|
370
|
+
if counter % n_iterations == 0:
|
|
371
|
+
class_label += 1
|
|
372
|
+
|
|
373
|
+
if tree.is_leaf:
|
|
374
|
+
mb.add_leaf(tree_id=tree_id, response=tree.value, cover=tree.cover)
|
|
375
|
+
continue
|
|
376
|
+
|
|
377
|
+
root_node = tree.root_node
|
|
378
|
+
parent_id = mb.add_split(
|
|
379
|
+
tree_id=tree_id,
|
|
380
|
+
feature_index=root_node.feature,
|
|
381
|
+
feature_value=root_node.get_value_closest_float_downward(),
|
|
382
|
+
cover=root_node.cover,
|
|
383
|
+
default_left=root_node.default_left,
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
# create queue
|
|
387
|
+
node_queue: Deque[Node] = deque()
|
|
388
|
+
children = root_node.get_children()
|
|
389
|
+
assert children is not None
|
|
390
|
+
for position, child in enumerate(children):
|
|
391
|
+
child.parent_id = parent_id
|
|
392
|
+
child.position = position
|
|
393
|
+
node_queue.append(child)
|
|
394
|
+
|
|
395
|
+
while node_queue:
|
|
396
|
+
node = node_queue.popleft()
|
|
397
|
+
assert node.parent_id != -1, "node.parent_id must not be -1"
|
|
398
|
+
assert node.position != -1, "node.position must not be -1"
|
|
399
|
+
|
|
400
|
+
if node.is_leaf:
|
|
401
|
+
mb.add_leaf(
|
|
402
|
+
tree_id=tree_id,
|
|
403
|
+
response=node.value,
|
|
404
|
+
cover=node.cover,
|
|
405
|
+
parent_id=node.parent_id,
|
|
406
|
+
position=node.position,
|
|
407
|
+
)
|
|
408
|
+
else:
|
|
409
|
+
parent_id = mb.add_split(
|
|
410
|
+
tree_id=tree_id,
|
|
411
|
+
feature_index=node.feature,
|
|
412
|
+
feature_value=node.get_value_closest_float_downward(),
|
|
413
|
+
cover=node.cover,
|
|
414
|
+
default_left=node.default_left,
|
|
415
|
+
parent_id=node.parent_id,
|
|
416
|
+
position=node.position,
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
children = node.get_children()
|
|
420
|
+
assert children is not None
|
|
421
|
+
for position, child in enumerate(children):
|
|
422
|
+
child.parent_id = parent_id
|
|
423
|
+
child.position = position
|
|
424
|
+
node_queue.append(child)
|
|
425
|
+
|
|
426
|
+
return mb.model(base_score=base_score)
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
def get_gbt_model_from_lightgbm(model: Any, booster=None) -> Any:
|
|
430
|
+
if booster is None:
|
|
431
|
+
booster = model.dump_model()
|
|
432
|
+
|
|
433
|
+
n_features = booster["max_feature_idx"] + 1
|
|
434
|
+
n_iterations = len(booster["tree_info"]) / booster["num_tree_per_iteration"]
|
|
435
|
+
n_classes = booster["num_tree_per_iteration"]
|
|
436
|
+
|
|
437
|
+
is_regression = False
|
|
438
|
+
objective_fun = booster["objective"]
|
|
439
|
+
if n_classes > 2:
|
|
440
|
+
if "multiclass" not in objective_fun:
|
|
441
|
+
raise TypeError(
|
|
442
|
+
"multiclass (softmax) objective is only supported for multiclass classification"
|
|
443
|
+
)
|
|
444
|
+
elif "binary" in objective_fun: # nClasses == 1
|
|
445
|
+
n_classes = 2
|
|
446
|
+
else:
|
|
447
|
+
is_regression = True
|
|
448
|
+
|
|
449
|
+
tree_list = TreeList.from_lightgbm_booster_dump(booster)
|
|
450
|
+
|
|
451
|
+
return get_gbt_model_from_tree_list(
|
|
452
|
+
tree_list,
|
|
453
|
+
n_iterations=n_iterations,
|
|
454
|
+
is_regression=is_regression,
|
|
455
|
+
n_features=n_features,
|
|
456
|
+
n_classes=n_classes,
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
def get_gbt_model_from_xgboost(booster: Any, xgb_config=None) -> Any:
|
|
461
|
+
# Note: in the absence of any feature names, XGBoost will generate
|
|
462
|
+
# tree json dumps where features are named 'f0..N'. While the JSONs
|
|
463
|
+
# of the whole model will have feature indices, the per-tree JSONs
|
|
464
|
+
# used here always use string names instead, hence the need for this.
|
|
465
|
+
feature_names = booster.feature_names
|
|
466
|
+
if feature_names:
|
|
467
|
+
feature_names_to_indices = {fname: ind for ind, fname in enumerate(feature_names)}
|
|
468
|
+
else:
|
|
469
|
+
feature_names_to_indices = {
|
|
470
|
+
f"f{ind}": ind for ind in range(booster.num_features())
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
if xgb_config is None:
|
|
474
|
+
xgb_config = get_xgboost_params(booster)
|
|
475
|
+
|
|
476
|
+
n_features = int(xgb_config["learner"]["learner_model_param"]["num_feature"])
|
|
477
|
+
n_classes = int(xgb_config["learner"]["learner_model_param"]["num_class"])
|
|
478
|
+
base_score = float(xgb_config["learner"]["learner_model_param"]["base_score"])
|
|
479
|
+
|
|
480
|
+
is_regression = False
|
|
481
|
+
objective_fun = xgb_config["learner"]["learner_train_param"]["objective"]
|
|
482
|
+
|
|
483
|
+
# Note: the base score from XGBoost is in the response scale, but the predictions
|
|
484
|
+
# are calculated in the link scale, so when there is a non-identity link function,
|
|
485
|
+
# it needs to be converted to the link scale.
|
|
486
|
+
if objective_fun in ["count:poisson", "reg:gamma", "reg:tweedie", "survival:aft"]:
|
|
487
|
+
base_score = float(np.log(base_score))
|
|
488
|
+
elif objective_fun == "reg:logistic":
|
|
489
|
+
base_score = float(np.log(base_score / (1 - base_score)))
|
|
490
|
+
elif objective_fun.startswith("rank"):
|
|
491
|
+
raise TypeError("Ranking objectives are not supported.")
|
|
492
|
+
|
|
493
|
+
if n_classes > 2:
|
|
494
|
+
if objective_fun not in ["multi:softprob", "multi:softmax"]:
|
|
495
|
+
raise TypeError(
|
|
496
|
+
"multi:softprob and multi:softmax are only supported for multiclass classification"
|
|
497
|
+
)
|
|
498
|
+
elif objective_fun.startswith("binary:"):
|
|
499
|
+
if objective_fun not in ["binary:logistic", "binary:logitraw"]:
|
|
500
|
+
raise TypeError(
|
|
501
|
+
"only binary:logistic and binary:logitraw are supported for binary classification"
|
|
502
|
+
)
|
|
503
|
+
n_classes = 2
|
|
504
|
+
if objective_fun == "binary:logitraw":
|
|
505
|
+
# daal4py always applies a sigmoid for pred_proba, wheres XGBoost
|
|
506
|
+
# returns raw predictions with logitraw
|
|
507
|
+
warn(
|
|
508
|
+
"objective='binary:logitraw' selected\n"
|
|
509
|
+
"XGBoost returns raw class scores when calling pred_proba()\n"
|
|
510
|
+
"whilst scikit-learn-intelex always uses binary:logistic\n"
|
|
511
|
+
)
|
|
512
|
+
base_score = float(1 / (1 + np.exp(-base_score)))
|
|
513
|
+
else:
|
|
514
|
+
is_regression = True
|
|
515
|
+
|
|
516
|
+
# max_trees=0 if best_iteration does not exist
|
|
517
|
+
max_trees = getattr(booster, "best_iteration", -1) + 1
|
|
518
|
+
if n_classes > 2:
|
|
519
|
+
max_trees *= n_classes
|
|
520
|
+
tree_list = TreeList.from_xgb_booster(booster, max_trees, feature_names_to_indices)
|
|
521
|
+
|
|
522
|
+
if hasattr(booster, "best_iteration"):
|
|
523
|
+
n_iterations = booster.best_iteration + 1
|
|
524
|
+
else:
|
|
525
|
+
n_iterations = len(tree_list) // (n_classes if n_classes > 2 else 1)
|
|
526
|
+
|
|
527
|
+
return get_gbt_model_from_tree_list(
|
|
528
|
+
tree_list,
|
|
529
|
+
n_iterations=n_iterations,
|
|
530
|
+
is_regression=is_regression,
|
|
531
|
+
n_features=n_features,
|
|
532
|
+
n_classes=n_classes,
|
|
533
|
+
base_score=base_score,
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def __get_value_as_list(node):
|
|
538
|
+
"""Make sure the values are a list"""
|
|
539
|
+
values = node["value"]
|
|
540
|
+
if isinstance(values, (list, tuple)):
|
|
541
|
+
return values
|
|
542
|
+
else:
|
|
543
|
+
return [values]
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
def __calc_node_weights_from_leaf_weights(weights):
|
|
547
|
+
def sum_pairs(values):
|
|
548
|
+
assert len(values) % 2 == 0, "Length of values must be even"
|
|
549
|
+
return [values[i] + values[i + 1] for i in range(0, len(values), 2)]
|
|
550
|
+
|
|
551
|
+
level_weights = sum_pairs(weights)
|
|
552
|
+
result = [level_weights]
|
|
553
|
+
while len(level_weights) > 1:
|
|
554
|
+
level_weights = sum_pairs(level_weights)
|
|
555
|
+
result.append(level_weights)
|
|
556
|
+
return result[::-1]
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def get_gbt_model_from_catboost(booster: Any) -> Any:
|
|
560
|
+
if not booster.is_fitted():
|
|
561
|
+
raise RuntimeError("Model should be fitted before exporting to daal4py.")
|
|
562
|
+
|
|
563
|
+
model = CatBoostModelData(get_catboost_params(booster))
|
|
564
|
+
|
|
565
|
+
if model.has_categorical_features:
|
|
566
|
+
raise NotImplementedError(
|
|
567
|
+
"Categorical features are not supported in daal4py Gradient Boosting Trees"
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
if model.is_classification:
|
|
571
|
+
mb = gbt_clf_model_builder(
|
|
572
|
+
n_features=model.n_features,
|
|
573
|
+
n_iterations=model.n_iterations,
|
|
574
|
+
n_classes=model.n_classes,
|
|
575
|
+
)
|
|
576
|
+
else:
|
|
577
|
+
mb = gbt_reg_model_builder(
|
|
578
|
+
n_features=model.n_features, n_iterations=model.n_iterations
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
# Create splits array (all splits are placed sequentially)
|
|
582
|
+
splits = []
|
|
583
|
+
for feature in model.float_features:
|
|
584
|
+
if feature["borders"]:
|
|
585
|
+
for feature_border in feature["borders"]:
|
|
586
|
+
splits.append(
|
|
587
|
+
{"feature_index": feature["feature_index"], "value": feature_border}
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
trees_explicit = []
|
|
591
|
+
tree_symmetric = []
|
|
592
|
+
|
|
593
|
+
if model.is_symmetric_tree:
|
|
594
|
+
for tree in model.oblivious_trees:
|
|
595
|
+
cur_tree_depth = len(tree.get("splits", []))
|
|
596
|
+
tree_symmetric.append((tree, cur_tree_depth))
|
|
597
|
+
else:
|
|
598
|
+
for tree in model.trees:
|
|
599
|
+
n_nodes = 1
|
|
600
|
+
if "split" not in tree:
|
|
601
|
+
# handle leaf node
|
|
602
|
+
values = __get_value_as_list(tree)
|
|
603
|
+
root_node = CatBoostNode(value=[value * model.scale for value in values])
|
|
604
|
+
continue
|
|
605
|
+
# Check if node is a leaf (in case of stump)
|
|
606
|
+
if "split" in tree:
|
|
607
|
+
# Get number of trees and splits info via BFS
|
|
608
|
+
# Create queue
|
|
609
|
+
nodes_queue = []
|
|
610
|
+
root_node = CatBoostNode(split=splits[tree["split"]["split_index"]])
|
|
611
|
+
nodes_queue.append((tree, root_node))
|
|
612
|
+
while nodes_queue:
|
|
613
|
+
cur_node_data, cur_node = nodes_queue.pop(0)
|
|
614
|
+
if "value" in cur_node_data:
|
|
615
|
+
cur_node.value = __get_value_as_list(cur_node_data)
|
|
616
|
+
else:
|
|
617
|
+
cur_node.split = splits[cur_node_data["split"]["split_index"]]
|
|
618
|
+
left_node = CatBoostNode()
|
|
619
|
+
right_node = CatBoostNode()
|
|
620
|
+
cur_node.left = left_node
|
|
621
|
+
cur_node.right = right_node
|
|
622
|
+
nodes_queue.append((cur_node_data["left"], left_node))
|
|
623
|
+
nodes_queue.append((cur_node_data["right"], right_node))
|
|
624
|
+
n_nodes += 2
|
|
625
|
+
else:
|
|
626
|
+
root_node = CatBoostNode()
|
|
627
|
+
if model.is_classification and model.n_classes > 2:
|
|
628
|
+
root_node.value = [value * model.scale for value in tree["value"]]
|
|
629
|
+
else:
|
|
630
|
+
root_node.value = [tree["value"] * model.scale + model.bias]
|
|
631
|
+
trees_explicit.append((root_node, n_nodes))
|
|
632
|
+
|
|
633
|
+
tree_id = []
|
|
634
|
+
class_label = 0
|
|
635
|
+
count = 0
|
|
636
|
+
|
|
637
|
+
# Only 1 tree for each iteration in case of regression or binary classification
|
|
638
|
+
if not model.is_classification or model.n_classes == 2:
|
|
639
|
+
n_tree_each_iter = 1
|
|
640
|
+
else:
|
|
641
|
+
n_tree_each_iter = model.n_classes
|
|
642
|
+
|
|
643
|
+
shap_ready = False
|
|
644
|
+
|
|
645
|
+
# Create id for trees (for the right order in model builder)
|
|
646
|
+
for i in range(model.n_iterations):
|
|
647
|
+
for _ in range(n_tree_each_iter):
|
|
648
|
+
if model.is_symmetric_tree:
|
|
649
|
+
n_nodes = 2 ** (tree_symmetric[i][1] + 1) - 1
|
|
650
|
+
else:
|
|
651
|
+
n_nodes = trees_explicit[i][1]
|
|
652
|
+
|
|
653
|
+
if model.is_classification and model.n_classes > 2:
|
|
654
|
+
tree_id.append(mb.create_tree(n_nodes, class_label))
|
|
655
|
+
count += 1
|
|
656
|
+
if count == model.n_iterations:
|
|
657
|
+
class_label += 1
|
|
658
|
+
count = 0
|
|
659
|
+
|
|
660
|
+
elif model.is_classification:
|
|
661
|
+
tree_id.append(mb.create_tree(n_nodes, 0))
|
|
662
|
+
else:
|
|
663
|
+
tree_id.append(mb.create_tree(n_nodes))
|
|
664
|
+
|
|
665
|
+
if model.is_symmetric_tree:
|
|
666
|
+
for class_label in range(n_tree_each_iter):
|
|
667
|
+
for i in range(model.n_iterations):
|
|
668
|
+
shap_ready = True # this code branch provides all info for SHAP values
|
|
669
|
+
cur_tree_info = tree_symmetric[i][0]
|
|
670
|
+
cur_tree_id = tree_id[i * n_tree_each_iter + class_label]
|
|
671
|
+
cur_tree_leaf_val = cur_tree_info["leaf_values"]
|
|
672
|
+
cur_tree_leaf_weights = cur_tree_info["leaf_weights"]
|
|
673
|
+
cur_tree_depth = tree_symmetric[i][1]
|
|
674
|
+
if cur_tree_depth == 0:
|
|
675
|
+
mb.add_leaf(
|
|
676
|
+
tree_id=cur_tree_id,
|
|
677
|
+
response=cur_tree_leaf_val[0],
|
|
678
|
+
cover=cur_tree_leaf_weights[0],
|
|
679
|
+
)
|
|
680
|
+
else:
|
|
681
|
+
# One split used for the whole level
|
|
682
|
+
cur_level_split = splits[
|
|
683
|
+
cur_tree_info["splits"][cur_tree_depth - 1]["split_index"]
|
|
684
|
+
]
|
|
685
|
+
cur_tree_weights_per_level = __calc_node_weights_from_leaf_weights(
|
|
686
|
+
cur_tree_leaf_weights
|
|
687
|
+
)
|
|
688
|
+
root_weight = cur_tree_weights_per_level[0][0]
|
|
689
|
+
root_id = mb.add_split(
|
|
690
|
+
tree_id=cur_tree_id,
|
|
691
|
+
feature_index=cur_level_split["feature_index"],
|
|
692
|
+
feature_value=cur_level_split["value"],
|
|
693
|
+
default_left=model.default_left,
|
|
694
|
+
cover=root_weight,
|
|
695
|
+
)
|
|
696
|
+
prev_level_nodes = [root_id]
|
|
697
|
+
|
|
698
|
+
# Iterate over levels, splits in json are reversed (root split is the last)
|
|
699
|
+
for cur_level in range(cur_tree_depth - 2, -1, -1):
|
|
700
|
+
cur_level_nodes = []
|
|
701
|
+
next_level_weights = cur_tree_weights_per_level[cur_level + 1]
|
|
702
|
+
cur_level_node_index = 0
|
|
703
|
+
for cur_parent in prev_level_nodes:
|
|
704
|
+
cur_level_split = splits[
|
|
705
|
+
cur_tree_info["splits"][cur_level]["split_index"]
|
|
706
|
+
]
|
|
707
|
+
cur_left_node = mb.add_split(
|
|
708
|
+
tree_id=cur_tree_id,
|
|
709
|
+
parent_id=cur_parent,
|
|
710
|
+
position=0,
|
|
711
|
+
feature_index=cur_level_split["feature_index"],
|
|
712
|
+
feature_value=cur_level_split["value"],
|
|
713
|
+
default_left=model.default_left,
|
|
714
|
+
cover=next_level_weights[cur_level_node_index],
|
|
715
|
+
)
|
|
716
|
+
# cur_level_node_index += 1
|
|
717
|
+
cur_right_node = mb.add_split(
|
|
718
|
+
tree_id=cur_tree_id,
|
|
719
|
+
parent_id=cur_parent,
|
|
720
|
+
position=1,
|
|
721
|
+
feature_index=cur_level_split["feature_index"],
|
|
722
|
+
feature_value=cur_level_split["value"],
|
|
723
|
+
default_left=model.default_left,
|
|
724
|
+
cover=next_level_weights[cur_level_node_index],
|
|
725
|
+
)
|
|
726
|
+
# cur_level_node_index += 1
|
|
727
|
+
cur_level_nodes.append(cur_left_node)
|
|
728
|
+
cur_level_nodes.append(cur_right_node)
|
|
729
|
+
prev_level_nodes = cur_level_nodes
|
|
730
|
+
|
|
731
|
+
# Different storing format for leaves
|
|
732
|
+
if not model.is_classification or model.n_classes == 2:
|
|
733
|
+
for last_level_node_num in range(len(prev_level_nodes)):
|
|
734
|
+
mb.add_leaf(
|
|
735
|
+
tree_id=cur_tree_id,
|
|
736
|
+
response=cur_tree_leaf_val[2 * last_level_node_num]
|
|
737
|
+
* model.scale
|
|
738
|
+
+ model.bias,
|
|
739
|
+
parent_id=prev_level_nodes[last_level_node_num],
|
|
740
|
+
position=0,
|
|
741
|
+
cover=cur_tree_leaf_weights[2 * last_level_node_num],
|
|
742
|
+
)
|
|
743
|
+
mb.add_leaf(
|
|
744
|
+
tree_id=cur_tree_id,
|
|
745
|
+
response=cur_tree_leaf_val[2 * last_level_node_num + 1]
|
|
746
|
+
* model.scale
|
|
747
|
+
+ model.bias,
|
|
748
|
+
parent_id=prev_level_nodes[last_level_node_num],
|
|
749
|
+
position=1,
|
|
750
|
+
cover=cur_tree_leaf_weights[2 * last_level_node_num + 1],
|
|
751
|
+
)
|
|
752
|
+
else:
|
|
753
|
+
shap_ready = False
|
|
754
|
+
for last_level_node_num in range(len(prev_level_nodes)):
|
|
755
|
+
left_index = (
|
|
756
|
+
2 * last_level_node_num * n_tree_each_iter + class_label
|
|
757
|
+
)
|
|
758
|
+
right_index = (
|
|
759
|
+
2 * last_level_node_num + 1
|
|
760
|
+
) * n_tree_each_iter + class_label
|
|
761
|
+
mb.add_leaf(
|
|
762
|
+
tree_id=cur_tree_id,
|
|
763
|
+
response=cur_tree_leaf_val[left_index] * model.scale
|
|
764
|
+
+ model.bias,
|
|
765
|
+
parent_id=prev_level_nodes[last_level_node_num],
|
|
766
|
+
position=0,
|
|
767
|
+
cover=0.0,
|
|
768
|
+
)
|
|
769
|
+
mb.add_leaf(
|
|
770
|
+
tree_id=cur_tree_id,
|
|
771
|
+
response=cur_tree_leaf_val[right_index] * model.scale
|
|
772
|
+
+ model.bias,
|
|
773
|
+
parent_id=prev_level_nodes[last_level_node_num],
|
|
774
|
+
position=1,
|
|
775
|
+
cover=0.0,
|
|
776
|
+
)
|
|
777
|
+
else:
|
|
778
|
+
shap_ready = False
|
|
779
|
+
for class_label in range(n_tree_each_iter):
|
|
780
|
+
for i in range(model.n_iterations):
|
|
781
|
+
root_node = trees_explicit[i][0]
|
|
782
|
+
|
|
783
|
+
cur_tree_id = tree_id[i * n_tree_each_iter + class_label]
|
|
784
|
+
# Traverse tree via BFS and build tree with modelbuilder
|
|
785
|
+
if root_node.value is None:
|
|
786
|
+
root_id = mb.add_split(
|
|
787
|
+
tree_id=cur_tree_id,
|
|
788
|
+
feature_index=root_node.split["feature_index"],
|
|
789
|
+
feature_value=root_node.split["value"],
|
|
790
|
+
default_left=model.default_left,
|
|
791
|
+
cover=0.0,
|
|
792
|
+
)
|
|
793
|
+
nodes_queue = [(root_node, root_id)]
|
|
794
|
+
while nodes_queue:
|
|
795
|
+
cur_node, cur_node_id = nodes_queue.pop(0)
|
|
796
|
+
left_node = cur_node.left
|
|
797
|
+
# Check if node is a leaf
|
|
798
|
+
if left_node.value is None:
|
|
799
|
+
left_node_id = mb.add_split(
|
|
800
|
+
tree_id=cur_tree_id,
|
|
801
|
+
parent_id=cur_node_id,
|
|
802
|
+
position=0,
|
|
803
|
+
feature_index=left_node.split["feature_index"],
|
|
804
|
+
feature_value=left_node.split["value"],
|
|
805
|
+
default_left=model.default_left,
|
|
806
|
+
cover=0.0,
|
|
807
|
+
)
|
|
808
|
+
nodes_queue.append((left_node, left_node_id))
|
|
809
|
+
else:
|
|
810
|
+
mb.add_leaf(
|
|
811
|
+
tree_id=cur_tree_id,
|
|
812
|
+
response=left_node.value[class_label],
|
|
813
|
+
parent_id=cur_node_id,
|
|
814
|
+
position=0,
|
|
815
|
+
cover=0.0,
|
|
816
|
+
)
|
|
817
|
+
right_node = cur_node.right
|
|
818
|
+
# Check if node is a leaf
|
|
819
|
+
if right_node.value is None:
|
|
820
|
+
right_node_id = mb.add_split(
|
|
821
|
+
tree_id=cur_tree_id,
|
|
822
|
+
parent_id=cur_node_id,
|
|
823
|
+
position=1,
|
|
824
|
+
feature_index=right_node.split["feature_index"],
|
|
825
|
+
feature_value=right_node.split["value"],
|
|
826
|
+
default_left=model.default_left,
|
|
827
|
+
cover=0.0,
|
|
828
|
+
)
|
|
829
|
+
nodes_queue.append((right_node, right_node_id))
|
|
830
|
+
else:
|
|
831
|
+
mb.add_leaf(
|
|
832
|
+
tree_id=cur_tree_id,
|
|
833
|
+
response=cur_node.right.value[class_label],
|
|
834
|
+
parent_id=cur_node_id,
|
|
835
|
+
position=1,
|
|
836
|
+
cover=0.0,
|
|
837
|
+
)
|
|
838
|
+
|
|
839
|
+
else:
|
|
840
|
+
# Tree has only one node
|
|
841
|
+
mb.add_leaf(
|
|
842
|
+
tree_id=cur_tree_id,
|
|
843
|
+
response=root_node.value[class_label],
|
|
844
|
+
cover=0.0,
|
|
845
|
+
)
|
|
846
|
+
|
|
847
|
+
if not shap_ready:
|
|
848
|
+
warn("Converted models of this type do not support SHAP value calculation")
|
|
849
|
+
else:
|
|
850
|
+
warn(
|
|
851
|
+
"CatBoost SHAP values seem to be incorrect. "
|
|
852
|
+
"Values from converted models will differ. "
|
|
853
|
+
"See https://github.com/catboost/catboost/issues/2556 for more details."
|
|
854
|
+
)
|
|
855
|
+
return mb.model(base_score=0.0)
|