scikit-learn-intelex 2024.3.0__py312-none-win_amd64.whl → 2024.5.0__py312-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of scikit-learn-intelex might be problematic. Click here for more details.

Files changed (107) hide show
  1. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_device_offload.py +39 -5
  2. {scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/spmd → scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex}/basic_statistics/__init__.py +2 -1
  3. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +288 -0
  4. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +384 -0
  5. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +317 -0
  6. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +54 -17
  7. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/pca.py +71 -19
  8. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +2 -2
  9. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +33 -2
  10. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +73 -79
  11. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +5 -3
  12. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +387 -0
  13. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +316 -0
  14. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +50 -9
  15. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +200 -0
  16. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +40 -5
  17. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +53 -36
  18. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +4 -1
  19. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +37 -122
  20. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +10 -117
  21. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +6 -78
  22. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +2 -2
  23. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/k_means.py +5 -73
  24. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +6 -5
  25. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +18 -5
  26. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/_common.py +4 -7
  27. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +66 -50
  28. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +3 -49
  29. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +66 -51
  30. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +3 -49
  31. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/_utils.py +34 -16
  32. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +5 -1
  33. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +12 -2
  34. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_patching.py +87 -58
  35. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability_tests.py +1 -1
  36. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +2 -1
  37. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/utils/_namespace.py +97 -0
  38. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/utils/tests/test_finite.py +89 -0
  39. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/METADATA +227 -230
  40. scikit_learn_intelex-2024.5.0.dist-info/RECORD +104 -0
  41. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/WHEEL +1 -1
  42. scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +0 -130
  43. scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +0 -381
  44. scikit_learn_intelex-2024.3.0.dist-info/RECORD +0 -98
  45. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/__init__.py +0 -0
  46. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/__main__.py +0 -0
  47. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_config.py +0 -0
  48. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_utils.py +0 -0
  49. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +0 -0
  50. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
  51. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +0 -0
  52. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +0 -0
  53. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +0 -0
  54. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
  55. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/conftest.py +0 -0
  56. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
  57. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
  58. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +0 -0
  59. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
  60. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +0 -0
  61. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +0 -0
  62. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +0 -0
  63. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +0 -0
  64. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_path.py +0 -0
  65. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +0 -0
  66. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +0 -0
  67. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
  68. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +0 -0
  69. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
  70. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
  71. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +0 -0
  72. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +0 -0
  73. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
  74. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
  75. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +0 -0
  76. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
  77. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
  78. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +0 -0
  79. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/__init__.py +0 -0
  80. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/_common.py +0 -0
  81. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
  82. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
  83. {scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex → scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/spmd}/basic_statistics/__init__.py +0 -0
  84. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
  85. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
  86. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
  87. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
  88. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
  89. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
  90. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
  91. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
  92. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
  93. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +0 -0
  94. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
  95. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
  96. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
  97. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -0
  98. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -0
  99. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
  100. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
  101. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
  102. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +0 -0
  103. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +0 -0
  104. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
  105. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +0 -0
  106. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/LICENSE.txt +0 -0
  107. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,316 @@
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 logging
18
+ from abc import ABC
19
+
20
+ import numpy as np
21
+ from sklearn.exceptions import NotFittedError
22
+ from sklearn.linear_model import LinearRegression as sklearn_LinearRegression
23
+
24
+ from daal4py.sklearn._n_jobs_support import control_n_jobs
25
+ from daal4py.sklearn._utils import sklearn_check_version
26
+
27
+ from .._device_offload import dispatch, wrap_output_data
28
+ from .._utils import PatchingConditionsChain, get_patch_message, register_hyperparameters
29
+ from ..utils.validation import _assert_all_finite
30
+
31
+ if sklearn_check_version("1.0") and not sklearn_check_version("1.2"):
32
+ from sklearn.linear_model._base import _deprecate_normalize
33
+
34
+ from scipy.sparse import issparse
35
+ from sklearn.utils.validation import check_X_y
36
+
37
+ from onedal.common.hyperparameters import get_hyperparameters
38
+ from onedal.linear_model import LinearRegression as onedal_LinearRegression
39
+ from onedal.utils import _num_features, _num_samples
40
+
41
+
42
+ @register_hyperparameters({"fit": get_hyperparameters("linear_regression", "train")})
43
+ @control_n_jobs(decorated_methods=["fit", "predict"])
44
+ class LinearRegression(sklearn_LinearRegression):
45
+ __doc__ = sklearn_LinearRegression.__doc__
46
+
47
+ if sklearn_check_version("1.2"):
48
+ _parameter_constraints: dict = {**sklearn_LinearRegression._parameter_constraints}
49
+
50
+ def __init__(
51
+ self,
52
+ fit_intercept=True,
53
+ copy_X=True,
54
+ n_jobs=None,
55
+ positive=False,
56
+ ):
57
+ super().__init__(
58
+ fit_intercept=fit_intercept,
59
+ copy_X=copy_X,
60
+ n_jobs=n_jobs,
61
+ positive=positive,
62
+ )
63
+
64
+ else:
65
+
66
+ def __init__(
67
+ self,
68
+ fit_intercept=True,
69
+ normalize="deprecated" if sklearn_check_version("1.0") else False,
70
+ copy_X=True,
71
+ n_jobs=None,
72
+ positive=False,
73
+ ):
74
+ super().__init__(
75
+ fit_intercept=fit_intercept,
76
+ normalize=normalize,
77
+ copy_X=copy_X,
78
+ n_jobs=n_jobs,
79
+ positive=positive,
80
+ )
81
+
82
+ def fit(self, X, y, sample_weight=None):
83
+ if sklearn_check_version("1.0"):
84
+ self._check_feature_names(X, reset=True)
85
+ if sklearn_check_version("1.2"):
86
+ self._validate_params()
87
+
88
+ # It is necessary to properly update coefs for predict if we
89
+ # fallback to sklearn in dispatch
90
+ if hasattr(self, "_onedal_estimator"):
91
+ del self._onedal_estimator
92
+
93
+ dispatch(
94
+ self,
95
+ "fit",
96
+ {
97
+ "onedal": self.__class__._onedal_fit,
98
+ "sklearn": sklearn_LinearRegression.fit,
99
+ },
100
+ X,
101
+ y,
102
+ sample_weight,
103
+ )
104
+ return self
105
+
106
+ @wrap_output_data
107
+ def predict(self, X):
108
+
109
+ if not hasattr(self, "coef_"):
110
+ msg = (
111
+ "This %(name)s instance is not fitted yet. Call 'fit' with "
112
+ "appropriate arguments before using this estimator."
113
+ )
114
+ raise NotFittedError(msg % {"name": self.__class__.__name__})
115
+
116
+ return dispatch(
117
+ self,
118
+ "predict",
119
+ {
120
+ "onedal": self.__class__._onedal_predict,
121
+ "sklearn": sklearn_LinearRegression.predict,
122
+ },
123
+ X,
124
+ )
125
+
126
+ def _test_type_and_finiteness(self, X_in):
127
+ X = X_in if isinstance(X_in, np.ndarray) else np.asarray(X_in)
128
+
129
+ dtype = X.dtype
130
+ if "complex" in str(type(dtype)):
131
+ return False
132
+
133
+ try:
134
+ _assert_all_finite(X)
135
+ except BaseException:
136
+ return False
137
+ return True
138
+
139
+ def _onedal_fit_supported(self, method_name, *data):
140
+ assert method_name == "fit"
141
+ assert len(data) == 3
142
+ X, y, sample_weight = data
143
+
144
+ class_name = self.__class__.__name__
145
+ patching_status = PatchingConditionsChain(
146
+ f"sklearn.linear_model.{class_name}.fit"
147
+ )
148
+
149
+ normalize_is_set = (
150
+ hasattr(self, "normalize")
151
+ and self.normalize
152
+ and self.normalize != "deprecated"
153
+ )
154
+ positive_is_set = hasattr(self, "positive") and self.positive
155
+
156
+ n_samples = _num_samples(X)
157
+ n_features = _num_features(X, fallback_1d=True)
158
+
159
+ # Check if equations are well defined
160
+ is_underdetermined = n_samples < (n_features + int(self.fit_intercept))
161
+
162
+ dal_ready = patching_status.and_conditions(
163
+ [
164
+ (sample_weight is None, "Sample weight is not supported."),
165
+ (
166
+ not issparse(X) and not issparse(y),
167
+ "Sparse input is not supported.",
168
+ ),
169
+ (not normalize_is_set, "Normalization is not supported."),
170
+ (
171
+ not positive_is_set,
172
+ "Forced positive coefficients are not supported.",
173
+ ),
174
+ (
175
+ not is_underdetermined,
176
+ "The shape of X (fitting) does not satisfy oneDAL requirements:"
177
+ "Number of features + 1 >= number of samples.",
178
+ ),
179
+ ]
180
+ )
181
+ if not dal_ready:
182
+ return patching_status
183
+
184
+ if not patching_status.and_condition(
185
+ self._test_type_and_finiteness(X), "Input X is not supported."
186
+ ):
187
+ return patching_status
188
+
189
+ patching_status.and_condition(
190
+ self._test_type_and_finiteness(y), "Input y is not supported."
191
+ )
192
+
193
+ return patching_status
194
+
195
+ def _onedal_predict_supported(self, method_name, *data):
196
+ assert method_name == "predict"
197
+ assert len(data) == 1
198
+
199
+ class_name = self.__class__.__name__
200
+ patching_status = PatchingConditionsChain(
201
+ f"sklearn.linear_model.{class_name}.predict"
202
+ )
203
+
204
+ n_samples = _num_samples(*data)
205
+ model_is_sparse = issparse(self.coef_) or (
206
+ self.fit_intercept and issparse(self.intercept_)
207
+ )
208
+ dal_ready = patching_status.and_conditions(
209
+ [
210
+ (n_samples > 0, "Number of samples is less than 1."),
211
+ (not issparse(*data), "Sparse input is not supported."),
212
+ (not model_is_sparse, "Sparse coefficients are not supported."),
213
+ ]
214
+ )
215
+ if not dal_ready:
216
+ return patching_status
217
+
218
+ patching_status.and_condition(
219
+ self._test_type_and_finiteness(*data), "Input X is not supported."
220
+ )
221
+
222
+ return patching_status
223
+
224
+ def _onedal_supported(self, method_name, *data):
225
+ if method_name == "fit":
226
+ return self._onedal_fit_supported(method_name, *data)
227
+ if method_name == "predict":
228
+ return self._onedal_predict_supported(method_name, *data)
229
+ raise RuntimeError(f"Unknown method {method_name} in {self.__class__.__name__}")
230
+
231
+ _onedal_gpu_supported = _onedal_supported
232
+ _onedal_cpu_supported = _onedal_supported
233
+
234
+ def _initialize_onedal_estimator(self):
235
+ onedal_params = {"fit_intercept": self.fit_intercept, "copy_X": self.copy_X}
236
+ self._onedal_estimator = onedal_LinearRegression(**onedal_params)
237
+
238
+ def _onedal_fit(self, X, y, sample_weight, queue=None):
239
+ assert sample_weight is None
240
+
241
+ check_params = {
242
+ "X": X,
243
+ "y": y,
244
+ "dtype": [np.float64, np.float32],
245
+ "accept_sparse": ["csr", "csc", "coo"],
246
+ "y_numeric": True,
247
+ "multi_output": True,
248
+ "force_all_finite": False,
249
+ }
250
+ if sklearn_check_version("1.2"):
251
+ X, y = self._validate_data(**check_params)
252
+ else:
253
+ X, y = check_X_y(**check_params)
254
+
255
+ if sklearn_check_version("1.0") and not sklearn_check_version("1.2"):
256
+ self._normalize = _deprecate_normalize(
257
+ self.normalize,
258
+ default=False,
259
+ estimator_name=self.__class__.__name__,
260
+ )
261
+
262
+ self._initialize_onedal_estimator()
263
+ try:
264
+ self._onedal_estimator.fit(X, y, queue=queue)
265
+ self._save_attributes()
266
+
267
+ except RuntimeError:
268
+ logging.getLogger("sklearnex").info(
269
+ f"{self.__class__.__name__}.fit "
270
+ + get_patch_message("sklearn_after_onedal")
271
+ )
272
+
273
+ del self._onedal_estimator
274
+ super().fit(X, y)
275
+
276
+ def _onedal_predict(self, X, queue=None):
277
+ if sklearn_check_version("1.0"):
278
+ self._check_feature_names(X, reset=False)
279
+
280
+ X = self._validate_data(X, accept_sparse=False, reset=False)
281
+ if not hasattr(self, "_onedal_estimator"):
282
+ self._initialize_onedal_estimator()
283
+ self._onedal_estimator.coef_ = self.coef_
284
+ self._onedal_estimator.intercept_ = self.intercept_
285
+
286
+ res = self._onedal_estimator.predict(X, queue=queue)
287
+ return res
288
+
289
+ def get_coef_(self):
290
+ return self.coef_
291
+
292
+ def set_coef_(self, value):
293
+ self.__dict__["coef_"] = value
294
+ if hasattr(self, "_onedal_estimator"):
295
+ self._onedal_estimator.coef_ = value
296
+ del self._onedal_estimator._onedal_model
297
+
298
+ def get_intercept_(self):
299
+ return self.intercept_
300
+
301
+ def set_intercept_(self, value):
302
+ self.__dict__["intercept_"] = value
303
+ if hasattr(self, "_onedal_estimator"):
304
+ self._onedal_estimator.intercept_ = value
305
+ del self._onedal_estimator._onedal_model
306
+
307
+ def _save_attributes(self):
308
+ self.coef_ = property(self.get_coef_, self.set_coef_)
309
+ self.intercept_ = property(self.get_intercept_, self.set_intercept_)
310
+ self.n_features_in_ = self._onedal_estimator.n_features_in_
311
+ self._sparse = False
312
+ self.__dict__["coef_"] = self._onedal_estimator.coef_
313
+ self.__dict__["intercept_"] = self._onedal_estimator.intercept_
314
+
315
+ fit.__doc__ = sklearn_LinearRegression.fit.__doc__
316
+ predict.__doc__ = sklearn_LinearRegression.predict.__doc__
@@ -38,19 +38,27 @@ if daal_check_version((2024, "P", 1)):
38
38
  import numpy as np
