Praktikum 11: OLS, Ridge, dan Lasso

1. Praktik dengan data padi

Dua model bisa memberi prediksi yang mirip, tetapi koefisiennya sangat berbeda. Hari ini kita mempelajari apa yang terjadi ketika prediktor saling berkaitan.

Kita akan memprediksi hasil panen padi dari kondisi lingkungan dan budidaya. Beberapa peubah membawa informasi yang mirip: hujan berkaitan dengan kelembapan tanah, sedangkan penggunaan pupuk A dan B bisa berjalan bersama.

Model Yang kita pelajari
OLS Regresi linear sebagai model pembanding
Ridge Penalti untuk mengendalikan besar koefisien
Lasso Penyusutan yang dapat meniadakan sebagian koefisien

Di akhir praktikum, kita bisa membaca hubungan antarprediktor, menjalankan ketiga model, dan menjelaskan pilihan model berdasarkan hasil evaluasi. Waktu praktik sekitar dua jam.

Mulai di R

Buka file .Rmd ini di RStudio atau Posit Cloud. Jalankan kode secara berurutan; tombol Code membuka sintaks di setiap bagian. Gunakan Knit untuk membuat HTML.

nim_seed boleh diganti sesuai arahan kelas. Nilai awalnya disediakan agar hasil contoh dapat diulang.

Jalankan satu kali di Console jika paketnya belum tersedia:

install.packages(c("glmnet", "knitr", "rmarkdown", "rmdformats"))

Data latihan

Data simulasi. Data ini dibuat untuk pembelajaran, bukan hasil pengamatan lapangan. Hubungan di dalamnya tidak boleh dijadikan kesimpulan agronomis.

Ada 160 pengamatan dengan 10 prediktor. Target yield dinyatakan dalam ton/ha. Kode berikut membangkitkan data yang sama setiap kali dijalankan, sehingga praktikum tidak memerlukan unduhan dataset tambahan.

nim_seed <- 1101
set.seed(nim_seed)
n <- 160

air <- rnorm(n)
pupuk <- rnorm(n)
panas <- rnorm(n)

agri <- data.frame(
  rainfall      = 180 + 35 * air + rnorm(n, sd = 2),
  humidity      = 75 + 5 * air + rnorm(n, sd = 3),
  temperature   = 28 + 1.7 * panas,
  soil_moisture = 30 + 6 * air + rnorm(n, sd = 0.35),
  irrigation    = 60 + 10 * air + rnorm(n, sd = 6),
  fertilizer_A  = 120 + 20 * pupuk + rnorm(n, sd = 1),
  fertilizer_B  = 100 + 17 * pupuk + rnorm(n, sd = 1),
  sunlight      = 7 + 0.8 * panas + rnorm(n, sd = 0.4),
  soil_pH       = 6.2 + rnorm(n, sd = 0.35),
  pest_index    = runif(n, min = 0, max = 5)
)

agri$yield <- 5.5 +
  0.45 * (agri$rainfall - 180) / 35 +
  0.45 * (agri$soil_moisture - 30) / 6 +
  0.65 * (agri$fertilizer_A - 120) / 20 -
  0.45 * (agri$temperature - 28) / 1.7 -
  0.50 * (agri$pest_index - 2.5) / 1.5 +
  rnorm(n, sd = 0.85)

knitr::kable(
  head(agri[c("rainfall", "temperature", "fertilizer_A", "fertilizer_B", "yield")], 5),
  digits = 2,
  col.names = c("Curah hujan", "Suhu", "Pupuk A", "Pupuk B", "Hasil panen"),
  row.names = FALSE
)
Curah hujan Suhu Pupuk A Pupuk B Hasil panen
146.73 26.39 172.05 145.35 7.36
169.24 27.25 120.65 100.53 5.06
147.99 28.45 129.61 108.24 5.68
84.54 28.57 90.22 73.04 1.35
213.05 27.91 109.02 90.64 6.15
Nama di data Arti Satuan simulasi
yield Hasil panen, target ton/ha
rainfall Curah hujan mm/bulan
humidity Kelembapan udara %
temperature Suhu udara °C
soil_moisture Kelembapan tanah %
irrigation Volume irigasi ekuivalen mm/bulan
fertilizer_A, fertilizer_B Penggunaan pupuk A dan B kg/ha
sunlight Lama penyinaran jam/hari
soil_pH pH tanah tanpa satuan
pest_index Indeks hama skala 0–5

