ML Foundations
Preventing Overfitting — Ridge, Lasso, and Elastic Net
Regularization constrains model complexity by adding penalty terms to the loss function, helping models generalize better to unseen data.
- Ridge (L2) — shrinks weights toward zero to prevent overfitting when all features are potentially useful
- Lasso (L1) — zeros out irrelevant features, performing automatic feature selection
- Elastic Net — combines both penalties for the best of Ridge and Lasso
"Simplicity is the ultimate sophistication." — Leonardo da Vinci
Prerequisites
Before diving into regularization, you should be familiar with:
- Linear Regression — understanding of OLS, residuals, and the normal equation
- Gradient Descent — optimization algorithms for minimizing loss functions
- Overfitting & Underfitting — understanding bias-variance tradeoff
- Cross-Validation — k-fold, leave-one-out, and why we split data
- Matrix Algebra — basic understanding of vectors, matrices, and norms
- Python & Scikit-learn — familiarity with fit/predict API
Learning Objectives
By the end of this tutorial, you will be able to:
- Explain why regularization is necessary and how it prevents overfitting
- Derive the Ridge (L2) and Lasso (L1) loss functions
- Understand the geometric intuition behind L1 and L2 constraint regions
- Implement Ridge, Lasso, and Elastic Net in Python using scikit-learn
- Choose the right regularization technique for a given problem
- Tune the hyperparameter α using cross-validation
- Interpret coefficient paths and understand regularization paths
- Apply regularization to high-dimensional datasets with many features
- Understand the connection between regularization and Bayesian priors
- Avoid common pitfalls when using regularized models
The Problem
L1 vs L2 Constraint Regions
| Aspect | Without Regularization | With Regularization |
|---|---|---|
| Fit | Fits training perfectly | Balances fit and simplicity |
| Weights | Large | Small |
| Variance | High (overfitting) | Lower (less overfitting) |
| Generalization | Poor | Better |
Ridge Regression (L2)
Coefficient Shrinkage Diagram
MathNote: Ridge and Multicollinearity
Lasso Regression (L1)
MathExample: Lasso Feature Selection
import numpy as np
from sklearn.linear_model import Lasso
# Simulate data with 10 features, only 3 are relevant
np.random.seed(42)
n_samples, n_features = 100, 10
X = np.random.randn(n_samples, n_features)
true_coefs = np.array([3, 0, 0, 2, 0, 0, 0, 0, 1, 0])
y = X @ true_coefs + np.random.randn(n_samples) * 0.5
# Fit Lasso
lasso = Lasso(alpha=0.1).fit(X, y)
print("True coefficients:", true_coefs)
print("Lasso coefficients:", np.round(lasso.coef_, 2))
print(f"Features selected: {np.sum(lasso.coef_ != 0)} / {n_features}")
# Output:
# True coefficients: [3 0 0 2 0 0 0 0 1 0]
# Lasso coefficients: [2.85 0. 0. 1.73 0. 0. 0. 0. 0.65 0. ]
# Features selected: 3 / 10
Elastic Net
Regularization Path
MathNote: L1 Ratio Explained
Key Formulas Reference
Essential Regularization Formulas
| Formula | Description |
|---|---|
L_Ridge = MSE + α Σwᵢ² | Ridge (L2) adds squared weight penalty |
| `L_Lasso = MSE + α Σ | wᵢ |
| `L_Elastic = MSE + α₁ Σ | wᵢ |
α = 0 → OLS solution | No regularization |
α → ∞ → w = 0 | Maximum regularization |
Python Implementation
MathExample: Complete Regularization Pipeline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
# Generate synthetic data
np.random.seed(42)
n_samples, n_features = 200, 50
X = np.random.randn(n_samples, n_features)
# Only 5 features are truly relevant
true_coefs = np.zeros(n_features)
true_coefs[:5] = [3, -2, 1.5, -1, 0.5]
y = X @ true_coefs + np.random.randn(n_samples) * 0.3
# Create pipelines with scaling
models = {
'Ridge': Pipeline([
('scaler', StandardScaler()),
('model', Ridge())
]),
'Lasso': Pipeline([
('scaler', StandardScaler()),
('model', Lasso())
]),
'ElasticNet': Pipeline([
('scaler', StandardScaler()),
('model', ElasticNet())
])
}
# Cross-validation with different alpha values
alphas = np.logspace(-3, 3, 50)
for name, model in models.items():
scores = []
for alpha in alphas:
if name == 'ElasticNet':
model.set_params(model__alpha=alpha)
else:
model.set_params(model__alpha=alpha)
cv_score = cross_val_score(model, X, y, cv=5, scoring='r2').mean()
scores.append(cv_score)
best_alpha = alphas[np.argmax(scores)]
print(f"{name}: Best alpha = {best_alpha:.4f}, Best R² = {max(scores):.4f}")
# Fit Lasso to see feature selection
lasso = Pipeline([
('scaler', StandardScaler()),
('model', Lasso(alpha=0.1))
])
lasso.fit(X, y)
print(f"Lasso selected {np.sum(lasso['model'].coef_ != 0)} features out of {n_features}")
print(f"True features selected: {np.sum(lasso['model'].coef_[:5] != 0)} / 5")
Choosing Alpha
| α Value | Effect |
|---|---|
| α = 0 | No regularization (original model) |
| α = ∞ | All weights = 0 (trivial model) |
Use cross-validation to find optimal α from candidates like: [0.001, 0.01, 0.1, 1, 10, 100]
MathExample: Alpha Tuning with GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
# Define parameter grid
param_grid = {'alpha': np.logspace(-4, 4, 50)}
# Grid search with cross-validation
grid_search = GridSearchCV(
Ridge(),
param_grid,
cv=5,
scoring='r2',
return_train_score=True
)
grid_search.fit(X, y)
print(f"Best alpha: {grid_search.best_params_['alpha']:.4f}")
print(f"Best R² score: {grid_search.best_score_:.4f}")
# Plot results
results = grid_search.cv_results_
plt.figure(figsize=(10, 6))
plt.semilogx(param_grid['alpha'], results['mean_test_score'], label='Test')
plt.semilogx(param_grid['alpha'], results['mean_train_score'], label='Train')
plt.xlabel('Alpha')
plt.ylabel('R² Score')
plt.title('Ridge: Alpha vs Performance')
plt.legend()
plt.grid(True)
plt.show()
Bayesian Interpretation
Real-World Applications
1. Genomics & Bioinformatics
With thousands of genes (features) but few patients, Lasso identifies which genes are associated with diseases like cancer. Ridge handles groups of correlated gene expressions.
2. Financial Modeling
Predicting stock returns with hundreds of economic indicators. Ridge prevents overfitting when indicators are correlated (GDP, employment, spending).
3. Real Estate Pricing
Housing price prediction with many features (square footage, bedrooms, location scores, school ratings). Elastic Net handles correlated features like square footage and room count.
4. Healthcare Analytics
Predicting patient outcomes from electronic health records with many correlated variables (blood pressure, heart rate, cholesterol levels).
5. Marketing & Customer Analytics
Predicting customer lifetime value from dozens of behavioral features. Lasso identifies the most predictive features for targeted campaigns.
6. Natural Language Processing
Text classification with thousands of word features (TF-IDF). Lasso performs automatic feature selection, keeping only relevant words.
Common Mistakes & How to Avoid Them
1. Forgetting to Scale Features
The penalty is scale-dependent! A feature with range [0, 1000] will be penalized differently than [0, 1]. Always use StandardScaler before regularization.
2. Not Tuning Alpha
Using default alpha values is a missed opportunity. Always perform cross-validation to find the optimal regularization strength for your data.
3. Using Lasso with Correlated Features
Lasso arbitrarily selects one feature from a group of correlated features and sets others to zero. Use Elastic Net instead when you have correlated features.
4. Regularizing the Intercept
The intercept should NOT be regularized (it represents the baseline prediction). Most sklearn implementations handle this correctly by default, but be aware.
5. Ignoring the Bias-Variance Tradeoff
Too much regularization → underfitting (high bias). Too little → overfitting (high variance). Find the sweet spot through cross-validation.
6. Not Using Pipeline
Always put scaler and regularizer in a Pipeline to prevent data leakage during cross-validation.
7. Expecting Feature Selection from Ridge
Ridge shrinks all coefficients but never sets them exactly to zero. If you need feature selection, use Lasso or Elastic Net.
Interview Questions
Q1: Why does regularization help prevent overfitting?
A: Regularization adds a penalty for large weights, constraining the model's complexity. This forces the model to learn simpler patterns that generalize better, reducing variance at the cost of slightly increased bias.
Q2: What's the difference between L1 and L2 regularization?
A: L1 (Lasso) adds the absolute value of weights as penalty, producing sparse solutions (some weights become exactly zero). L2 (Ridge) adds squared weights, shrinking all weights toward zero but never exactly. L1 performs feature selection; L2 is better when all features are relevant.
Q3: Why does Lasso produce sparse solutions while Ridge doesn't?
A: Geometrically, the L1 constraint region is a diamond with corners on the axes. The loss function contours are more likely to intersect at these corners, where some weights are exactly zero. The L2 constraint is a circle, so intersections rarely occur at axes.
Q4: When would you use Elastic Net over Lasso?
A: When you have correlated features. Lasso arbitrarily selects one feature from a correlated group, which can be unstable. Elastic Net groups correlated features together and selects or deselects them as a group.
Q5: How do you choose the optimal alpha?
A: Use cross-validation (k-fold or time series split). Try a range of alpha values on a logarithmic scale (e.g., 10^-4 to 10^4) and select the one that gives the best cross-validation score.
Q6: Should you regularize the intercept term?
A: No. The intercept represents the mean of the target variable when all features are zero. Regularizing it would shift the predictions inappropriately. Sklearn's regularized models exclude the intercept by default.
Q7: Can you use regularization with non-linear models?
A: Yes! Regularization applies to any model with weights. In neural networks, L2 regularization (weight decay) and dropout are common. In SVMs, the C parameter controls regularization strength.
Practice Exercise
Exercise: Regularization Comparison Study
Objective: Compare Ridge, Lasso, and Elastic Net on a high-dimensional dataset.
Dataset: Use sklearn.datasets.make_regression to create a dataset with:
- 500 samples
- 100 features
- Only 10 features with non-zero coefficients
- Noise level of 0.5
Tasks:
-
Generate and visualize the data
from sklearn.datasets import make_regression X, y, true_coef = make_regression( n_samples=500, n_features=100, n_informative=10, noise=0.5, coef=True, random_state=42 ) -
Fit all three models with alpha=1.0 and compare:
- Number of non-zero coefficients
- R² score on test set
- Which features were selected
-
Tune alpha for each model using GridSearchCV with 5-fold cross-validation
-
Plot regularization paths showing how coefficients change with alpha
-
Answer these questions:
- Which model recovered the most true features?
- Which model had the best test performance?
- Why did Lasso select different features than expected?
Bonus: Try adding 50 more noise-only features and see how each model handles the increased dimensionality.
Comparison Table
Regularization Techniques Comparison
| Feature | Ridge (L2) | Lasso (L1) | Elastic Net |
|---|---|---|---|
| Penalty | α Σwᵢ² | α Σ|wᵢ| | α₁ Σ|wᵢ| + α₂ Σwᵢ² |
| Feature Selection | No | Yes | Yes |
| Correlated Features | Handles well | Unstable | Handles well |
| Solution Type | Dense (all non-zero) | Sparse (many zeros) | Sparse |
| Computational Cost | Low (closed form) | Medium (iterative) | Medium (iterative) |
| Best Use Case | All features relevant | Many irrelevant features | Correlated + selection |
| Hyperparameters | α | α | α, l1_ratio |
Key Takeaways
Further Reading
Academic Papers
- "Regression Shrinkage and Selection via the Lasso" — Tibshirani (1996) — The original Lasso paper
- "Regularization and Variable Selection via the Elastic Net" — Zou & Hastie (2005) — Elastic Net introduction
- "Least Angle Regression" — Efron et al. (2004) — Efficient Lasso algorithm
Books
- "The Elements of Statistical Learning" — Hastie, Tibshirani, Friedman — Chapter 3 covers regularization extensively
- "An Introduction to Statistical Learning" — James, Witten, Hastie, Tibshirani — Chapter 6 for accessible overview
- "Pattern Recognition and Machine Learning" — Bishop — Bayesian perspective on regularization
Online Resources
What to Learn Next
-> Linear Regression Understand the foundational model where Ridge and Lasso regularization are applied.
-> Logistic Regression Extend regularization to classification problems with penalized logistic models.
-> Model Evaluation Learn cross-validation techniques for selecting the optimal regularization strength.
-> Model Selection Compare algorithms and tune hyperparameters including regularization parameters.
-> Training Deep Networks Apply dropout, weight decay, and batch normalization as regularization in deep learning.
-> SVM Explore maximum margin classifiers that implicitly use L2 regularization.