39
39
  from scipy.sparse import issparse
40
40
  from sklearn.linear_model import LogisticRegression as sklearn_LogisticRegression
41
+ from sklearn.metrics import accuracy_score
42
+ from sklearn.utils.multiclass import type_of_target
41
43
  from sklearn.utils.validation import check_X_y
42
44
 
43
45
  from daal4py.sklearn._n_jobs_support import control_n_jobs
44
46
  from daal4py.sklearn._utils import sklearn_check_version
45
47
  from onedal.linear_model import LogisticRegression as onedal_LogisticRegression
46
- from onedal.utils import _num_features, _num_samples
48
+ from onedal.utils import _num_samples
47
49
 
48
50
  from .._device_offload import dispatch, wrap_output_data
49
51
  from .._utils import PatchingConditionsChain, get_patch_message
50
52
  from ..utils.validation import _assert_all_finite
51
53
 
52
54
  @control_n_jobs(
53
- decorated_methods=["fit", "predict", "predict_proba", "predict_log_proba"]
55
+ decorated_methods=[
56
+ "fit",
57
+ "predict",
58
+ "predict_proba",
59
+ "predict_log_proba",
60
+ "score",
61
+ ]
54
62
  )
55
63
  class LogisticRegression(sklearn_LogisticRegression, BaseLogisticRegression):