Coba jawab: mana targetnya, mana prediktornya, dan mengapa ini termasuk regresi?

2. Kenali data sebelum memodelkan

Pisahkan data latih dan data uji

Gunakan 70% data latih untuk membangun model dan memilih penalti. Simpan 30% data uji untuk evaluasi akhir. Pembagian acak sesuai untuk contoh ini karena pengamatan disimulasikan independen; data deret waktu memerlukan pembagian yang mengikuti urutan waktu.

set.seed(nim_seed + 1)
id_train <- sample(seq_len(nrow(agri)), size = floor(0.7 * nrow(agri)))
train <- agri[id_train, ]
test  <- agri[-id_train, ]

knitr::kable(data.frame(
  Bagian = c("Data latih", "Data uji"),
  Jumlah = c(nrow(train), nrow(test)),
  Kegunaan = c("EDA, pelatihan, dan cross-validation", "Evaluasi akhir")
), row.names = FALSE)
Bagian Jumlah Kegunaan
Data latih 112 EDA, pelatihan, dan cross-validation
Data uji 48 Evaluasi akhir
stopifnot(!anyNA(agri))

Apa yang terlihat dari dua prediktor ini?

par(mfrow = c(1, 2))
tema_plot()
plot(train$rainfall, train$yield,
     pch = 19, col = adjustcolor(warna["OLS"], 0.65),
     xlab = "Curah hujan (mm/bulan)", ylab = "Hasil panen (ton/ha)",
     main = "Hujan dan hasil panen")
tema_plot()
plot(train$pest_index, train$yield,
     pch = 19, col = adjustcolor(warna["Lasso"], 0.65),
     xlab = "Indeks hama", ylab = "Hasil panen (ton/ha)",
     main = "Hama dan hasil panen")

par(mfrow = c(1, 1))

Perhatikan arah hubungan, sebaran titik, dan kemungkinan pencilan. Scatter plot ini menunjukkan hubungan dua peubah; koefisien regresi berganda nanti memperhitungkan prediktor lain juga.

Prediktor mana yang membawa informasi serupa?

fitur <- setdiff(names(train), "yield")
label_fitur <- c("Hujan", "Kelemb. udara", "Suhu", "Kelemb. tanah",
                 "Irigasi", "Pupuk A", "Pupuk B", "Penyinaran",
                 "pH tanah", "Indeks hama")
x_train <- as.matrix(train[, fitur])
y_train <- train$yield
x_test  <- as.matrix(test[, fitur])
y_test  <- test$yield

kor <- cor(x_train)
p <- ncol(kor)
tema_plot()
par(mar = c(7, 8, 3, 2))
image(seq_len(p), seq_len(p), t(kor[p:1, ]),
      col = colorRampPalette(c("#176E91", "#FFFFFF", "#C75C45"))(101),
      zlim = c(-1, 1), axes = FALSE, xlab = "", ylab = "")
axis(1, at = seq_len(p), labels = label_fitur, las = 2, cex.axis = 0.85)
axis(2, at = seq_len(p), labels = rev(label_fitur), las = 2, cex.axis = 0.85)
for (i in seq_len(p)) for (j in seq_len(p)) {
  nilai <- kor[p + 1 - j, i]
  text(i, j, sprintf("%.3f", nilai), cex = 0.72,
       col = if (abs(nilai) > 0.65) "white" else "#243D50")
}
title("Korelasi prediktor pada data latih", line = 1)

