scikit-learn-intelex 2024.3.0__py311-none-manylinux1_x86_64.whl → 2024.5.0__py311-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.

Files changed (43) hide show
  1. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/METADATA +2 -2
  2. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/RECORD +43 -37
  3. sklearnex/_device_offload.py +39 -5
  4. sklearnex/basic_statistics/__init__.py +2 -1
  5. sklearnex/basic_statistics/incremental_basic_statistics.py +288 -0
  6. sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +384 -0
  7. sklearnex/covariance/incremental_covariance.py +217 -30
  8. sklearnex/covariance/tests/test_incremental_covariance.py +54 -17
  9. sklearnex/decomposition/pca.py +71 -19
  10. sklearnex/decomposition/tests/test_pca.py +2 -2
  11. sklearnex/dispatcher.py +33 -2
  12. sklearnex/ensemble/_forest.py +73 -79
  13. sklearnex/linear_model/__init__.py +5 -3
  14. sklearnex/linear_model/incremental_linear.py +387 -0
  15. sklearnex/linear_model/linear.py +275 -340
  16. sklearnex/linear_model/logistic_regression.py +50 -9
  17. sklearnex/linear_model/tests/test_incremental_linear.py +200 -0
  18. sklearnex/linear_model/tests/test_linear.py +40 -5
  19. sklearnex/neighbors/_lof.py +53 -36
  20. sklearnex/neighbors/common.py +4 -1
  21. sklearnex/neighbors/knn_classification.py +37 -122
  22. sklearnex/neighbors/knn_regression.py +10 -117
  23. sklearnex/neighbors/knn_unsupervised.py +6 -78
  24. sklearnex/neighbors/tests/test_neighbors.py +2 -2
  25. sklearnex/preview/cluster/k_means.py +5 -73
  26. sklearnex/preview/covariance/covariance.py +6 -5
  27. sklearnex/preview/covariance/tests/test_covariance.py +18 -5
  28. sklearnex/svm/_common.py +4 -7
  29. sklearnex/svm/nusvc.py +66 -50
  30. sklearnex/svm/nusvr.py +3 -49
  31. sklearnex/svm/svc.py +66 -51
  32. sklearnex/svm/svr.py +3 -49
  33. sklearnex/tests/_utils.py +34 -16
  34. sklearnex/tests/test_memory_usage.py +5 -1
  35. sklearnex/tests/test_n_jobs_support.py +12 -2
  36. sklearnex/tests/test_patching.py +87 -58
  37. sklearnex/tests/test_run_to_run_stability_tests.py +1 -1
  38. sklearnex/utils/__init__.py +2 -1
  39. sklearnex/utils/_namespace.py +97 -0
  40. sklearnex/utils/tests/test_finite.py +89 -0
  41. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/LICENSE.txt +0 -0
  42. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/WHEEL +0 -0
  43. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/top_level.txt +0 -0
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
- if sklearn_check_version("0.24"):
115
- self.clf_prob = CalibratedClassifierCV(
116
- clf_base, ensemble=False, cv=cv, method="sigmoid", n_jobs=n_jobs
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__
sklearnex/svm/nusvr.py CHANGED
@@ -63,39 +63,6 @@ class NuSVR(sklearn_NuSVR, BaseSVR):
63
63
  )
64
64
 
65
65
  def fit(self, X, y, sample_weight=None):
66
- """
67
- Fit the SVM model according to the given training data.
68
-
69
- Parameters
70
- ----------
71
- X : {array-like, sparse matrix} of shape (n_samples, n_features) \
72
- or (n_samples, n_samples)
73
- Training vectors, where `n_samples` is the number of samples
74
- and `n_features` is the number of features.
75
- For kernel="precomputed", the expected shape of X is
76
- (n_samples, n_samples).
77
-
78
- y : array-like of shape (n_samples,)
79
- Target values (class labels in classification, real numbers in
80
- regression).
81
-
82
- sample_weight : array-like of shape (n_samples,), default=None
83
- Per-sample weights. Rescale C per sample. Higher weights
84
- force the classifier to put more emphasis on these points.
85
-
86
- Returns
87
- -------
88
- self : object
89
- Fitted estimator.
90
-
91
- Notes
92
- -----
93
- If X and y are not C-ordered and contiguous arrays of np.float64 and
94
- X is not a scipy.sparse.csr_matrix, X and/or y may be copied.
95
-
96
- If X is a dense array, then the other methods will not support sparse
97
- matrices as input.
98
- """
99
66
  if sklearn_check_version("1.2"):
