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
sklearnex/svm/svc.py ADDED
@@ -0,0 +1,399 @@
1
+ # ==============================================================================
2
+ # Copyright 2021 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
+ from scipy import sparse as sp
19
+ from sklearn.exceptions import NotFittedError
20
+ from sklearn.metrics import accuracy_score
21
+ from sklearn.svm import SVC as _sklearn_SVC
22
+ from sklearn.utils.validation import (
23
+ _deprecate_positional_args,
24
+ check_array,
25
+ check_is_fitted,
26
+ )
27
+
28
+ from daal4py.sklearn._n_jobs_support import control_n_jobs
29
+ from daal4py.sklearn._utils import sklearn_check_version
30
+
31
+ from .._device_offload import dispatch, wrap_output_data
32
+ from .._utils import PatchingConditionsChain
33
+ from ..utils._array_api import get_namespace
34
+ from ._common import BaseSVC
35
+
36
+ if sklearn_check_version("1.0"):
37
+ from sklearn.utils.metaestimators import available_if
38
+
39
+ from onedal.svm import SVC as onedal_SVC
40
+
41
+ if sklearn_check_version("1.6"):
42
+ from sklearn.utils.validation import validate_data
43
+ else:
44
+ validate_data = BaseSVC._validate_data
45
+
46
+
47
+ @control_n_jobs(
48
+ decorated_methods=["fit", "predict", "_predict_proba", "decision_function", "score"]
49
+ )
50
+ class SVC(_sklearn_SVC, BaseSVC):
51
+ __doc__ = _sklearn_SVC.__doc__
52
+
53
+ if sklearn_check_version("1.2"):
54
+ _parameter_constraints: dict = {**_sklearn_SVC._parameter_constraints}
55
+
56
+ @_deprecate_positional_args
57
+ def __init__(
58
+ self,
59
+ *,
60
+ C=1.0,
61
+ kernel="rbf",
62
+ degree=3,
63
+ gamma="scale",
64
+ coef0=0.0,
65
+ shrinking=True,
66
+ probability=False,
67
+ tol=1e-3,
68
+ cache_size=200,
69
+ class_weight=None,
70
+ verbose=False,
71
+ max_iter=-1,
72
+ decision_function_shape="ovr",
73
+ break_ties=False,
74
+ random_state=None,
75
+ ):
76
+ super().__init__(
77
+ C=C,
78
+ kernel=kernel,
79
+ degree=degree,
80
+ gamma=gamma,
81
+ coef0=coef0,
82
+ shrinking=shrinking,
83
+ probability=probability,
84
+ tol=tol,
85
+ cache_size=cache_size,
86
+ class_weight=class_weight,
87
+ verbose=verbose,
88
+ max_iter=max_iter,
89
+ decision_function_shape=decision_function_shape,
90
+ break_ties=break_ties,
91
+ random_state=random_state,
92
+ )
93
+
94
+ def fit(self, X, y, sample_weight=None):
95
+ if sklearn_check_version("1.2"):
96
+ self._validate_params()
97
+ elif self.C <= 0:
98
+ # else if added to correct issues with
99
+ # sklearn tests:
100
+ # svm/tests/test_sparse.py::test_error
101
+ # svm/tests/test_svm.py::test_bad_input
102
+ # for sklearn versions < 1.2 (i.e. without
103
+ # validate_params parameter checking)
104
+ # Without this, a segmentation fault with
105
+ # Windows fatal exception: access violation
106
+ # occurs
107
+ raise ValueError("C <= 0")
108
+ dispatch(
109
+ self,
110
+ "fit",
111
+ {
112
+ "onedal": self.__class__._onedal_fit,
113
+ "sklearn": _sklearn_SVC.fit,
114
+ },
115
+ X,
116
+ y,
117
+ sample_weight=sample_weight,
118
+ )
119
+
120
+ return self
121
+
122
+ @wrap_output_data
123
+ def predict(self, X):
124
+ check_is_fitted(self)
125
+ return dispatch(
126
+ self,
127
+ "predict",
128
+ {
129
+ "onedal": self.__class__._onedal_predict,
130
+ "sklearn": _sklearn_SVC.predict,
131
+ },
132
+ X,
133
+ )
134
+
135
+ @wrap_output_data
136
+ def score(self, X, y, sample_weight=None):
137
+ check_is_fitted(self)
138
+ return dispatch(
139
+ self,
140
+ "score",
141
+ {
142
+ "onedal": self.__class__._onedal_score,
143
+ "sklearn": _sklearn_SVC.score,
144
+ },
145
+ X,
146
+ y,
147
+ sample_weight=sample_weight,
148
+ )
149
+
150
+ if sklearn_check_version("1.0"):
151
+
152
+ @available_if(_sklearn_SVC._check_proba)
153
+ def predict_proba(self, X):
154
+ """
155
+ Compute probabilities of possible outcomes for samples in X.
156
+
157
+ The model need to have probability information computed at training
158
+ time: fit with attribute `probability` set to True.
159
+
160
+ Parameters
161
+ ----------
162
+ X : array-like of shape (n_samples, n_features)
163
+ For kernel="precomputed", the expected shape of X is
164
+ (n_samples_test, n_samples_train).
165
+
166
+ Returns
167
+ -------
168
+ T : ndarray of shape (n_samples, n_classes)
169
+ Returns the probability of the sample for each class in
170
+ the model. The columns correspond to the classes in sorted
171
+ order, as they appear in the attribute :term:`classes_`.
172
+
173
+ Notes
174
+ -----
175
+ The probability model is created using cross validation, so
176
+ the results can be slightly different than those obtained by
177
+ predict. Also, it will produce meaningless results on very small
178
+ datasets.
179
+ """
180
+ check_is_fitted(self)
181
+ return self._predict_proba(X)
182
+
183
+ @available_if(_sklearn_SVC._check_proba)
184
+ def predict_log_proba(self, X):
185
+ """Compute log probabilities of possible outcomes for samples in X.
186
+
187
+ The model need to have probability information computed at training
188
+ time: fit with attribute `probability` set to True.
189
+
190
+ Parameters
191
+ ----------
192
+ X : array-like of shape (n_samples, n_features) or \
193
+ (n_samples_test, n_samples_train)
194
+ For kernel="precomputed", the expected shape of X is
195
+ (n_samples_test, n_samples_train).
196
+
197
+ Returns
198
+ -------
199
+ T : ndarray of shape (n_samples, n_classes)
200
+ Returns the log-probabilities of the sample for each class in
201
+ the model. The columns correspond to the classes in sorted
202
+ order, as they appear in the attribute :term:`classes_`.
203
+
204
+ Notes
205
+ -----
206
+ The probability model is created using cross validation, so
207
+ the results can be slightly different than those obtained by
208
+ predict. Also, it will produce meaningless results on very small
209
+ datasets.
210
+ """
211
+ xp, _ = get_namespace(X)
212
+
213
+ return xp.log(self.predict_proba(X))
214
+
215
+ else:
216
+
217
+ @property
218
+ def predict_proba(self):
219
+ self._check_proba()
220
+ check_is_fitted(self)
221
+ return self._predict_proba
222
+
223
+ def _predict_log_proba(self, X):
224
+ xp, _ = get_namespace(X)
225
+ return xp.log(self.predict_proba(X))
226
+
227
+ predict_proba.__doc__ = _sklearn_SVC.predict_proba.__doc__
228
+
229
+ @wrap_output_data
230
+ def _predict_proba(self, X):
231
+ sklearn_pred_proba = (
232
+ _sklearn_SVC.predict_proba
233
+ if sklearn_check_version("1.0")
234
+ else _sklearn_SVC._predict_proba
235
+ )
236
+
237
+ return dispatch(
238
+ self,
239
+ "predict_proba",
240
+ {
241
+ "onedal": self.__class__._onedal_predict_proba,
242
+ "sklearn": sklearn_pred_proba,
243
+ },
244
+ X,
245
+ )
246
+
247
+ @wrap_output_data
248
+ def decision_function(self, X):
249
+ check_is_fitted(self)
250
+ return dispatch(
251
+ self,
252
+ "decision_function",
253
+ {
254
+ "onedal": self.__class__._onedal_decision_function,
255
+ "sklearn": _sklearn_SVC.decision_function,
256
+ },
257
+ X,
258
+ )
259
+
260
+ decision_function.__doc__ = _sklearn_SVC.decision_function.__doc__
261
+
262
+ def _onedal_gpu_supported(self, method_name, *data):
263
+ class_name = self.__class__.__name__
264
+ patching_status = PatchingConditionsChain(
265
+ f"sklearn.svm.{class_name}.{method_name}"
266
+ )
267
+ if len(data) > 1:
268
+ self._class_count = len(np.unique(data[1]))
269
+ self._is_sparse = sp.issparse(data[0])
270
+ conditions = [
271
+ (
272
+ self.kernel in ["linear", "rbf"],
273
+ f'Kernel is "{self.kernel}" while '
274
+ '"linear" and "rbf" are only supported on GPU.',
275
+ ),
276
+ (self.class_weight is None, "Class weight is not supported on GPU."),
277
+ (not self._is_sparse, "Sparse input is not supported on GPU."),
278
+ (self._class_count == 2, "Multiclassification is not supported on GPU."),
279
+ ]
280
+ if method_name == "fit":
281
+ patching_status.and_conditions(conditions)
282
+ return patching_status
283
+ if method_name in ["predict", "predict_proba", "decision_function", "score"]:
284
+ conditions.append(
285
+ (hasattr(self, "_onedal_estimator"), "oneDAL model was not trained")
286
+ )
287
+ patching_status.and_conditions(conditions)
288
+ return patching_status
289
+ raise RuntimeError(f"Unknown method {method_name} in {class_name}")
290
+
291
+ def _get_sample_weight(self, X, y, sample_weight=None):
292
+ sample_weight = super()._get_sample_weight(X, y, sample_weight)
293
+ if sample_weight is None:
294
+ return sample_weight
295
+
296
+ if np.any(sample_weight <= 0) and len(np.unique(y[sample_weight > 0])) != len(
297
+ self.classes_
298
+ ):
299
+ raise ValueError(
300
+ "Invalid input - all samples with positive weights "
301
+ "belong to the same class"
302
+ if sklearn_check_version("1.2")
303
+ else "Invalid input - all samples with positive weights "
304
+ "have the same label."
305
+ )
306
+ return sample_weight
307
+
308
+ def _onedal_fit(self, X, y, sample_weight=None, queue=None):
309
+ X, _, weights = self._onedal_fit_checks(X, y, sample_weight)
310
+ onedal_params = {
311
+ "C": self.C,
312
+ "kernel": self.kernel,
313
+ "degree": self.degree,
314
+ "gamma": self._compute_gamma_sigma(X),
315
+ "coef0": self.coef0,
316
+ "tol": self.tol,
317
+ "shrinking": self.shrinking,
318
+ "cache_size": self.cache_size,
319
+ "max_iter": self.max_iter,
320
+ "class_weight": self.class_weight,
321
+ "break_ties": self.break_ties,
322
+ "decision_function_shape": self.decision_function_shape,
323
+ }
324
+
325
+ self._onedal_estimator = onedal_SVC(**onedal_params)
326
+ self._onedal_estimator.fit(X, y, weights, queue=queue)
327
+
328
+ if self.probability:
329
+ self._fit_proba(
330
+ X,
331
+ y,
332
+ sample_weight=sample_weight,
333
+ queue=queue,
334
+ )
335
+
336
+ self._save_attributes()
337
+
338
+ def _onedal_predict(self, X, queue=None):
339
+ if sklearn_check_version("1.0"):
340
+ X = validate_data(
341
+ self,
342
+ X,
343
+ dtype=[np.float64, np.float32],
344
+ force_all_finite=False,
345
+ ensure_2d=False,
346
+ accept_sparse="csr",
347
+ reset=False,
348
+ )
349
+ else:
350
+ X = check_array(
351
+ X,
352
+ dtype=[np.float64, np.float32],
353
+ force_all_finite=False,
354
+ accept_sparse="csr",
355
+ )
356
+ return self._onedal_estimator.predict(X, queue=queue)
357
+
358
+ def _onedal_predict_proba(self, X, queue=None):
359
+ if getattr(self, "clf_prob", None) is None:
360
+ raise NotFittedError(
361
+ "predict_proba is not available when fitted with probability=False"
362
+ )
363
+ from .._config import config_context, get_config
364
+
365
+ # We use stock metaestimators below, so the only way
366
+ # to pass a queue is using config_context.
367
+ cfg = get_config()
368
+ cfg["target_offload"] = queue
369
+ with config_context(**cfg):
370
+ return self.clf_prob.predict_proba(X)
371
+
372
+ def _onedal_decision_function(self, X, queue=None):
373
+ if sklearn_check_version("1.0"):
374
+ X = validate_data(
375
+ self,
376
+ X,
377
+ dtype=[np.float64, np.float32],
378
+ force_all_finite=False,
379
+ accept_sparse="csr",
380
+ reset=False,
381
+ )
382
+ else:
383
+ X = check_array(
384
+ X,
385
+ dtype=[np.float64, np.float32],
386
+ force_all_finite=False,
387
+ accept_sparse="csr",
388
+ )
389
+ return self._onedal_estimator.decision_function(X, queue=queue)
390
+
391
+ def _onedal_score(self, X, y, sample_weight=None, queue=None):
392
+ return accuracy_score(
393
+ y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
394
+ )
395
+
396
+ fit.__doc__ = _sklearn_SVC.fit.__doc__
397
+ predict.__doc__ = _sklearn_SVC.predict.__doc__
398
+ decision_function.__doc__ = _sklearn_SVC.decision_function.__doc__
399
+ score.__doc__ = _sklearn_SVC.score.__doc__
sklearnex/svm/svr.py ADDED
@@ -0,0 +1,167 @@
1
+ # ==============================================================================
2
+ # Copyright 2021 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
+ from sklearn.svm import SVR as _sklearn_SVR
19
+ from sklearn.utils.validation import _deprecate_positional_args, check_is_fitted
20
+
21
+ from daal4py.sklearn._n_jobs_support import control_n_jobs
22
+ from daal4py.sklearn._utils import sklearn_check_version
23
+ from onedal.svm import SVR as onedal_SVR
24
+
25
+ from .._device_offload import dispatch, wrap_output_data
26
+ from ._common import BaseSVR
27
+
28
+ if sklearn_check_version("1.6"):
29
+ from sklearn.utils.validation import validate_data
30
+ else:
31
+ validate_data = BaseSVR._validate_data
32
+
33
+
34
+ @control_n_jobs(decorated_methods=["fit", "predict", "score"])
35
+ class SVR(_sklearn_SVR, BaseSVR):
36
+ __doc__ = _sklearn_SVR.__doc__
37
+
38
+ if sklearn_check_version("1.2"):
39
+ _parameter_constraints: dict = {**_sklearn_SVR._parameter_constraints}
40
+
41
+ @_deprecate_positional_args
42
+ def __init__(
43
+ self,
44
+ *,
45
+ kernel="rbf",
46
+ degree=3,
47
+ gamma="scale",
48
+ coef0=0.0,
49
+ tol=1e-3,
50
+ C=1.0,
51
+ epsilon=0.1,
52
+ shrinking=True,
53
+ cache_size=200,
54
+ verbose=False,
55
+ max_iter=-1,
56
+ ):
57
+ super().__init__(
58
+ kernel=kernel,
59
+ degree=degree,
60
+ gamma=gamma,
61
+ coef0=coef0,
62
+ tol=tol,
63
+ C=C,
64
+ epsilon=epsilon,
65
+ shrinking=shrinking,
66
+ cache_size=cache_size,
67
+ verbose=verbose,
68
+ max_iter=max_iter,
69
+ )
70
+
71
+ def fit(self, X, y, sample_weight=None):
72
+ if sklearn_check_version("1.2"):
73
+ self._validate_params()
74
+ elif self.C <= 0:
75
+ # else if added to correct issues with
76
+ # sklearn tests:
77
+ # svm/tests/test_sparse.py::test_error
78
+ # svm/tests/test_svm.py::test_bad_input
79
+ # for sklearn versions < 1.2 (i.e. without
80
+ # validate_params parameter checking)
81
+ # Without this, a segmentation fault with
82
+ # Windows fatal exception: access violation
83
+ # occurs
84
+ raise ValueError("C <= 0")
85
+ dispatch(
86
+ self,
87
+ "fit",
88
+ {
89
+ "onedal": self.__class__._onedal_fit,
90
+ "sklearn": _sklearn_SVR.fit,
91
+ },
92
+ X,
93
+ y,
94
+ sample_weight=sample_weight,
95
+ )
96
+
97
+ return self
98
+
99
+ @wrap_output_data
100
+ def predict(self, X):
101
+ check_is_fitted(self)
102
+ return dispatch(
103
+ self,
104
+ "predict",
105
+ {
106
+ "onedal": self.__class__._onedal_predict,
107
+ "sklearn": _sklearn_SVR.predict,
108
+ },
109
+ X,
110
+ )
111
+
112
+ @wrap_output_data
113
+ def score(self, X, y, sample_weight=None):
114
+ check_is_fitted(self)
115
+ return dispatch(
116
+ self,
117
+ "score",
118
+ {
119
+ "onedal": self.__class__._onedal_score,
120
+ "sklearn": _sklearn_SVR.score,
121
+ },
122
+ X,
123
+ y,
124
+ sample_weight=sample_weight,
125
+ )
126
+
127
+ def _onedal_fit(self, X, y, sample_weight=None, queue=None):
128
+ X, _, sample_weight = self._onedal_fit_checks(X, y, sample_weight)
129
+ onedal_params = {
130
+ "C": self.C,
131
+ "epsilon": self.epsilon,
132
+ "kernel": self.kernel,
133
+ "degree": self.degree,
134
+ "gamma": self._compute_gamma_sigma(X),
135
+ "coef0": self.coef0,
136
+ "tol": self.tol,
137
+ "shrinking": self.shrinking,
138
+ "cache_size": self.cache_size,
139
+ "max_iter": self.max_iter,
140
+ }
141
+
142
+ self._onedal_estimator = onedal_SVR(**onedal_params)
143
+ self._onedal_estimator.fit(X, y, sample_weight, queue=queue)
144
+ self._save_attributes()
145
+
146
+ def _onedal_predict(self, X, queue=None):
147
+ if sklearn_check_version("1.0"):
148
+ X = validate_data(
149
+ self,
150
+ X,
151
+ dtype=[np.float64, np.float32],
152
+ force_all_finite=False,
153
+ accept_sparse="csr",
154
+ reset=False,
155
+ )
156
+ else:
157
+ X = check_array(
158
+ X,
159
+ dtype=[np.float64, np.float32],
160
+ force_all_finite=False,
161
+ accept_sparse="csr",
162
+ )
163
+ return self._onedal_estimator.predict(X, queue=queue)
164
+
165
+ fit.__doc__ = _sklearn_SVR.fit.__doc__
166
+ predict.__doc__ = _sklearn_SVR.predict.__doc__
167
+ score.__doc__ = _sklearn_SVR.score.__doc__
@@ -0,0 +1,93 @@
1
+ # ===============================================================================
2
+ # Copyright 2021 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
+ import pytest
19
+ from numpy.testing import assert_allclose
20
+
21
+ from onedal.tests.utils._dataframes_support import (
22
+ _as_numpy,
23
+ _convert_to_dataframe,
24
+ get_dataframes_and_queues,
25
+ )
26
+
27
+
28
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
29
+ def test_sklearnex_import_svc(dataframe, queue):
30
+ if queue and queue.sycl_device.is_gpu:
31
+ pytest.skip("SVC fit for the GPU sycl_queue is buggy.")
32
+ from sklearnex.svm import SVC
33
+
34
+ X = np.array([[-2, -1], [-1, -1], [-1, -2], [+1, +1], [+1, +2], [+2, +1]])
35
+ y = np.array([1, 1, 1, 2, 2, 2])
36
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
37
+ y = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
38
+ svc = SVC(kernel="linear").fit(X, y)
39
+ assert "daal4py" in svc.__module__ or "sklearnex" in svc.__module__
40
+ assert_allclose(_as_numpy(svc.dual_coef_), [[-0.25, 0.25]])
41
+ assert_allclose(_as_numpy(svc.support_), [1, 3])
42
+
43
+
44
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
45
+ def test_sklearnex_import_nusvc(dataframe, queue):
46
+ if queue and queue.sycl_device.is_gpu:
47
+ pytest.skip("NuSVC fit for the GPU sycl_queue is buggy.")
48
+ from sklearnex.svm import NuSVC
49
+
50
+ X = np.array([[-2, -1], [-1, -1], [-1, -2], [+1, +1], [+1, +2], [+2, +1]])
51
+ y = np.array([1, 1, 1, 2, 2, 2])
52
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
53
+ y = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
54
+ svc = NuSVC(kernel="linear").fit(X, y)
55
+ assert "daal4py" in svc.__module__ or "sklearnex" in svc.__module__
56
+ assert_allclose(
57
+ _as_numpy(svc.dual_coef_), [[-0.04761905, -0.0952381, 0.0952381, 0.04761905]]
58
+ )
59
+ assert_allclose(_as_numpy(svc.support_), [0, 1, 3, 4])
60
+
61
+
62
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
63
+ def test_sklearnex_import_svr(dataframe, queue):
64
+ if queue and queue.sycl_device.is_gpu:
65
+ pytest.skip("SVR fit for the GPU sycl_queue is buggy.")
66
+ from sklearnex.svm import SVR
67
+
68
+ X = np.array([[-2, -1], [-1, -1], [-1, -2], [+1, +1], [+1, +2], [+2, +1]])
69
+ y = np.array([1, 1, 1, 2, 2, 2])
70
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
71
+ y = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
72
+ svc = SVR(kernel="linear").fit(X, y)
73
+ assert "daal4py" in svc.__module__ or "sklearnex" in svc.__module__
74
+ assert_allclose(_as_numpy(svc.dual_coef_), [[-0.1, 0.1]])
75
+ assert_allclose(_as_numpy(svc.support_), [1, 3])
76
+
77
+
78
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
79
+ def test_sklearnex_import_nusvr(dataframe, queue):
80
+ if queue and queue.sycl_device.is_gpu:
81
+ pytest.skip("NuSVR fit for the GPU sycl_queue is buggy.")
82
+ from sklearnex.svm import NuSVR
83
+
84
+ X = np.array([[-2, -1], [-1, -1], [-1, -2], [+1, +1], [+1, +2], [+2, +1]])
85
+ y = np.array([1, 1, 1, 2, 2, 2])
86
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
87
+ y = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
88
+ svc = NuSVR(kernel="linear", nu=0.9).fit(X, y)
89
+ assert "daal4py" in svc.__module__ or "sklearnex" in svc.__module__
90
+ assert_allclose(
91
+ _as_numpy(svc.dual_coef_), [[-1.0, 0.611111, 1.0, -0.611111]], rtol=1e-3
92
+ )
93
+ assert_allclose(_as_numpy(svc.support_), [1, 2, 3, 5])