Elastic Net VS Lasso

Kelompok 7

  • Hazelita

  • Latifah Zahra

  • Nimas Ayu Hapsari

  • Syaifullah Yusuf Ramadhan

Elastic Net

Elastic Net adalah sebuah teknik regresi yang menggabungkan kelebihan dari dua metode regresi populer, yaitu Lasso dan Ridge Regression. Metode ini sangat berguna dalam mengatasi masalah multikolinearitas dan melakukan seleksi fitur secara simultan.

How

Elastic Net menambahkan penalti pada fungsi tujuan (objective function) dari model regresi linear. Penalti ini merupakan kombinasi linier dari L1-norm (seperti pada Lasso) dan L2-norm (seperti pada Ridge). Secara matematis, penalti Elastic Net dapat ditulis sebagai berikut:

\(\lambda[(1-\alpha)||\beta||_1 +\alpha||\beta||_2^2]\)

Dengan mengatur nilai \(\alpha\), Elastic Net dapat memberikan fleksibilitas dalam mengontrol tingkat sparsity (jumlah koefisien yang bernilai nol) dan kekuatan shrinkage (pengurangan nilai absolut koefisien).

Kelebihan

  • Seleksi fitur: Mampu memilih fitur yang relevan dan menghilangkan fitur yang tidak relevan.

  • Mengatasi multikolinearitas: Dapat menangani masalah multikolinearitas dengan baik.

  • Fleksibilitas: Dapat disesuaikan dengan berbagai jenis data dan masalah.

  • Akurasi prediksi: Seringkali menghasilkan model dengan akurasi prediksi yang tinggi.

When

  • Data dengan banyak fitur: Ketika jumlah fitur jauh lebih banyak daripada jumlah observasi.

  • Adanya multikolinearitas: Ketika terdapat korelasi yang tinggi antara variabel prediktor.

  • Ingin melakukan seleksi fitur: Ketika ingin mengetahui fitur mana saja yang paling penting dalam memprediksi variabel target.

  • Membutuhkan model yang interpretable: Karena Elastic Net dapat menghasilkan model yang lebih sederhana.

Membangkitkan Data

library(glmnet)
library(caret)
library(tidyverse)
library(ggplot2)
library(purrr)

# Simulasi data
set.seed(2024)
n <- 100
p <- 500
X <- matrix(rnorm(n * p), nrow = n, ncol = p)
true_beta <- rep(0, p)
true_beta[1:10] <- c(1, -1, 2, -2, 1.5, -1.5, 0.5, -0.5, 2, -2)
y <- X %*% true_beta + rnorm(n, sd = 2)

Bagi Data Training Testing

# Bagi data menjadi training dan testing
trainIndex <- createDataPartition(y, p = .8, list = FALSE)
X_train <- X[trainIndex,]
y_train <- y[trainIndex]
X_test <- X[-trainIndex,]
y_test <- y[-trainIndex]

# Standarisasi data
X_train_scaled <- scale(X_train)
X_test_scaled <- scale(X_test, center = attr(X_train_scaled, "scaled:center"),
                       scale = attr(X_train_scaled, "scaled:scale"))

Lasso

# 1. Lasso Regression (alpha = 1)
lasso_model <- cv.glmnet(X_train_scaled, y_train, alpha = 1, family = "gaussian")

# Plot CV Error vs Log(Lambda) untuk Lasso
plot(lasso_model)
# Dapatkan lambda terbaik dari model Lasso
best_lambda_lasso <- lasso_model$lambda.min
print(paste("Best Lambda for Lasso:", best_lambda_lasso))
[1] "Best Lambda for Lasso: 0.339842608871534"

Lasso (Lanjutan)

# Prediksi pada data testing menggunakan lambda terbaik
predictions_lasso <- predict(lasso_model, newx = X_test_scaled, s = "lambda.min")

# Evaluasi model Lasso
RMSE_lasso <- sqrt(mean((predictions_lasso - y_test)^2))
print(paste("RMSE Lasso:", RMSE_lasso))
[1] "RMSE Lasso: 3.05437506312003"

Elastic Net

# 2. Elastic Net Regression (Grid Search over alpha)
alpha_grid <- seq(0, 1, by = 0.1)

# Fungsi untuk melakukan cross-validation untuk setiap nilai alpha
cv_fun <- function(alpha) {
  # Tampilkan nilai alpha yang sedang diproses
  print(paste("Fitting Elastic Net model for alpha =", alpha))
  
  # Cross-validation pada elastic net dengan alpha tertentu
  cv.glmnet(X_train_scaled, y_train, alpha = alpha, family = "gaussian")
}

# Terapkan cross-validation untuk setiap alpha
cv_models_elastic <- map(alpha_grid, cv_fun)

# Cari model dengan CV error terkecil
best_index_elastic <- which.min(sapply(cv_models_elastic, function(cv_model) min(cv_model$cvm)))
best_model_elastic <- cv_models_elastic[[best_index_elastic]]

Elastic Net (Lanjutan)

# Dapatkan nilai alpha dan lambda terbaik
best_alpha <- alpha_grid[best_index_elastic]
best_lambda_elastic <- best_model_elastic$lambda.min
print(paste("Best Alpha for Elastic Net:", best_alpha))
[1] "Best Alpha for Elastic Net: 1"
print(paste("Best Lambda for Elastic Net:", best_lambda_elastic))
[1] "Best Lambda for Elastic Net: 0.0263127789876837"
# Prediksi pada data testing menggunakan model Elastic Net terbaik
predictions_elastic <- predict(best_model_elastic, newx = X_test_scaled, s = "lambda.min")

# Evaluasi model Elastic Net
RMSE_elastic <- sqrt(mean((predictions_elastic - y_test)^2))
print(paste("RMSE Elastic Net:", RMSE_elastic))
[1] "RMSE Elastic Net: 2.61635504717981"

Which best model

# Bandingkan hasil RMSE
if (RMSE_elastic < RMSE_lasso) {
  print("Performa Elastic Net lebih baik dari Lasso.")
} else {
  print("Performa Lasso lebih baik dari Elastic Net.")
}
[1] "Performa Elastic Net lebih baik dari Lasso."

Terima Kasih