100
67
  self._validate_params()
101
68
  if sklearn_check_version("1.0"):
@@ -115,22 +82,6 @@ class NuSVR(sklearn_NuSVR, BaseSVR):
115
82
 
116
83
  @wrap_output_data
117
84
  def predict(self, X):
118
- """
119
- Perform regression on samples in X.
120
-
121
- For an one-class model, +1 (inlier) or -1 (outlier) is returned.
122
-
123
- Parameters
124
- ----------
125
- X : {array-like, sparse matrix} of shape (n_samples, n_features)
126
- For kernel="precomputed", the expected shape of X is
127
- (n_samples_test, n_samples_train).
128
-
129
- Returns
130
- -------
131
- y_pred : ndarray of shape (n_samples,)
132
- The predicted values.
133
- """
134
85
  if sklearn_check_version("1.0"):
135
86
  self._check_feature_names(X, reset=False)
136
87
  return dispatch(
@@ -163,3 +114,6 @@ class NuSVR(sklearn_NuSVR, BaseSVR):
163
114
 
164
115
  def _onedal_predict(self, X, queue=None):
165
116
  return self._onedal_estimator.predict(X, queue=queue)
117
+
118
+ fit.__doc__ = sklearn_NuSVR.fit.__doc__
119
+ predict.__doc__ = sklearn_NuSVR.predict.__doc__
sklearnex/svm/svc.py CHANGED
@@ -17,11 +17,13 @@
17
17
  import numpy as np
18
18
  from scipy import sparse as sp
19
19
  from sklearn.exceptions import NotFittedError
20
+ from sklearn.metrics import accuracy_score
20
21
  from sklearn.svm import SVC as sklearn_SVC
21
22
  from sklearn.utils.validation import _deprecate_positional_args
22
23
 
23
24
  from daal4py.sklearn._n_jobs_support import control_n_jobs
24
25
  from daal4py.sklearn._utils import sklearn_check_version
26
+ from sklearnex.utils import get_namespace
25
27
 
26
28
  from .._device_offload import dispatch, wrap_output_data
27
29
  from .._utils import PatchingConditionsChain
@@ -34,7 +36,7 @@ from onedal.svm import SVC as onedal_SVC
34
36
 
35
37
 
36
38
  @control_n_jobs(
37
- decorated_methods=["fit", "predict", "_predict_proba", "decision_function"]
39
+ decorated_methods=["fit", "predict", "_predict_proba", "decision_function", "score"]
38
40
  )
39
41
  class SVC(sklearn_SVC, BaseSVC):
40
42
  __doc__ = sklearn_SVC.__doc__
@@ -81,39 +83,6 @@ class SVC(sklearn_SVC, BaseSVC):
81
83
  )
82
84
 
83
85
  def fit(self, X, y, sample_weight=None):
84
- """
85
- Fit the SVM model according to the given training data.
86
-
87
- Parameters
88
- ----------
89
- X : {array-like, sparse matrix} of shape (n_samples, n_features) \
90
- or (n_samples, n_samples)
91
- Training vectors, where `n_samples` is the number of samples
92
- and `n_features` is the number of features.
93
- For kernel="precomputed", the expected shape of X is
94
- (n_samples, n_samples).
95
-
96
- y : array-like of shape (n_samples,)
97
- Target values (class labels in classification, real numbers in
98
- regression).
99
-
100
- sample_weight : array-like of shape (n_samples,), default=None
101
- Per-sample weights. Rescale C per sample. Higher weights
102
- force the classifier to put more emphasis on these points.
103
-
104
- Returns
105
- -------
106
- self : object
107
- Fitted estimator.
108
-
109
- Notes
110
- -----
111
- If X and y are not C-ordered and contiguous arrays of np.float64 and
112
- X is not a scipy.sparse.csr_matrix, X and/or y may be copied.
113
-
114
- If X is a dense array, then the other methods will not support sparse
115
- matrices as input.
116
- """
117
86
  if sklearn_check_version("1.2"):
118
87
  self._validate_params()
119
88
  if sklearn_check_version("1.0"):
@@ -133,22 +102,6 @@ class SVC(sklearn_SVC, BaseSVC):
133
102
 
134
103
  @wrap_output_data
135
104
  def predict(self, X):