Merah menunjukkan korelasi positif, biru menunjukkan korelasi negatif, dan warna mendekati putih menunjukkan korelasi mendekati nol. Lihat angkanya untuk membaca kekuatan hubungan.

Berhenti sebentar: temukan dua pasangan prediktor yang sangat berkorelasi. Jika keduanya masuk model, apakah mudah memisahkan kontribusinya?

Multikolinearitas terjadi ketika satu atau beberapa prediktor dapat dijelaskan kuat oleh kombinasi prediktor lain. Heatmap membantu melihat pasangan yang berkorelasi, tetapi belum menangkap seluruh kemungkinan hubungan multivariat.

3. OLS sebagai titik awal

OLS mencari koefisien yang meminimalkan jumlah kuadrat selisih nilai aktual dan prediksi pada data latih.

OLS: minimalkan Σi (yi − ŷi)²
model_ols <- lm(yield ~ ., data = train)
knitr::kable(data.frame(
  Komponen = names(coef(model_ols)),
  Koefisien = unname(coef(model_ols))
), digits = 4, row.names = FALSE)
Komponen Koefisien
(Intercept) 1.7473
rainfall -0.0133
humidity 0.0637
temperature -0.2642
soil_moisture 0.1792
irrigation -0.0013
fertilizer_A 0.0407
fertilizer_B -0.0166
sunlight 0.2362
soil_pH -0.1383
pest_index -0.2570

Koefisien positif berarti kenaikan prediktor berkaitan dengan kenaikan prediksi hasil panen, dengan prediktor lain tetap. Koefisien negatif berarti arah sebaliknya. Hubungan ini tidak dengan sendirinya membuktikan sebab-akibat.

Apakah koefisien besar berarti peubah paling penting?

Belum tentu. Satuan hujan, suhu, dan pH berbeda. Untuk membandingkan perubahan prediksi pada skala yang sama, kalikan setiap koefisien dengan simpangan baku prediktornya pada data latih.

sd_train <- apply(x_train, 2, sd)
beta_ols <- coef(model_ols)[fitur] * sd_train

tema_plot()
par(mar = c(5, 9, 3, 1))
barplot(rev(beta_ols), names.arg = rev(label_fitur), horiz = TRUE,
        las = 1, col = warna["OLS"], border = NA,
        xlim = range(c(0, beta_ols)) * 1.12,
        xlab = "Perubahan prediksi per kenaikan 1 SD prediktor (ton/ha)",
        main = "Koefisien OLS pada skala yang sebanding")
abline(v = 0, col = "#80919B")

Perhatikan koefisien pada pasangan yang sangat berkorelasi. Nilai ekstrem atau tanda yang sulit dijelaskan dapat menjadi alasan untuk memeriksa kestabilan, tetapi satu model saja belum membuktikan bahwa koefisiennya tidak stabil.

Ingat: multikolinearitas dapat memperbesar ketidakpastian koefisien. Prediksi gabungan masih bisa baik, terutama pada data baru dengan pola prediktor yang serupa.

4. Apa yang dilakukan shrinkage?

Shrinkage menambahkan penalti pada besar koefisien. Model bersedia menerima sedikit tambahan galat latih jika hal itu membuat koefisien lebih terkendali. Ini merupakan pertukaran antara bias dan varians.

Ridge: galat kuadrat + λ × Σj βj²
Lasso: galat kuadrat + λ × Σj |βj|
Besar penalti Yang diharapkan
λ = 0 Tanpa penalti; kembali ke persoalan OLS
λ kecil Solusi masih dekat dengan OLS
λ semakin besar Penyusutan semakin kuat secara keseluruhan
λ terlalu besar Model dapat terlalu sederhana dan kehilangan pola

Ridge umumnya mempertahankan seluruh prediktor. Lasso dapat membuat sebagian koefisien tepat nol. Tidak harus setiap koefisien mengecil secara monoton pada data dengan prediktor berkorelasi.

Catatan persamaan dan intersep