56
64
  __doc__ = sklearn_LogisticRegression.__doc__
@@ -72,9 +80,9 @@ if daal_check_version((2024, "P", 1)):
72
80
  intercept_scaling=1,
73
81
  class_weight=None,
74
82
  random_state=None,
75
- solver="lbfgs" if sklearn_check_version("0.22") else "liblinear",
83
+ solver="lbfgs",
76
84
  max_iter=100,
77
- multi_class="auto" if sklearn_check_version("0.22") else "ovr",
85
+ multi_class="auto",
78
86
  verbose=0,
79
87
  warm_start=False,
80
88
  n_jobs=None,
@@ -160,6 +168,27 @@ if daal_check_version((2024, "P", 1)):
160
168
  X,
161
169
  )
162
170
 
171
+ @wrap_output_data
172
+ def score(self, X, y, sample_weight=None):
173
+ if sklearn_check_version("1.0"):
174
+ self._check_feature_names(X, reset=False)
175
+ return dispatch(
176
+ self,
177
+ "score",
178
+ {
179
+ "onedal": self.__class__._onedal_score,
180
+ "sklearn": sklearn_LogisticRegression.score,
181
+ },
182
+ X,
183
+ y,
184
+ sample_weight=sample_weight,
185
+ )
186
+
187
+ def _onedal_score(self, X, y, sample_weight=None, queue=None):
188
+ return accuracy_score(
189
+ y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
190
+ )
191
+
163
192
  def _test_type_and_finiteness(self, X_in):
