Regularisasi

Ridge dan Lasso sebagai tuas bias-variance untuk menahan overfitting.

Daftar isi

Model linear dengan banyak fitur bebas membangun koefisien yang besar untuk mengejar sampel data latih, dan kebebasan itulah yang membuka ruang overfitting. Regularisasi menahan kebebasan tersebut dengan menambahkan penalti atas besaran koefisien ke dalam fungsi biaya. Topik ini membahas Ridge dan Lasso sebagai dua penalti yang paling umum, peran hyperparameter alpha sebagai tuas antara dua komponen kesalahan, yaitu bias dan variance, serta praktik keduanya pada dataset diabetes. Setelah topik ini dipahami, pilihan alpha dapat dibaca dari perilaku koefisien dan skornya, bukan ditebak.

Penalti pada fungsi biaya#

Pelatihan regresi linear biasa meminimalkan MSE semata, sehingga model tidak tahu apakah koefisiennya besar atau kecil. Regularisasi menambahkan satu suku penalti yang menghukum koefisien yang besar:

L(w,b)=1n∑i=1n(w⊤xi+b−yi)2+λ∑j=1pwj2 L(w, b) = \frac{1}{n} \sum_{i=1}^{n} \left( w^\top x_i + b - y_i \right)^2 + \lambda \sum_{j=1}^{p} w_j^2

Suku kedua adalah penalti, dan λ\lambda menyatakan kekuatannya. Dengan penalti, model hanya membangun koefisien besar apabila pengurangan kesalahan pada data latih lebih besar dari hukuman yang harus dibayar. Akibatnya koefisien tersusutkan, model menjadi lebih halus, dan prediksinya lebih stabil pada data yang belum pernah dilihat. Model dengan penalti kuadrat seperti di atas disebut ridge regression, sedangkan varian dengan penalti nilai absolut disebut lasso, singkatan dari Least Absolute Shrinkage and Selection Operator.

scikit-learn menamai kekuatan penalti ini alpha, sehingga istilah λ\lambda pada rumus dan alpha pada kode merujuk pada hal yang sama. Satu hal yang tidak dikenai penalti adalah intercept bb, karena intercept hanya menggeser prediksi ke atas atau ke bawah dan tidak memperbesar kepekaan model terhadap fitur.

Ridge dan Lasso sebagai penalti L2 dan L1#

Ridge menggunakan penalti L2, yaitu jumlah kuadrat koefisien λ∑j=1pwj2\lambda \sum_{j=1}^{p} w_j^2. Penalti ini menyusutkan seluruh koefisien menuju nol secara proporsional, tetapi tidak pernah membuatnya persis nol. Untuk fitur yang saling berkorelasi, Ridge cenderung membagi peran di antara keduanya alih-alih memilih satu, sehingga koefisien yang dihasilkan lebih stabil dibandingkan regresi biasa pada data berkorelasi. Ridge dipilih apabila seluruh fitur diperkirakan tetap menyumbang dan tujuan utamanya adalah kestabilan prediksi.

Lasso menggunakan penalti L1, yaitu jumlah nilai absolut λ∑j=1p∣wj∣\lambda \sum_{j=1}^{p} |w_j|. Pada penalti L1, laju hukuman tidak mengecil ketika koefisien mengecil, sehingga koefisien yang sudah kecil tetap terdorong sampai persis nol. Bentuk absolut yang bersudut tajam di titik nol itulah yang membuat dorongan tersebut benar-benar berhenti di nol pada proses optimasi. Akibat praktisnya besar, karena Lasso mematikan fitur yang menurutnya tidak perlu. Lasso sekaligus menjadi alat seleksi fitur dan menghasilkan model yang lebih ramping untuk dibaca. Pada kelompok fitur yang saling berkorelasi, Lasso cenderung memilih satu wakil dan mematikan sisanya.

Alpha sebagai tuas bias-variance#

Nilai alpha mengatur ketegangan antara bias dan variance, dua komponen kesalahan model. Bias adalah kesalahan yang muncul karena model terlalu sederhana untuk menangkap pola, sedangkan variance adalah kepekaan berlebih terhadap sampel data latih yang kebetulan diterima. Alpha yang sangat kecil membuat penalti nyaris tidak berpengaruh, sehingga model kembali ke regresi biasa dengan variance tinggi dan risiko overfitting. Alpha yang sangat besar menghukum semua koefisien sampai hampir nol, sehingga model menjadi kaku dan berkinerja buruk bahkan pada data latih, yaitu kondisi underfitting. Titik yang menguntungkan terletak di antara keduanya, dan tidak ada teori yang menetapkan nilai alpha terbaik.

Titik itu bergeser mengikuti data, karena data dengan derau tebal biasanya menuntut penalti yang lebih tegas daripada data yang bersih. Karena itu alpha diperlakukan sebagai hyperparameter yang disetel dengan data, biasanya melalui cross-validation pada data latih, lalu kinerjanya dilaporkan sekali pada data uji. Pencariannya menjajarkan kandidat alpha dalam skala logaritmik, misalnya 0.01, 0.1, 1, 10, dan 100, karena pengaruhnya berlipat antar tingkat. Ketegangan yang diatur alpha inilah yang menjadi inti pertukaran bias-variance. Model yang terlalu bebas menghafal derau, sedangkan model yang terlalu kaku gagal menangkap pola yang sebenarnya.

Praktik Ridge dan Lasso pada dataset diabetes#

