options(repos = c(CRAN = "https://cloud.r-project.org"))
install.packages("readr")
## 
## The downloaded binary packages are in
##  /var/folders/cr/bz9czqyj7ns63d_c7qrdg_l40000gn/T//RtmpdUFZPc/downloaded_packages

Penggunaan Shrinkage Methods dalam Sains Data

Dalam statistika dan pembelajaran mesin Shrinkage method merupakan metode yang digunakan untuk mengurangi kompleksitas model dengan tujuan menghindari overfitting. Metode ini bekerja dengan menyusutkan atau memperkecil nilai koefisien dari variabel prediktor dalam model, sehingga variabel yang kurang signifikan atau berpengaruh kecil akan memiliki koefisien yang lebih kecil atau bahkan nol. Hasil pemodelan akan menjadi lebih sederhana dan lebih robust terhadap noise atau data baru.

Ridge Regression (L2 Regularization)

Ridge regression digunakan sebagai langkah pertama untuk mengurangi overfitting. Ridge menambahkan penalti terhadap besar kuadrat dari koefisien regresi, sehingga fitur-fitur dengan pengaruh kecil akan memiliki koefisien yang lebih rendah. Dalam konteks ini, Ridge membantu mengurangi efek multikolinieritas (hubungan antar fitur) dan menghasilkan model dengan koefisien yang lebih stabil. Setelah mengaplikasikan Ridge, koefisien untuk beberapa fitur yang sebelumnya sangat besar, kini lebih terkontrol, sehingga model lebih robust.

Bagaimana kegunaannya?

  • Menduga koefisien regresi dengan peubah prediktornya saling berkorelasi (terdapat multikolinieritas tinggi)

  • Dapat digunakan dengan peubah prediktor yang banyak (Bahkan ketika 𝑝 >> n)

Catatan

Meskipun semua fitur dipertahankan, nilai koefisien yang lebih kecil menunjukkan bahwa fitur tersebut memiliki pengaruh yang lebih rendah terhadap variabel target. Ini dapat membantu dalam memahami mana fitur yang berkontribusi paling signifikan.

Lasso Regression (L1 Regularization)

Setelah menerapkan Ridge, Lasso Regression dapat digunakan dengan tujuan selain mengurangi koefisien kecil, juga memiliki kemampuan untuk secara otomatis memilih fitur-fitur yang paling penting dengan mengatur beberapa koefisien menjadi nol. Dalam dataset kami, yang terdiri dari banyak fitur, Lasso membantu menyederhanakan model dengan menghilangkan variabel yang tidak relevan. Hal ini membuat model lebih mudah diinterpretasikan dan lebih sederhana tanpa kehilangan akurasi.

Bagaimana kegunaannya?

  • Lasso berguna dalam seleksi peubah prediktor dalam model

  • Digunakan pada pemodelan regresi dengan peubah prediktor sangat banyak (bahkan ketika 𝑝 >> 𝑛 )

Catatan :

Pada model lasso memungkinkan tidak semua peubah prediktor dipilih (memiliki koefisien tidak sama dengan 0)

Penerapan Ridge dan Lasso dalam penyusutan peubah prediktor dengan data bangkitan

set.seed(123)
x <- cbind(1,matrix(rnorm(100*20,2,1),100,20))
e <- matrix(rnorm(100),100,1)
b <- c(1,rep(0:4,each=4))
y <- x%*%b+e

Kode di atas mensimulasikan regresi linier dengan 100 observasi dan 20 fitur, di mana predictor x terdiri dari matriks fitur dengan sebuah kolom konstanta untuk intersep. Vektor koefisien b terdiri dari sebuah intersep sebesar 1 dan blok-blok koefisien yang berulang dari 0 hingga 4. Nilai respons y dihitung sebagai hasil perkalian matriks antara x dan b, kemudian ditambahkan error acak e yang disimulasikan dari distribusi normal. Model ini mencerminkan regresi linier dengan noise yang dimaksudkan untuk mengeksplorasi efek koefisien dan noise pada prediksi.

