scikit-learn-intelex 2025.4.0__py313-none-manylinux_2_28_x86_64.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.

Files changed (282) hide show
  1. daal4py/__init__.py +73 -0
  2. daal4py/__main__.py +58 -0
  3. daal4py/_daal4py.cpython-313-x86_64-linux-gnu.so +0 -0
  4. daal4py/doc/third-party-programs.txt +424 -0
  5. daal4py/mb/__init__.py +19 -0
  6. daal4py/mb/model_builders.py +377 -0
  7. daal4py/mpi_transceiver.cpython-313-x86_64-linux-gnu.so +0 -0
  8. daal4py/sklearn/__init__.py +40 -0
  9. daal4py/sklearn/_n_jobs_support.py +248 -0
  10. daal4py/sklearn/_utils.py +245 -0
  11. daal4py/sklearn/cluster/__init__.py +20 -0
  12. daal4py/sklearn/cluster/dbscan.py +165 -0
  13. daal4py/sklearn/cluster/k_means.py +597 -0
  14. daal4py/sklearn/cluster/tests/test_dbscan.py +109 -0
  15. daal4py/sklearn/decomposition/__init__.py +19 -0
  16. daal4py/sklearn/decomposition/_pca.py +524 -0
  17. daal4py/sklearn/ensemble/AdaBoostClassifier.py +196 -0
  18. daal4py/sklearn/ensemble/GBTDAAL.py +337 -0
  19. daal4py/sklearn/ensemble/__init__.py +27 -0
  20. daal4py/sklearn/ensemble/_forest.py +1397 -0
  21. daal4py/sklearn/ensemble/tests/test_decision_forest.py +206 -0
  22. daal4py/sklearn/linear_model/__init__.py +29 -0
  23. daal4py/sklearn/linear_model/_coordinate_descent.py +848 -0
  24. daal4py/sklearn/linear_model/_linear.py +272 -0
  25. daal4py/sklearn/linear_model/_ridge.py +325 -0
  26. daal4py/sklearn/linear_model/coordinate_descent.py +17 -0
  27. daal4py/sklearn/linear_model/linear.py +17 -0
  28. daal4py/sklearn/linear_model/logistic_loss.py +195 -0
  29. daal4py/sklearn/linear_model/logistic_path.py +1026 -0
  30. daal4py/sklearn/linear_model/ridge.py +17 -0
  31. daal4py/sklearn/linear_model/tests/test_linear.py +208 -0
  32. daal4py/sklearn/linear_model/tests/test_ridge.py +69 -0
  33. daal4py/sklearn/manifold/__init__.py +19 -0
  34. daal4py/sklearn/manifold/_t_sne.py +405 -0
  35. daal4py/sklearn/metrics/__init__.py +20 -0
  36. daal4py/sklearn/metrics/_pairwise.py +236 -0
  37. daal4py/sklearn/metrics/_ranking.py +210 -0
  38. daal4py/sklearn/model_selection/__init__.py +19 -0
  39. daal4py/sklearn/model_selection/_split.py +309 -0
  40. daal4py/sklearn/model_selection/tests/test_split.py +56 -0
  41. daal4py/sklearn/monkeypatch/__init__.py +0 -0
  42. daal4py/sklearn/monkeypatch/dispatcher.py +232 -0
  43. daal4py/sklearn/monkeypatch/tests/_models_info.py +161 -0
  44. daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +71 -0
  45. daal4py/sklearn/monkeypatch/tests/test_patching.py +90 -0
  46. daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +117 -0
  47. daal4py/sklearn/neighbors/__init__.py +21 -0
  48. daal4py/sklearn/neighbors/_base.py +503 -0
  49. daal4py/sklearn/neighbors/_classification.py +139 -0
  50. daal4py/sklearn/neighbors/_regression.py +74 -0
  51. daal4py/sklearn/neighbors/_unsupervised.py +55 -0
  52. daal4py/sklearn/neighbors/tests/test_kneighbors.py +113 -0
  53. daal4py/sklearn/svm/__init__.py +19 -0
  54. daal4py/sklearn/svm/svm.py +734 -0
  55. daal4py/sklearn/utils/__init__.py +21 -0
  56. daal4py/sklearn/utils/base.py +75 -0
  57. daal4py/sklearn/utils/tests/test_utils.py +51 -0
  58. daal4py/sklearn/utils/validation.py +696 -0
  59. onedal/__init__.py +83 -0
  60. onedal/_config.py +54 -0
  61. onedal/_device_offload.py +204 -0
  62. onedal/_onedal_py_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
  63. onedal/_onedal_py_host.cpython-313-x86_64-linux-gnu.so +0 -0
  64. onedal/_onedal_py_spmd_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
  65. onedal/basic_statistics/__init__.py +20 -0
  66. onedal/basic_statistics/basic_statistics.py +107 -0
  67. onedal/basic_statistics/incremental_basic_statistics.py +175 -0
  68. onedal/basic_statistics/tests/test_basic_statistics.py +242 -0
  69. onedal/basic_statistics/tests/test_incremental_basic_statistics.py +279 -0
  70. onedal/basic_statistics/tests/utils.py +50 -0
  71. onedal/cluster/__init__.py +27 -0
  72. onedal/cluster/dbscan.py +105 -0
  73. onedal/cluster/kmeans.py +557 -0
  74. onedal/cluster/kmeans_init.py +112 -0
  75. onedal/cluster/tests/test_dbscan.py +125 -0
  76. onedal/cluster/tests/test_kmeans.py +88 -0
  77. onedal/cluster/tests/test_kmeans_init.py +93 -0
  78. onedal/common/_base.py +38 -0
  79. onedal/common/_estimator_checks.py +47 -0
  80. onedal/common/_mixin.py +62 -0
  81. onedal/common/_policy.py +55 -0
  82. onedal/common/_spmd_policy.py +30 -0
  83. onedal/common/hyperparameters.py +125 -0
  84. onedal/common/tests/test_policy.py +76 -0
  85. onedal/common/tests/test_sycl.py +128 -0
  86. onedal/covariance/__init__.py +20 -0
  87. onedal/covariance/covariance.py +122 -0
  88. onedal/covariance/incremental_covariance.py +161 -0
  89. onedal/covariance/tests/test_covariance.py +50 -0
  90. onedal/covariance/tests/test_incremental_covariance.py +190 -0
  91. onedal/datatypes/__init__.py +19 -0
  92. onedal/datatypes/_data_conversion.py +121 -0
  93. onedal/datatypes/tests/common.py +126 -0
  94. onedal/datatypes/tests/test_data.py +475 -0
  95. onedal/decomposition/__init__.py +20 -0
  96. onedal/decomposition/incremental_pca.py +214 -0
  97. onedal/decomposition/pca.py +186 -0
  98. onedal/decomposition/tests/test_incremental_pca.py +285 -0
  99. onedal/ensemble/__init__.py +29 -0
  100. onedal/ensemble/forest.py +736 -0
  101. onedal/ensemble/tests/test_random_forest.py +97 -0
  102. onedal/linear_model/__init__.py +27 -0
  103. onedal/linear_model/incremental_linear_model.py +292 -0
  104. onedal/linear_model/linear_model.py +325 -0
  105. onedal/linear_model/logistic_regression.py +247 -0
  106. onedal/linear_model/tests/test_incremental_linear_regression.py +213 -0
  107. onedal/linear_model/tests/test_incremental_ridge_regression.py +171 -0
  108. onedal/linear_model/tests/test_linear_regression.py +259 -0
  109. onedal/linear_model/tests/test_logistic_regression.py +95 -0
  110. onedal/linear_model/tests/test_ridge.py +95 -0
  111. onedal/neighbors/__init__.py +19 -0
  112. onedal/neighbors/neighbors.py +763 -0
  113. onedal/neighbors/tests/test_knn_classification.py +49 -0
  114. onedal/primitives/__init__.py +27 -0
  115. onedal/primitives/get_tree.py +25 -0
  116. onedal/primitives/kernel_functions.py +152 -0
  117. onedal/primitives/tests/test_kernel_functions.py +159 -0
  118. onedal/spmd/__init__.py +25 -0
  119. onedal/spmd/_base.py +30 -0
  120. onedal/spmd/basic_statistics/__init__.py +20 -0
  121. onedal/spmd/basic_statistics/basic_statistics.py +30 -0
  122. onedal/spmd/basic_statistics/incremental_basic_statistics.py +71 -0
  123. onedal/spmd/cluster/__init__.py +28 -0
  124. onedal/spmd/cluster/dbscan.py +23 -0
  125. onedal/spmd/cluster/kmeans.py +56 -0
  126. onedal/spmd/covariance/__init__.py +20 -0
  127. onedal/spmd/covariance/covariance.py +26 -0
  128. onedal/spmd/covariance/incremental_covariance.py +83 -0
  129. onedal/spmd/decomposition/__init__.py +20 -0
  130. onedal/spmd/decomposition/incremental_pca.py +124 -0
  131. onedal/spmd/decomposition/pca.py +26 -0
  132. onedal/spmd/ensemble/__init__.py +19 -0
  133. onedal/spmd/ensemble/forest.py +28 -0
  134. onedal/spmd/linear_model/__init__.py +21 -0
  135. onedal/spmd/linear_model/incremental_linear_model.py +101 -0
  136. onedal/spmd/linear_model/linear_model.py +30 -0
  137. onedal/spmd/linear_model/logistic_regression.py +38 -0
  138. onedal/spmd/neighbors/__init__.py +19 -0
  139. onedal/spmd/neighbors/neighbors.py +75 -0
  140. onedal/svm/__init__.py +19 -0
  141. onedal/svm/svm.py +556 -0
  142. onedal/svm/tests/test_csr_svm.py +351 -0
  143. onedal/svm/tests/test_nusvc.py +204 -0
  144. onedal/svm/tests/test_nusvr.py +210 -0
  145. onedal/svm/tests/test_svc.py +176 -0
  146. onedal/svm/tests/test_svr.py +243 -0
  147. onedal/tests/test_common.py +57 -0
  148. onedal/tests/utils/_dataframes_support.py +162 -0
  149. onedal/tests/utils/_device_selection.py +102 -0
  150. onedal/utils/__init__.py +49 -0
  151. onedal/utils/_array_api.py +81 -0
  152. onedal/utils/_dpep_helpers.py +56 -0
  153. onedal/utils/tests/test_validation.py +142 -0
  154. onedal/utils/validation.py +464 -0
  155. scikit_learn_intelex-2025.4.0.dist-info/LICENSE.txt +202 -0
  156. scikit_learn_intelex-2025.4.0.dist-info/METADATA +190 -0
  157. scikit_learn_intelex-2025.4.0.dist-info/RECORD +282 -0
  158. scikit_learn_intelex-2025.4.0.dist-info/WHEEL +5 -0
  159. scikit_learn_intelex-2025.4.0.dist-info/top_level.txt +3 -0
  160. sklearnex/__init__.py +66 -0
  161. sklearnex/__main__.py +58 -0
  162. sklearnex/_config.py +116 -0
  163. sklearnex/_device_offload.py +126 -0
  164. sklearnex/_utils.py +177 -0
  165. sklearnex/basic_statistics/__init__.py +20 -0
  166. sklearnex/basic_statistics/basic_statistics.py +261 -0
  167. sklearnex/basic_statistics/incremental_basic_statistics.py +352 -0
  168. sklearnex/basic_statistics/tests/test_basic_statistics.py +405 -0
  169. sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +455 -0
  170. sklearnex/cluster/__init__.py +20 -0
  171. sklearnex/cluster/dbscan.py +197 -0
  172. sklearnex/cluster/k_means.py +397 -0
  173. sklearnex/cluster/tests/test_dbscan.py +38 -0
  174. sklearnex/cluster/tests/test_kmeans.py +157 -0
  175. sklearnex/conftest.py +82 -0
  176. sklearnex/covariance/__init__.py +19 -0
  177. sklearnex/covariance/incremental_covariance.py +405 -0
  178. sklearnex/covariance/tests/test_incremental_covariance.py +287 -0
  179. sklearnex/decomposition/__init__.py +19 -0
  180. sklearnex/decomposition/pca.py +427 -0
  181. sklearnex/decomposition/tests/test_pca.py +58 -0
  182. sklearnex/dispatcher.py +534 -0
  183. sklearnex/doc/third-party-programs.txt +424 -0
  184. sklearnex/ensemble/__init__.py +29 -0
  185. sklearnex/ensemble/_forest.py +2029 -0
  186. sklearnex/ensemble/tests/test_forest.py +140 -0
  187. sklearnex/glob/__main__.py +72 -0
  188. sklearnex/glob/dispatcher.py +101 -0
  189. sklearnex/linear_model/__init__.py +32 -0
  190. sklearnex/linear_model/coordinate_descent.py +30 -0
  191. sklearnex/linear_model/incremental_linear.py +495 -0
  192. sklearnex/linear_model/incremental_ridge.py +432 -0
  193. sklearnex/linear_model/linear.py +346 -0
  194. sklearnex/linear_model/logistic_regression.py +415 -0
  195. sklearnex/linear_model/ridge.py +390 -0
  196. sklearnex/linear_model/tests/test_incremental_linear.py +267 -0
  197. sklearnex/linear_model/tests/test_incremental_ridge.py +214 -0
  198. sklearnex/linear_model/tests/test_linear.py +142 -0
  199. sklearnex/linear_model/tests/test_logreg.py +134 -0
  200. sklearnex/linear_model/tests/test_ridge.py +256 -0
  201. sklearnex/manifold/__init__.py +19 -0
  202. sklearnex/manifold/t_sne.py +26 -0
  203. sklearnex/manifold/tests/test_tsne.py +250 -0
  204. sklearnex/metrics/__init__.py +23 -0
  205. sklearnex/metrics/pairwise.py +22 -0
  206. sklearnex/metrics/ranking.py +20 -0
  207. sklearnex/metrics/tests/test_metrics.py +39 -0
  208. sklearnex/model_selection/__init__.py +21 -0
  209. sklearnex/model_selection/split.py +22 -0
  210. sklearnex/model_selection/tests/test_model_selection.py +34 -0
  211. sklearnex/neighbors/__init__.py +27 -0
  212. sklearnex/neighbors/_lof.py +236 -0
  213. sklearnex/neighbors/common.py +310 -0
  214. sklearnex/neighbors/knn_classification.py +231 -0
  215. sklearnex/neighbors/knn_regression.py +207 -0
  216. sklearnex/neighbors/knn_unsupervised.py +178 -0
  217. sklearnex/neighbors/tests/test_neighbors.py +82 -0
  218. sklearnex/preview/__init__.py +17 -0
  219. sklearnex/preview/covariance/__init__.py +19 -0
  220. sklearnex/preview/covariance/covariance.py +142 -0
  221. sklearnex/preview/covariance/tests/test_covariance.py +66 -0
  222. sklearnex/preview/decomposition/__init__.py +19 -0
  223. sklearnex/preview/decomposition/incremental_pca.py +244 -0
  224. sklearnex/preview/decomposition/tests/test_incremental_pca.py +336 -0
  225. sklearnex/spmd/__init__.py +25 -0
  226. sklearnex/spmd/basic_statistics/__init__.py +20 -0
  227. sklearnex/spmd/basic_statistics/basic_statistics.py +21 -0
  228. sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +30 -0
  229. sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +107 -0
  230. sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +306 -0
  231. sklearnex/spmd/cluster/__init__.py +30 -0
  232. sklearnex/spmd/cluster/dbscan.py +50 -0
  233. sklearnex/spmd/cluster/kmeans.py +21 -0
  234. sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +97 -0
  235. sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +173 -0
  236. sklearnex/spmd/covariance/__init__.py +20 -0
  237. sklearnex/spmd/covariance/covariance.py +21 -0
  238. sklearnex/spmd/covariance/incremental_covariance.py +37 -0
  239. sklearnex/spmd/covariance/tests/test_covariance_spmd.py +107 -0
  240. sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +184 -0
  241. sklearnex/spmd/decomposition/__init__.py +20 -0
  242. sklearnex/spmd/decomposition/incremental_pca.py +30 -0
  243. sklearnex/spmd/decomposition/pca.py +21 -0
  244. sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +269 -0
  245. sklearnex/spmd/decomposition/tests/test_pca_spmd.py +128 -0
  246. sklearnex/spmd/ensemble/__init__.py +19 -0
  247. sklearnex/spmd/ensemble/forest.py +71 -0
  248. sklearnex/spmd/ensemble/tests/test_forest_spmd.py +265 -0
  249. sklearnex/spmd/linear_model/__init__.py +21 -0
  250. sklearnex/spmd/linear_model/incremental_linear_model.py +35 -0
  251. sklearnex/spmd/linear_model/linear_model.py +21 -0
  252. sklearnex/spmd/linear_model/logistic_regression.py +21 -0
  253. sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +331 -0
  254. sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +145 -0
  255. sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +162 -0
  256. sklearnex/spmd/neighbors/__init__.py +19 -0
  257. sklearnex/spmd/neighbors/neighbors.py +25 -0
  258. sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +288 -0
  259. sklearnex/svm/__init__.py +29 -0
  260. sklearnex/svm/_common.py +339 -0
  261. sklearnex/svm/nusvc.py +371 -0
  262. sklearnex/svm/nusvr.py +170 -0
  263. sklearnex/svm/svc.py +399 -0
  264. sklearnex/svm/svr.py +167 -0
  265. sklearnex/svm/tests/test_svm.py +93 -0
  266. sklearnex/tests/test_common.py +491 -0
  267. sklearnex/tests/test_config.py +123 -0
  268. sklearnex/tests/test_hyperparameters.py +43 -0
  269. sklearnex/tests/test_memory_usage.py +347 -0
  270. sklearnex/tests/test_monkeypatch.py +269 -0
  271. sklearnex/tests/test_n_jobs_support.py +108 -0
  272. sklearnex/tests/test_parallel.py +48 -0
  273. sklearnex/tests/test_patching.py +377 -0
  274. sklearnex/tests/test_run_to_run_stability.py +326 -0
  275. sklearnex/tests/utils/__init__.py +48 -0
  276. sklearnex/tests/utils/base.py +436 -0
  277. sklearnex/tests/utils/spmd.py +198 -0
  278. sklearnex/utils/__init__.py +19 -0
  279. sklearnex/utils/_array_api.py +82 -0
  280. sklearnex/utils/parallel.py +59 -0
  281. sklearnex/utils/tests/test_validation.py +238 -0
  282. sklearnex/utils/validation.py +208 -0