136
- """
137
- Perform regression on samples in X.
138
-
139
- For an one-class model, +1 (inlier) or -1 (outlier) is returned.
140
-
141
- Parameters
142
- ----------
143
- X : {array-like, sparse matrix} of shape (n_samples, n_features)
144
- For kernel="precomputed", the expected shape of X is
145
- (n_samples_test, n_samples_train).
146
-
147
- Returns
148
- -------
149
- y_pred : ndarray of shape (n_samples,)
150
- The predicted values.
151
- """
152
105
  if sklearn_check_version("1.0"):
153
106
  self._check_feature_names(X, reset=False)
154
107
  return dispatch(
@@ -161,6 +114,22 @@ class SVC(sklearn_SVC, BaseSVC):
161
114
  X,
162
115
  )
163
116
 
117
+ @wrap_output_data
118
+ def score(self, X, y, sample_weight=None):
119
+ if sklearn_check_version("1.0"):
120
+ self._check_feature_names(X, reset=False)
121
+ return dispatch(
122
+ self,
123
+ "score",
124
+ {
125
+ "onedal": self.__class__._onedal_score,
126
+ "sklearn": sklearn_SVC.score,
127
+ },
128
+ X,
129
+ y,
130
+ sample_weight=sample_weight,
131
+ )
132
+
164
133
  if sklearn_check_version("1.0"):
165
134
 
166
135
  @available_if(sklearn_SVC._check_proba)