Persamaan di atas memperlihatkan ide penalti. Untuk regresi Gaussian, glmnet menggunakan galat kuadrat yang dibagi 2n dan penalti λ[(1−α)Σβ²/2 + αΣ|β|]. Karena konvensi skala bisa berbeda antarperangkat lunak, nilai numerik lambda tidak langsung dapat disamakan. Intersep tidak dikenai penalti pada pengaturan yang digunakan di sini.

Mengapa prediktor perlu distandardisasi?

Penalti bekerja pada angka koefisien. Mengubah curah hujan dari mm menjadi meter saja dapat mengubah besar koefisiennya. Standardisasi membuat penalti bekerja pada skala prediktor yang sebanding.

Pada praktik ini: berikan matriks prediktor dalam satuan asli. Gunakan standardize = TRUE agar glmnet menghitung standardisasi saat model dilatih, termasuk di dalam setiap fold CV. Koefisien yang dikembalikan tetap dalam satuan asli.

Dua pengaturan yang berbeda

Argumen di R Peran Pengaturan praktikum
alpha Memilih bentuk penalti 0 = Ridge; 1 = Lasso
lambda Mengatur kekuatan penalti Dipilih melalui cross-validation

Catatan saat membaca materi Python: argumen alpha pada sklearn.Ridge atau sklearn.Lasso berperan sebagai kekuatan penalti. Pada glmnet di R, kekuatan penalti diatur oleh lambda.

5. Ridge: memilih seberapa kuat remnya

Kita belum tahu lambda yang sesuai. Gunakan 5-fold cross-validation: bagi data latih menjadi lima bagian, latih dengan empat bagian, validasi dengan satu bagian, lalu bergiliran.

Data uji tetap disimpan. CV membantu memilih lambda berdasarkan kinerja validasi, bukan berdasarkan kecocokan pada data latih saja.

set.seed(nim_seed + 2)
fold_id <- sample(rep(1:5, length.out = nrow(train)))
lambda_grid <- 10^seq(2, -4, length.out = 120)

cv_ridge <- cv.glmnet(
  x = x_train, y = y_train,
  family = "gaussian", alpha = 0,
  lambda = lambda_grid,
  foldid = fold_id, type.measure = "mse",
  standardize = TRUE
)

knitr::kable(data.frame(
  Aturan = c("lambda.min", "lambda.1se"),
  Lambda = c(cv_ridge$lambda.min, cv_ridge$lambda.1se)
), digits = 4, row.names = FALSE)
Aturan Lambda
lambda.min 0.0528
lambda.1se 0.9620

Baca sumbu vertikal: MSE validasi lebih kecil lebih baik. Garis dan titik biru menunjukkan rata-rata galat CV; garis abu-abu menunjukkan ±1 standard error. Garis jingga dan hijau menandai dua pilihan lambda.

Pilihan Artinya
lambda.min Lambda dengan rata-rata galat CV paling kecil
lambda.1se Lambda terbesar dengan galat masih dalam satu standard error dari minimum

Praktikum utama memakai lambda.min untuk kedua metode. Aturan ini ditetapkan sebelum membuka hasil data uji. lambda.1se dipakai nanti sebagai latihan memilih penalti yang lebih kuat.

beta_ridge_raw <- as.matrix(coef(cv_ridge, s = "lambda.min"))[fitur, 1]
beta_ridge <- beta_ridge_raw * sd_train

knitr::kable(
  data.frame(Peubah = label_fitur,
             OLS = as.numeric(beta_ols),
             Ridge = as.numeric(beta_ridge)),
  digits = 3, row.names = FALSE
)
Peubah OLS Ridge
Hujan -0.481 0.236
Kelemb. udara 0.376 0.360
Suhu -0.419 -0.359
Kelemb. tanah 1.107 0.358
Irigasi -0.015 0.024
Pupuk A 0.801 0.285
Pupuk B -0.278 0.237
Penyinaran 0.188 0.129
pH tanah -0.046 -0.032
Indeks hama -0.369 -0.362