Penalti menghukum besaran koefisien, sehingga skala fitur menentukan fitur mana yang paling terhukum. Fitur bersatuan besar otomatis mendapat koefisien kecil dan sebaliknya, sehingga penalti tanpa penskalaan menghukum fitur secara tidak merata. Karena itu kedua model dilatih di dalam Pipeline dengan StandardScaler pada langkah pertama, dan statistik penskalaan hanya dihitung dari data latih sehingga tidak ada kebocoran informasi ke data uji.

python ridge-lasso.py
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Lasso, Ridge
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_diabetes(return_X_y=True)
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.2, random_state=42
)

for nama, Model in (("Ridge", Ridge), ("Lasso", Lasso)):
    for alpha in (0.01, 1.0, 100.0):
        model = make_pipeline(
            StandardScaler(), Model(alpha=alpha, max_iter=100000)
        )
        model.fit(X_latih, y_latih)
        r2 = model.score(X_uji, y_uji)
        koef = model.named_steps[nama.lower()].coef_
        if nama == "Ridge":
            ukuran = float(np.linalg.norm(koef))
            print(
                f"{nama} alpha={alpha:>6.2f}: "
                f"R2 data uji = {r2:.4f}, norm L2 koefisien = {ukuran:.4f}"
            )
        else:
            nol = int(np.sum(koef == 0.0))
            print(
                f"{nama} alpha={alpha:>6.2f}: "
                f"R2 data uji = {r2:.4f}, koefisien nol = {nol} dari {koef.size}"
            )
text Keluaran
Ridge alpha=  0.01: R2 data uji = 0.4526, norm L2 koefisien = 71.4836
Ridge alpha=  1.00: R2 data uji = 0.4541, norm L2 koefisien = 60.9088
Ridge alpha=100.00: R2 data uji = 0.4605, norm L2 koefisien = 34.2828
Lasso alpha=  0.01: R2 data uji = 0.4529, koefisien nol = 0 dari 10
Lasso alpha=  1.00: R2 data uji = 0.4669, koefisien nol = 1 dari 10
Lasso alpha=100.00: R2 data uji = -0.0120, koefisien nol = 10 dari 10

Hasil Ridge memperlihatkan penalti yang bekerja tanpa merusak kinerja. Norm L2 koefisien menyusut dari 71.4836 pada alpha 0.01 menjadi 34.2828 pada alpha 100.0, sementara R-squared data uji justru naik perlahan dari 0.4526 ke 0.4605. Penyusutan koefisien mengurangi kepekaan model terhadap derau data latih, dan pada dataset ini disiplin itu terbayar dengan skor data uji yang sedikit lebih baik.

Hasil Lasso memperlihatkan dua sisi tuas yang sama. Alpha 1.0 mematikan satu fitur dan menghasilkan R-squared 0.4669, yang terbaik di seluruh tabel, karena fitur yang dihilangkan memang tidak banyak menyumbang. Alpha 100.0 menjadi contoh underfitting yang utuh, yaitu seluruh sepuluh koefisien nol sehingga model hanya menebak rata-rata target dan R-squared turun ke -0.0120. Perbandingan ini juga menegaskan bahwa nilai alpha Ridge dan Lasso tidak dapat dibandingkan secara langsung, karena satuannya berbeda dan titik optimalnya masing-masing harus dicari dengan cross-validation.

Kesalahan umum#

  • Menyetel alpha dengan melihat skor data uji. Data uji yang ikut menentukan pilihan alpha membuat skornya terlalu optimis sebagai laporan akhir. Kesalahan ini muncul karena godaan mengulang pencarian sampai skor uji memuaskan. Perbaikannya, setel alpha melalui cross-validation pada data latih, lalu gunakan data uji sekali untuk pelaporan.
  • Membaca penyusutan koefisien sebagai ukuran pentingnya fitur. Penalti menyusutkan koefisien karena disiplin model, sehingga fitur penting pun bisa mengecil dan tidak boleh langsung disimpulkan tidak berperan. Perbaikannya, periksa perubahan skor apabila fitur itu dihilangkan, bukan hanya membaca besaran koefisiennya.
  • Membandingkan alpha antar Ridge dan Lasso seolah satu skala. Penalti kuadrat dan absolut mempunyai satuan berbeda, dan alpha 1.0 pada keduanya tidak berarti kekuatan penalti yang sama. Kekeliruannya dipicu oleh kedua model yang sama-sama menggunakan nama parameter alpha di scikit-learn. Perbaikannya, setel alpha masing-masing model secara terpisah melalui cross-validation.

Ringkasan#

  • Regularisasi menambahkan penalti atas besaran koefisien ke fungsi biaya, sehingga model hanya membangun koefisien besar apabila pengurangan kesalahan data latih melebihi hukumannya.
  • Ridge menggunakan penalti L2 yang menyusutkan koefisien menuju nol tanpa mencapainya, sedangkan Lasso menggunakan penalti L1 yang dapat membuat koefisien persis nol dan berfungsi sebagai seleksi fitur.
  • Alpha adalah tuas bias-variance, dengan nilai kecil yang nyaris tanpa penalti dan nilai besar yang berujung pada underfitting, dan nilainya disetel lewat cross-validation.
  • Penalti hanya bekerja adil pada fitur seskala, sehingga StandardScaler di dalam Pipeline menjadi langkah baku sebelum Ridge atau Lasso.

Referensi#