scikit-learn-intelex 2024.3.0__py312-none-manylinux1_x86_64.whl → 2024.4.0__py312-none-manylinux1_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.
- {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/METADATA +2 -2
- {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/RECORD +33 -30
- sklearnex/_device_offload.py +31 -4
- sklearnex/basic_statistics/__init__.py +2 -1
- sklearnex/basic_statistics/incremental_basic_statistics.py +288 -0
- sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +386 -0
- sklearnex/decomposition/pca.py +3 -6
- sklearnex/dispatcher.py +2 -2
- sklearnex/ensemble/_forest.py +68 -75
- sklearnex/linear_model/linear.py +275 -340
- sklearnex/linear_model/logistic_regression.py +50 -9
- sklearnex/linear_model/tests/test_linear.py +40 -5
- sklearnex/neighbors/_lof.py +53 -36
- sklearnex/neighbors/common.py +4 -1
- sklearnex/neighbors/knn_classification.py +37 -122
- sklearnex/neighbors/knn_regression.py +10 -117
- sklearnex/neighbors/knn_unsupervised.py +6 -78
- sklearnex/preview/cluster/k_means.py +5 -73
- sklearnex/preview/covariance/covariance.py +6 -5
- sklearnex/preview/covariance/tests/test_covariance.py +18 -5
- sklearnex/svm/_common.py +4 -7
- sklearnex/svm/nusvc.py +66 -50
- sklearnex/svm/nusvr.py +3 -49
- sklearnex/svm/svc.py +66 -51
- sklearnex/svm/svr.py +3 -49
- sklearnex/tests/_utils.py +14 -5
- sklearnex/tests/test_n_jobs_support.py +8 -2
- sklearnex/tests/test_patching.py +64 -54
- sklearnex/utils/__init__.py +2 -1
- sklearnex/utils/_namespace.py +97 -0
- {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/LICENSE.txt +0 -0
- {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/WHEEL +0 -0
- {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/top_level.txt +0 -0
|
@@ -14,125 +14,27 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
# ==============================================================================
|
|
16
16
|
|
|
17
|
-
from daal4py.sklearn._n_jobs_support import control_n_jobs
|
|
18
|
-
from daal4py.sklearn._utils import sklearn_check_version
|
|
19
|
-
|
|
20
|
-
if not sklearn_check_version("1.2"):
|
|
21
|
-
from sklearn.neighbors._base import _check_weights
|
|
22
|
-
|
|
23
17
|
from sklearn.neighbors._regression import (
|
|
24
18
|
KNeighborsRegressor as sklearn_KNeighborsRegressor,
|
|
25
19
|
)
|
|
26
20
|
from sklearn.neighbors._unsupervised import NearestNeighbors as sklearn_NearestNeighbors
|
|
27
21
|
from sklearn.utils.validation import _deprecate_positional_args, check_is_fitted
|
|
28
22
|
|
|
23
|
+
from daal4py.sklearn._n_jobs_support import control_n_jobs
|
|
24
|
+
from daal4py.sklearn._utils import sklearn_check_version
|
|
29
25
|
from onedal.neighbors import KNeighborsRegressor as onedal_KNeighborsRegressor
|
|
30
26
|
|
|
31
27
|
from .._device_offload import dispatch, wrap_output_data
|
|
32
28
|
from .common import KNeighborsDispatchingBase
|
|
33
29
|
|
|
34
|
-
if sklearn_check_version("0.24"):
|
|
35
|
-
|
|
36
|
-
class KNeighborsRegressor_(sklearn_KNeighborsRegressor):
|
|
37
|
-
if sklearn_check_version("1.2"):
|
|
38
|
-
_parameter_constraints: dict = {
|
|
39
|
-
**sklearn_KNeighborsRegressor._parameter_constraints
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@_deprecate_positional_args
|
|
43
|
-
def __init__(
|
|
44
|
-
self,
|
|
45
|
-
n_neighbors=5,
|
|
46
|
-
*,
|
|
47
|
-
weights="uniform",
|
|
48
|
-
algorithm="auto",
|
|
49
|
-
leaf_size=30,
|
|
50
|
-
p=2,
|
|
51
|
-
metric="minkowski",
|
|
52
|
-
metric_params=None,
|
|
53
|
-
n_jobs=None,
|
|
54
|
-
**kwargs,
|
|
55
|
-
):
|
|
56
|
-
super().__init__(
|
|
57
|
-
n_neighbors=n_neighbors,
|
|
58
|
-
algorithm=algorithm,
|
|
59
|
-
leaf_size=leaf_size,
|
|
60
|
-
metric=metric,
|
|
61
|
-
p=p,
|
|
62
|
-
metric_params=metric_params,
|
|
63
|
-
n_jobs=n_jobs,
|
|
64
|
-
**kwargs,
|
|
65
|
-
)
|
|
66
|
-
self.weights = (
|
|
67
|
-
weights if sklearn_check_version("1.0") else _check_weights(weights)
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
elif sklearn_check_version("0.22"):
|
|
71
|
-
from sklearn.neighbors._base import SupervisedFloatMixin as BaseSupervisedFloatMixin
|
|
72
|
-
|
|
73
|
-
class KNeighborsRegressor_(sklearn_KNeighborsRegressor, BaseSupervisedFloatMixin):
|
|
74
|
-
@_deprecate_positional_args
|
|
75
|
-
def __init__(
|
|
76
|
-
self,
|
|
77
|
-
n_neighbors=5,
|
|
78
|
-
*,
|
|
79
|
-
weights="uniform",
|
|
80
|
-
algorithm="auto",
|
|
81
|
-
leaf_size=30,
|
|
82
|
-
p=2,
|
|
83
|
-
metric="minkowski",
|
|
84
|
-
metric_params=None,
|
|
85
|
-
n_jobs=None,
|
|
86
|
-
**kwargs,
|
|
87
|
-
):
|
|
88
|
-
super().__init__(
|
|
89
|
-
n_neighbors=n_neighbors,
|
|
90
|
-
algorithm=algorithm,
|
|
91
|
-
leaf_size=leaf_size,
|
|
92
|
-
metric=metric,
|
|
93
|
-
p=p,
|
|
94
|
-
metric_params=metric_params,
|
|
95
|
-
n_jobs=n_jobs,
|
|
96
|
-
**kwargs,
|
|
97
|
-
)
|
|
98
|
-
self.weights = _check_weights(weights)
|
|
99
|
-
|
|
100
|
-
else:
|
|
101
|
-
from sklearn.neighbors.base import SupervisedFloatMixin as BaseSupervisedFloatMixin
|
|
102
|
-
|
|
103
|
-
class KNeighborsRegressor_(sklearn_KNeighborsRegressor, BaseSupervisedFloatMixin):
|
|
104
|
-
@_deprecate_positional_args
|
|
105
|
-
def __init__(
|
|
106
|
-
self,
|
|
107
|
-
n_neighbors=5,
|
|
108
|
-
*,
|
|
109
|
-
weights="uniform",
|
|
110
|
-
algorithm="auto",
|
|
111
|
-
leaf_size=30,
|
|
112
|
-
p=2,
|
|
113
|
-
metric="minkowski",
|
|
114
|
-
metric_params=None,
|
|
115
|
-
n_jobs=None,
|
|
116
|
-
**kwargs,
|
|
117
|
-
):
|
|
118
|
-
super().__init__(
|
|
119
|
-
n_neighbors=n_neighbors,
|
|
120
|
-
algorithm=algorithm,
|
|
121
|
-
leaf_size=leaf_size,
|
|
122
|
-
metric=metric,
|
|
123
|
-
p=p,
|
|
124
|
-
metric_params=metric_params,
|
|
125
|
-
n_jobs=n_jobs,
|
|
126
|
-
**kwargs,
|
|
127
|
-
)
|
|
128
|
-
self.weights = _check_weights(weights)
|
|
129
|
-
|
|
130
30
|
|
|
131
31
|
@control_n_jobs(decorated_methods=["fit", "predict", "kneighbors"])
|
|
132
|
-
class KNeighborsRegressor(
|
|
32
|
+
class KNeighborsRegressor(sklearn_KNeighborsRegressor, KNeighborsDispatchingBase):
|
|
133
33
|
__doc__ = sklearn_KNeighborsRegressor.__doc__
|
|
134
34
|
if sklearn_check_version("1.2"):
|
|
135
|
-
_parameter_constraints: dict = {
|
|
35
|
+
_parameter_constraints: dict = {
|
|
36
|
+
**sklearn_KNeighborsRegressor._parameter_constraints
|
|
37
|
+
}
|
|
136
38
|
|
|
137
39
|
if sklearn_check_version("1.0"):
|
|
138
40
|
|
|
@@ -188,7 +90,6 @@ class KNeighborsRegressor(KNeighborsRegressor_, KNeighborsDispatchingBase):
|
|
|
188
90
|
)
|
|
189
91
|
|
|
190
92
|
def fit(self, X, y):
|
|
191
|
-
self._fit_validation(X, y)
|
|
192
93
|
dispatch(
|
|
193
94
|
self,
|
|
194
95
|
"fit",
|
|
@@ -244,18 +145,10 @@ class KNeighborsRegressor(KNeighborsRegressor_, KNeighborsDispatchingBase):
|
|
|
244
145
|
or getattr(self, "_tree", 0) is None
|
|
245
146
|
and self._fit_method == "kd_tree"
|
|
246
147
|
):
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
if sklearn_check_version("0.22"):
|
|
252
|
-
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
253
|
-
self, X, radius, return_distance, sort_results
|
|
254
|
-
)
|
|
255
|
-
else:
|
|
256
|
-
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
257
|
-
self, X, radius, return_distance
|
|
258
|
-
)
|
|
148
|
+
sklearn_NearestNeighbors.fit(self, self._fit_X, getattr(self, "_y", None))
|
|
149
|
+
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
150
|
+
self, X, radius, return_distance, sort_results
|
|
151
|
+
)
|
|
259
152
|
|
|
260
153
|
return result
|
|
261
154
|
|
|
@@ -14,12 +14,6 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
# ===============================================================================
|
|
16
16
|
|
|
17
|
-
try:
|
|
18
|
-
from packaging.version import Version
|
|
19
|
-
except ImportError:
|
|
20
|
-
from distutils.version import LooseVersion as Version
|
|
21
|
-
|
|
22
|
-
from sklearn import __version__ as sklearn_version
|
|
23
17
|
from sklearn.neighbors._unsupervised import NearestNeighbors as sklearn_NearestNeighbors
|
|
24
18
|
from sklearn.utils.validation import _deprecate_positional_args, check_is_fitted
|
|
25
19
|
|
|
@@ -30,69 +24,12 @@ from onedal.neighbors import NearestNeighbors as onedal_NearestNeighbors
|
|
|
30
24
|
from .._device_offload import dispatch, wrap_output_data
|
|
31
25
|
from .common import KNeighborsDispatchingBase
|
|
32
26
|
|
|
33
|
-
if sklearn_check_version("0.22") and Version(sklearn_version) < Version("0.23"):
|
|
34
|
-
|
|
35
|
-
class NearestNeighbors_(sklearn_NearestNeighbors):
|
|
36
|
-
def __init__(
|
|
37
|
-
self,
|
|
38
|
-
n_neighbors=5,
|
|
39
|
-
radius=1.0,
|
|
40
|
-
algorithm="auto",
|
|
41
|
-
leaf_size=30,
|
|
42
|
-
metric="minkowski",
|
|
43
|
-
p=2,
|
|
44
|
-
metric_params=None,
|
|
45
|
-
n_jobs=None,
|
|
46
|
-
):
|
|
47
|
-
super().__init__(
|
|
48
|
-
n_neighbors=n_neighbors,
|
|
49
|
-
radius=radius,
|
|
50
|
-
algorithm=algorithm,
|
|
51
|
-
leaf_size=leaf_size,
|
|
52
|
-
metric=metric,
|
|
53
|
-
p=p,
|
|
54
|
-
metric_params=metric_params,
|
|
55
|
-
n_jobs=n_jobs,
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
else:
|
|
59
|
-
|
|
60
|
-
class NearestNeighbors_(sklearn_NearestNeighbors):
|
|
61
|
-
if sklearn_check_version("1.2"):
|
|
62
|
-
_parameter_constraints: dict = {
|
|
63
|
-
**sklearn_NearestNeighbors._parameter_constraints
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@_deprecate_positional_args
|
|
67
|
-
def __init__(
|
|
68
|
-
self,
|
|
69
|
-
*,
|
|
70
|
-
n_neighbors=5,
|
|
71
|
-
radius=1.0,
|
|
72
|
-
algorithm="auto",
|
|
73
|
-
leaf_size=30,
|
|
74
|
-
metric="minkowski",
|
|
75
|
-
p=2,
|
|
76
|
-
metric_params=None,
|
|
77
|
-
n_jobs=None,
|
|
78
|
-
):
|
|
79
|
-
super().__init__(
|
|
80
|
-
n_neighbors=n_neighbors,
|
|
81
|
-
radius=radius,
|
|
82
|
-
algorithm=algorithm,
|
|
83
|
-
leaf_size=leaf_size,
|
|
84
|
-
metric=metric,
|
|
85
|
-
p=p,
|
|
86
|
-
metric_params=metric_params,
|
|
87
|
-
n_jobs=n_jobs,
|
|
88
|
-
)
|
|
89
|
-
|
|
90
27
|
|
|
91
28
|
@control_n_jobs(decorated_methods=["fit", "kneighbors"])
|
|
92
|
-
class NearestNeighbors(
|
|
29
|
+
class NearestNeighbors(sklearn_NearestNeighbors, KNeighborsDispatchingBase):
|
|
93
30
|
__doc__ = sklearn_NearestNeighbors.__doc__
|
|
94
31
|
if sklearn_check_version("1.2"):
|
|
95
|
-
_parameter_constraints: dict = {**
|
|
32
|
+
_parameter_constraints: dict = {**sklearn_NearestNeighbors._parameter_constraints}
|
|
96
33
|
|
|
97
34
|
@_deprecate_positional_args
|
|
98
35
|
def __init__(
|
|
@@ -118,7 +55,6 @@ class NearestNeighbors(NearestNeighbors_, KNeighborsDispatchingBase):
|
|
|
118
55
|
)
|
|
119
56
|
|
|
120
57
|
def fit(self, X, y=None):
|
|
121
|
-
self._fit_validation(X, y)
|
|
122
58
|
dispatch(
|
|
123
59
|
self,
|
|
124
60
|
"fit",
|
|
@@ -159,18 +95,10 @@ class NearestNeighbors(NearestNeighbors_, KNeighborsDispatchingBase):
|
|
|
159
95
|
or getattr(self, "_tree", 0) is None
|
|
160
96
|
and self._fit_method == "kd_tree"
|
|
161
97
|
):
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if sklearn_check_version("0.22"):
|
|
167
|
-
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
168
|
-
self, X, radius, return_distance, sort_results
|
|
169
|
-
)
|
|
170
|
-
else:
|
|
171
|
-
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
172
|
-
self, X, radius, return_distance
|
|
173
|
-
)
|
|
98
|
+
sklearn_NearestNeighbors.fit(self, self._fit_X, getattr(self, "_y", None))
|
|
99
|
+
result = sklearn_NearestNeighbors.radius_neighbors(
|
|
100
|
+
self, X, radius, return_distance, sort_results
|
|
101
|
+
)
|
|
174
102
|
|
|
175
103
|
return result
|
|
176
104
|
|
|
@@ -172,24 +172,6 @@ if daal_check_version((2023, "P", 200)):
|
|
|
172
172
|
return patching_status
|
|
173
173
|
|
|
174
174
|
def fit(self, X, y=None, sample_weight=None):
|
|
175
|
-
"""Compute k-means clustering.
|
|
176
|
-
|
|
177
|
-
Parameters
|
|
178
|
-
----------
|
|
179
|
-
X : array-like or sparse matrix, shape=(n_samples, n_features)
|
|
180
|
-
Training instances to cluster. It must be noted that the data
|
|
181
|
-
will be converted to C ordering, which will cause a memory
|
|
182
|
-
copy if the given data is not C-contiguous.
|
|
183
|
-
|
|
184
|
-
y : Ignored
|
|
185
|
-
not used, present here for API consistency by convention.
|
|
186
|
-
|
|
187
|
-
sample_weight : array-like, shape (n_samples,), optional
|
|
188
|
-
The weights for each observation in X. If None, all observations
|
|
189
|
-
are assigned equal weight (default: None)
|
|
190
|
-
|
|
191
|
-
"""
|
|
192
|
-
|
|
193
175
|
if sklearn_check_version("1.0"):
|
|
194
176
|
self._check_feature_names(X, reset=True)
|
|
195
177
|
if sklearn_check_version("1.2"):
|
|
@@ -257,24 +239,6 @@ if daal_check_version((2023, "P", 200)):
|
|
|
257
239
|
|
|
258
240
|
@wrap_output_data
|
|
259
241
|
def predict(self, X):
|
|
260
|
-
"""Compute k-means clustering.
|
|
261
|
-
|
|
262
|
-
Parameters
|
|
263
|
-
----------
|
|
264
|
-
X : array-like or sparse matrix, shape=(n_samples, n_features)
|
|
265
|
-
Training instances to cluster. It must be noted that the data
|
|
266
|
-
will be converted to C ordering, which will cause a memory
|
|
267
|
-
copy if the given data is not C-contiguous.
|
|
268
|
-
|
|
269
|
-
y : Ignored
|
|
270
|
-
not used, present here for API consistency by convention.
|
|
271
|
-
|
|
272
|
-
sample_weight : array-like, shape (n_samples,), optional
|
|
273
|
-
The weights for each observation in X. If None, all observations
|
|
274
|
-
are assigned equal weight (default: None)
|
|
275
|
-
|
|
276
|
-
"""
|
|
277
|
-
|
|
278
242
|
if sklearn_check_version("1.0"):
|
|
279
243
|
self._check_feature_names(X, reset=True)
|
|
280
244
|
if sklearn_check_version("1.2"):
|
|
@@ -317,52 +281,20 @@ if daal_check_version((2023, "P", 200)):
|
|
|
317
281
|
|
|
318
282
|
@wrap_output_data
|
|
319
283
|
def fit_transform(self, X, y=None, sample_weight=None):
|
|
320
|
-
"""Compute clustering and transform X to cluster-distance space.
|
|
321
|
-
|
|
322
|
-
Equivalent to fit(X).transform(X), but more efficiently implemented.
|
|
323
|
-
|
|
324
|
-
Parameters
|
|
325
|
-
----------
|
|
326
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
327
|
-
New data to transform.
|
|
328
|
-
|
|
329
|
-
y : Ignored
|
|
330
|
-
Not used, present here for API consistency by convention.
|
|
331
|
-
|
|
332
|
-
sample_weight : array-like of shape (n_samples,), default=None
|
|
333
|
-
The weights for each observation in X. If None, all observations
|
|
334
|
-
are assigned equal weight.
|
|
335
|
-
|
|
336
|
-
Returns
|
|
337
|
-
-------
|
|
338
|
-
X_new : ndarray of shape (n_samples, n_clusters)
|
|
339
|
-
X transformed in the new space.
|
|
340
|
-
"""
|
|
341
284
|
return self.fit(X, sample_weight=sample_weight)._transform(X)
|
|
342
285
|
|
|
343
286
|
@wrap_output_data
|
|
344
287
|
def transform(self, X):
|
|
345
|
-
"""Transform X to a cluster-distance space.
|
|
346
|
-
|
|
347
|
-
In the new space, each dimension is the distance to the cluster
|
|
348
|
-
centers. Note that even if X is sparse, the array returned by
|
|
349
|
-
`transform` will typically be dense.
|
|
350
|
-
|
|
351
|
-
Parameters
|
|
352
|
-
----------
|
|
353
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
354
|
-
New data to transform.
|
|
355
|
-
|
|
356
|
-
Returns
|
|
357
|
-
-------
|
|
358
|
-
X_new : ndarray of shape (n_samples, n_clusters)
|
|
359
|
-
X transformed in the new space.
|
|
360
|
-
"""
|
|
361
288
|
check_is_fitted(self)
|
|
362
289
|
|
|
363
290
|
X = self._check_test_data(X)
|
|
364
291
|
return self._transform(X)
|
|
365
292
|
|
|
293
|
+
fit.__doc__ = sklearn_KMeans.fit.__doc__
|
|
294
|
+
predict.__doc__ = sklearn_KMeans.predict.__doc__
|
|
295
|
+
transform.__doc__ = sklearn_KMeans.transform.__doc__
|
|
296
|
+
fit_transform.__doc__ = sklearn_KMeans.fit_transform.__doc__
|
|
297
|
+
|
|
366
298
|
else:
|
|
367
299
|
from daal4py.sklearn.cluster import KMeans
|
|
368
300
|
|
|
@@ -22,7 +22,7 @@ from sklearn.covariance import EmpiricalCovariance as sklearn_EmpiricalCovarianc
|
|
|
22
22
|
from sklearn.utils import check_array
|
|
23
23
|
|
|
24
24
|
from daal4py.sklearn._n_jobs_support import control_n_jobs
|
|
25
|
-
from daal4py.sklearn._utils import sklearn_check_version
|
|
25
|
+
from daal4py.sklearn._utils import daal_check_version, sklearn_check_version
|
|
26
26
|
from onedal.common.hyperparameters import get_hyperparameters
|
|
27
27
|
from onedal.covariance import EmpiricalCovariance as onedal_EmpiricalCovariance
|
|
28
28
|
from sklearnex import config_context
|
|
@@ -44,6 +44,10 @@ class EmpiricalCovariance(sklearn_EmpiricalCovariance):
|
|
|
44
44
|
|
|
45
45
|
def _save_attributes(self):
|
|
46
46
|
assert hasattr(self, "_onedal_estimator")
|
|
47
|
+
if not daal_check_version((2024, "P", 400)) and self.assume_centered:
|
|
48
|
+
location = self._onedal_estimator.location_[None, :]
|
|
49
|
+
self._onedal_estimator.covariance_ += np.dot(location.T, location)
|
|
50
|
+
self._onedal_estimator.location_ = np.zeros_like(np.squeeze(location))
|
|
47
51
|
self._set_covariance(self._onedal_estimator.covariance_)
|
|
48
52
|
self.location_ = self._onedal_estimator.location_
|
|
49
53
|
|
|
@@ -58,6 +62,7 @@ class EmpiricalCovariance(sklearn_EmpiricalCovariance):
|
|
|
58
62
|
onedal_params = {
|
|
59
63
|
"method": "dense",
|
|
60
64
|
"bias": True,
|
|
65
|
+
"assume_centered": self.assume_centered,
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
self._onedal_estimator = self._onedal_covariance(**onedal_params)
|
|
@@ -73,10 +78,6 @@ class EmpiricalCovariance(sklearn_EmpiricalCovariance):
|
|
|
73
78
|
(X,) = data
|
|
74
79
|
patching_status.and_conditions(
|
|
75
80
|
[
|
|
76
|
-
(
|
|
77
|
-
self.assume_centered == False,
|
|
78
|
-
"assume_centered parameter is not supported on oneDAL side",
|
|
79
|
-
),
|
|
80
81
|
(not sp.issparse(X), "X is sparse. Sparse input is not supported."),
|
|
81
82
|
]
|
|
82
83
|
)
|
|
@@ -27,27 +27,40 @@ from onedal.tests.utils._dataframes_support import (
|
|
|
27
27
|
|
|
28
28
|
@pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
|
|
29
29
|
@pytest.mark.parametrize("macro_block", [None, 1024])
|
|
30
|
-
|
|
30
|
+
@pytest.mark.parametrize("assume_centered", [True, False])
|
|
31
|
+
def test_sklearnex_import_covariance(dataframe, queue, macro_block, assume_centered):
|
|
31
32
|
from sklearnex.preview.covariance import EmpiricalCovariance
|
|
32
33
|
|
|
33
34
|
X = np.array([[0, 1], [0, 1]])
|
|
35
|
+
|
|
34
36
|
X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
|
|
35
|
-
empcov = EmpiricalCovariance()
|
|
37
|
+
empcov = EmpiricalCovariance(assume_centered=assume_centered)
|
|
36
38
|
if daal_check_version((2024, "P", 0)) and macro_block is not None:
|
|
37
39
|
hparams = empcov.get_hyperparameters("fit")
|
|
38
40
|
hparams.cpu_macro_block = macro_block
|
|
39
41
|
result = empcov.fit(X)
|
|
42
|
+
|
|
40
43
|
expected_covariance = np.array([[0, 0], [0, 0]])
|
|
41
|
-
expected_means = np.array([0,
|
|
44
|
+
expected_means = np.array([0, 0])
|
|
45
|
+
|
|
46
|
+
if assume_centered:
|
|
47
|
+
expected_covariance = np.array([[0, 0], [0, 1]])
|
|
48
|
+
else:
|
|
49
|
+
expected_means = np.array([0, 1])
|
|
42
50
|
|
|
43
51
|
assert_allclose(expected_covariance, result.covariance_)
|
|
44
52
|
assert_allclose(expected_means, result.location_)
|
|
45
53
|
|
|
46
54
|
X = np.array([[1, 2], [3, 6]])
|
|
55
|
+
|
|
47
56
|
X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
|
|
48
57
|
result = empcov.fit(X)
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
|
|
59
|
+
if assume_centered:
|
|
60
|
+
expected_covariance = np.array([[5, 10], [10, 20]])
|
|
61
|
+
else:
|
|
62
|
+
expected_covariance = np.array([[1, 2], [2, 4]])
|
|
63
|
+
expected_means = np.array([2, 4])
|
|
51
64
|
|
|
52
65
|
assert_allclose(expected_covariance, result.covariance_)
|
|
53
66
|
assert_allclose(expected_means, result.location_)
|
sklearnex/svm/_common.py
CHANGED
|
@@ -76,7 +76,7 @@ class BaseSVM(ABC):
|
|
|
76
76
|
inference_methods = (
|
|
77
77
|
["predict"]
|
|
78
78
|
if class_name.endswith("R")
|
|
79
|
-
else ["predict", "predict_proba", "decision_function"]
|
|
79
|
+
else ["predict", "predict_proba", "decision_function", "score"]
|
|
80
80
|
)
|
|
81
81
|
if method_name in inference_methods:
|
|
82
82
|
patching_status.and_conditions(
|
|
@@ -111,12 +111,9 @@ class BaseSVC(BaseSVM):
|
|
|
111
111
|
cv = StratifiedKFold(
|
|
112
112
|
n_splits=n_splits, shuffle=True, random_state=self.random_state
|
|
113
113
|
)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
)
|
|
118
|
-
else:
|
|
119
|
-
self.clf_prob = CalibratedClassifierCV(clf_base, cv=cv, method="sigmoid")
|
|
114
|
+
self.clf_prob = CalibratedClassifierCV(
|
|
115
|
+
clf_base, ensemble=False, cv=cv, method="sigmoid", n_jobs=n_jobs
|
|
116
|
+
)
|
|
120
117
|
self.clf_prob.fit(X, y, sample_weight)
|
|
121
118
|
except ValueError:
|
|
122
119
|
clf_base = clf_base.fit(X, y, sample_weight)
|
sklearnex/svm/nusvc.py
CHANGED
|
@@ -14,12 +14,15 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
# ==============================================================================
|
|
16
16
|
|
|
17
|
+
import numpy as np
|
|
17
18
|
from sklearn.exceptions import NotFittedError
|
|
19
|
+
from sklearn.metrics import accuracy_score
|
|
18
20
|
from sklearn.svm import NuSVC as sklearn_NuSVC
|
|
19
21
|
from sklearn.utils.validation import _deprecate_positional_args
|
|
20
22
|
|
|
21
23
|
from daal4py.sklearn._n_jobs_support import control_n_jobs
|
|
22
24
|
from daal4py.sklearn._utils import sklearn_check_version
|
|
25
|
+
from sklearnex.utils import get_namespace
|
|
23
26
|
|
|
24
27
|
from .._device_offload import dispatch, wrap_output_data
|
|
25
28
|
from ._common import BaseSVC
|
|
@@ -31,7 +34,7 @@ from onedal.svm import NuSVC as onedal_NuSVC
|
|
|
31
34
|
|
|
32
35
|
|
|
33
36
|
@control_n_jobs(
|
|
34
|
-
decorated_methods=["fit", "predict", "_predict_proba", "decision_function"]
|
|
37
|
+
decorated_methods=["fit", "predict", "_predict_proba", "decision_function", "score"]
|
|
35
38
|
)
|
|
36
39
|
class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
37
40
|
__doc__ = sklearn_NuSVC.__doc__
|
|
@@ -78,39 +81,6 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
78
81
|
)
|
|
79
82
|
|
|
80
83
|
def fit(self, X, y, sample_weight=None):
|
|
81
|
-
"""
|
|
82
|
-
Fit the SVM model according to the given training data.
|
|
83
|
-
|
|
84
|
-
Parameters
|
|
85
|
-
----------
|
|
86
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features) \
|
|
87
|
-
or (n_samples, n_samples)
|
|
88
|
-
Training vectors, where `n_samples` is the number of samples
|
|
89
|
-
and `n_features` is the number of features.
|
|
90
|
-
For kernel="precomputed", the expected shape of X is
|
|
91
|
-
(n_samples, n_samples).
|
|
92
|
-
|
|
93
|
-
y : array-like of shape (n_samples,)
|
|
94
|
-
Target values (class labels in classification, real numbers in
|
|
95
|
-
regression).
|
|
96
|
-
|
|
97
|
-
sample_weight : array-like of shape (n_samples,), default=None
|
|
98
|
-
Per-sample weights. Rescale C per sample. Higher weights
|
|
99
|
-
force the classifier to put more emphasis on these points.
|
|
100
|
-
|
|
101
|
-
Returns
|
|
102
|
-
-------
|
|
103
|
-
self : object
|
|
104
|
-
Fitted estimator.
|
|
105
|
-
|
|
106
|
-
Notes
|
|
107
|
-
-----
|
|
108
|
-
If X and y are not C-ordered and contiguous arrays of np.float64 and
|
|
109
|
-
X is not a scipy.sparse.csr_matrix, X and/or y may be copied.
|
|
110
|
-
|
|
111
|
-
If X is a dense array, then the other methods will not support sparse
|
|
112
|
-
matrices as input.
|
|
113
|
-
"""
|
|
114
84
|
if sklearn_check_version("1.2"):
|
|
115
85
|
self._validate_params()
|
|
116
86
|
if sklearn_check_version("1.0"):
|
|
@@ -131,22 +101,6 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
131
101
|
|
|
132
102
|
@wrap_output_data
|
|
133
103
|
def predict(self, X):
|
|
134
|
-
"""
|
|
135
|
-
Perform regression on samples in X.
|
|
136
|
-
|
|
137
|
-
For an one-class model, +1 (inlier) or -1 (outlier) is returned.
|
|
138
|
-
|
|
139
|
-
Parameters
|
|
140
|
-
----------
|
|
141
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
142
|
-
For kernel="precomputed", the expected shape of X is
|
|
143
|
-
(n_samples_test, n_samples_train).
|
|
144
|
-
|
|
145
|
-
Returns
|
|
146
|
-
-------
|
|
147
|
-
y_pred : ndarray of shape (n_samples,)
|
|
148
|
-
The predicted values.
|
|
149
|
-
"""
|
|
150
104
|
if sklearn_check_version("1.0"):
|
|
151
105
|
self._check_feature_names(X, reset=False)
|
|
152
106
|
return dispatch(
|
|
@@ -159,6 +113,22 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
159
113
|
X,
|
|
160
114
|
)
|
|
161
115
|
|
|
116
|
+
@wrap_output_data
|
|
117
|
+
def score(self, X, y, sample_weight=None):
|
|
118
|
+
if sklearn_check_version("1.0"):
|
|
119
|
+
self._check_feature_names(X, reset=False)
|
|
120
|
+
return dispatch(
|
|
121
|
+
self,
|
|
122
|
+
"score",
|
|
123
|
+
{
|
|
124
|
+
"onedal": self.__class__._onedal_score,
|
|
125
|
+
"sklearn": sklearn_NuSVC.score,
|
|
126
|
+
},
|
|
127
|
+
X,
|
|
128
|
+
y,
|
|
129
|
+
sample_weight=sample_weight,
|
|
130
|
+
)
|
|
131
|
+
|
|
162
132
|
if sklearn_check_version("1.0"):
|
|
163
133
|
|
|
164
134
|
@available_if(sklearn_NuSVC._check_proba)
|
|
@@ -191,6 +161,38 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
191
161
|
"""
|
|
192
162
|
return self._predict_proba(X)
|
|
193
163
|
|
|
164
|
+
@available_if(sklearn_NuSVC._check_proba)
|
|
165
|
+
def predict_log_proba(self, X):
|
|
166
|
+
"""Compute log probabilities of possible outcomes for samples in X.
|
|
167
|
+
|
|
168
|
+
The model need to have probability information computed at training
|
|
169
|
+
time: fit with attribute `probability` set to True.
|
|
170
|
+
|
|
171
|
+
Parameters
|
|
172
|
+
----------
|
|
173
|
+
X : array-like of shape (n_samples, n_features) or \
|
|
174
|
+
(n_samples_test, n_samples_train)
|
|
175
|
+
For kernel="precomputed", the expected shape of X is
|
|
176
|
+
(n_samples_test, n_samples_train).
|
|
177
|
+
|
|
178
|
+
Returns
|
|
179
|
+
-------
|
|
180
|
+
T : ndarray of shape (n_samples, n_classes)
|
|
181
|
+
Returns the log-probabilities of the sample for each class in
|
|
182
|
+
the model. The columns correspond to the classes in sorted
|
|
183
|
+
order, as they appear in the attribute :term:`classes_`.
|
|
184
|
+
|
|
185
|
+
Notes
|
|
186
|
+
-----
|
|
187
|
+
The probability model is created using cross validation, so
|
|
188
|
+
the results can be slightly different than those obtained by
|
|
189
|
+
predict. Also, it will produce meaningless results on very small
|
|
190
|
+
datasets.
|
|
191
|
+
"""
|
|
192
|
+
xp, _ = get_namespace(X)
|
|
193
|
+
|
|
194
|
+
return xp.log(self.predict_proba(X))
|
|
195
|
+
|
|
194
196
|
else:
|
|
195
197
|
|
|
196
198
|
@property
|
|
@@ -198,6 +200,10 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
198
200
|
self._check_proba()
|
|
199
201
|
return self._predict_proba
|
|
200
202
|
|
|
203
|
+
def _predict_log_proba(self, X):
|
|
204
|
+
xp, _ = get_namespace(X)
|
|
205
|
+
return xp.log(self.predict_proba(X))
|
|
206
|
+
|
|
201
207
|
predict_proba.__doc__ = sklearn_NuSVC.predict_proba.__doc__
|
|
202
208
|
|
|
203
209
|
@wrap_output_data
|
|
@@ -278,3 +284,13 @@ class NuSVC(sklearn_NuSVC, BaseSVC):
|
|
|
278
284
|
|
|
279
285
|
def _onedal_decision_function(self, X, queue=None):
|
|
280
286
|
return self._onedal_estimator.decision_function(X, queue=queue)
|
|
287
|
+
|
|
288
|
+
def _onedal_score(self, X, y, sample_weight=None, queue=None):
|
|
289
|
+
return accuracy_score(
|
|
290
|
+
y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
fit.__doc__ = sklearn_NuSVC.fit.__doc__
|
|
294
|
+
predict.__doc__ = sklearn_NuSVC.predict.__doc__
|
|
295
|
+
decision_function.__doc__ = sklearn_NuSVC.decision_function.__doc__
|
|
296
|
+
score.__doc__ = sklearn_NuSVC.score.__doc__
|