Coba baca: apa yang terjadi pada koefisien hujan dan kelembapan tanah? Bandingkan juga pupuk A dan B.

6. Lasso: sebagian koefisien bisa menjadi nol

Gunakan pembagian fold yang sama seperti Ridge agar perbandingan validasinya lebih sebanding. Yang diubah adalah bentuk penalti: alpha = 1.

cv_lasso <- cv.glmnet(
  x = x_train, y = y_train,
  family = "gaussian", alpha = 1,
  lambda = lambda_grid,
  foldid = fold_id, type.measure = "mse",
  standardize = TRUE
)

beta_lasso_raw <- as.matrix(coef(cv_lasso, s = "lambda.min"))[fitur, 1]
beta_lasso <- beta_lasso_raw * sd_train

tabel_lasso <- data.frame(
  Peubah = label_fitur,
  Koefisien_per_SD = as.numeric(beta_lasso),
  Status = ifelse(abs(beta_lasso_raw) > 1e-8,
                  "Dipertahankan", "Koefisien nol")
)
knitr::kable(tabel_lasso, digits = 3, row.names = FALSE)
Peubah Koefisien_per_SD Status
Hujan 0.000 Koefisien nol
Kelemb. udara 0.365 Dipertahankan
Suhu -0.389 Dipertahankan
Kelemb. tanah 0.618 Dipertahankan
Irigasi 0.000 Koefisien nol
Pupuk A 0.523 Dipertahankan
Pupuk B 0.000 Koefisien nol
Penyinaran 0.157 Dipertahankan
pH tanah -0.033 Dipertahankan
Indeks hama -0.368 Dipertahankan

Setiap garis mewakili satu prediktor. Bergerak ke kanan berarti penalti makin kuat; garis putus-putus menunjukkan lambda.min. Perhatikan bagaimana sejumlah garis Lasso mencapai nol.

Koefisien nol bukan bukti bahwa suatu peubah tidak berpengaruh di dunia nyata. Hasil seleksi bergantung pada data, lambda, dan prediktor lain. Jika dua prediktor sangat berkorelasi, Lasso dapat mempertahankan salah satu dan meniadakan yang lain.

7. Bandingkan hasilnya

Lihat ketiga model dalam satu gambar

koef <- cbind(OLS = beta_ols, Ridge = beta_ridge, Lasso = beta_lasso)
rownames(koef) <- label_fitur
tema_plot()
par(mar = c(5, 9, 3, 1))
barplot(t(koef[nrow(koef):1, ]), beside = TRUE, horiz = TRUE,
        names.arg = rev(label_fitur), las = 1,
        xlim = range(c(0, koef)) * 1.12,
        col = warna, border = NA,
        xlab = "Perubahan prediksi per kenaikan 1 SD prediktor (ton/ha)",
        main = "Bagaimana koefisien berubah?",
        legend.text = colnames(koef),
        args.legend = list(x = "bottomright", bty = "n", cex = 0.85))
abline(v = 0, col = "#80919B")

Baru sekarang, buka data uji

rmse <- function(aktual, prediksi) sqrt(mean((aktual - prediksi)^2))
r2 <- function(aktual, prediksi) {
  1 - sum((aktual - prediksi)^2) / sum((aktual - mean(aktual))^2)
}

pred_train <- list(
  OLS = as.numeric(predict(model_ols, newdata = train)),
  Ridge = as.numeric(predict(cv_ridge, newx = x_train, s = "lambda.min")),
  Lasso = as.numeric(predict(cv_lasso, newx = x_train, s = "lambda.min"))
)
pred_test <- list(
  OLS = as.numeric(predict(model_ols, newdata = test)),
  Ridge = as.numeric(predict(cv_ridge, newx = x_test, s = "lambda.min")),
  Lasso = as.numeric(predict(cv_lasso, newx = x_test, s = "lambda.min"))
)

