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
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 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.”
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)”
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:
Intercept (1.1998): Ini adalah nilai prediksi rata-rata dari y ketika semua variabel predictor bernilai 0.
Koefisien untuk variabel X1 hingga X4 relatif kecil dan dekat dengan nol, yang menunjukkan kontribusi rendah terhadap variabel target y.
X5 hingga X20 memiliki koefisien positif yang signifikan, terutama X9 (1.9884) hingga X20 (3.8532). Ini berarti bahwa peningkatan pada variabel-variabel ini cenderung meningkatkan nilai y, dengan X17 hingga X20 memiliki pengaruh terbesar.
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 :
Lambda sebesar 0.4241 adalah nilai yang optimal untuk mengontrol penyusutan koefisien dalam Ridge Regression, menjaga keseimbangan antara kompleksitas model dan akurasi prediksi. Dengan MSE 1.434 dan SE 0.1982, ini menunjukkan bahwa model Ridge dengan lambda ini mampu memberikan prediksi yang cukup akurat dan stabil, dengan risiko overfitting yang lebih rendah dibandingkan regresi linier biasa.
4.5651, merupakan nilai rata-rata dari variabel target
y setelah mempertimbangkan efek dari semua prediktor.
Koefisien untuk semua variabel predictor (V1 hingga V20) disusutkan,
tetapi tetap tidak ada yang diatur menjadi nol (karena Ridge tidak
mengeliminasi variabel)
V17, V18, V19: Koefisien cukup besar (sekitar
3.7–3.9), menunjukkan bahwa variabel ini memiliki pengaruh yang cukup
kuat terhadap variabel target y.
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.
Dataset ini berisi mengenai informasi detail tentang berbagai fitur rumah dan harga jual. dataset ini dapat diunduh disini
# 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.
# 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
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]
# 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)
# 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.
# 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.