dt.all <- data.frame(y,x[,-1])
str(dt.all)
## 'data.frame':    100 obs. of  21 variables:
##  $ y  : num  71.6 64.3 64.7 100.1 90.3 ...
##  $ X1 : num  1.44 1.77 3.56 2.07 2.13 ...
##  $ X2 : num  1.29 2.26 1.75 1.65 1.05 ...
##  $ X3 : num  4.2 3.31 1.73 2.54 1.59 ...
##  $ X4 : num  1.285 1.247 1.061 0.947 1.563 ...
##  $ X5 : num  1.926 0.831 1.365 1.971 2.671 ...
##  $ X6 : num  1.398 1.006 3.027 2.751 0.491 ...
##  $ X7 : num  3.074 1.973 1.967 0.484 2.79 ...
##  $ X8 : num  1.272 0.46 1.307 2.119 0.635 ...
##  $ X9 : num  2.36 1.34 2.86 3.15 2.28 ...
##  $ X10: num  0.986 1.209 2.3 3.639 3.085 ...
##  $ X11: num  1.004 0.96 1.982 1.868 -0.549 ...
##  $ X12: num  2.916 2.801 1.063 0.599 2.16 ...
##  $ X13: num  2.62 1.24 2.85 1.25 2.63 ...
##  $ X14: num  1.25 1.678 0.852 2.354 2.425 ...
##  $ X15: num  0.914 1.335 2.715 1.568 2.228 ...
##  $ X16: num  1.18 1.69 1.1 2.63 3.12 ...
##  $ X17: num  1.71 2.66 1.55 1.41 0.29 ...
##  $ X18: num  1.81 1.53 -1.05 3.87 3.79 ...
##  $ X19: num  0.711 1.345 1.943 3.257 3.587 ...
##  $ X20: num  3.54 1.54 1.97 3.64 1.67 ...
#regresi linier
mod1 <- lm(y~.,data=dt.all)
coef(mod1)
##  (Intercept)           X1           X2           X3           X4           X5 
##  1.199813532 -0.073189937 -0.071293234  0.176350703 -0.006345167  1.015471670 
##           X6           X7           X8           X9          X10          X11 
##  0.999708429  1.019633372  0.885459998  1.988429428  2.019416432  2.158248869 
##          X12          X13          X14          X15          X16          X17 
##  2.013082122  2.867064930  3.029382418  3.046901211  2.970311314  3.954652929 
##          X18          X19          X20 
##  3.951884182  4.035364936  3.853178398

Hasil pemodelan menggunakan regresi linear pada data bangkitan diatas menunjukkan bagaimana setiap variabel prediktor (X1 hingga X20) mempengaruhi variabel target y. Berikut adalah interpretasinya:

Berdasarkan hasil diatas kita akan coba gunakan metode ridge lasso untuk mendapatkan penyusutan dari variabel yang digunakan

# 
library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-8
#regresi ridge
mod2 <- cv.glmnet(x[,-1],y,alpha=0) #pemilihan lambda dgn cv untuk ridge
mod2
## 
## Call:  cv.glmnet(x = x[, -1], y = y, alpha = 0) 
## 
## Measure: Mean-Squared Error 
## 
##     Lambda Index Measure     SE Nonzero
## min 0.4241   100   1.434 0.1982      20
## 1se 0.5108    98   1.543 0.2247      20
coef(mod2,s="lambda.min")
## 21 x 1 sparse Matrix of class "dgCMatrix"
##                      s1
## (Intercept)  4.56512925
## V1           0.01864237
## V2          -0.14474607
## V3           0.13647799
## V4           0.09321257
## V5           1.01992103
## V6           1.02833345
## V7           1.03021554
## V8           0.87150470
## V9           1.90975375
## V10          1.89214977
## V11          2.12432856
## V12          1.99839789
## V13          2.69183965
## V14          2.86949361
## V15          2.91427164
## V16          2.72840558
## V17          3.73396794
## V18          3.70200292
## V19          3.88847919
## V20          3.67709282

berdasarkan hasil yang didapat dari ridge regression dapat ditarik beberapa poin antara lain :

Selanjutnya kita akan terapkan Lasso Regression dalam rangka penyusutan variabel

#lasso
mod3 <- cv.glmnet(x[,-1],y,alpha=1) #pemilihan lambda dgn cv untuk lambda
mod3
## 
## Call:  cv.glmnet(x = x[, -1], y = y, alpha = 1) 
## 
## Measure: Mean-Squared Error 
## 
##      Lambda Index Measure     SE Nonzero
## min 0.01923    59   1.014 0.1213      19
## 1se 0.07763    44   1.134 0.1439      18
coef(mod3,s="lambda.min")
## 21 x 1 sparse Matrix of class "dgCMatrix"
##                      s1
## (Intercept)  1.83533712
## V1          -0.03815930
## V2          -0.05393318
## V3           0.14314845
## V4           .         
## V5           1.00548302
## V6           0.98429527
## V7           0.99965103
## V8           0.86434523
## V9           1.96683664
## V10          1.99554456
## V11          2.14570324
## V12          2.01162119
## V13          2.84395139
## V14          3.01020049
## V15          3.01257009
## V16          2.92811226
## V17          3.93506150
## V18          3.90997381
## V19          4.01843473
## V20          3.84020618

Berdasarkan hasil Lasso Regression diatas dapat ditarik kesimpulan bahwa Lasso Regression dengan lambda optimal (0.01923) melakukan penyusutan beberapa koefisien menjadi nol, terdapat eliminasi variabel yang tidak penting (seperti V4), dan mempertahankan variabel yang lebih berpengaruh (seperti V5 hingga V20). Model ini lebih sederhana dibanding Ridge, karena beberapa variabel dihapus, namun tetap memberikan prediksi yang akurat dengan MSE sebesar 1.014.

