diff --git a/CHANGES.md b/CHANGES.md index 89c7684..10e3c2d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,11 @@ -# version 0.12.2 +# version 0.12.3 - add prediction intervals to `LSBoostRegressor` (split conformal prediction, split conformal prediction with Kernel Density Estimation, and split conformal prediction bootstrap) see `examples/lsboost_regressor_pi.py` for examples - do not rescale columns with zero variance in `LSBoostRegressor` and `LSBoostClassifier` -- faster ridge regression for `LSBoostRegressor` +- faster ridge regression for `LSBoostRegressor` and `LSBoostClassifier` # version 0.9.0 diff --git a/mlsauce/lasso/_lasso.py b/mlsauce/lasso/_lasso.py index ef5d8f0..980c733 100644 --- a/mlsauce/lasso/_lasso.py +++ b/mlsauce/lasso/_lasso.py @@ -6,6 +6,7 @@ from sklearn.base import RegressorMixin from numpy.linalg import inv from . import _lassoc as mo +from ..utils import get_beta if platform.system() in ("Linux", "Darwin"): import jax.numpy as jnp @@ -83,7 +84,8 @@ def fit(self, X, y, **kwargs): Xy2 = 2 * Xy if self.backend == "cpu": - beta0, _, _, _ = np.linalg.lstsq(X_, centered_y, rcond=None) + #beta0, _, _, _ = np.linalg.lstsq(X_, centered_y, rcond=None) + beta0 = get_beta(X_, centered_y) if len(np.asarray(y).shape) == 1: res = mo.get_beta_1D( beta0=np.asarray(beta0), diff --git a/mlsauce/ridge/_ridge.py b/mlsauce/ridge/_ridge.py index df28b2a..ff122b0 100644 --- a/mlsauce/ridge/_ridge.py +++ b/mlsauce/ridge/_ridge.py @@ -5,6 +5,7 @@ from sklearn.base import RegressorMixin from numpy.linalg import inv from . import _ridgec as mo +from ..utils import get_beta if platform.system() in ("Linux", "Darwin"): import jax.numpy as jnp @@ -73,13 +74,15 @@ def fit(self, X, y, **kwargs): eye_term = np.sqrt(self.reg_lambda) * np.eye(X.shape[1]) X_ = np.row_stack((X_, eye_term)) y_ = np.concatenate((centered_y, np.zeros(X.shape[1]))) - self.beta, _, _, _ = np.linalg.lstsq(X_, y_, rcond=None) + #self.beta, _, _, _ = np.linalg.lstsq(X_, y_, rcond=None) + self.beta = get_beta(X_, y_) else: try: eye_term = np.sqrt(self.reg_lambda) * np.eye(X.shape[1]) X_ = np.row_stack((X_, eye_term)) y_ = np.row_stack((centered_y, np.zeros((eye_term.shape[0], centered_y.shape[1])))) - self.beta, _, _, _ = np.linalg.lstsq(X_, y_, rcond=None) + #self.beta, _, _, _ = np.linalg.lstsq(X_, y_, rcond=None) + self.beta = get_beta(X_, y_) except Exception: x = inv(mo.crossprod(X_) + self.reg_lambda * np.eye(X_.shape[1])) hat_matrix = mo.tcrossprod(x, X_) diff --git a/mlsauce/utils/__init__.py b/mlsauce/utils/__init__.py index 5eefd4d..49792bf 100644 --- a/mlsauce/utils/__init__.py +++ b/mlsauce/utils/__init__.py @@ -1,6 +1,7 @@ from .sampling.rowsubsampling import subsample from .misc.misc import merge_two_dicts, flatten, is_float, is_factor from .progress_bar import Progbar +from .get_beta import get_beta __all__ = [ "subsample", @@ -9,4 +10,5 @@ "is_float", "is_factor", "Progbar", + "get_beta" ] diff --git a/mlsauce/utils/get_beta.py b/mlsauce/utils/get_beta.py new file mode 100644 index 0000000..87b4cdc --- /dev/null +++ b/mlsauce/utils/get_beta.py @@ -0,0 +1,4 @@ +import numpy as np + +def get_beta(X, y): + return np.linalg.solve(X.T @ X, X.T @ y) diff --git a/setup.py b/setup.py index ca42363..dd23fbb 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ MAINTAINER_EMAIL = 'thierry.moudiki@gmail.com' LICENSE = 'BSD3 Clause Clear' -__version__ = '0.12.2' +__version__ = '0.12.3' VERSION = __version__