There are two posts related to this topic in R language including fixed regressor in a Lasso regression model and fixed effect Lasso logit model
I am writing a feature selection model using Lasso penalisation, my data has some seasonal dummy variables and they must not be dropped during the modelling phase. The easiest way to do so is the shrinkage applied to the coefficients on the linear model should avoid the coefficients of fixed features. Could you please help me write a custom Lasso function which does not shrink the coefficients of fixed features and is callable in sklearn Pipeline?**
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()), # Optional: Feature scaling
('lasso', LassoWithFixedFeatures(fixed_features_indices))
])
I have tried this,
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.linear_model import Lasso
import numpy as np
class LassoWithFixedFeatures(BaseEstimator, RegressorMixin):
def __init__(self, fixed_features_indices, alpha=1.0):
self.fixed_features_indices = fixed_features_indices
self.alpha = alpha
def fit(self, X, y):
# Fit Lasso model with regularized coefficients
self.lasso = Lasso(alpha=self.alpha)
self.lasso.fit(X, y)
# Calculate the penalty term for fixed features
penalty_fixed = self.alpha * np.abs(self.lasso.coef_[self.fixed_features_indices])
# Set coefficients of fixed features to their original values
fixed_features_coefs = np.linalg.lstsq(X[:, self.fixed_features_indices], y, rcond=None)[0]
self.coef_ = np.zeros(X.shape[1])
self.coef_[self.fixed_features_indices] = fixed_features_coefs
# Calculate the penalty term for non-fixed features
penalty_non_fixed = np.zeros(X.shape[1])
penalty_non_fixed[self.fixed_features_indices] = 0 # Exclude fixed features from penalty
penalty_non_fixed[~np.isin(np.arange(X.shape[1]), self.fixed_features_indices)] = self.alpha * np.abs(self.lasso.coef_)
# Update coefficients by considering penalties
self.coef_ += self.lasso.coef_ - penalty_non_fixed + penalty_fixed
return self
def predict(self, X):
return np.dot(X, self.coef_)
I was expecting lasso regresson with custom shrinkage but got ValueError:
All the 500 fits failed.
It is very likely that your model is misconfigured.
You can try to debug the error by setting error_score=’raise’.
Below are more details about the failures:
500 fits failed with the following error:
Traceback (most recent call last):
File “C:Usersaaditanaconda3Libsite-packagessklearnmodel_selection_validation.py”, line 732, in _fit_and_score
estimator.fit(X_train, y_train, **fit_params)
File “C:Usersaaditanaconda3Libsite-packagessklearnbase.py”, line 1151, in wrapper
return fit_method(estimator, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “C:Usersaaditanaconda3Libsite-packagessklearnpipeline.py”, line 420, in fit
self.final_estimator.fit(Xt, y, **fit_params_last_step)
File “C:UsersaaditAppDataLocalTempipykernel_205082286835759.py”, line 26, in fit
penalty_non_fixed[~np.isin(np.arange(X.shape1), self.fixed_features_indices)] = self.alpha * np.abs(self.lasso.coef)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: NumPy boolean array indexing assignment cannot assign 18 input values to the 11 output values where the mask is true