Ridge Regression

"The Shrinker": Mencegah Ledakan Koefisien

1. Apa itu Ridge?

Ridge Regression (L2 Regularization) mirip dengan Lasso, tapi tujuannya sedikit beda. Lasso membuang fitur (jadi nol), sedangkan Ridge hanya mengecilkan fitur (mendekati nol tapi tidak pernah benar-benar nol).

Superpower Utama: Sangat ampuh mengatasi Multikolinearitas (ketika fitur-fitur saling berhubungan kuat, misal: "Luas Tanah" dan "Luas Bangunan"). Ridge mencegah koefisien menjadi sensitif/meledak nilainya.

2. Visualisasi: L1 vs L2

Perbedaan perlakuan terhadap fitur "Sampah" (Fitur yang kurang penting).

OLS (Biasa)
10
Koefisien

Nilai Besar (Rawan Overfit)

Lasso (L1)
0
Koefisien

Dihapus Total (Sparse)

Ridge (L2)
2
Koefisien

Dikecilkan (Dense)

3. Matematika: L2 Regularization

Ridge menambahkan penalti berupa Kuadrat Koefisien ($m^2$).

$$ Cost = \sum(y - \hat{y})^2 + \underbrace{\alpha \sum m^2}_{\text{Penalty L2}} $$
  • Mengapa dikuadratkan ($m^2$)?
    Karena kuadrat membuat hukuman menjadi sangat besar jika $m$ besar, tapi menjadi sangat kecil jika $m$ sudah kecil ($0.1^2 = 0.01$).
    Inilah kenapa Ridge malas menekan koefisien sampai benar-benar nol.

4. Simulasi Perhitungan Manual

Kasus: 1 Data (X=1, Y=1). $\alpha = 0.5$.

Cost = (1 - m)² + 0.5 * m²

Nilai m MSE $(1-m)^2$ Penalty $0.5m^2$ Total Cost
$m = 1.0$ 0 $0.5(1)^2 = 0.5$ 0.50
$m = 0.67$ (Optimal) $(0.33)^2 = 0.11$ $0.5(0.45) = 0.22$ 0.33 (WINNER! 🏆)
$m = 0.0$ (Terlalu Kecil) 1 0 1.00
Lihat! Ridge memilih $m=0.67$. Dia tidak memilih $m=0$ (karena error MSE-nya kegedean) dan tidak memilih $m=1$ (karena penaltinya kegedean). Dia cari jalan tengah.

5. Implementasi Python (Scikit-Learn)

import numpy as np
from sklearn.linear_model import Ridge, LinearRegression

# 1. Data Multikolinear (Fitur 1 & 2 kembar identik)
# Masalah: Regresi biasa akan bingung bagi tugas ke fitur kembar.
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4]])
y = np.array([2, 4, 6, 8]) # y = 1*x1 + 1*x2 (Idealnya)

# 2. Training
ols = LinearRegression().fit(X, y)
ridge = Ridge(alpha=1.0).fit(X, y)

# 3. Bandingkan Koefisien
print("OLS Coef:", ols.coef_) 
# OLS mungkin hasilnya aneh, misal: [2.0, 0.0] atau [100, -98]. Tidak stabil.

print("Ridge Coef:", ridge.coef_)
# Ridge akan membagi rata beban: [0.9x, 0.9x]. Lebih adil & stabil.

# 4. Prediksi
print("Prediksi:", ridge.predict([[5, 5]]))