@@ -193,6 +162,38 @@ class SVC(sklearn_SVC, BaseSVC):
193
162
  """
194
163
  return self._predict_proba(X)
195
164
 
165
+ @available_if(sklearn_SVC._check_proba)
166
+ def predict_log_proba(self, X):
167
+ """Compute log probabilities of possible outcomes for samples in X.
168
+
169
+ The model need to have probability information computed at training
170
+ time: fit with attribute `probability` set to True.
171
+
172
+ Parameters
173
+ ----------
174
+ X : array-like of shape (n_samples, n_features) or \
175
+ (n_samples_test, n_samples_train)
176
+ For kernel="precomputed", the expected shape of X is
177
+ (n_samples_test, n_samples_train).
178
+
179
+ Returns
180
+ -------
181
+ T : ndarray of shape (n_samples, n_classes)
182
+ Returns the log-probabilities of the sample for each class in
183
+ the model. The columns correspond to the classes in sorted
184
+ order, as they appear in the attribute :term:`classes_`.
185
+
186
+ Notes
187
+ -----
188
+ The probability model is created using cross validation, so
189
+ the results can be slightly different than those obtained by
190
+ predict. Also, it will produce meaningless results on very small
191
+ datasets.
192
+ """
193
+ xp, _ = get_namespace(X)
194
+
195
+ return xp.log(self.predict_proba(X))
196
+
196
197
  else:
197
198
 
198
199
  @property
@@ -200,6 +201,10 @@ class SVC(sklearn_SVC, BaseSVC):
200
201
  self._check_proba()
201
202
  return self._predict_proba
202
203
 
204
+ def _predict_log_proba(self, X):
205
+ xp, _ = get_namespace(X)
206
+ return xp.log(self.predict_proba(X))
207
+
203
208
  predict_proba.__doc__ = sklearn_SVC.predict_proba.__doc__
204
209
 
205
210
  @wrap_output_data
@@ -257,7 +262,7 @@ class SVC(sklearn_SVC, BaseSVC):
257
262
  if method_name == "fit":
258
263
  patching_status.and_conditions(conditions)
259
264
  return patching_status
260
- if method_name in ["predict", "predict_proba", "decision_function"]:
265
+ if method_name in ["predict", "predict_proba", "decision_function", "score"]:
261
266
  conditions.append(
262
267
  (hasattr(self, "_onedal_estimator"), "oneDAL model was not trained")
263
268
  )
@@ -307,3 +312,13 @@ class SVC(sklearn_SVC, BaseSVC):
307
312
 
308
313
  def _onedal_decision_function(self, X, queue=None):
309
314
  return self._onedal_estimator.decision_function(X, queue=queue)
315
+
316
+ def _onedal_score(self, X, y, sample_weight=None, queue=None):
317
+ return accuracy_score(
318
+ y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
319
+ )
320
+
321
+ fit.__doc__ = sklearn_SVC.fit.__doc__
322
+ predict.__doc__ = sklearn_SVC.predict.__doc__
323
+ decision_function.__doc__ = sklearn_SVC.decision_function.__doc__
324
+ score.__doc__ = sklearn_SVC.score.__doc__
sklearnex/svm/svr.py CHANGED
@@ -63,39 +63,6 @@ class SVR(sklearn_SVR, BaseSVR):
63
63
  )
64
64
 
65
65
  def fit(self, X, y, sample_weight=None):
66
- """
67
- Fit the SVM model according to the given training data.
68
-
69
- Parameters
70
- ----------
71
- X : {array-like, sparse matrix} of shape (n_samples, n_features) \
72
- or (n_samples, n_samples)
73
- Training vectors, where `n_samples` is the number of samples
74
- and `n_features` is the number of features.
75
- For kernel="precomputed", the expected shape of X is
76
- (n_samples, n_samples).
77
-
78
- y : array-like of shape (n_samples,)
79
- Target values (class labels in classification, real numbers in
80
- regression).
81
-
82
- sample_weight : array-like of shape (n_samples,), default=None
83
- Per-sample weights. Rescale C per sample. Higher weights
84
- force the classifier to put more emphasis on these points.
85
-
86
- Returns
87
- -------
88
- self : object
89
- Fitted estimator.
90
-
91
- Notes
92
- -----
93
- If X and y are not C-ordered and contiguous arrays of np.float64 and
94
- X is not a scipy.sparse.csr_matrix, X and/or y may be copied.
95
-
96
- If X is a dense array, then the other methods will not support sparse
97
- matrices as input.
98
- """
99
66
  if sklearn_check_version("1.2"):
100
67
  self._validate_params()
101
68
  if sklearn_check_version("1.0"):
@@ -116,22 +83,6 @@ class SVR(sklearn_SVR, BaseSVR):
116
83
 
117
84
  @wrap_output_data
118
85
  def predict(self, X):
119
- """
120
- Perform regression on samples in X.
121
-
122
- For an one-class model, +1 (inlier) or -1 (outlier) is returned.
123
-
124
- Parameters
125
- ----------
126
- X : {array-like, sparse matrix} of shape (n_samples, n_features)
127
- For kernel="precomputed", the expected shape of X is
128
- (n_samples_test, n_samples_train).
129
-
130
- Returns
131
- -------
132
- y_pred : ndarray of shape (n_samples,)
133
- The predicted values.
134
- """
135
86
  if sklearn_check_version("1.0"):
136
87
  self._check_feature_names(X, reset=False)
137
88
  return dispatch(
@@ -164,3 +115,6 @@ class SVR(sklearn_SVR, BaseSVR):
164
115
 
165
116
  def _onedal_predict(self, X, queue=None):
166
117
  return self._onedal_estimator.predict(X, queue=queue)
118
+
119
+ fit.__doc__ = sklearn_SVR.fit.__doc__
120
+ predict.__doc__ = sklearn_SVR.predict.__doc__
sklearnex/tests/_utils.py CHANGED
@@ -17,6 +17,7 @@
17
17
  from inspect import isclass
18
18
 
19
19
  import numpy as np
20
+ from sklearn import clone
20
21
  from sklearn.base import (
21
22
  BaseEstimator,
22
23
  ClassifierMixin,
@@ -30,6 +31,7 @@ from sklearn.neighbors._base import KNeighborsMixin
30
31
 
31
32
  from onedal.tests.utils._dataframes_support import _convert_to_dataframe
32
33
  from sklearnex import get_patch_map, patch_sklearn, sklearn_is_patched, unpatch_sklearn
34
+ from sklearnex.linear_model import LogisticRegression
33
35
  from sklearnex.neighbors import (
34
36
  KNeighborsClassifier,
35
37
  KNeighborsRegressor,
@@ -86,26 +88,38 @@ mixin_map = [
86
88
  ]
87
89
 
88
90
 
89
- SPECIAL_INSTANCES = {
90
- str(i): i
91
- for i in [
92
- LocalOutlierFactor(novelty=True),
93
- SVC(probability=True),
94
- NuSVC(probability=True),
95
- KNeighborsClassifier(algorithm="brute"),
96
- KNeighborsRegressor(algorithm="brute"),
97
- NearestNeighbors(algorithm="brute"),
98
- ]
99
- }
91
+ class _sklearn_clone_dict(dict):
92
+
93
+ def __getitem__(self, key):
94
+ return clone(super().__getitem__(key))
95
+
96
+
97
+ SPECIAL_INSTANCES = _sklearn_clone_dict(
98
+ {
99
+ str(i): i
100
+ for i in [
101
+ LocalOutlierFactor(novelty=True),
102
+ SVC(probability=True),
103
+ NuSVC(probability=True),
104
+ KNeighborsClassifier(algorithm="brute"),
105
+ KNeighborsRegressor(algorithm="brute"),
106
+ NearestNeighbors(algorithm="brute"),
107
+ LogisticRegression(solver="newton-cg"),
108
+ ]
109
+ }
110
+ )
100
111
 
101
112
 
102
113
  def gen_models_info(algorithms):
103
114
  output = []
104
115
  for i in algorithms:
105
- # split handles SPECIAL_INSTANCES or custom inputs
106
- # custom sklearn inputs must be a dict of estimators
107
- # with keys set by the __str__ method
108
- est = PATCHED_MODELS[i.split("(")[0]]
116
+
117
+ if i in PATCHED_MODELS:
118
+ est = PATCHED_MODELS[i]
119
+ elif i in SPECIAL_INSTANCES:
120
+ est = SPECIAL_INSTANCES[i].__class__
121
+ else:
122
+ raise KeyError(f"Unrecognized sklearnex estimator: {i}")
109
123
 
110
124
  methods = set()
111
125
  candidates = set(
@@ -116,7 +130,11 @@ def gen_models_info(algorithms):
116
130
  if issubclass(est, mixin):
117
131
  methods |= candidates & set(method)
118
132
 
119
- output += [[i, j] for j in methods]
133
+ output += [[i, j] for j in methods] if methods else [[i, None]]
134
+
135
+ # In the case that no methods are available, set method to None.
136
+ # This will allow estimators without mixins to still test the fit
137
+ # method in various tests.
120
138
  return output
121
139
 
122
140
 
@@ -96,7 +96,11 @@ def remove_duplicated_estimators(estimators_list):
96
96
  return estimators_map.values()
97
97
 
98
98
 
99
- BANNED_ESTIMATORS = ("TSNE",) # too slow for using in testing on common data size
99
+ BANNED_ESTIMATORS = (
100
+ "IncrementalEmpiricalCovariance", # dataframe_f issues
101
+ "IncrementalLinearRegression", # TODO fix memory leak issue in private CI for data_shape = (1000, 100), data_transform_function = dataframe_f
102
+ "TSNE", # too slow for using in testing on common data size
103
+ )
100
104
  estimators = [
101
105
  TrainTestSplitEstimator,
102
106
  FiniteCheckEstimator,
@@ -22,6 +22,7 @@ import pytest
22
22
  from sklearn.base import BaseEstimator
23
23
  from sklearn.datasets import make_classification
24
24
 
25
+ from sklearnex.decomposition import PCA
25
26
  from sklearnex.dispatcher import get_patch_map
26
27
  from sklearnex.svm import SVC, NuSVC
27
28
 
@@ -73,6 +74,9 @@ def test_n_jobs_support(caplog, estimator_class, n_jobs):
73
74
  # by default, [Nu]SVC.predict_proba is restricted by @available_if decorator
74
75
  if estimator_class in [SVC, NuSVC]:
75
76
  estimator_kwargs["probability"] = True
77
+ # explicitly request oneDAL's PCA-Covariance algorithm
78
+ if estimator_class == PCA:
79
+ estimator_kwargs["svd_solver"] = "covariance_eigh"
76
80
  estimator_instance = estimator_class(**estimator_kwargs)
77
81
  # check `n_jobs` parameter doc entry
78
82
  check_estimator_doc(estimator_class)
@@ -84,10 +88,16 @@ def test_n_jobs_support(caplog, estimator_class, n_jobs):
84
88
  if method_name == "fit":
85
89
  continue
86
90
  method = getattr(estimator_instance, method_name)
87
- if len(inspect.signature(method).parameters) == 0:
91
+ argdict = inspect.signature(method).parameters
92
+ argnum = len(
93
+ [i for i in argdict if argdict[i].default == inspect.Parameter.empty]
94
+ )
95
+ if argnum == 0:
88
96
  check_method(method=method, caplog=caplog)
89
- else:
97
+ elif argnum == 1:
90
98
  check_method(X, method=method, caplog=caplog)
99
+ else:
100
+ check_method(X, Y, method=method, caplog=caplog)
91
101
  # check if correct methods were decorated
92
102
  check_methods_decoration(estimator_class)
93
103
  check_methods_decoration(estimator_instance)