@@ -0,0 +1,97 @@
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 pytest
18
+ from numpy.testing import assert_allclose
19
+ from sklearn.datasets import make_classification, make_regression
20
+
21
+ from daal4py.sklearn._utils import daal_check_version
22
+ from onedal.ensemble import RandomForestClassifier, RandomForestRegressor
23
+ from onedal.tests.utils._device_selection import get_queues
24
+
25
+
26
+ @pytest.mark.parametrize("queue", get_queues())
27
+ def test_rf_classifier(queue):
28
+ X, y = make_classification(
29
+ n_samples=100,
30
+ n_features=4,
31
+ n_informative=2,
32
+ n_redundant=0,
33
+ random_state=0,
34
+ shuffle=False,
35
+ )
36
+ rf = RandomForestClassifier(max_depth=2, random_state=0).fit(X, y, queue=queue)
37
+ assert_allclose([1], rf.predict([[0, 0, 0, 0]], queue=queue))
38
+
39
+
40
+ @pytest.mark.parametrize("queue", get_queues())
41
+ def test_rf_regression(queue):
42
+ if queue and queue.sycl_device.is_gpu:
43
+ pytest.skip("RF regressor predict for the GPU sycl_queue is buggy.")
44
+ X, y = make_regression(
45
+ n_samples=100, n_features=4, n_informative=2, random_state=0, shuffle=False
46
+ )
47
+ rf = RandomForestRegressor(max_depth=2, random_state=0).fit(X, y, queue=queue)
48
+
49
+ # GPU and CPU implementations of Random Forest use RNGs differently. They build
50
+ # different ensembles of trees, thereby requiring separate check values.
51
+ if queue and queue.sycl_device.is_gpu:
52
+ if daal_check_version((2024, "P", 0)):
53
+ assert_allclose([1.82], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
54
+ else:
55
+ assert_allclose([-6.83], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
56
+ else:
57
+ if daal_check_version((2024, "P", 0)):
58
+ assert_allclose([-6.97], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
59
+ else:
60
+ assert_allclose([-6.83], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
61
+
62
+
63
+ @pytest.mark.skipif(
64
+ not daal_check_version((2023, "P", 101)), reason="requires OneDAL 2023.1.1"
65
+ )
66
+ @pytest.mark.parametrize("queue", get_queues("gpu"))
67
+ def test_rf_classifier_random_splitter(queue):
68
+ X, y = make_classification(
69
+ n_samples=100,
70
+ n_features=4,
71
+ n_informative=2,
72
+ n_redundant=0,
73
+ random_state=0,
74
+ shuffle=False,
75
+ )
76
+ rf = RandomForestClassifier(max_depth=2, random_state=0, splitter_mode="random").fit(
77
+ X, y, queue=queue
78
+ )
79
+ assert_allclose([1], rf.predict([[0, 0, 0, 0]], queue=queue))
80
+
81
+
82
+ @pytest.mark.parametrize("queue", get_queues("gpu"))
83
+ def test_rf_regression_random_splitter(queue):
84
+ # splitter_mode selection only for GPU enabled.
85
+ # For CPU only `best` mode is supported.
86
+ if queue and queue.sycl_device.is_gpu:
87
+ pytest.skip("RF regressor predict for the GPU sycl_queue is buggy.")
88
+ X, y = make_regression(
89
+ n_samples=100, n_features=4, n_informative=2, random_state=0, shuffle=False
90
+ )
91
+ rf = RandomForestRegressor(max_depth=2, random_state=0, splitter_mode="random").fit(
92
+ X, y, queue=queue
93
+ )
94
+ if daal_check_version((2024, "P", 0)):
95
+ assert_allclose([-6.88], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
96
+ else:
97
+ assert_allclose([-6.83], rf.predict([[0, 0, 0, 0]], queue=queue), atol=1e-2)
@@ -0,0 +1,27 @@
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
+ from .incremental_linear_model import IncrementalLinearRegression, IncrementalRidge
18
+ from .linear_model import LinearRegression, Ridge
19
+ from .logistic_regression import LogisticRegression
20
+
21
+ __all__ = [
22
+ "IncrementalLinearRegression",
23
+ "IncrementalRidge",
24
+ "LinearRegression",
25
+ "LogisticRegression",
26
+ "Ridge",
27
+ ]
@@ -0,0 +1,292 @@
1
+ # ==============================================================================
2
+ # Copyright 2024 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 numpy as np
18
+
19
+ from daal4py.sklearn._utils import get_dtype
20
+
21
+ from ..common.hyperparameters import get_hyperparameters
22
+ from ..datatypes import from_table, to_table
23
+ from ..utils import _check_X_y, _num_features
24
+ from .linear_model import BaseLinearRegression
25
+
26
+
27
+ class IncrementalLinearRegression(BaseLinearRegression):
28
+ """
29
+ Incremental Linear Regression oneDAL implementation.
30
+
31
+ Parameters
32
+ ----------
33
+ fit_intercept : bool, default=True
34
+ Whether to calculate the intercept for this model. If set
35
+ to False, no intercept will be used in calculations
36
+ (i.e. data is expected to be centered).
37
+
38
+ copy_X : bool, default=True
39
+ If True, X will be copied; else, it may be overwritten.
40
+
41
+ algorithm : string, default="norm_eq"
42
+ Algorithm used for computation on oneDAL side
43
+ """
44
+
45
+ def __init__(self, fit_intercept=True, copy_X=False, algorithm="norm_eq"):
46
+ super().__init__(fit_intercept=fit_intercept, copy_X=copy_X, algorithm=algorithm)
47
+ self._reset()
48
+
49
+ def _reset(self):
50
+ self._need_to_finalize = False
51
+ self._partial_result = self._get_backend(
52
+ "linear_model", "regression", "partial_train_result"
53
+ )
54
+
55
+ def __getstate__(self):
56
+ # Since finalize_fit can't be dispatched without directly provided queue
57
+ # and the dispatching policy can't be serialized, the computation is finalized
58
+ # here and the policy is not saved in serialized data.
59
+
60
+ self.finalize_fit()
61
+ data = self.__dict__.copy()
62
+ data.pop("_queue", None)
63
+
64
+ return data
65
+
66
+ def partial_fit(self, X, y, queue=None):
67
+ """
68
+ Computes partial data for linear regression
69
+ from data batch X and saves it to `_partial_result`.
70
+ Parameters
71
+ ----------
72
+ X : array-like of shape (n_samples, n_features)
73
+ Training data batch, where `n_samples` is the number of samples
74
+ in the batch, and `n_features` is the number of features.
75
+
76
+ y: array-like of shape (n_samples,) or (n_samples, n_targets) in
77
+ case of multiple targets
78
+ Responses for training data.
79
+
80
+ queue : dpctl.SyclQueue
81
+ If not None, use this queue for computations.
82
+ Returns
83
+ -------
84
+ self : object
85
+ Returns the instance itself.
86
+ """
87
+ module = self._get_backend("linear_model", "regression")
88
+
89
+ self._queue = queue
90
+ policy = self._get_policy(queue, X)
91
+
92
+ X, y = _check_X_y(
93
+ X, y, dtype=[np.float64, np.float32], accept_2d_y=True, force_all_finite=False
94
+ )
95
+ y = np.asarray(y, dtype=X.dtype)
96
+
97
+ self.n_features_in_ = _num_features(X, fallback_1d=True)
98
+
99
+ X_table, y_table = to_table(X, y, queue=queue)
100
+
101
+ if not hasattr(self, "_dtype"):
102
+ self._dtype = X_table.dtype
103
+ self._params = self._get_onedal_params(self._dtype)
104
+
105
+ hparams = get_hyperparameters("linear_regression", "train")
106
+ if hparams is not None and not hparams.is_default:
107
+ self._partial_result = module.partial_train(
108
+ policy,
109
+ self._params,
110
+ hparams.backend,
111
+ self._partial_result,
112
+ X_table,
113
+ y_table,
114
+ )
115
+ else:
116
+ self._partial_result = module.partial_train(
117
+ policy, self._params, self._partial_result, X_table, y_table
118
+ )
119
+
120
+ self._need_to_finalize = True
121
+ return self
122
+
123
+ def finalize_fit(self, queue=None):
124
+ """
125
+ Finalizes linear regression computation and obtains coefficients
126
+ from the current `_partial_result`.
127
+
128
+ Parameters
129
+ ----------
130
+ queue : dpctl.SyclQueue
131
+ If not None, use this queue for computations.
132
+
133
+ Returns
134
+ -------
135
+ self : object
136
+ Returns the instance itself.
137
+ """
138
+
139
+ if self._need_to_finalize:
140
+ if queue is not None:
141
+ policy = self._get_policy(queue)
142
+ else:
143
+ policy = self._get_policy(self._queue)
144
+
145
+ module = self._get_backend("linear_model", "regression")
146
+ hparams = get_hyperparameters("linear_regression", "train")
147
+ if hparams is not None and not hparams.is_default:
148
+ result = module.finalize_train(
149
+ policy, self._params, hparams.backend, self._partial_result
150
+ )
151
+ else:
152
+ result = module.finalize_train(policy, self._params, self._partial_result)
153
+
154
+ self._onedal_model = result.model
155
+
156
+ packed_coefficients = from_table(result.model.packed_coefficients)
157
+ self.coef_, self.intercept_ = (
158
+ packed_coefficients[:, 1:].squeeze(),
159
+ packed_coefficients[:, 0].squeeze(),
160
+ )
161
+
162
+ self._need_to_finalize = False
163
+
164
+ return self
165
+
166
+
167
+ class IncrementalRidge(BaseLinearRegression):
168
+ """
169
+ Incremental Ridge Regression oneDAL implementation.
170
+
171
+ Parameters
172
+ ----------
173
+ alpha : float, default=1.0
174
+ Regularization strength; must be a positive float. Regularization
175
+ improves the conditioning of the problem and reduces the variance of
176
+ the estimates. Larger values specify stronger regularization.
177
+
178
+ fit_intercept : bool, default=True
179
+ Whether to calculate the intercept for this model. If set
180
+ to False, no intercept will be used in calculations
181
+ (i.e. data is expected to be centered).
182
+
183
+ copy_X : bool, default=True
184
+ If True, X will be copied; else, it may be overwritten.
185
+
186
+ algorithm : string, default="norm_eq"
187
+ Algorithm used for computation on oneDAL side
188
+ """
189
+
190
+ def __init__(self, alpha=1.0, fit_intercept=True, copy_X=False, algorithm="norm_eq"):
191
+ super().__init__(
192
+ fit_intercept=fit_intercept, alpha=alpha, copy_X=copy_X, algorithm=algorithm
193
+ )
194
+ self._reset()
195
+
196
+ def _reset(self):
197
+ module = self._get_backend("linear_model", "regression")
198
+ self._partial_result = module.partial_train_result()
199
+ self._need_to_finalize = False
200
+
201
+ def __getstate__(self):
202
+ # Since finalize_fit can't be dispatched without directly provided queue
203
+ # and the dispatching policy can't be serialized, the computation is finalized
204
+ # here and the policy is not saved in serialized data.
205
+
206
+ self.finalize_fit()
207
+ data = self.__dict__.copy()
208
+ data.pop("_queue", None)
209
+
210
+ return data
211
+
212
+ def partial_fit(self, X, y, queue=None):
213
+ """
214
+ Computes partial data for ridge regression
215
+ from data batch X and saves it to `_partial_result`.
216
+ Parameters
217
+ ----------
218
+ X : array-like of shape (n_samples, n_features)
219
+ Training data batch, where `n_samples` is the number of samples
220
+ in the batch, and `n_features` is the number of features.
221
+
222
+ y: array-like of shape (n_samples,) or (n_samples, n_targets) in
223
+ case of multiple targets
224
+ Responses for training data.
225
+
226
+ queue : dpctl.SyclQueue
227
+ If not None, use this queue for computations.
228
+ Returns
229
+ -------
230
+ self : object
231
+ Returns the instance itself.
232
+ """
233
+ module = self._get_backend("linear_model", "regression")
234
+
235
+ self._queue = queue
236
+ policy = self._get_policy(queue, X)
237
+
238
+ X, y = _check_X_y(
239
+ X, y, dtype=[np.float64, np.float32], accept_2d_y=True, force_all_finite=False
240
+ )
241
+ y = np.asarray(y, dtype=X.dtype)
242
+
243
+ self.n_features_in_ = _num_features(X, fallback_1d=True)
244
+
245
+ X_table, y_table = to_table(X, y, queue=queue)
246
+
247
+ if not hasattr(self, "_dtype"):
248
+ self._dtype = X_table.dtype
249
+ self._params = self._get_onedal_params(self._dtype)
250
+
251
+ self._partial_result = module.partial_train(
252
+ policy, self._params, self._partial_result, X_table, y_table
253
+ )
254
+
255
+ self._need_to_finalize = True
256
+ return self
257
+
258
+ def finalize_fit(self, queue=None):
259
+ """
260
+ Finalizes ridge regression computation and obtains coefficients
261
+ from the current `_partial_result`.
262
+
263
+ Parameters
264
+ ----------
265
+ queue : dpctl.SyclQueue
266
+ If available, uses provided queue for computations.
267
+
268
+ Returns
269
+ -------
270
+ self : object
271
+ Returns the instance itself.
272
+ """
273
+
274
+ if self._need_to_finalize:
275
+ module = self._get_backend("linear_model", "regression")
276
+ if queue is not None:
277
+ policy = self._get_policy(queue)
278
+ else:
279
+ policy = self._get_policy(self._queue)
280
+ result = module.finalize_train(policy, self._params, self._partial_result)
281
+
282
+ self._onedal_model = result.model
283
+
284
+ packed_coefficients = from_table(result.model.packed_coefficients)
285
+ self.coef_, self.intercept_ = (
286
+ packed_coefficients[:, 1:].squeeze(),
287
+ packed_coefficients[:, 0].squeeze(),
288
+ )
289
+
290
+ self._need_to_finalize = False
291
+
292
+ return self