164
193
  X = np.asarray(X_in)
165
194
 
@@ -198,6 +227,10 @@ if daal_check_version((2024, "P", 1)):
198
227
  (self.warm_start == False, "Warm start is not supported."),
199
228
  (self.l1_ratio is None, "l1 ratio is not supported."),
200
229
  (sample_weight is None, "Sample weight is not supported."),
230
+ (
231
+ type_of_target(y) == "binary",
232
+ "Only binary classification is supported",
233
+ ),
201
234
  ]
202
235
  )
203
236
 
@@ -216,22 +249,29 @@ if daal_check_version((2024, "P", 1)):
216
249
  return patching_status
217
250
 
218
251
  def _onedal_gpu_predict_supported(self, method_name, *data):
219
- assert method_name in ["predict", "predict_proba", "predict_log_proba"]
220
- assert len(data) == 1
252
+ assert method_name in [
253
+ "predict",
254
+ "predict_proba",
255
+ "predict_log_proba",
256
+ "score",
257
+ ]
221
258
 
222
259
  class_name = self.__class__.__name__
223
260
  patching_status = PatchingConditionsChain(
224
261
  f"sklearn.linear_model.{class_name}.{method_name}"
225
262
  )
226
263
 
227
- n_samples = _num_samples(*data)
264
+ n_samples = _num_samples(data[0])
228
265
  model_is_sparse = issparse(self.coef_) or (
229
266
  self.fit_intercept and issparse(self.intercept_)
230
267
  )