Penerapan Ridge dan Lasso dengan dataset house

Dataset ini berisi mengenai informasi detail tentang berbagai fitur rumah dan harga jual. dataset ini dapat diunduh disini

Pemanggilan Data

# Install dan load package yang diperlukan
install.packages("readr")
## 
## The downloaded binary packages are in
##  /var/folders/cr/bz9czqyj7ns63d_c7qrdg_l40000gn/T//RtmpdUFZPc/downloaded_packages
install.packages("dplyr")
## 
## The downloaded binary packages are in
##  /var/folders/cr/bz9czqyj7ns63d_c7qrdg_l40000gn/T//RtmpdUFZPc/downloaded_packages
library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Unduh data dari Kaggle atau tautan
# Misalnya, jika file sudah diunduh dan disimpan sebagai "train.csv":
dataset <- read_csv("Housing.csv")
## Rows: 545 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): mainroad, guestroom, basement, hotwaterheating, airconditioning, pr...
## dbl (6): price, area, bedrooms, bathrooms, stories, parking
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Pra-pemrosesan Data

# Memilih fitur numerik dan target (harga rumah)
# Pastikan 'SalePrice' adalah kolom target dan hapus kolom yang tidak diperlukan
dataset <- dataset %>%
  select(where(is.numeric)) %>%
  na.omit()  # Menghapus baris dengan nilai NA

# Memisahkan fitur dan target
x <- as.matrix(dataset %>% select(-price))
y <- dataset$price

Pembagian Data menjadi Data Latih dan Data Uji

set.seed(123)  # Untuk reproduktifitas
train_index <- sample(seq_len(nrow(dataset)), size = 0.8 * nrow(dataset))
x_train <- x[train_index, ]
y_train <- y[train_index]
x_test <- x[-train_index, ]
y_test <- y[-train_index]

Menerapkan Ridge Regression

# Ridge Regression
mod_ridge <- cv.glmnet(x_train, y_train, alpha = 0)  # Alpha = 0 untuk Ridge
best_lambda_ridge <- mod_ridge$lambda.min

# Melihat koefisien
coef(mod_ridge, s = "lambda.min")
## 6 x 1 sparse Matrix of class "dgCMatrix"
##                       s1
## (Intercept)   55122.0182
## area            297.2239
## bedrooms     139409.1962
## bathrooms   1129792.2754
## stories      583088.7553
## parking      398031.8645
# Membuat prediksi
pred_ridge <- predict(mod_ridge, s = "lambda.min", newx = x_test)

Menerapkan Lasso Regression

# Lasso Regression
mod_lasso <- cv.glmnet(x_train, y_train, alpha = 1)  # Alpha = 1 untuk Lasso
best_lambda_lasso <- mod_lasso$lambda.min

# Melihat koefisien
coef(mod_lasso, s = "lambda.min")
## 6 x 1 sparse Matrix of class "dgCMatrix"
##                      s1
## (Intercept)  -26125.251
## area            309.428
## bedrooms     112642.549
## bathrooms   1170418.289
## stories      606971.208
## parking      400508.740
# Membuat prediksi
pred_lasso <- predict(mod_lasso, s = "lambda.min", newx = x_test)

Dalam hasil di atas, baik Ridge maupun Lasso memberikan koefisien yang signifikan untuk fitur seperti bathrooms dan stories. Namun, Lasso tidak secara eksplisit mengeliminasi fitur mana pun dalam hasil ini, tetapi secara umum, Lasso cenderung mengeliminasi lebih banyak fitur dalam banyak kasus.

Kedua metode regresi ini memberikan koefisien yang mirip, tetapi metode yang berbeda dalam hal penyusutan koefisien dan seleksi fitur. Ridge Regression lebih cenderung mempertahankan semua fitur dengan koefisien yang lebih kecil, sedangkan Lasso Regression dapat memberikan model yang lebih sederhana dengan beberapa fitur dihilangkan, meskipun dalam kasus ini tidak ada fitur yang dihilangkan.

Evaluasi Model

# Menghitung MSE untuk Ridge
mse_ridge <- mean((y_test - pred_ridge)^2)
print(paste("MSE Ridge:", mse_ridge))
## [1] "MSE Ridge: 2033420203402.99"
# Menghitung MSE untuk Lasso
mse_lasso <- mean((y_test - pred_lasso)^2)
print(paste("MSE Lasso:", mse_lasso))
## [1] "MSE Lasso: 2038244161368.5"

Berdasarkan nilai MSE, Ridge Regression memberikan performa prediksi yang sedikit lebih baik dibandingkan Lasso Regression pada data uji. Namun, pemilihan model juga harus mempertimbangkan faktor-faktor lain seperti kebutuhan untuk interpretabilitas, kompleksitas model, dan apakah penyederhanaan fitur penting.