hasil <- data.frame(
  Model = names(pred_test),
  RMSE_latih = vapply(pred_train, function(z) rmse(y_train, z), numeric(1)),
  RMSE_uji = vapply(pred_test, function(z) rmse(y_test, z), numeric(1)),
  R2_uji = vapply(pred_test, function(z) r2(y_test, z), numeric(1)),
  Prediktor_aktif = c(
    sum(abs(coef(model_ols)[fitur]) > 1e-8),
    sum(abs(beta_ridge_raw) > 1e-8),
    sum(abs(beta_lasso_raw) > 1e-8)
  ), row.names = NULL
)
knitr::kable(hasil, digits = 3,
  col.names = c("Model", "RMSE latih", "RMSE uji", "R² uji", "Prediktor aktif"),
  row.names = FALSE)
Model RMSE latih RMSE uji R² uji Prediktor aktif
OLS 0.760 0.901 0.582 10
Ridge 0.764 0.872 0.608 10
Lasso 0.762 0.883 0.598 7
  • RMSE: lebih kecil lebih baik; satuannya ton/ha, sama seperti target.
  • R² uji: semakin tinggi semakin baik; bisa negatif jika prediksi lebih buruk daripada pembanding berupa rata-rata nilai aktual data uji.
  • Prediktor aktif: jumlah koefisien prediktor yang tidak nol secara numerik; intersep tidak dihitung.

Pada scatter plot, titik yang dekat dengan garis putus-putus menunjukkan prediksi yang dekat dengan nilai aktual. Grafik kanan menampilkan Ridge sebagai contoh, bukan sebagai pernyataan bahwa Ridge pasti paling baik.

Diskusikan: model mana yang RMSE ujinya paling kecil pada pembagian ini? Apakah hasilnya sejalan dengan jumlah prediktor aktif dan perubahan koefisiennya?

Jangan memaksakan Ridge atau Lasso menjadi pemenang. OLS juga bisa memiliki galat uji terkecil. Hasil satu pembagian data merupakan ilustrasi; selisih kecil belum cukup untuk menyatakan keunggulan yang berlaku umum. Jika data uji dipakai berulang kali untuk mengubah pengaturan, data itu sudah menjadi bagian dari proses pemilihan model.

Tambahan: benarkah koefisien lebih stabil?

Bagian ini dapat didemonstrasikan pengajar jika waktu memungkinkan. Kita mengambil ulang baris data latih sebanyak 80 kali, lalu membandingkan variasi koefisien OLS dan Ridge. Lambda Ridge ditahan pada nilai pilihan CV agar fokusnya pada perubahan sampel.

Kode demonstrasi bootstrap · opsional
set.seed(nim_seed + 3)
B <- 80
pilih <- c("rainfall", "soil_moisture", "fertilizer_A", "fertilizer_B")
boot_ols <- boot_ridge <- matrix(NA_real_, B, length(pilih))
for (b in seq_len(B)) {
  id <- sample(seq_len(nrow(train)), replace = TRUE)
  xb <- x_train[id, , drop = FALSE]
  yb <- y_train[id]
  fit_o <- lm.fit(cbind(1, xb), yb)
  fit_r <- glmnet(xb, yb, alpha = 0, lambda = lambda_grid,
                  standardize = TRUE)
  bo <- setNames(fit_o$coefficients[-1], fitur)
  br <- as.matrix(coef(fit_r, s = cv_ridge$lambda.min))[fitur, 1]
  boot_ols[b, ] <- bo[pilih] * sd_train[pilih]
  boot_ridge[b, ] <- br[pilih] * sd_train[pilih]
}

Kotak yang lebih sempit menunjukkan variasi koefisien yang lebih kecil dalam simulasi pengambilan ulang ini. Kestabilan koefisien tidak otomatis sama dengan RMSE uji terbaik. Demonstrasi ini bersyarat pada data latih dan lambda yang sudah dipilih; ketidakpastian pemilihan lambda belum dimasukkan.

8. Latihan penutup

Ubah aturan pemilihan lambda Lasso