231
268
  dal_ready = patching_status.and_conditions(
232
269
  [
233
270
  (n_samples > 0, "Number of samples is less than 1."),
234
- (not issparse(*data), "Sparse input is not supported."),
271
+ (
272
+ not any([issparse(i) for i in data]),
273
+ "Sparse input is not supported.",
274
+ ),
235
275
  (not model_is_sparse, "Sparse coefficients are not supported."),
236
276
  (
237
277
  hasattr(self, "_onedal_estimator"),
@@ -251,7 +291,7 @@ if daal_check_version((2024, "P", 1)):
251
291
  def _onedal_gpu_supported(self, method_name, *data):
252
292
  if method_name == "fit":
253
293
  return self._onedal_gpu_fit_supported(method_name, *data)
254
- if method_name in ["predict", "predict_proba", "predict_log_proba"]:
294
+ if method_name in ["predict", "predict_proba", "predict_log_proba", "score"]:
255
295
  return self._onedal_gpu_predict_supported(method_name, *data)
256
296
  raise RuntimeError(
257
297
  f"Unknown method {method_name} in {self.__class__.__name__}"
@@ -334,6 +374,7 @@ if daal_check_version((2024, "P", 1)):
334
374
  predict.__doc__ = sklearn_LogisticRegression.predict.__doc__
335
375
  predict_proba.__doc__ = sklearn_LogisticRegression.predict_proba.__doc__
336
376
  predict_log_proba.__doc__ = sklearn_LogisticRegression.predict_log_proba.__doc__
377
+ score.__doc__ = sklearn_LogisticRegression.score.__doc__
337
378
 
338
379
  else:
339
380
  LogisticRegression = LogisticRegression_daal4py
@@ -0,0 +1,200 @@
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
+ 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
+ from sklearnex.linear_model import IncrementalLinearRegression
27
+
28
+
29
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
30
+ @pytest.mark.parametrize("fit_intercept", [True, False])
31
+ @pytest.mark.parametrize("macro_block", [None, 1024])
32
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
33
+ def test_sklearnex_fit_on_gold_data(dataframe, queue, fit_intercept, macro_block, dtype):
34
+ X = np.array([[1], [2]])
35
+ X = X.astype(dtype=dtype)
36
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
37
+ y = np.array([1, 2])
38
+ y = y.astype(dtype=dtype)
39
+ y_df = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
40
+
41
+ inclin = IncrementalLinearRegression(fit_intercept=fit_intercept)
42
+ if macro_block is not None:
43
+ hparams = inclin.get_hyperparameters("fit")
44
+ hparams.cpu_macro_block = macro_block
45
+ hparams.gpu_macro_block = macro_block
46
+ inclin.fit(X_df, y_df)
47
+
48
+ y_pred = inclin.predict(X_df)
49
+
50
+ tol = 2e-6 if dtype == np.float32 else 1e-7
51
+ assert_allclose(inclin.coef_, [1], atol=tol)
52
+ if fit_intercept:
53
+ assert_allclose(inclin.intercept_, [0], atol=tol)
54
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
55
+
56
+
57
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
58
+ @pytest.mark.parametrize("fit_intercept", [True, False])
59
+ @pytest.mark.parametrize("macro_block", [None, 1024])
60
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
61
+ def test_sklearnex_partial_fit_on_gold_data(
62
+ dataframe, queue, fit_intercept, macro_block, dtype
63
+ ):
64
+ X = np.array([[1], [2], [3], [4]])
65
+ X = X.astype(dtype=dtype)
66
+ y = X + 3
67
+ y = y.astype(dtype=dtype)
68
+ X_split = np.array_split(X, 2)
69
+ y_split = np.array_split(y, 2)
70
+
71
+ inclin = IncrementalLinearRegression()
72
+ if macro_block is not None:
73
+ hparams = inclin.get_hyperparameters("fit")
74
+ hparams.cpu_macro_block = macro_block
75
+ hparams.gpu_macro_block = macro_block
76
+ for i in range(2):
77
+ X_split_df = _convert_to_dataframe(
78
+ X_split[i], sycl_queue=queue, target_df=dataframe
79
+ )
80
+ y_split_df = _convert_to_dataframe(
81
+ y_split[i], sycl_queue=queue, target_df=dataframe
82
+ )
83
+ inclin.partial_fit(X_split_df, y_split_df)
84
+
85
+ assert inclin.n_features_in_ == 1
86
+ tol = 2e-6 if dtype == np.float32 else 1e-7
87
+ assert_allclose(inclin.coef_, [[1]], atol=tol)
88
+ if fit_intercept:
89
+ assert_allclose(inclin.intercept_, 3, atol=tol)
90
+
91
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
92
+ y_pred = inclin.predict(X_df)
93
+
94
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
95
+
96
+
97
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
98
+ @pytest.mark.parametrize("fit_intercept", [True, False])
99
+ @pytest.mark.parametrize("macro_block", [None, 1024])
100
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
101
+ def test_sklearnex_partial_fit_multitarget_on_gold_data(
102
+ dataframe, queue, fit_intercept, macro_block, dtype
103
+ ):
104
+ X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
105
+ X = X.astype(dtype=dtype)
106
+ y = np.dot(X, [1, 2]) + 3
107
+ y = y.astype(dtype=dtype)
108
+ X_split = np.array_split(X, 2)
109
+ y_split = np.array_split(y, 2)
110
+
111
+ inclin = IncrementalLinearRegression()
112
+ if macro_block is not None:
113
+ hparams = inclin.get_hyperparameters("fit")
114
+ hparams.cpu_macro_block = macro_block
115
+ hparams.gpu_macro_block = macro_block
116
+ for i in range(2):
117
+ X_split_df = _convert_to_dataframe(
118
+ X_split[i], sycl_queue=queue, target_df=dataframe
119
+ )
120
+ y_split_df = _convert_to_dataframe(
121
+ y_split[i], sycl_queue=queue, target_df=dataframe
122
+ )
123
+ inclin.partial_fit(X_split_df, y_split_df)
124
+
125
+ assert inclin.n_features_in_ == 2
126
+ tol = 7e-6 if dtype == np.float32 else 1e-7
127
+ assert_allclose(inclin.coef_, [1.0, 2.0], atol=tol)
128
+ if fit_intercept:
129
+ assert_allclose(inclin.intercept_, 3.0, atol=tol)
130
+
131
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
132
+ y_pred = inclin.predict(X_df)
133
+
134
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
135
+
136
+
137
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
138
+ @pytest.mark.parametrize("fit_intercept", [True, False])
139
+ @pytest.mark.parametrize("num_samples", [100, 1000])
140
+ @pytest.mark.parametrize("num_features", [5, 10])
141
+ @pytest.mark.parametrize("num_targets", [1, 2])
142
+ @pytest.mark.parametrize("num_blocks", [1, 10])
143
+ @pytest.mark.parametrize("macro_block", [None, 1024])
144
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
145
+ def test_sklearnex_partial_fit_on_random_data(
146
+ dataframe,
147
+ queue,
148
+ fit_intercept,
149
+ num_samples,
150
+ num_features,
151
+ num_targets,
152
+ num_blocks,
153
+ macro_block,
154
+ dtype,
155
+ ):
156
+ seed = 42
157
+ gen = np.random.default_rng(seed)
158
+ intercept = gen.random(size=num_targets, dtype=dtype)
159
+ coef = gen.random(size=(num_targets, num_features), dtype=dtype).T
160
+
161
+ X = gen.random(size=(num_samples, num_features), dtype=dtype)
162
+ if fit_intercept:
163
+ y = X @ coef + intercept[np.newaxis, :]
164
+ else:
165
+ y = X @ coef
166
+
167
+ X_split = np.array_split(X, num_blocks)
168
+ y_split = np.array_split(y, num_blocks)
169
+
170
+ inclin = IncrementalLinearRegression(fit_intercept=fit_intercept)
171
+ if macro_block is not None:
172
+ hparams = inclin.get_hyperparameters("fit")
173
+ hparams.cpu_macro_block = macro_block
174
+ hparams.gpu_macro_block = macro_block
175
+ for i in range(num_blocks):
176
+ X_split_df = _convert_to_dataframe(
177
+ X_split[i], sycl_queue=queue, target_df=dataframe
178
+ )
179
+ y_split_df = _convert_to_dataframe(
180
+ y_split[i], sycl_queue=queue, target_df=dataframe
181
+ )
182
+ inclin.partial_fit(X_split_df, y_split_df)
183
+
184
+ tol = 1e-4 if dtype == np.float32 else 1e-7
185
+ assert_allclose(coef, inclin.coef_.T, atol=tol)
186
+
187
+ if fit_intercept:
188
+ assert_allclose(intercept, inclin.intercept_, atol=tol)
189
+
190
+ X_test = gen.random(size=(num_samples, num_features), dtype=dtype)
191
+ if fit_intercept:
192
+ expected_y_pred = X_test @ coef + intercept[np.newaxis, :]
193
+ else:
194
+ expected_y_pred = X_test @ coef
195
+
196
+ X_test_df = _convert_to_dataframe(X_test, sycl_queue=queue, target_df=dataframe)
197
+
198
+ y_pred = inclin.predict(X_test_df)
199
+
200
+ assert_allclose(expected_y_pred, _as_numpy(y_pred), atol=tol)