Machine Learning

Tugas dan Latihan

1 Perkenalan Machine Learning

1.1 Tugas 1.7

  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.
  3. Jelaskan target, fitur, dan metrik evaluasi yang cocok untuk dua contoh pilihan Anda.

Jawab

(1) Berikan 5 contoh masalah nyata yang bisa diselesaikan dengan machine learning.

  1. Prediksi harga rumah berdasarkan ukuran rumah, lokasi, dan jumlah kamar.
  2. Deteksi email spam dari isi email dan metadata pengirim.
  3. Segmentasi pelanggan berdasarkan pola pembelian.
  4. Rekomendasi film berdasarkan riwayat tontonan pengguna.
  5. Kompresi data gambar dengan mereduksi jumlah fitur.

(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

1.2 Kuis Singkat 1.8

  1. Apa perbedaan utama supervised dan unsupervised learning?
  2. Mengapa data latih yang bagus belum tentu menghasilkan model yang bagus?
  3. Apa arti generalisasi dalam machine learning?
  4. Sebutkan dua contoh loss function.
  5. Mengapa baseline model penting?

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:

  • pemilihan model
  • hyperparameter
  • kualitas fitur
  • kemungkinan overfitting atau underfitting

(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:

  • Mean Squared Error (MSE)
  • Cross-Entropy Loss

(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


1.3 Ringkasan

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.


2 Analisis Regresi dan Gradient Descent

2.1 Latihan 2.11

  1. Ubah fungsi sebenarnya menjadi 𝑓(𝑥)=sin(2𝜋𝑥) dan ulangi analisis. Bagaimana berubah bias–variance?
  2. Ubah ukuran sampel n dari 40 menjadi 200. Apa yang terjadi pada variance model fleksibel?
  3. Coba beberapa nilai lambda pada ridge. Kapan model mulai underfit?
  4. (Opsional) Coba deg=5 vs deg=15. Jelaskan perubahan kompleksitas.

2.1.1 Soal 1

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:

  • Model linear tidak mampu mengikuti pola sinus → bias tinggi
  • Model polynomial lebih fleksibel → bias lebih kecil tetapi berpotensi variance tinggi

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:

  • model linear memiliki bias besar
  • model polynomial memiliki bias lebih kecil tetapi variance tinggi

Ini memperjelas bias–variance tradeoff.


2.1.2 Soal 2

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

  • variance model fleksibel menurun
  • model menjadi lebih stabil
  • overfitting berkurang

2.1.3 Soal 3

# 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

  • Model polynomial derajat tinggi (tanpa regularization) memiliki variance sangat besar, sehingga prediksi sangat sensitif terhadap perubahan data training.
  • Ridge regression menambahkan penalti pada koefisien model, sehingga koefisien menjadi lebih kecil dan model menjadi lebih stabil.
  • Dengan λ sedang (misalnya λ = 3), variance model menurun cukup besar sementara bias hanya meningkat sedikit. Hal ini biasanya menghasilkan MSE yang lebih kecil dibanding polynomial biasa.
  • Ketika λ terlalu kecil, ridge hampir sama dengan model polynomial biasa sehingga variance masih tinggi.
  • Ketika λ terlalu besar, koefisien model ditekan terlalu kuat sehingga model kehilangan fleksibilitas dan mulai underfit.
  • Hasil ini menunjukkan bahwa regularization membantu mengontrol tradeoff antara bias dan variance dan dapat meningkatkan kemampuan generalisasi model.

2.1.4 Soal 4

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

  • model lebih sederhana
  • bias lebih besar
  • variance lebih kecil

Polynomial deg = 15

  • model sangat fleksibel
  • bias kecil
  • variance sangat besar

Kesimpulan:

meningkatkan kompleksitas model mengurangi bias tetapi meningkatkan variance (bias–variance tradeoff).


2.2 Contoh R: Regresi Linear dengan lm()

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

2.3 Contoh R: Gradient Descent Manual

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")


2.4 Tugas 2.10

  1. Gunakan dataset mtcars untuk memprediksi mpg dengan minimal tiga prediktor.
  2. Bandingkan hasil lm() dengan implementasi gradient descent manual.
  3. Uji tiga learning rate berbeda dan jelaskan pengaruhnya terhadap konvergensi.

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")


2.5 Kuis Singkat 2.11

  1. Apa perbedaan solusi OLS dan gradient descent?
  2. Mengapa fitur sering perlu diskalakan sebelum gradient descent?
  3. Apa yang terjadi jika learning rate terlalu besar?
  4. Apa makna MSE yang kecil?
  5. Mengapa regresi linear sering dipakai sebagai baseline?

Jawab

(1) Apa perbedaan solusi OLS dan gradient descent?

  • OLS (Ordinary Least Squares) memiliki solusi analitik langsung menggunakan rumus matriks.
  • Gradient Descent adalah metode iteratif yang mencari parameter optimal secara bertahap dengan mengikuti arah gradien.

Kesimpulan:

  • OLS → solusi langsung
  • Gradient Descent → solusi numerik melalui iterasi

(2) Mengapa fitur sering perlu diskalakan sebelum gradient descent?

Karena fitur dengan skala berbeda dapat membuat gradien tidak seimbang, sehingga:

  • proses konvergensi menjadi sangat lambat
  • algoritma bisa tidak stabil

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:

  • parameter melompat terlalu jauh dari minimum
  • algoritma tidak konvergen
  • loss bisa berosilasi atau divergen

Dalam kasus ekstrem, nilai parameter bisa menjadi Inf atau NaN.


(4) Apa makna MSE yang kecil?

MSE (Mean Squared Error) yang kecil berarti:

  • perbedaan antara nilai prediksi dan nilai sebenarnya kecil
  • model memiliki akurasi prediksi yang baik

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 sederhana dan mudah diinterpretasikan
  • cepat dihitung
  • memberikan acuan performa dasar

Model lain dianggap baik jika dapat mengalahkan performa regresi linear.


2.6 Ringkasan

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.


3 Ridge, Lasso, dan Elastic Net

3.1 Tugas 3.9

  1. Gunakan mtcars atau dataset lain untuk membandingkan OLS, Ridge, Lasso, dan Elastic Net.
  2. Catat variabel mana yang dipertahankan oleh Lasso.
  3. Bandingkan RMSE test set dari keempat model.

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:

  • OLS tidak menggunakan regularisasi sehingga koefisien bisa besar ketika terjadi multikolinearitas.
  • Ridge mengecilkan koefisien tetapi tidak membuatnya nol.
  • Lasso dapat melakukan seleksi variabel karena beberapa koefisien menjadi nol.
  • Elastic Net menggabungkan Ridge dan Lasso sehingga lebih stabil ketika fitur berkorelasi.

Model dengan RMSE terkecil memiliki performa prediksi terbaik pada test set.


3.2 Quis 3.10

  1. Apa bedanya penalti 𝐿1 dan 𝐿2 ?
  2. Mengapa Lasso bisa melakukan seleksi variabel?
  3. Kapan Ridge lebih disukai daripada Lasso?
  4. Apa fungsi lambda.min pada cv.glmnet?
  5. Mengapa regularisasi dapat menurunkan variance?

Jawab

(1) Apa bedanya penalti 𝐿1 dan 𝐿2 ?

  • L1 (Lasso) menggunakan penalti jumlah nilai absolut koefisien \(\lambda \sum |\beta_j|\)
  • L2 (Ridge) menggunakan penalti jumlah kuadrat koefisien \(\lambda \sum \beta_j^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:

  • variabel tersebut dihapus dari model
  • Lasso otomatis melakukan feature selection.

(3) Kapan Ridge lebih disukai daripada Lasso?

Ridge lebih baik ketika:

  • banyak variabel sama-sama penting
  • terdapat multikolinearitas tinggi
  • tidak ingin menghapus variabel dari model
  • jumlah fitur lebih banyak daripada observasi

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:

  • ini adalah parameter regularisasi terbaik
  • digunakan untuk menghasilkan model final.

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:

  • model menjadi lebih sederhana
  • koefisien tidak terlalu besar
  • model tidak terlalu mengikuti noise pada data training

Akibatnya model menjadi lebih stabil pada data baru, sehingga variance menurun.


3.3 Ringkasan

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.