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:
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 |
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")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.
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.
| 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 = TRUEagarglmnetmenghitung 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.
- Sebutkan dua pasangan prediktor yang berkorelasi kuat dan jelaskan masalahnya bagi interpretasi koefisien OLS.
- Bandingkan
lambda.mindanlambda.1se: apa yang berubah pada penalti, galat CV, dan jumlah prediktor aktif? - Berdasarkan tabel evaluasi utama, model mana yang memiliki RMSE uji terkecil? Sertakan angkanya dan batasi kesimpulan pada pembagian data ini.
- 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 |