Bandingkan lambda.min dengan lambda.1se menggunakan hasil CV yang sama. Cukup periksa lambda, galat CV, dan jumlah prediktor aktif; simpan data uji untuk evaluasi akhir model yang aturannya sudah ditetapkan.

aturan <- c("lambda.min", "lambda.1se")
latihan <- do.call(rbind, lapply(aturan, function(s) {
  lam <- cv_lasso[[s]]
  idx <- which.min(abs(cv_lasso$lambda - lam))
  b <- as.matrix(coef(cv_lasso, s = s))[-1, 1]
  data.frame(Aturan = s, Lambda = lam,
             MSE_CV = cv_lasso$cvm[idx],
             Prediktor_aktif = sum(abs(b) > 1e-8))
}))
knitr::kable(latihan, digits = 4,
  col.names = c("Aturan", "Lambda", "MSE CV", "Prediktor aktif"),
  row.names = FALSE)
Aturan Lambda MSE CV Prediktor aktif
lambda.min 0.0052 0.6848 7
lambda.1se 0.1060 0.7456 5

Kerjakan berpasangan. Siapkan jawaban singkat untuk empat pertanyaan berikut.

  1. Sebutkan dua pasangan prediktor yang berkorelasi kuat dan jelaskan masalahnya bagi interpretasi koefisien OLS.
  2. Bandingkan lambda.min dan lambda.1se: apa yang berubah pada penalti, galat CV, dan jumlah prediktor aktif?
  3. Berdasarkan tabel evaluasi utama, model mana yang memiliki RMSE uji terkecil? Sertakan angkanya dan batasi kesimpulan pada pembagian data ini.
  4. Apakah peubah yang koefisien Lasso-nya nol boleh langsung disebut tidak berpengaruh terhadap hasil panen? Jelaskan.

Luaran sederhana: file Rmd yang dapat dijalankan dan jawaban singkat atas empat pertanyaan. Tabel serta grafik utama sudah dihasilkan dari chunk praktikum.

9. Ringkasan hasil praktik

Hal yang dibandingkan OLS Ridge Lasso
Penalti Tidak ada Jumlah kuadrat koefisien Jumlah absolut koefisien
Peran utama Model pembanding Mengendalikan koefisien Penyusutan dan seleksi peubah
Koefisien tepat nol Tidak ditujukan untuk seleksi Umumnya tidak Bisa
Kekuatan penalti Tidak ada Lambda dipilih lewat CV Lambda dipilih lewat CV
Pasti terbaik di data uji? Tidak Tidak Tidak

Yang perlu dibawa pulang: nilai koefisien, kualitas prediksi, dan kesederhanaan model adalah hal yang berbeda. Pilih model dengan alasan yang sesuai tujuan, lalu tunjukkan buktinya.

Catatan penggunaan dan bacaan

Materi ini mengadaptasi alur kasus pertanian dan pembahasan OLS–Ridge–Lasso dari dua PDF yang disediakan: Kuliah 11 — Shrinkage Methods dalam Sains Data: Ridge dan Lasso Regression (Yeni Herdiyeni) dan Materi Praktikum 2 Jam: OLS, Ridge, dan Lasso Regression. Contoh program disusun ulang dalam R; data simulasi dibangkitkan khusus untuk praktikum ini.

Rincian argumen dan keluaran R dapat diperiksa melalui dokumentasi paket: glmnet dan cv.glmnet. Rujukan ini menjelaskan standardisasi, alpha, foldid, lambda.min, serta lambda.1se.

Jika instalasi meminta versi xfun yang lebih baru, restart sesi R, jalankan install.packages(c("xfun", "knitr", "rmarkdown", "bookdown", "rmdformats")) di Console, lalu restart kembali dan Knit. Gunakan Posit Cloud bila pemasangan paket di laptop masih terkendala.

Komponen Versi
R 4.5.2
glmnet 4.1.10
rmarkdown 2.30
rmdformats 1.0.4