Tugas dan Latihan
Jawab
(1) Berikan 5 contoh masalah nyata yang bisa diselesaikan dengan machine learning.
(2) Untuk masing-masing contoh, tentukan apakah termasuk regresi, klasifikasi, clustering, atau reduksi dimensi.
| Masalah | Jenis Machine Learning |
|---|---|
| Prediksi harga rumah | Regresi |
| Deteksi email spam | Klasifikasi |
| Segmentasi pelanggan | Clustering |
| Rekomendasi film | Clustering / Sistem Rekomendasi |
| Kompresi gambar | Reduksi dimensi |
(3) Jelaskan target, fitur, dan metrik evaluasi yang cocok untuk dua contoh pilihan Anda.
| Contoh Masalah | Target | Fitur | Metrik Evaluasi |
|---|---|---|---|
| Prediksi harga rumah | Harga rumah | luas rumah, jumlah kamar, lokasi, usia bangunan | RMSE, MAE |
| Deteksi email spam | Label email (spam / tidak spam) | jumlah kata tertentu, frekuensi kata promosi, panjang email, domain pengirim | Accuracy, Precision, Recall, F1-score |
Jawab
(1) Apa perbedaan utama supervised dan unsupervised learning?
Supervised learning menggunakan data yang memiliki
label target untuk melatih model.
Sedangkan unsupervised learning tidak memiliki label
dan bertujuan menemukan pola atau struktur dalam
data.
(2) Mengapa data latih yang bagus belum tentu menghasilkan model yang bagus?
Karena performa model juga dipengaruhi oleh:
(3) Apa arti generalisasi dalam machine learning?
Generalisasi adalah kemampuan model untuk memberikan prediksi yang baik pada data baru yang belum pernah dilihat sebelumnya.
(4) Sebutkan dua contoh loss function.
Beberapa contoh loss function adalah:
(5) Mengapa baseline model penting?
Baseline model penting karena: - memberikan acuan performa awal - membantu mengevaluasi apakah model yang lebih kompleks benar-benar meningkatkan performa model
Machine learning mempelajari pola dari data untuk menghasilkan prediksi atau keputusan. Fokus utamanya adalah generalisasi, bukan sekadar cocok pada data latih. Seluruh bab berikutnya pada dasarnya adalah variasi dari ide yang sama: memilih bentuk fungsi 𝑓(⋅) , menentukan loss, melatih model, dan mengevaluasinya pada data yang belum pernah dilihat.
1. Simulasi Data Mengubah fungsi menjadi f(x)=(2x)
set.seed(123)
f_true <- function(x) sin(2*pi*x)
sigma <- 0.8
n <- 40
x_grid <- seq(-2,2,length.out=120)
f_grid <- f_true(x_grid)
x <- runif(n,-2,2)
y <- f_true(x) + rnorm(n,0,sigma)
plot(x,y,pch=16,main="Training sample: Y = sin(2πx) + noise")
lines(x_grid,f_grid,lwd=2)
2. Fit 2 model
# model sederhana
m_lm <- lm(y ~ x)
# model fleksibel
deg <- 15
m_poly <- lm(y ~ poly(x, deg, raw = TRUE))
plot(x, y, pch=16, main="Fit pada satu dataset")
lines(x_grid, f_grid, lwd=2)
lines(x_grid,
predict(m_lm, newdata=data.frame(x=x_grid)),
lwd=2, lty=2)
lines(x_grid,
predict(m_poly, newdata=data.frame(x=x_grid)),
lwd=2, lty=3)
legend("topleft",
legend=c("f(x) true",
"Linear (OLS)",
paste0("Polynomial deg=",deg)),
lty=c(1,2,3),
bty="n")
Interpretasi:
3.Simulasi bias–variance
B <- 300
pred_lm <- matrix(NA_real_,B,length(x_grid))
pred_poly <- matrix(NA_real_,B,length(x_grid))
set.seed(2026)
for(b in 1:B){
x_b <- runif(n,-2,2)
y_b <- f_true(x_b) + rnorm(n,0,sigma)
fit_lm <- lm(y_b ~ x_b)
fit_poly <- lm(y_b ~ poly(x_b,deg,raw=TRUE))
pred_lm[b,] <- predict(fit_lm,
newdata=data.frame(x_b=x_grid))
pred_poly[b,] <- predict(fit_poly,
newdata=data.frame(x_b=x_grid))
}
bv_summary <- function(pred_mat,f_grid,sigma2){
mu_hat <- colMeans(pred_mat)
bias2 <- (mu_hat - f_grid)^2
varhat <- apply(pred_mat,2,var)
msehat <- bias2 + varhat + sigma2
list(
mu_hat = mu_hat,
bias2 = bias2,
variance = varhat,
msehat = msehat
)
}
s_lm <- bv_summary(pred_lm,f_grid,sigma^2)
s_poly <- bv_summary(pred_poly,f_grid,sigma^2)
par(mfrow=c(2,2),mar=c(4,4,2,1))
plot(x_grid,s_lm$bias2,type="l",lwd=2,
main="Bias^2 vs x (Linear)",
ylab="Bias^2",xlab="x")
plot(x_grid,s_lm$variance,type="l",lwd=2,
main="Variance vs x (Linear)",
ylab="Variance",xlab="x")
plot(x_grid,s_poly$bias2,type="l",lwd=2,
main=paste0("Bias^2 vs x (Poly ",deg,")"),
ylab="Bias^2",xlab="x")
plot(x_grid,s_poly$variance,type="l",lwd=2,
main=paste0("Variance vs x (Poly ",deg,")"),
ylab="Variance",xlab="x")
4.Ringkasan
avg_metrics <- function(s) {
c(
Bias2 = mean(s$bias2),
Variance = mean(s$variance),
Irreducible = sigma^2,
MSE = mean(s$msehat)
)
}
rbind(
Linear_OLS = avg_metrics(s_lm),
Poly_high_degree = avg_metrics(s_poly)
)
## Bias2 Variance Irreducible MSE
## Linear_OLS 0.4781825 5.881990e-02 0.64 1.177002e+00
## Poly_high_degree 578.6735751 1.912306e+05 0.64 1.918099e+05
Interpretasi
Ketika fungsi sebenarnya menjadi sinus:
Ini memperjelas bias–variance tradeoff.
set.seed(123)
f_true <- function(x) sin(2*pi*x)
sigma <- 0.8
n <- 200
x_grid <- seq(-2,2,length.out=120)
f_grid <- f_true(x_grid)
x <- runif(n,-2,2)
y <- f_true(x) + rnorm(n,0,sigma)
plot(x,y,pch=16,main="Training sample: Y = sin(2πx) + noise")
lines(x_grid,f_grid,lwd=2)
# model sederhana
m_lm <- lm(y ~ x)
# model fleksibel
deg <- 15
m_poly <- lm(y ~ poly(x, deg, raw = TRUE))
plot(x, y, pch=16, main="Fit pada satu dataset")
lines(x_grid, f_grid, lwd=2)
lines(x_grid,
predict(m_lm, newdata=data.frame(x=x_grid)),
lwd=2, lty=2)
lines(x_grid,
predict(m_poly, newdata=data.frame(x=x_grid)),
lwd=2, lty=3)
legend("topleft",
legend=c("f(x) true",
"Linear (OLS)",
paste0("Polynomial deg=",deg)),
lty=c(1,2,3),
bty="n")
B <- 300
pred_lm <- matrix(NA_real_,B,length(x_grid))
pred_poly <- matrix(NA_real_,B,length(x_grid))
set.seed(2026)
for(b in 1:B){
x_b <- runif(n,-2,2)
y_b <- f_true(x_b) + rnorm(n,0,sigma)
fit_lm <- lm(y_b ~ x_b)
fit_poly <- lm(y_b ~ poly(x_b,deg,raw=TRUE))
pred_lm[b,] <- predict(fit_lm,
newdata=data.frame(x_b=x_grid))
pred_poly[b,] <- predict(fit_poly,
newdata=data.frame(x_b=x_grid))
}
bv_summary <- function(pred_mat,f_grid,sigma2){
mu_hat <- colMeans(pred_mat)
bias2 <- (mu_hat - f_grid)^2
varhat <- apply(pred_mat,2,var)
msehat <- bias2 + varhat + sigma2
list(
mu_hat = mu_hat,
bias2 = bias2,
variance = varhat,
msehat = msehat
)
}
s_lm <- bv_summary(pred_lm,f_grid,sigma^2)
s_poly <- bv_summary(pred_poly,f_grid,sigma^2)
par(mfrow=c(2,2),mar=c(4,4,2,1))
plot(x_grid,s_lm$bias2,type="l",lwd=2,
main="Bias^2 vs x (Linear)",
ylab="Bias^2",xlab="x")
plot(x_grid,s_lm$variance,type="l",lwd=2,
main="Variance vs x (Linear)",
ylab="Variance",xlab="x")
plot(x_grid,s_poly$bias2,type="l",lwd=2,
main=paste0("Bias^2 vs x (Poly ",deg,")"),
ylab="Bias^2",xlab="x")
plot(x_grid,s_poly$variance,type="l",lwd=2,
main=paste0("Variance vs x (Poly ",deg,")"),
ylab="Variance",xlab="x")
avg_metrics <- function(s) {
c(
Bias2 = mean(s$bias2),
Variance = mean(s$variance),
Irreducible = sigma^2,
MSE = mean(s$msehat)
)
}
rbind(
Linear_OLS = avg_metrics(s_lm),
Poly_high_degree = avg_metrics(s_poly)
)
## Bias2 Variance Irreducible MSE
## Linear_OLS 0.477622715 0.01100145 0.64 1.1286242
## Poly_high_degree 0.001518939 0.14745757 0.64 0.7889765
Interpretasi
# fungsi ridge
ridge_fit_predict <- function(x_train, y_train, x_grid, deg=15, lambda=1){
Xtr <- sapply(0:deg, function(k) x_train^k)
Xg <- sapply(0:deg, function(k) x_grid^k)
fit <- glmnet(Xtr, y_train, alpha=0, lambda=lambda, standardize=TRUE)
as.numeric(predict(fit, newx=Xg, s=lambda))
}
# simulasi ridge
lambda <- 3
pred_ridge <- matrix(NA_real_, nrow=B, ncol=length(x_grid))
set.seed(2026)
for(b in 1:B){
x_b <- runif(n,-2,2)
y_b <- f_true(x_b) + rnorm(n,0,sigma)
pred_ridge[b,] <- ridge_fit_predict(
x_b,
y_b,
x_grid,
deg=deg,
lambda=lambda
)
}
# bias-variance ridge
s_ridge <- bv_summary(pred_ridge, f_grid, sigma^2)
# ringkasan model
rbind(
Linear_OLS = avg_metrics(s_lm),
Poly_high_degree = avg_metrics(s_poly),
Ridge_poly_features = avg_metrics(s_ridge)
)
## Bias2 Variance Irreducible MSE
## Linear_OLS 0.477622715 0.01100145 0.64 1.1286242
## Poly_high_degree 0.001518939 0.14745757 0.64 0.7889765
## Ridge_poly_features 0.455969500 0.01160909 0.64 1.1075786
# plot rata-rata prediksi
plot(x_grid, f_grid, type="l", lwd=2,
main="Mean Prediction E[f^(x)] vs f(x)",
ylab="y", xlab="x")
lines(x_grid, s_lm$mu_hat, lwd=2, lty=2)
lines(x_grid, s_poly$mu_hat, lwd=2, lty=3)
lines(x_grid, s_ridge$mu_hat, lwd=2, lty=4)
legend("topleft",
legend=c("f(x) true",
"Linear",
paste0("Poly ",deg),
paste0("Ridge (lambda=",lambda,")")),
lty=c(1,2,3,4),
bty="n")
Interpretasi
Deg 5
# degree 5
deg <- 5
# fit model
m_poly5 <- lm(y ~ poly(x, deg, raw=TRUE))
# plot fit pada satu dataset
plot(x, y, pch=16, main="Polynomial Fit (deg=5)")
lines(x_grid, f_grid, lwd=2)
lines(x_grid,
predict(m_poly5, newdata=data.frame(x=x_grid)),
lwd=2, lty=3)
legend("topleft",
legend=c("f(x) true","Poly deg=5"),
lty=c(1,3), bty="n")
# simulasi bias-variance
pred_poly5 <- matrix(NA_real_, B, length(x_grid))
set.seed(2026)
for(b in 1:B){
x_b <- runif(n,-2,2)
y_b <- f_true(x_b) + rnorm(n,0,sigma)
fit_poly5 <- lm(y_b ~ poly(x_b,5,raw=TRUE))
pred_poly5[b,] <- predict(fit_poly5,
newdata=data.frame(x_b=x_grid))
}
# hitung bias variance
s_poly5 <- bv_summary(pred_poly5, f_grid, sigma^2)
Deg 15
# degree 15
deg <- 15
# fit model
m_poly15 <- lm(y ~ poly(x, deg, raw=TRUE))
# plot fit pada satu dataset
plot(x, y, pch=16, main="Polynomial Fit (deg=15)")
lines(x_grid, f_grid, lwd=2)
lines(x_grid,
predict(m_poly15, newdata=data.frame(x=x_grid)),
lwd=2, lty=3)
legend("topleft",
legend=c("f(x) true","Poly deg=15"),
lty=c(1,3), bty="n")
# simulasi bias-variance
pred_poly15 <- matrix(NA_real_, B, length(x_grid))
set.seed(2026)
for(b in 1:B){
x_b <- runif(n,-2,2)
y_b <- f_true(x_b) + rnorm(n,0,sigma)
fit_poly15 <- lm(y_b ~ poly(x_b,15,raw=TRUE))
pred_poly15[b,] <- predict(fit_poly15,
newdata=data.frame(x_b=x_grid))
}
# hitung bias variance
s_poly15 <- bv_summary(pred_poly15, f_grid, sigma^2)
Ringkasan perbandingan
rbind(
Poly_deg5 = avg_metrics(s_poly5),
Poly_deg15 = avg_metrics(s_poly15)
)
## Bias2 Variance Irreducible MSE
## Poly_deg5 0.442995918 0.03558981 0.64 1.1185857
## Poly_deg15 0.001518939 0.14745757 0.64 0.7889765
Interpretasi
Polynomial deg = 5
Polynomial deg = 15
Kesimpulan:
meningkatkan kompleksitas model mengurangi bias tetapi meningkatkan variance (bias–variance tradeoff).
model_lm <- lm(mpg ~ wt + hp, data = mtcars)
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ wt + hp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.941 -1.600 -0.182 1.050 5.854
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.22727 1.59879 23.285 < 2e-16 ***
## wt -3.87783 0.63273 -6.129 1.12e-06 ***
## hp -0.03177 0.00903 -3.519 0.00145 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.593 on 29 degrees of freedom
## Multiple R-squared: 0.8268, Adjusted R-squared: 0.8148
## F-statistic: 69.21 on 2 and 29 DF, p-value: 9.109e-12
pred_lm <- predict(model_lm, newdata = mtcars)
rmse_lm <- sqrt(mean((mtcars$mpg - pred_lm)^2))
rmse_lm
## [1] 2.468854
dat <- mtcars[, c("mpg", "wt", "hp")]
y <- dat$mpg
x <- scale(as.matrix(dat[, c("wt", "hp")]))
X <- cbind(1, x)
beta <- rep(0, ncol(X))
eta <- 0.05
epochs <- 5000
loss_history <- numeric(epochs)
for (t in seq_len(epochs)) {
error <- X %*% beta - y
grad <- (2 / nrow(X)) * t(X) %*% error
beta <- beta - eta * grad
loss_history[t] <- mean(error^2)
}
beta
## [,1]
## 20.090625
## wt -3.794292
## hp -2.178444
tail(loss_history)
## [1] 6.095242 6.095242 6.095242 6.095242 6.095242 6.095242
plot(loss_history, type = "l", col = "blue", lwd = 2,
main = "Konvergensi Gradient Descent",
xlab = "Epoch", ylab = "MSE")
Jawab
(1) Gunakan dataset mtcars untuk memprediksi mpg dengan minimal tiga prediktor.
data(mtcars)
model_lm <- lm(mpg ~ wt + hp + disp, data = mtcars)
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ wt + hp + disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.891 -1.640 -0.172 1.061 5.861
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.105505 2.110815 17.579 < 2e-16 ***
## wt -3.800891 1.066191 -3.565 0.00133 **
## hp -0.031157 0.011436 -2.724 0.01097 *
## disp -0.000937 0.010350 -0.091 0.92851
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.639 on 28 degrees of freedom
## Multiple R-squared: 0.8268, Adjusted R-squared: 0.8083
## F-statistic: 44.57 on 3 and 28 DF, p-value: 8.65e-11
pred_lm <- predict(model_lm, newdata = mtcars)
rmse_lm <- sqrt(mean((mtcars$mpg - pred_lm)^2))
rmse_lm
## [1] 2.468493
(2) Bandingkan hasil lm() dengan implementasi gradient descent manual.
dat <- mtcars[, c("mpg","wt","hp","disp")]
y <- dat$mpg
X <- scale(as.matrix(dat[,c("wt","hp","disp")]))
X <- cbind(1,X)
beta <- rep(0, ncol(X))
eta <- 0.05
epochs <- 5000
loss_history <- numeric(epochs)
for (t in seq_len(epochs)) {
error <- X %*% beta - y
grad <- (2 / nrow(X)) * t(X) %*% error
beta <- beta - eta * grad
loss_history[t] <- mean(error^2)
}
beta
## [,1]
## 20.0906250
## wt -3.7190097
## hp -2.1361825
## disp -0.1161317
plot(loss_history,
type="l",
col="blue",
lwd=2,
main="Konvergensi Gradient Descent",
xlab="Epoch",
ylab="MSE")
(3) Uji tiga learning rate berbeda dan jelaskan pengaruhnya terhadap konvergensi.
Eta 0.001
data(mtcars)
model_lm <- lm(mpg ~ wt + hp + disp, data = mtcars)
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ wt + hp + disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.891 -1.640 -0.172 1.061 5.861
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.105505 2.110815 17.579 < 2e-16 ***
## wt -3.800891 1.066191 -3.565 0.00133 **
## hp -0.031157 0.011436 -2.724 0.01097 *
## disp -0.000937 0.010350 -0.091 0.92851
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.639 on 28 degrees of freedom
## Multiple R-squared: 0.8268, Adjusted R-squared: 0.8083
## F-statistic: 44.57 on 3 and 28 DF, p-value: 8.65e-11
pred_lm <- predict(model_lm, newdata = mtcars)
rmse_lm <- sqrt(mean((mtcars$mpg - pred_lm)^2))
rmse_lm
## [1] 2.468493
dat <- mtcars[, c("mpg","wt","hp","disp")]
y <- dat$mpg
X <- scale(as.matrix(dat[,c("wt","hp","disp")]))
X <- cbind(1,X)
beta <- rep(0, ncol(X))
eta <- 0.001
epochs <- 5000
loss_history <- numeric(epochs)
for (t in seq_len(epochs)) {
error <- X %*% beta - y
grad <- (2 / nrow(X)) * t(X) %*% error
beta <- beta - eta * grad
loss_history[t] <- mean(error^2)
}
beta
## [,1]
## 20.0897220
## wt -3.0727547
## hp -1.8476426
## disp -0.9925554
plot(loss_history,
type="l",
col="blue",
lwd=2,
main="Konvergensi Gradient Descent",
xlab="Epoch",
ylab="MSE")
Eta 0.05
data(mtcars)
model_lm <- lm(mpg ~ wt + hp + disp, data = mtcars)
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ wt + hp + disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.891 -1.640 -0.172 1.061 5.861
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.105505 2.110815 17.579 < 2e-16 ***
## wt -3.800891 1.066191 -3.565 0.00133 **
## hp -0.031157 0.011436 -2.724 0.01097 *
## disp -0.000937 0.010350 -0.091 0.92851
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.639 on 28 degrees of freedom
## Multiple R-squared: 0.8268, Adjusted R-squared: 0.8083
## F-statistic: 44.57 on 3 and 28 DF, p-value: 8.65e-11
pred_lm <- predict(model_lm, newdata = mtcars)
rmse_lm <- sqrt(mean((mtcars$mpg - pred_lm)^2))
rmse_lm
## [1] 2.468493
dat <- mtcars[, c("mpg","wt","hp","disp")]
y <- dat$mpg
X <- scale(as.matrix(dat[,c("wt","hp","disp")]))
X <- cbind(1,X)
beta <- rep(0, ncol(X))
eta <- 0.05
epochs <- 5000
loss_history <- numeric(epochs)
for (t in seq_len(epochs)) {
error <- X %*% beta - y
grad <- (2 / nrow(X)) * t(X) %*% error
beta <- beta - eta * grad
loss_history[t] <- mean(error^2)
}
beta
## [,1]
## 20.0906250
## wt -3.7190097
## hp -2.1361825
## disp -0.1161317
plot(loss_history,
type="l",
col="blue",
lwd=2,
main="Konvergensi Gradient Descent",
xlab="Epoch",
ylab="MSE")
Eta 0,3
data(mtcars)
model_lm <- lm(mpg ~ wt + hp + disp, data = mtcars)
summary(model_lm)
##
## Call:
## lm(formula = mpg ~ wt + hp + disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.891 -1.640 -0.172 1.061 5.861
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.105505 2.110815 17.579 < 2e-16 ***
## wt -3.800891 1.066191 -3.565 0.00133 **
## hp -0.031157 0.011436 -2.724 0.01097 *
## disp -0.000937 0.010350 -0.091 0.92851
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.639 on 28 degrees of freedom
## Multiple R-squared: 0.8268, Adjusted R-squared: 0.8083
## F-statistic: 44.57 on 3 and 28 DF, p-value: 8.65e-11
pred_lm <- predict(model_lm, newdata = mtcars)
rmse_lm <- sqrt(mean((mtcars$mpg - pred_lm)^2))
rmse_lm
## [1] 2.468493
dat <- mtcars[, c("mpg","wt","hp","disp")]
y <- dat$mpg
X <- scale(as.matrix(dat[,c("wt","hp","disp")]))
X <- cbind(1,X)
beta <- rep(0, ncol(X))
eta <- 0.3
epochs <- 5000
loss_history <- numeric(epochs)
for (t in seq_len(epochs)) {
error <- X %*% beta - y
grad <- (2 / nrow(X)) * t(X) %*% error
beta <- beta - eta * grad
loss_history[t] <- mean(error^2)
}
beta
## [,1]
## 20.0906250
## wt -3.7190097
## hp -2.1361825
## disp -0.1161317
plot(loss_history,
type="l",
col="blue",
lwd=2,
main="Konvergensi Gradient Descent",
xlab="Epoch",
ylab="MSE")
Jawab
(1) Apa perbedaan solusi OLS dan gradient descent?
Kesimpulan:
(2) Mengapa fitur sering perlu diskalakan sebelum gradient descent?
Karena fitur dengan skala berbeda dapat membuat gradien tidak seimbang, sehingga:
Dengan scaling (misalnya standardization), semua fitur berada pada skala yang mirip sehingga gradient descent lebih cepat dan stabil.
(3) Apa yang terjadi jika learning rate terlalu besar?
Jika learning rate terlalu besar:
Dalam kasus ekstrem, nilai parameter bisa menjadi Inf atau NaN.
(4) Apa makna MSE yang kecil?
MSE (Mean Squared Error) yang kecil berarti:
Semakin kecil MSE, semakin baik model dalam memprediksi data.
(5) Mengapa regresi linear sering dipakai sebagai baseline?
Regresi linear sering digunakan sebagai baseline karena:
Model lain dianggap baik jika dapat mengalahkan performa regresi linear.
Machine learning mempelajari pola dari data untuk menghasilkan prediksi atau keputusan. Fokus utamanya adalah generalisasi, bukan sekadar cocok pada data latih. Seluruh bab berikutnya pada dasarnya adalah variasi dari ide yang sama: memilih bentuk fungsi 𝑓(⋅) , menentukan loss, melatih model, dan mengevaluasinya pada data yang belum pernah dilihat.
Jawab
(1) Gunakan mtcars atau dataset lain untuk membandingkan OLS, Ridge, Lasso, dan Elastic Net.
## 1. Persiapan Data
library(glmnet)
set.seed(123)
data(mtcars)
# split train-test
n <- nrow(mtcars)
train_id <- sample(1:n, size = 0.7*n)
train <- mtcars[train_id, ]
test <- mtcars[-train_id, ]
# matriks fitur
x_train <- model.matrix(mpg ~ ., train)[,-1]
y_train <- train$mpg
x_test <- model.matrix(mpg ~ ., test)[,-1]
y_test <- test$mpg
## 2 OLS Regression
ols_model <- lm(mpg ~ ., data = train)
pred_ols <- predict(ols_model, newdata = test)
rmse_ols <- sqrt(mean((y_test - pred_ols)^2))
rmse_ols
## [1] 2.28145
## 3 Ridge Regression
cv_ridge <- cv.glmnet(x_train, y_train, alpha = 0)
pred_ridge <- predict(
cv_ridge,
s = "lambda.min",
newx = x_test
)
rmse_ridge <- sqrt(mean((y_test - pred_ridge)^2))
rmse_ridge
## [1] 1.863647
## 4 Lasso Regression
cv_lasso <- cv.glmnet(x_train, y_train, alpha = 1)
pred_lasso <- predict(
cv_lasso,
s = "lambda.min",
newx = x_test
)
rmse_lasso <- sqrt(mean((y_test - pred_lasso)^2))
rmse_lasso
## [1] 2.048234
## 5 Elastic Net
cv_enet <- cv.glmnet(x_train, y_train, alpha = 0.5)
pred_enet <- predict(
cv_enet,
s = "lambda.min",
newx = x_test
)
rmse_enet <- sqrt(mean((y_test - pred_enet)^2))
rmse_enet
## [1] 1.928763
(2) Catat variabel mana yang dipertahankan oleh Lasso.
coef(cv_lasso, s = "lambda.min")
## 11 x 1 sparse Matrix of class "dgCMatrix"
## lambda.min
## (Intercept) 38.41947251
## cyl -1.31122398
## disp .
## hp -0.00655791
## drat .
## wt -2.73823244
## qsec .
## vs .
## am .
## gear .
## carb -0.09716831
Variabel yang tidak nol adalah variabel yang dipilih oleh Lasso.
(3) Bandingkan RMSE test set dari keempat model.
data.frame(
Model = c("OLS","Ridge","Lasso","Elastic Net"),
RMSE = c(rmse_ols, rmse_ridge, rmse_lasso, rmse_enet)
)
## Model RMSE
## 1 OLS 2.281450
## 2 Ridge 1.863647
## 3 Lasso 2.048234
## 4 Elastic Net 1.928763
Interpretasi singkat:
Model dengan RMSE terkecil memiliki performa prediksi terbaik pada test set.
Jawab
(1) Apa bedanya penalti 𝐿1 dan 𝐿2 ?
Perbedaannya: - L1 dapat membuat beberapa koefisien tepat nol - L2 hanya mengecilkan koefisien, tetapi jarang menjadi nol
(2) Mengapa Lasso bisa melakukan seleksi variabel?
Karena penalti L1 memiliki bentuk geometri yang membuat solusi sering jatuh pada sudut constraint region, sehingga beberapa koefisien menjadi 0.
Akibatnya:
(3) Kapan Ridge lebih disukai daripada Lasso?
Ridge lebih baik ketika:
Ridge membuat model lebih stabil dengan mengecilkan koefisien.
(4) Apa fungsi lambda.min pada cv.glmnet?
lambda.min adalah nilai λ yang menghasilkan error cross-validation paling kecil.
Artinya:
Contoh penggunaan:
coef(cv_lasso, s = "lambda.min")
## 11 x 1 sparse Matrix of class "dgCMatrix"
## lambda.min
## (Intercept) 38.41947251
## cyl -1.31122398
## disp .
## hp -0.00655791
## drat .
## wt -2.73823244
## qsec .
## vs .
## am .
## gear .
## carb -0.09716831
(5) Mengapa regularisasi dapat menurunkan variance?
Regularisasi menambahkan penalti pada besar koefisien sehingga:
Akibatnya model menjadi lebih stabil pada data baru, sehingga variance menurun.
Regresi linear adalah jembatan paling natural antara statistika dan machine learning. Dari sini pembaca belajar bahwa model adalah fungsi, pelatihan adalah optimisasi, dan kualitas model ditentukan oleh performa prediksi serta kestabilannya.