Skip to content

Commit 11d676f

Browse files
Add _n_inner_iter attribute for Logistic Regression (#1756)
* Add inner_iteraions_count option * Add condition for onedal version * Change required onedal version to 2024.3 * Remove _n_iter_iter from save attributes * Add comment and test for logistic regression attributes presence
1 parent 51bbced commit 11d676f

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

onedal/linear_model/logistic_regression.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,14 @@ auto get_onedal_result_options(const py::dict& params) {
9595
else if (match.str() == "iterations_count") {
9696
onedal_options = onedal_options | result_options::iterations_count;
9797
}
98-
else
98+
#if ONEDAL_VERSION >= 20240300
99+
else if (match.str() == "inner_iterations_count") {
100+
onedal_options = onedal_options | result_options::inner_iterations_count;
101+
}
102+
#endif
103+
else {
99104
ONEDAL_PARAM_DISPATCH_THROW_INVALID_VALUE(result_option);
105+
}
100106
}
101107
}
102108
catch (std::regex_error&) {
@@ -207,6 +213,9 @@ void init_train_result(py::module_& m) {
207213
.DEF_ONEDAL_PY_PROPERTY(intercept, result_t)
208214
.DEF_ONEDAL_PY_PROPERTY(coefficients, result_t)
209215
.DEF_ONEDAL_PY_PROPERTY(iterations_count, result_t)
216+
#if ONEDAL_VERSION >= 20240300
217+
.DEF_ONEDAL_PY_PROPERTY(inner_iterations_count, result_t)
218+
#endif
210219
.DEF_ONEDAL_PY_PROPERTY(packed_coefficients, result_t)
211220
.DEF_ONEDAL_PY_PROPERTY(result_options, result_t);
212221
}

onedal/linear_model/logistic_regression.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import numpy as np
2121

22-
from daal4py.sklearn._utils import get_dtype, make2d
22+
from daal4py.sklearn._utils import daal_check_version, get_dtype, make2d
2323

2424
from ..common._base import BaseEstimator as onedal_BaseEstimator
2525
from ..common._estimator_checks import _check_is_fitted
@@ -54,7 +54,11 @@ def _get_onedal_params(self, dtype=np.float32):
5454
"max_iter": self.max_iter,
5555
"C": self.C,
5656
"optimizer": self.solver,
57-
"result_option": (intercept + "coefficients|iterations_count"),
57+
"result_option": (
58+
intercept
59+
+ "coefficients|iterations_count"
60+
+ ("|inner_iterations_count" if self.solver == "newton-cg" else "")
61+
),
5862
}
5963

6064
def _fit(self, X, y, module, queue):
@@ -85,6 +89,10 @@ def _fit(self, X, y, module, queue):
8589
self._onedal_model = result.model
8690
self.n_iter_ = np.array([result.iterations_count])
8791

92+
# _n_inner_iter is the total number of cg-solver iterations
93+
if daal_check_version((2024, "P", 300)) and self.solver == "newton-cg":
94+
self._n_inner_iter = result.inner_iterations_count
95+
8896
coeff = from_table(result.model.packed_coefficients)
8997
self.coef_, self.intercept_ = coeff[:, 1:], coeff[:, 0]
9098

onedal/linear_model/tests/test_logistic_regression.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ def test_breast_cancer(queue, dtype):
4040
y_pred = model.predict(X_test, queue=queue)
4141
assert accuracy_score(y_test, y_pred) > 0.95
4242

43+
assert hasattr(model, "n_iter_")
44+
assert hasattr(model, "coef_")
45+
assert hasattr(model, "intercept_")
46+
if daal_check_version((2024, "P", 300)):
47+
assert hasattr(model, "_n_inner_iter")
48+
4349
@pytest.mark.parametrize("queue", get_queues("gpu"))
4450
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
4551
def test_pickle(queue, dtype):

0 commit comments

Comments
 (0)