Ebook ini disusun sebagai bahan ajar satu semester untuk mata kuliah machine learning berbasis R. Susunan materi mengikuti urutan belajar yang lebih logis: dimulai dari pengantar dan regresi, lalu regularisasi, reduksi dimensi, unsupervised learning, ensemble learning, metode supervised utama, neural network, evaluasi model, dan dua proyek besar pada UTS serta UAS.
Setiap bab memiliki format yang sama agar mudah dipakai untuk kuliah, belajar mandiri, maupun penyusunan slide:
Catatan penting:
iris, mtcars, USArrests, dan
AirPassengers.Ebook ini cocok untuk:
Setelah menyelesaikan seluruh buku ini, pembaca diharapkan mampu:
paket <- c(
"tidyverse", "glmnet", "cluster", "e1071", "class",
"rpart", "rpart.plot", "randomForest", "gbm", "nnet"
)
install.packages(setdiff(paket, rownames(installed.packages())))
| Notasi | Arti |
|---|---|
| \(n\) | banyak observasi |
| \(p\) | banyak fitur atau prediktor |
| \(\mathbf{X}\) | matriks fitur berukuran \(n \times p\) |
| \(\mathbf{y}\) | vektor target |
| \(\hat{y}\) | prediksi model |
| \(\beta\) | parameter regresi |
| \(\lambda\) | parameter regularisasi |
| \(k\) | jumlah tetangga atau jumlah cluster, tergantung konteks |
| \(L(\cdot)\) | loss function |
| \(f(\cdot)\) | fungsi model |
| Pertemuan | Topik | Fokus Utama | Penanggung Jawab |
|---|---|---|---|
| 1 | Perkenalan Machine Learning | ruang lingkup, tipe masalah, pipeline | Mindra |
| 2 | Analisis Regresi dan Gradient Descent | fondasi supervised learning | Mindra |
| 3 | Ridge, Lasso, Elastic Net | regularisasi dan seleksi fitur | Mindra |
| 4 | PCA dan Analisis Faktor | reduksi dimensi dan variabel laten | Irland |
| 5 | Hierarchical Clustering dan K-Medoids | clustering berbasis jarak | Irland |
| 6 | K-Means dan Fuzzy C-Means | clustering partisional dan fuzzy | Irland |
| 7 | Gradient Boosting untuk Regresi dan Time Series | ensemble boosting | Mindra |
| 8 | UTS Project | desain dan pelaporan proyek | Tim |
| 9 | Naive Bayes dan K-NN | klasifikasi probabilistik dan instance-based | Irland |
| 10 | Decision Tree | pemisahan berbasis aturan | Irland |
| 11 | Random Forest | bagging dan random subspace | Irland |
| 12 | SVM | margin maksimum dan kernel | Mindra |
| 13 | SVR | regresi berbasis support vectors | Mindra |
| 14 | Neural Network dan Deep Learning | model berlapis dan backpropagation | Mindra |
| 15 | Validation dan Evaluation | hold-out, k-fold, confusion matrix | Irland |
| 16 | UAS Project | proyek akhir, presentasi, dan report | Tim |
Setelah mempelajari bab ini, pembaca mampu:
Machine learning adalah pendekatan komputasional untuk membangun sistem yang dapat belajar dari data, menemukan pola, lalu menggunakan pola tersebut untuk membuat prediksi atau keputusan. Berbeda dari pemrograman tradisional yang mensyaratkan aturan eksplisit, machine learning membiarkan model “mempelajari” aturan dari data historis.
Secara formal, kita ingin membangun fungsi:
\[ \hat{y} = f(\mathbf{x}; \theta) \]
dengan:
Proses belajar dilakukan dengan meminimalkan fungsi kerugian:
\[ \hat{\theta} = \arg\min_{\theta} \sum_{i=1}^n L(y_i, f(x_i; \theta)) \]
Data memiliki pasangan input-output. Tujuan model adalah mempelajari hubungan antara prediktor dan target.
Contoh:
Data tidak memiliki label target. Model mencari struktur tersembunyi, misalnya cluster atau dimensi laten.
Contoh:
Sebagian data berlabel, sebagian tidak. Pendekatan ini umum pada kasus di mana label mahal untuk diperoleh.
Agent belajar melalui interaksi dengan lingkungan dan menerima reward. Fokusnya pada strategi keputusan berurutan.
Urutan kerja minimum yang sehat adalah:
Perbedaan paling penting bukan pada alatnya, melainkan pada fokus analisis:
Keduanya saling melengkapi. Regresi linear, misalnya, bisa dipakai sebagai model inferensial maupun model prediktif, tergantung pertanyaan riset dan cara evaluasinya.
set.seed(123)
idx <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train_data <- iris[idx, ]
test_data <- iris[-idx, ]
dim(train_data)
#> [1] 105 5
dim(test_data)
#> [1] 45 5
table(train_data$Species)
#>
#> setosa versicolor virginica
#> 36 32 37
table(test_data$Species)
#>
#> setosa versicolor virginica
#> 14 18 13
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 \(f(\cdot)\), menentukan loss, melatih model, dan mengevaluasinya pada data yang belum pernah dilihat.
Setelah menyelesaikan bab ini, pembaca mampu:
Regresi linear berganda dinyatakan sebagai:
\[ y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \cdots + \beta_p x_{ip} + \varepsilon_i \]
dalam bentuk matriks:
\[ \mathbf{y} = \mathbf{X}\beta + \varepsilon \]
Tujuan utamanya adalah mencari \(\beta\) yang meminimalkan galat kuadrat.
Loss yang paling umum untuk regresi adalah Mean Squared Error:
\[ \text{MSE}(\beta) = \frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \]
dengan:
\[ \hat{y}_i = \beta_0 + \sum_{j=1}^{p}\beta_j x_{ij} \]
Secara matriks, objective function dapat ditulis:
\[ J(\beta) = \frac{1}{n}(\mathbf{y} - \mathbf{X}\beta)^\top(\mathbf{y} - \mathbf{X}\beta) \]
Jika \(\mathbf{X}^\top\mathbf{X}\) invertibel, estimator ordinary least squares adalah:
\[ \hat{\beta}_{OLS} = (\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top \mathbf{y} \]
Solusi ini efisien dan elegan, tetapi pada data besar atau model kompleks sering lebih nyaman memakai optimisasi iteratif.
Gradient descent memperbarui parameter sedikit demi sedikit mengikuti arah negatif gradien:
\[ \beta^{(t+1)} = \beta^{(t)} - \eta \nabla J(\beta^{(t)}) \]
untuk regresi linear:
\[ \nabla J(\beta) = \frac{2}{n}\mathbf{X}^\top(\mathbf{X}\beta - \mathbf{y}) \]
sehingga:
\[ \beta^{(t+1)} = \beta^{(t)} - \eta \frac{2}{n}\mathbf{X}^\top(\mathbf{X}\beta^{(t)} - \mathbf{y}) \]
Keterangan:
Gradient descent sangat penting ketika:
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 < 0.0000000000000002 ***
#> wt -3.87783 0.63273 -6.129 0.00000112 ***
#> 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: 0.000000000009109
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")
Beberapa poin penting dari regresi linear:
mtcars untuk memprediksi
mpg dengan minimal tiga prediktor.lm() dengan implementasi gradient
descent manual.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.
Pembaca diharapkan mampu:
glmnet.Pada data dengan banyak prediktor atau korelasi tinggi antarprediktor, OLS bisa menghasilkan koefisien yang tidak stabil. Model juga dapat terlalu menyesuaikan data latih sehingga performanya turun pada data baru. Regularisasi menambahkan penalti pada besar koefisien agar model lebih sederhana dan stabil.
Objective function Ridge:
\[ \min_{\beta_0,\beta} \left\{ \sum_{i=1}^{n}(y_i - \beta_0 - x_i^\top\beta)^2 + \lambda \sum_{j=1}^{p}\beta_j^2 \right\} \]
Karakteristik:
Objective function Lasso:
\[ \min_{\beta_0,\beta} \left\{ \sum_{i=1}^{n}(y_i - \beta_0 - x_i^\top\beta)^2 + \lambda \sum_{j=1}^{p}|\beta_j| \right\} \]
Karakteristik:
Elastic Net menggabungkan penalti \(L_1\) dan \(L_2\):
\[ \min_{\beta_0,\beta} \left\{ \sum_{i=1}^{n}(y_i - \beta_0 - x_i^\top\beta)^2 + \lambda \left[(1-\alpha)\sum_{j=1}^{p}\beta_j^2/2 + \alpha \sum_{j=1}^{p}|\beta_j|\right] \right\} \]
dengan:
glmnetlibrary(glmnet)
x <- model.matrix(mpg ~ ., data = mtcars)[, -1]
y <- mtcars$mpg
cv_ridge <- cv.glmnet(x, y, alpha = 0)
cv_lasso <- cv.glmnet(x, y, alpha = 1)
cv_enet <- cv.glmnet(x, y, alpha = 0.5)
coef(cv_ridge, s = "lambda.min")
#> 11 x 1 sparse Matrix of class "dgCMatrix"
#> lambda.min
#> (Intercept) 20.974654745
#> cyl -0.376364874
#> disp -0.005370836
#> hp -0.011393558
#> drat 1.055717325
#> wt -1.175325163
#> qsec 0.158738999
#> vs 0.801360486
#> am 1.558830973
#> gear 0.539424986
#> carb -0.521508008
coef(cv_lasso, s = "lambda.min")
#> 11 x 1 sparse Matrix of class "dgCMatrix"
#> lambda.min
#> (Intercept) 17.97054403
#> cyl -0.13048617
#> disp .
#> hp -0.01299374
#> drat 0.81635748
#> wt -2.63483901
#> qsec 0.51900822
#> vs 0.12811186
#> am 2.21741376
#> gear 0.42898828
#> carb -0.50776070
coef(cv_enet, s = "lambda.min")
#> 11 x 1 sparse Matrix of class "dgCMatrix"
#> lambda.min
#> (Intercept) 31.441460703
#> cyl -0.651622903
#> disp -0.001531276
#> hp -0.014184057
#> drat 0.584812825
#> wt -2.083724697
#> qsec .
#> vs 0.276206167
#> am 1.131837728
#> gear .
#> carb -0.307590466
plot(cv_ridge)
plot(cv_lasso)
plot(cv_enet)
mtcars atau dataset lain untuk membandingkan
OLS, Ridge, Lasso, dan Elastic Net.lambda.min pada cv.glmnet?Regularisasi adalah alat utama untuk menjaga model tetap stabil dan tidak terlalu kompleks. Ridge menurunkan variance, Lasso memberi seleksi fitur, dan Elastic Net menggabungkan keduanya.
Setelah bab ini, pembaca mampu:
prcomp() dan factanal() di
R.Reduksi dimensi diperlukan ketika:
PCA mencari kombinasi linear dari variabel asal yang memaksimalkan variasi.
Komponen pertama:
\[ z_1 = a_{11}x_1 + a_{12}x_2 + \cdots + a_{1p}x_p \]
dengan kendala:
\[ \sum_{j=1}^{p} a_{1j}^2 = 1 \]
dan dipilih agar:
\[ \mathrm{Var}(z_1) \]
maksimum. Secara matriks, solusi diperoleh dari eigen decomposition matriks kovarians atau korelasi.
Jika \(\mathbf{S}\) adalah matriks kovarians, maka:
\[ \mathbf{S} a_k = \lambda_k a_k \]
dengan:
Analisis faktor berangkat dari asumsi bahwa variabel teramati dipengaruhi oleh faktor laten:
\[ \mathbf{x} = \mu + \Lambda \mathbf{f} + \epsilon \]
dengan:
Struktur kovarians:
\[ \Sigma = \Lambda \Phi \Lambda^\top + \Psi \]
PCA berfokus pada kompresi variasi, sedangkan analisis faktor berfokus pada konstruk laten yang menjelaskan korelasi antarvariabel.
| Aspek | PCA | Analisis Faktor |
|---|---|---|
| Tujuan | reduksi dimensi | menemukan faktor laten |
| Dasar | total variance | common variance |
| Output utama | principal components | factor loadings |
| Cocok untuk | visualisasi, kompresi | konstruk psikometrik, sosial, ekonomi |
pca_fit <- prcomp(USArrests, scale. = TRUE)
summary(pca_fit)
#> Importance of components:
#> PC1 PC2 PC3 PC4
#> Standard deviation 1.5749 0.9949 0.59713 0.41645
#> Proportion of Variance 0.6201 0.2474 0.08914 0.04336
#> Cumulative Proportion 0.6201 0.8675 0.95664 1.00000
pca_fit$rotation
#> PC1 PC2 PC3 PC4
#> Murder -0.5358995 -0.4181809 0.3412327 0.64922780
#> Assault -0.5831836 -0.1879856 0.2681484 -0.74340748
#> UrbanPop -0.2781909 0.8728062 0.3780158 0.13387773
#> Rape -0.5434321 0.1673186 -0.8177779 0.08902432
pca_fit$x[1:10, ]
#> PC1 PC2 PC3 PC4
#> Alabama -0.97566045 -1.12200121 0.43980366 0.154696581
#> Alaska -1.93053788 -1.06242692 -2.01950027 -0.434175454
#> Arizona -1.74544285 0.73845954 -0.05423025 -0.826264240
#> Arkansas 0.13999894 -1.10854226 -0.11342217 -0.180973554
#> California -2.49861285 1.52742672 -0.59254100 -0.338559240
#> Colorado -1.49934074 0.97762966 -1.08400162 0.001450164
#> Connecticut 1.34499236 1.07798362 0.63679250 -0.117278736
#> Delaware -0.04722981 0.32208890 0.71141032 -0.873113315
#> Florida -2.98275967 -0.03883425 0.57103206 -0.095317042
#> Georgia -1.62280742 -1.26608838 0.33901818 1.065974459
biplot(pca_fit, cex = 0.7)
fa_fit <- factanal(USArrests, factors = 1, rotation = "varimax",
scores = "regression")
print(fa_fit, digits = 2, cutoff = 0.30)
#>
#> Call:
#> factanal(x = USArrests, factors = 1, scores = "regression", rotation = "varimax")
#>
#> Uniquenesses:
#> Murder Assault UrbanPop Rape
#> 0.33 0.04 0.93 0.53
#>
#> Loadings:
#> Factor1
#> Murder 0.82
#> Assault 0.98
#> UrbanPop
#> Rape 0.68
#>
#> Factor1
#> SS loadings 2.16
#> Proportion Var 0.54
#>
#> Test of the hypothesis that 1 factor is sufficient.
#> The chi square statistic is 9.15 on 2 degrees of freedom.
#> The p-value is 0.0103
fa_fit$loadings
#>
#> Loadings:
#> Factor1
#> Murder 0.818
#> Assault 0.979
#> UrbanPop 0.262
#> Rape 0.683
#>
#> Factor1
#> SS loadings 2.162
#> Proportion Var 0.540
fa_fit$scores[1:10, ]
#> Alabama Alaska Arizona Arkansas California Colorado
#> 0.7901515 1.1161087 1.3553508 0.2025243 1.2423296 0.4472463
#> Connecticut Delaware Florida Georgia
#> -0.7724846 0.6409789 1.9416162 0.6412841
Catatan:
USArrests hanya memiliki 4 variabel, sehingga contoh
yang aman untuk factanal() adalah
1 factor.2 factor, gunakan dataset dengan
variabel lebih banyak agar model teridentifikasi dengan baik.PCA meringkas variasi data ke beberapa komponen utama, sedangkan analisis faktor memodelkan struktur laten di balik korelasi antarfaktor. Keduanya sangat berguna untuk eksplorasi dan penyederhanaan data berdimensi tinggi.
Pembaca mampu:
Clustering bertujuan mengelompokkan observasi yang mirip dalam cluster yang sama dan memisahkan observasi yang tidak mirip ke cluster berbeda. Tidak ada label target, sehingga fokusnya pada struktur internal data.
Ukuran jarak yang sering dipakai:
Untuk dua observasi \(x_i\) dan \(x_j\), jarak Euclidean:
\[ d(x_i, x_j) = \sqrt{\sum_{m=1}^{p}(x_{im} - x_{jm})^2} \]
Hierarchical clustering membangun struktur pohon atau dendrogram.
Dua pendekatan utama:
Linkage yang umum:
K-medoids mirip K-means, tetapi pusat cluster adalah observasi aktual, bukan rata-rata. Ini membuatnya lebih tahan terhadap outlier.
Objective function:
\[ \min \sum_{k=1}^{K}\sum_{i \in C_k} d(x_i, m_k) \]
dengan \(m_k\) adalah medoid cluster ke-\(k\).
scaled_data <- scale(USArrests)
d <- dist(scaled_data, method = "euclidean")
hc_complete <- hclust(d, method = "complete")
plot(hc_complete, main = "Dendrogram Complete Linkage")
cluster_hc <- cutree(hc_complete, k = 3)
table(cluster_hc)
#> cluster_hc
#> 1 2 3
#> 8 11 31
pam()library(cluster)
pam_fit <- pam(scaled_data, k = 3)
pam_fit$medoids
#> Murder Assault UrbanPop Rape
#> New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
#> Oklahoma -0.2727580 -0.2371077 0.1699510 -0.1315342
#> New Hampshire -1.3059321 -1.3650491 -0.6590781 -1.2525644
table(pam_fit$clustering)
#>
#> 1 2 3
#> 19 21 10
plot(pam_fit)
Beberapa alat evaluasi:
USArrests dengan
tiga linkage berbeda.Hierarchical clustering memberi gambaran struktur data secara bertingkat, sedangkan K-medoids lebih robust terhadap outlier. Keduanya cocok untuk eksplorasi segmentasi pada data tanpa label.
Setelah bab ini, pembaca mampu:
K-means membagi data ke dalam \(K\) cluster dengan meminimalkan within-cluster sum of squares:
\[ \min \sum_{k=1}^{K}\sum_{i \in C_k} \lVert x_i - \mu_k \rVert^2 \]
Algoritmanya:
Kelebihan:
Kelemahan:
FCM mengizinkan satu observasi memiliki derajat keanggotaan di lebih dari satu cluster.
Objective function:
\[ J_m = \sum_{i=1}^{n}\sum_{k=1}^{c} u_{ik}^{m} \lVert x_i - v_k \rVert^2 \]
dengan:
Kendala:
\[ \sum_{k=1}^{c} u_{ik} = 1 \quad \text{untuk setiap } i \]
Pusat cluster:
\[ v_k = \frac{\sum_{i=1}^{n}u_{ik}^{m} x_i}{\sum_{i=1}^{n}u_{ik}^{m}} \]
Keanggotaan:
\[ u_{ik} = \frac{1}{\sum_{\ell=1}^{c}\left( \frac{\lVert x_i - v_k \rVert}{\lVert x_i - v_\ell \rVert} \right)^{\frac{2}{m-1}}} \]
scaled_iris <- scale(iris[, -5])
kmeans_fit <- kmeans(scaled_iris, centers = 3, nstart = 25)
kmeans_fit$centers
#> Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1 1.13217737 0.08812645 0.9928284 1.0141287
#> 2 -0.05005221 -0.88042696 0.3465767 0.2805873
#> 3 -1.01119138 0.85041372 -1.3006301 -1.2507035
table(Cluster = kmeans_fit$cluster, Species = iris$Species)
#> Species
#> Cluster setosa versicolor virginica
#> 1 0 11 36
#> 2 0 39 14
#> 3 50 0 0
library(e1071)
fcm_fit <- cmeans(scaled_iris, centers = 3, m = 2)
head(fcm_fit$membership)
#> 1 2 3
#> [1,] 0.005296014 0.9915693 0.003134719
#> [2,] 0.119219440 0.8289426 0.051837932
#> [3,] 0.047305380 0.9293800 0.023314622
#> [4,] 0.089186568 0.8695193 0.041294084
#> [5,] 0.016047567 0.9739414 0.010011068
#> [6,] 0.101994225 0.8188015 0.079204320
table(apply(fcm_fit$membership, 1, which.max), iris$Species)
#>
#> setosa versicolor virginica
#> 1 0 39 13
#> 2 50 0 0
#> 3 0 11 37
Beberapa pendekatan:
iris dan bandingkan hasil cluster
dengan spesies asli.nstart.K-means cocok untuk pengelompokan cepat dan sederhana, sedangkan FCM lebih fleksibel karena mengizinkan keanggotaan parsial. Dalam banyak aplikasi sosial dan bisnis, pendekatan fuzzy sering lebih realistis.
Pembaca mampu:
Boosting membangun model secara bertahap. Setiap model baru mencoba memperbaiki kesalahan model sebelumnya. Gradient boosting merumuskan proses ini sebagai optimisasi loss dengan mengikuti arah negative gradient.
Model aditif:
\[ F_M(x) = F_{M-1}(x) + \nu \gamma_m h_m(x) \]
dengan:
Untuk squared error loss, residual menjadi target pada iterasi berikutnya.
Namun:
n.trees: jumlah pohon,interaction.depth: kedalaman pohon,shrinkage: learning rate,bag.fraction: proporsi data untuk tiap iterasi.library(gbm)
set.seed(123)
gbm_fit <- gbm(
mpg ~ .,
data = mtcars,
distribution = "gaussian",
n.trees = 2000,
interaction.depth = 3,
shrinkage = 0.01,
cv.folds = 5,
n.minobsinnode = 5
)
best_iter <- gbm.perf(gbm_fit, method = "cv")
summary(gbm_fit, n.trees = best_iter)
#> var rel.inf
#> disp disp 21.5546392
#> hp hp 20.3775283
#> cyl cyl 20.1763731
#> wt wt 13.9846179
#> qsec qsec 9.1057106
#> drat drat 7.2886519
#> carb carb 3.0400758
#> vs vs 1.8632136
#> am am 1.6843181
#> gear gear 0.9248715
pred_gbm <- predict(gbm_fit, newdata = mtcars, n.trees = best_iter)
sqrt(mean((mtcars$mpg - pred_gbm)^2))
#> [1] 1.098624
Banyak metode machine learning untuk time series bekerja setelah deret waktu diubah menjadi fitur lag. Misalnya:
\[ y_t = f(y_{t-1}, y_{t-2}, \ldots, y_{t-p}, t, \text{variabel eksogen}) \]
library(gbm)
ap <- as.numeric(AirPassengers)
lag_df <- data.frame(
y = ap[13:length(ap)],
lag1 = ap[12:(length(ap) - 1)],
lag12 = ap[1:(length(ap) - 12)],
trend = 13:length(ap)
)
train_ts <- lag_df[1:100, ]
test_ts <- lag_df[101:nrow(lag_df), ]
gbm_ts <- gbm(
y ~ lag1 + lag12 + trend,
data = train_ts,
distribution = "gaussian",
n.trees = 1500,
interaction.depth = 2,
shrinkage = 0.01,
n.minobsinnode = 3
)
pred_ts <- predict(gbm_ts, newdata = test_ts, n.trees = 1500)
rmse_ts <- sqrt(mean((test_ts$y - pred_ts)^2))
rmse_ts
#> [1] 60.59657
Gradient boosting adalah metode ensemble yang sangat kuat untuk regresi maupun time series berbasis lag. Kuncinya bukan hanya pada algoritma, tetapi pada framing masalah dan tuning parameter.
UTS dirancang untuk mengukur kemampuan mahasiswa dalam:
Setiap kelompok wajib menyerahkan:
| Komponen | Bobot |
|---|---|
| Rumusan masalah dan relevansi data | 20% |
| Kualitas praproses dan EDA | 20% |
| Ketepatan model dan pembahasan | 25% |
| Evaluasi dan validasi | 20% |
| Presentasi dan kualitas report | 15% |
project_uts/
data/
scripts/
figures/
report/
slides/
UTS tidak hanya menguji kemampuan menjalankan algoritma, tetapi juga ketajaman berpikir analitis, kerapian workflow, dan kemampuan menjelaskan keputusan modeling.
Setelah mempelajari bab ini, pembaca mampu:
Naive Bayes didasarkan pada:
\[ P(y \mid x_1, \ldots, x_p) \propto P(y)\prod_{j=1}^{p}P(x_j \mid y) \]
Asumsi “naive”-nya adalah fitur saling independen bersyarat terhadap kelas. Asumsi ini sering tidak sepenuhnya benar, tetapi model tetap bisa bekerja baik.
Untuk Gaussian Naive Bayes:
\[ x_j \mid y = c \sim \mathcal{N}(\mu_{jc}, \sigma_{jc}^2) \]
K-NN mengklasifikasikan observasi baru berdasarkan mayoritas kelas dari \(k\) tetangga terdekat.
Jika \(N_k(x)\) adalah himpunan tetangga terdekat, maka prediksi kelas:
\[ \hat{y}(x) = \arg\max_{c} \sum_{i \in N_k(x)} I(y_i = c) \]
K-NN tidak membangun model parametrik eksplisit. Ia menyimpan data latih dan melakukan prediksi saat diperlukan.
Kelebihan:
Kekurangan:
Kelebihan:
Kekurangan:
library(e1071)
set.seed(123)
idx <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train <- iris[idx, ]
test <- iris[-idx, ]
nb_fit <- naiveBayes(Species ~ ., data = train)
nb_pred <- predict(nb_fit, newdata = test)
table(Prediksi = nb_pred, Aktual = test$Species)
#> Aktual
#> Prediksi setosa versicolor virginica
#> setosa 14 0 0
#> versicolor 0 18 0
#> virginica 0 0 13
mean(nb_pred == test$Species)
#> [1] 1
library(class)
train_x <- scale(train[, -5])
test_x <- scale(
test[, -5],
center = attr(train_x, "scaled:center"),
scale = attr(train_x, "scaled:scale")
)
knn_pred <- knn(
train = train_x,
test = test_x,
cl = train$Species,
k = 5
)
table(Prediksi = knn_pred, Aktual = test$Species)
#> Aktual
#> Prediksi setosa versicolor virginica
#> setosa 14 0 0
#> versicolor 0 17 0
#> virginica 0 1 13
mean(knn_pred == test$Species)
#> [1] 0.9777778
iris.k pada K-NN dan amati perubahan
akurasi.k yang terlalu kecil?Naive Bayes unggul karena kesederhanaan dan kecepatan, sedangkan K-NN unggul karena fleksibilitas non-parametrik. Keduanya adalah pintu masuk yang baik untuk memahami klasifikasi.
Pembaca mampu:
Menjelaskan struktur pohon keputusan.
Menuliskan kriteria split untuk klasifikasi dan regresi.
Memahami pruning.
Mengimplementasikan decision tree di R.
Menjelaskan alur algoritma CART dari awal sampai akhir.
Menghitung impurity sederhana secara manual.
Membedakan pre-pruning dan post-pruning.
Menjelaskan kelebihan, keterbatasan, dan kasus penggunaan decision tree.
Decision tree adalah salah satu algoritma paling penting dalam machine learning karena tiga alasan.
Pertama, decision tree sangat mudah dijelaskan.
Kedua, decision tree mampu menangkap hubungan non-linear tanpa perlu transformasi yang rumit.
Ketiga, decision tree menjadi fondasi langsung bagi banyak metode ensemble modern seperti bagging, Random Forest, AdaBoost, dan Gradient Boosting.
Jika regresi linear adalah pintu masuk ke supervised learning dari sisi model parametrik, maka decision tree adalah pintu masuk ke supervised learning dari sisi model berbasis aturan.
Bayangkan kita ingin memutuskan apakah seorang nasabah berisiko gagal bayar.
Alih-alih membuat persamaan linear, decision tree membuat aturan seperti:
Aturan ini disusun dalam struktur pohon.
Setiap node internal memuat pertanyaan.
Setiap cabang memuat hasil dari pertanyaan itu.
Setiap daun memuat prediksi akhir.
Karena itu, decision tree sangat dekat dengan cara manusia mengambil keputusan bertahap.
Komponen utama decision tree adalah:
Root node adalah simpul pertama yang memecah data.
Biasanya root node memuat split yang paling informatif.
Internal node adalah simpul di tengah pohon yang masih melakukan pemisahan data.
Contoh:
Petal.Length < 2.45wt < 2.5Age >= 40Branch adalah hasil dari aturan pemisahan.
Misalnya:
Leaf node adalah simpul akhir yang tidak dipecah lagi.
Untuk klasifikasi, leaf node berisi kelas mayoritas atau probabilitas kelas.
Untuk regresi, leaf node berisi rata-rata target pada region tersebut.
Secara geometris, decision tree membagi ruang fitur menjadi beberapa region berbentuk persegi panjang atau hyper-rectangle.
Jika kita punya dua fitur, misalnya x1 dan
x2, maka setiap split membuat garis vertikal atau
horizontal.
Gabungan banyak split membentuk potongan-potongan area.
Setiap area memiliki satu prediksi.
Dalam klasifikasi:
\[ \hat{y}(x) = c_m \quad \text{jika } x \in R_m \]
Dalam regresi:
\[ \hat{y}(x) = \bar{y}_{R_m} \quad \text{jika } x \in R_m \]
dengan \(R_m\) adalah region ke-\(m\).
Decision tree dapat dipakai untuk dua jenis masalah utama.
Target berupa kategori, misalnya:
Tree klasifikasi memilih split yang paling menurunkan impurity kelas.
Target berupa nilai kontinu, misalnya:
Tree regresi memilih split yang paling menurunkan galat prediksi dalam node.
Prinsip dasarnya sangat sederhana:
Meski sederhana, proses ini menghasilkan model yang sangat fleksibel.
Pada klasifikasi, kita perlu mengukur “seberapa campur” kelas dalam sebuah node.
Ukuran ketidakmurnian ini disebut impurity.
Semakin homogen node, semakin kecil impurity.
Semakin campur node, semakin besar impurity.
Ukuran yang umum dipakai adalah:
Entropy mengukur ketidakpastian distribusi kelas:
\[ H(S) = - \sum_{c=1}^{C} p_c \log_2 p_c \]
dengan:
Karakter entropy:
Untuk dua kelas:
Information gain mengukur penurunan entropy setelah split.
\[ \text{Gain}(S, A) = H(S) - \sum_{v \in Values(A)} \frac{|S_v|}{|S|} H(S_v) \]
dengan:
Split terbaik adalah split dengan information gain terbesar.
Gini index adalah ukuran impurity yang sangat populer pada algoritma CART:
\[ G(S) = 1 - \sum_{c=1}^{C} p_c^2 \]
Interpretasinya:
Untuk klasifikasi dua kelas dengan proporsi \(p\) dan \(1-p\):
\[ G(S) = 2p(1-p) \]
Nilai maksimum terjadi saat \(p = 0.5\).
Ukuran ini lebih sederhana:
\[ E(S) = 1 - \max_c p_c \]
Nilai ini sering dipakai untuk evaluasi node, tetapi tidak sepeka entropy dan Gini dalam proses split.
| Ukuran | Rumus | Sensitivitas | Umum dipakai pada |
|---|---|---|---|
| Entropy | \(-\sum p_c \log_2 p_c\) | tinggi | ID3, C4.5 |
| Gini | \(1 - \sum p_c^2\) | tinggi | CART |
| Misclassification error | \(1 - \max p_c\) | lebih rendah | pruning, evaluasi |
Secara praktik:
Misalkan sebuah node berisi 10 observasi:
Ya,Tidak.Maka:
\[ p_{Ya} = 0.6, \quad p_{Tidak} = 0.4 \]
\[ H(S) = -(0.6 \log_2 0.6 + 0.4 \log_2 0.4) \]
\[ H(S) \approx -(0.6 \times -0.737 + 0.4 \times -1.322) \]
\[ H(S) \approx 0.971 \]
\[ G(S) = 1 - (0.6^2 + 0.4^2) \]
\[ G(S) = 1 - (0.36 + 0.16) = 0.48 \]
\[ E(S) = 1 - \max(0.6, 0.4) = 0.4 \]
Misalkan split Pendapatan < 5 membagi node menjadi
dua anak:
Node kiri:
Ya,TidakNode kanan:
Ya,Tidak\[ H(S_L) = -(0.8\log_2 0.8 + 0.2\log_2 0.2) \approx 0.722 \]
\[ H(S_R) = -(0.4\log_2 0.4 + 0.6\log_2 0.6) \approx 0.971 \]
Karena masing-masing node berisi 5 observasi, maka weighted entropy sesudah split:
\[ H_{after} = \frac{5}{10}(0.722) + \frac{5}{10}(0.971) = 0.8465 \]
Information gain:
\[ \text{Gain} = 0.971 - 0.8465 = 0.1245 \]
Jika split lain memberi gain yang lebih besar, maka split itu akan dipilih.
Pada regresi, target split umumnya meminimalkan residual sum of squares:
\[ \sum_{i \in R_1}(y_i - \bar{y}_{R_1})^2 + \sum_{i \in R_2}(y_i - \bar{y}_{R_2})^2 \]
atau secara umum:
\[ \text{RSS}_{split} = \sum_{m=1}^{M} \sum_{i \in R_m} (y_i - \bar{y}_{R_m})^2 \]
Tree akan memilih split yang menurunkan RSS paling besar.
Untuk squared error loss, prediksi konstan terbaik dalam satu region adalah rata-rata.
Secara formal, jika kita ingin memilih konstanta \(c\) yang meminimalkan:
\[ \sum_{i \in R}(y_i - c)^2 \]
maka solusi optimalnya adalah:
\[ c = \bar{y}_R \]
Itu sebabnya leaf pada regression tree biasanya berisi mean target.
Algoritma decision tree yang paling terkenal adalah CART.
Karakter CART:
Semua data diletakkan pada satu node.
Untuk setiap fitur:
Split terbaik adalah yang paling menurunkan impurity atau RSS.
Node dipecah menjadi dua subset.
Untuk setiap node baru, proses diulang sampai kriteria berhenti dipenuhi.
Setelah pohon besar terbentuk, kita sederhanakan pohon agar generalisasi lebih baik.
Pertumbuhan pohon tidak boleh dibiarkan tanpa batas.
Beberapa aturan penghentian umum:
Dalam praktik, perilaku pohon banyak dipengaruhi hyperparameter.
Beberapa yang paling penting:
maxdepth,minsplit,minbucket,cp,maxcompete,usesurrogate.maxdepthMengontrol kedalaman maksimum pohon.
Pohon yang terlalu dalam:
minsplitJumlah minimum observasi dalam node agar node itu boleh di-split.
minbucketJumlah minimum observasi dalam leaf.
cpComplexity parameter.
Split baru hanya dipertahankan jika perbaikan model lebih besar dari nilai ini.
Semakin besar cp, semakin sederhana pohon.
Ada dua cara utama mengendalikan kompleksitas pohon.
Pohon dihentikan lebih awal dengan aturan seperti:
Keuntungan pre-pruning:
Kelemahannya:
Langkahnya:
Keuntungan post-pruning:
Kelemahannya:
Tree yang terlalu dalam rawan overfitting.
Cost complexity pruning meminimalkan:
\[ R_\alpha(T) = R(T) + \alpha |T| \]
dengan:
Interpretasi:
Dalam rpart, ide ini direpresentasikan lewat
cp.
Jika pohon terlalu dangkal:
Jika pohon terlalu dalam:
Pohon yang baik:
Decision tree menciptakan boundary berbentuk potongan-potongan ortogonal.
Ini berarti:
Decision tree cocok ketika:
Decision tree kurang ideal ketika:
Decision tree relatif ringan kebutuhan feature engineering-nya.
Misalnya, tree tidak membutuhkan:
Tetapi, tree tetap diuntungkan oleh:
Untuk fitur numerik, tree mencari threshold terbaik:
\[ x_j < s \]
dengan \(s\) adalah kandidat split.
Threshold biasanya dicari dari titik tengah nilai terurut.
Untuk fitur kategorik, split dapat berbentuk:
Pada data dengan kategori sangat banyak, jumlah kemungkinan split bisa besar, sehingga perlu strategi komputasional yang efisien.
Beberapa implementasi tree dapat menangani missing values melalui surrogate splits.
Ide surrogate split:
Ini salah satu keunggulan tree dibanding model yang sangat sensitif pada missing values.
Pada data tidak seimbang, tree bisa cenderung memilih kelas mayoritas.
Strategi penanganan:
Decision tree dapat memberi gambaran fitur mana yang paling sering dan paling berguna dalam split.
Secara intuitif, fitur yang:
dianggap lebih penting.
Namun, variable importance pada single tree harus dibaca hati-hati karena pohon tunggal tidak stabil.
Salah satu kekuatan tree adalah aturan keputusan dapat diekstrak langsung.
Contoh aturan:
Petal.Length < 2.45, maka
setosa,Petal.Length >= 2.45 dan
Petal.Width < 1.75, maka versicolor,Petal.Length >= 2.45 dan
Petal.Width >= 1.75, maka virginica.Aturan seperti ini sangat kuat dalam konteks presentasi ke audiens non-teknis.
Misalkan kita punya data berikut untuk klasifikasi kelulusan interview.
| Kandidat | Pengalaman | TesTeknis | Lulus |
|---|---|---|---|
| 1 | 1 | 55 | Tidak |
| 2 | 2 | 60 | Tidak |
| 3 | 2 | 72 | Ya |
| 4 | 3 | 75 | Ya |
| 5 | 4 | 80 | Ya |
| 6 | 1 | 50 | Tidak |
| 7 | 5 | 90 | Ya |
| 8 | 3 | 65 | Ya |
Secara intuitif, split awal yang mungkin kuat adalah
TesTeknis < 66.
Node kiri:
Jika threshold dipilih tepat, node kiri dapat menjadi dominan
Tidak.
Node kanan dapat menjadi dominan Ya.
Ini menunjukkan bagaimana split threshold sederhana dapat memberi pemisahan yang kuat.
Misal sebelum split:
Ya,Tidak.Maka:
\[ G_{awal} = 1 - \left(\frac{5}{8}\right)^2 - \left(\frac{3}{8}\right)^2 \]
\[ G_{awal} = 1 - \frac{25}{64} - \frac{9}{64} = \frac{30}{64} = 0.46875 \]
Setelah split:
Node kiri:
Ya,TidakNode kanan:
Ya,TidakGini node kiri:
\[ G_L = 1 - \left(\frac{1}{4}\right)^2 - \left(\frac{3}{4}\right)^2 = 1 - \frac{1}{16} - \frac{9}{16} = \frac{6}{16} = 0.375 \]
Gini node kanan:
\[ G_R = 1 - 1^2 - 0^2 = 0 \]
Weighted Gini:
\[ G_{split} = \frac{4}{8}(0.375) + \frac{4}{8}(0) = 0.1875 \]
Karena \(0.1875 < 0.46875\), split ini jauh lebih baik daripada kondisi awal.
Misalkan kita ingin memprediksi harga rumah.
Tree bisa membangun aturan:
Model ini tidak memberi satu persamaan global.
Sebaliknya, model membagi data ke region-region lokal dengan prediksi konstan.
Anggap kita membagi ruang fitur menjadi \(M\) region:
\[ R_1, R_2, \ldots, R_M \]
Prediksi:
\[ \hat{f}(x) = \sum_{m=1}^{M} c_m I(x \in R_m) \]
dengan \(c_m = \bar{y}_{R_m}\).
Tujuan tree adalah mencari:
yang meminimalkan total RSS.
Decision tree secara alami memodelkan interaksi.
Contoh:
Pendapatan,Usia,Jumlah Anak.Ini secara implisit berarti pengaruh Usia bisa berbeda
tergantung Pendapatan.
Pada model linear, interaksi seperti ini biasanya harus ditulis eksplisit.
Tree tidak mengasumsikan hubungan linear.
Jika hubungan antara x dan y melengkung,
tree tetap bisa mendekatinya dengan partisi bertingkat.
Kekurangannya, aproksimasi menjadi bertangga atau piecewise constant.
| Aspek | Regresi Linear | Decision Tree |
|---|---|---|
| Bentuk model | persamaan global | aturan lokal bertingkat |
| Asumsi linearitas | ya | tidak |
| Interpretasi koefisien | jelas | tidak ada koefisien global |
| Interpretasi aturan | tidak langsung | sangat jelas |
| Stabilitas | lebih stabil | lebih sensitif pada data |
| Interaksi | harus ditentukan | otomatis |
| Aspek | Decision Tree | K-NN |
|---|---|---|
| Tipe model | rule-based | instance-based |
| Interpretasi | tinggi | rendah |
| Prediksi cepat | ya | relatif lebih lambat |
| Standardisasi perlu | tidak wajib | sangat penting |
| Bentuk boundary | ortogonal | sangat fleksibel |
| Aspek | Decision Tree | Random Forest |
|---|---|---|
| Jumlah pohon | satu | banyak |
| Interpretasi | sangat tinggi | lebih rendah |
| Stabilitas | rendah sampai sedang | tinggi |
| Akurasi | sedang | sering lebih tinggi |
| Variance | tinggi | lebih rendah |
Beberapa metrik yang relevan:
Untuk dataset seimbang, accuracy sering cukup.
Untuk dataset tidak seimbang, perlu metrik yang lebih sensitif pada kelas minoritas.
Gunakan:
library(rpart)
library(rpart.plot)
tree_cls <- rpart(
Species ~ .,
data = iris,
method = "class",
cp = 0.01
)
print(tree_cls)
#> n= 150
#>
#> node), split, n, loss, yval, (yprob)
#> * denotes terminal node
#>
#> 1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)
#> 2) Petal.Length< 2.45 50 0 setosa (1.00000000 0.00000000 0.00000000) *
#> 3) Petal.Length>=2.45 100 50 versicolor (0.00000000 0.50000000 0.50000000)
#> 6) Petal.Width< 1.75 54 5 versicolor (0.00000000 0.90740741 0.09259259) *
#> 7) Petal.Width>=1.75 46 1 virginica (0.00000000 0.02173913 0.97826087) *
summary(tree_cls)
#> Call:
#> rpart(formula = Species ~ ., data = iris, method = "class", cp = 0.01)
#> n= 150
#>
#> CP nsplit rel error xerror xstd
#> 1 0.50 0 1.00 1.16 0.05127703
#> 2 0.44 1 0.50 0.69 0.06104097
#> 3 0.01 2 0.06 0.10 0.03055050
#>
#> Variable importance
#> Petal.Width Petal.Length Sepal.Length Sepal.Width
#> 34 31 21 14
#>
#> Node number 1: 150 observations, complexity param=0.5
#> predicted class=setosa expected loss=0.6666667 P(node) =1
#> class counts: 50 50 50
#> probabilities: 0.333 0.333 0.333
#> left son=2 (50 obs) right son=3 (100 obs)
#> Primary splits:
#> Petal.Length < 2.45 to the left, improve=50.00000, (0 missing)
#> Petal.Width < 0.8 to the left, improve=50.00000, (0 missing)
#> Sepal.Length < 5.45 to the left, improve=34.16405, (0 missing)
#> Sepal.Width < 3.35 to the right, improve=19.03851, (0 missing)
#> Surrogate splits:
#> Petal.Width < 0.8 to the left, agree=1.000, adj=1.00, (0 split)
#> Sepal.Length < 5.45 to the left, agree=0.920, adj=0.76, (0 split)
#> Sepal.Width < 3.35 to the right, agree=0.833, adj=0.50, (0 split)
#>
#> Node number 2: 50 observations
#> predicted class=setosa expected loss=0 P(node) =0.3333333
#> class counts: 50 0 0
#> probabilities: 1.000 0.000 0.000
#>
#> Node number 3: 100 observations, complexity param=0.44
#> predicted class=versicolor expected loss=0.5 P(node) =0.6666667
#> class counts: 0 50 50
#> probabilities: 0.000 0.500 0.500
#> left son=6 (54 obs) right son=7 (46 obs)
#> Primary splits:
#> Petal.Width < 1.75 to the left, improve=38.969400, (0 missing)
#> Petal.Length < 4.75 to the left, improve=37.353540, (0 missing)
#> Sepal.Length < 6.15 to the left, improve=10.686870, (0 missing)
#> Sepal.Width < 2.45 to the left, improve= 3.555556, (0 missing)
#> Surrogate splits:
#> Petal.Length < 4.75 to the left, agree=0.91, adj=0.804, (0 split)
#> Sepal.Length < 6.15 to the left, agree=0.73, adj=0.413, (0 split)
#> Sepal.Width < 2.95 to the left, agree=0.67, adj=0.283, (0 split)
#>
#> Node number 6: 54 observations
#> predicted class=versicolor expected loss=0.09259259 P(node) =0.36
#> class counts: 0 49 5
#> probabilities: 0.000 0.907 0.093
#>
#> Node number 7: 46 observations
#> predicted class=virginica expected loss=0.02173913 P(node) =0.3066667
#> class counts: 0 1 45
#> probabilities: 0.000 0.022 0.978
rpart.plot(tree_cls, type = 2, extra = 104, fallen.leaves = TRUE)
method = "class" berarti target adalah kategori.cp = 0.01 memberi penalti kompleksitas awal.extra = 104 pada rpart.plot() menampilkan
informasi kelas dan probabilitas.printcp(tree_cls)
#>
#> Classification tree:
#> rpart(formula = Species ~ ., data = iris, method = "class", cp = 0.01)
#>
#> Variables actually used in tree construction:
#> [1] Petal.Length Petal.Width
#>
#> Root node error: 100/150 = 0.66667
#>
#> n= 150
#>
#> CP nsplit rel error xerror xstd
#> 1 0.50 0 1.00 1.16 0.051277
#> 2 0.44 1 0.50 0.69 0.061041
#> 3 0.01 2 0.06 0.10 0.030551
plotcp(tree_cls)
Tabel cptable sangat penting karena memuat:
Nilai xerror minimum sering dipakai untuk memilih ukuran
pohon terbaik.
best_cp <- tree_cls$cptable[
which.min(tree_cls$cptable[, "xerror"]),
"CP"
]
pruned_cls <- prune(tree_cls, cp = best_cp)
printcp(pruned_cls)
#>
#> Classification tree:
#> rpart(formula = Species ~ ., data = iris, method = "class", cp = 0.01)
#>
#> Variables actually used in tree construction:
#> [1] Petal.Length Petal.Width
#>
#> Root node error: 100/150 = 0.66667
#>
#> n= 150
#>
#> CP nsplit rel error xerror xstd
#> 1 0.50 0 1.00 1.16 0.051277
#> 2 0.44 1 0.50 0.69 0.061041
#> 3 0.01 2 0.06 0.10 0.030551
rpart.plot(pruned_cls, type = 2, extra = 104, fallen.leaves = TRUE)
Pohon awal sering tumbuh terlalu detail.
Pruning:
set.seed(123)
idx_tree <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train_tree <- iris[idx_tree, ]
test_tree <- iris[-idx_tree, ]
fit_tree <- rpart(Species ~ ., data = train_tree, method = "class")
pred_tree <- predict(fit_tree, newdata = test_tree, type = "class")
prob_tree <- predict(fit_tree, newdata = test_tree, type = "prob")
table(Prediksi = pred_tree, Aktual = test_tree$Species)
#> Aktual
#> Prediksi setosa versicolor virginica
#> setosa 14 0 0
#> versicolor 0 18 1
#> virginica 0 0 12
head(prob_tree)
#> setosa versicolor virginica
#> 1 1 0 0
#> 2 1 0 0
#> 3 1 0 0
#> 5 1 0 0
#> 11 1 0 0
#> 18 1 0 0
mean(pred_tree == test_tree$Species)
#> [1] 0.9777778
tree_reg <- rpart(
mpg ~ wt + hp + disp + cyl,
data = mtcars,
method = "anova",
cp = 0.01
)
print(tree_reg)
#> n= 32
#>
#> node), split, n, deviance, yval
#> * denotes terminal node
#>
#> 1) root 32 1126.04700 20.09062
#> 2) cyl>=5 21 198.47240 16.64762
#> 4) hp>=192.5 7 28.82857 13.41429 *
#> 5) hp< 192.5 14 59.87214 18.26429 *
#> 3) cyl< 5 11 203.38550 26.66364 *
summary(tree_reg)
#> Call:
#> rpart(formula = mpg ~ wt + hp + disp + cyl, data = mtcars, method = "anova",
#> cp = 0.01)
#> n= 32
#>
#> CP nsplit rel error xerror xstd
#> 1 0.64312523 0 1.0000000 1.0695014 0.2527134
#> 2 0.09748407 1 0.3568748 0.5921302 0.1637366
#> 3 0.01000000 2 0.2593907 0.4925836 0.1123262
#>
#> Variable importance
#> cyl disp hp wt
#> 27 26 26 21
#>
#> Node number 1: 32 observations, complexity param=0.6431252
#> mean=20.09062, MSE=35.18897
#> left son=2 (21 obs) right son=3 (11 obs)
#> Primary splits:
#> cyl < 5 to the right, improve=0.6431252, (0 missing)
#> wt < 2.3925 to the right, improve=0.6356630, (0 missing)
#> disp < 163.8 to the right, improve=0.6130502, (0 missing)
#> hp < 118 to the right, improve=0.6010712, (0 missing)
#> Surrogate splits:
#> disp < 142.9 to the right, agree=0.969, adj=0.909, (0 split)
#> hp < 101 to the right, agree=0.938, adj=0.818, (0 split)
#> wt < 2.5425 to the right, agree=0.906, adj=0.727, (0 split)
#>
#> Node number 2: 21 observations, complexity param=0.09748407
#> mean=16.64762, MSE=9.451066
#> left son=4 (7 obs) right son=5 (14 obs)
#> Primary splits:
#> hp < 192.5 to the right, improve=0.5530828, (0 missing)
#> disp < 266.9 to the right, improve=0.5068475, (0 missing)
#> cyl < 7 to the right, improve=0.5068475, (0 missing)
#> wt < 3.49 to the right, improve=0.4414890, (0 missing)
#> Surrogate splits:
#> disp < 334 to the right, agree=0.857, adj=0.571, (0 split)
#> wt < 4.66 to the right, agree=0.810, adj=0.429, (0 split)
#>
#> Node number 3: 11 observations
#> mean=26.66364, MSE=18.48959
#>
#> Node number 4: 7 observations
#> mean=13.41429, MSE=4.118367
#>
#> Node number 5: 14 observations
#> mean=18.26429, MSE=4.276582
rpart.plot(tree_reg, type = 2, extra = 101, fallen.leaves = TRUE)
pred_reg <- predict(tree_reg, newdata = mtcars)
rmse_reg <- sqrt(mean((mtcars$mpg - pred_reg)^2))
mae_reg <- mean(abs(mtcars$mpg - pred_reg))
r2_reg <- 1 - sum((mtcars$mpg - pred_reg)^2) /
sum((mtcars$mpg - mean(mtcars$mpg))^2)
c(RMSE = rmse_reg, MAE = mae_reg, R2 = r2_reg)
#> RMSE MAE R2
#> 3.0212072 2.4734172 0.7406093
tree_shallow <- rpart(
Species ~ .,
data = iris,
method = "class",
control = rpart.control(maxdepth = 2, cp = 0.01)
)
tree_deep <- rpart(
Species ~ .,
data = iris,
method = "class",
control = rpart.control(maxdepth = 10, cp = 0.0001)
)
rpart.plot(tree_shallow, type = 2, extra = 104)
rpart.plot(tree_deep, type = 2, extra = 104)
Amati:
Pohon dangkal:
Pohon dalam:
fit_control <- rpart(
Species ~ .,
data = iris,
method = "class",
control = rpart.control(
minsplit = 10,
minbucket = 3,
maxdepth = 4,
cp = 0.005
)
)
printcp(fit_control)
#>
#> Classification tree:
#> rpart(formula = Species ~ ., data = iris, method = "class", control = rpart.control(minsplit = 10,
#> minbucket = 3, maxdepth = 4, cp = 0.005))
#>
#> Variables actually used in tree construction:
#> [1] Petal.Length Petal.Width
#>
#> Root node error: 100/150 = 0.66667
#>
#> n= 150
#>
#> CP nsplit rel error xerror xstd
#> 1 0.500 0 1.00 1.14 0.052307
#> 2 0.440 1 0.50 0.59 0.059828
#> 3 0.020 2 0.06 0.10 0.030551
#> 4 0.005 3 0.04 0.07 0.025833
rpart.plot(fit_control, type = 2, extra = 104)
path.rpart(pruned_cls, nodes = rownames(pruned_cls$frame[pruned_cls$frame$var == "<leaf>", ]))
#>
#> node number: 2
#> root
#> Petal.Length< 2.45
#>
#> node number: 6
#> root
#> Petal.Length>=2.45
#> Petal.Width< 1.75
#>
#> node number: 7
#> root
#> Petal.Length>=2.45
#> Petal.Width>=1.75
Perintah ini berguna untuk:
prob_cls <- predict(pruned_cls, newdata = iris[1:10, ], type = "prob")
prob_cls
#> setosa versicolor virginica
#> 1 1 0 0
#> 2 1 0 0
#> 3 1 0 0
#> 4 1 0 0
#> 5 1 0 0
#> 6 1 0 0
#> 7 1 0 0
#> 8 1 0 0
#> 9 1 0 0
#> 10 1 0 0
Pada klasifikasi, tree tidak hanya memberi label akhir, tetapi juga estimasi probabilitas per kelas berdasarkan komposisi leaf.
irisInterpretasi tree iris sering sederhana:
Petal.Length menjadi split awal yang sangat kuat,setosa mudah dipisahkan,versicolor dan virginica membutuhkan split
lanjutan.Maknanya:
mtcarsPada mtcars, tree regresi sering memakai wt
sebagai split awal.
Interpretasinya:
hp, disp, dan cyl
dapat muncul pada cabang tertentu,summary(tree_cls)Output summary() biasanya menampilkan:
Mahasiswa sebaiknya belajar membaca output ini, bukan hanya melihat gambar pohon.
Hal yang harus diperhatikan dari plot:
Jika sebuah leaf hanya berisi sedikit observasi, prediksi pada leaf itu cenderung tidak stabil.
Karena itu, leaf yang terlalu kecil patut dicurigai sebagai gejala overfitting.
Tree sangat responsif terhadap data.
Hal ini menguntungkan karena fleksibel.
Namun, hal ini juga membuat tree sensitif pada noise.
Satu observasi yang ekstrem kadang bisa mengubah struktur split.
Ketidakstabilan single tree terjadi karena:
Inilah salah satu alasan ensemble tree sangat sukses.
Tree dibangun dengan strategi greedy.
Artinya, pada tiap node, algoritma memilih split terbaik saat itu, bukan menjamin struktur pohon global paling optimal.
Konsekuensinya:
Tree tidak punya koefisien seperti \(\beta_1\), \(\beta_2\), dan seterusnya.
Karena itu, interpretasi tree bukan berbasis:
Interpretasi tree berbasis:
Decision tree adalah model prediktif, bukan alat inferensi kausal utama.
Jika tujuan analisis adalah:
maka tree perlu dipakai sangat hati-hati atau dikombinasikan dengan kerangka kausal lain.
Selain prediksi, tree juga berguna untuk segmentasi berbasis aturan.
Contoh:
Segmentasi seperti ini mudah dikomunikasikan.
Dalam konteks kebijakan publik, decision tree berguna karena:
Namun, perlu dijaga agar model tidak menimbulkan keputusan yang tidak adil karena bias data.
Karena tree membagi data berdasarkan fitur, fitur sensitif seperti:
dapat mempengaruhi aturan keputusan.
Karena itu, penting untuk:
Tree umumnya lebih tahan terhadap outlier dibanding regresi linear, karena split berbasis threshold, bukan jarak kuadrat global.
Tetapi, outlier tetap bisa mempengaruhi struktur split, terutama jika jumlah data kecil.
Tree tidak memerlukan standardisasi.
Mengapa?
Karena tree tidak mengukur jarak Euclidean, melainkan mencari threshold pemisah pada tiap fitur.
Ini berbeda dari:
yang sangat dipengaruhi skala.
Multikolinearitas bukan masalah utama seperti pada OLS.
Namun, jika ada dua fitur sangat berkorelasi, tree bisa memilih salah satunya secara arbitrer, sehingga interpretasi importance perlu hati-hati.
Untuk kelas, decision tree sebaiknya diajarkan dengan urutan:
Urutan ini biasanya lebih mudah diterima daripada langsung masuk rumus.
Sebelum membangun model:
Saat membangun model:
cptable,Setelah model jadi:
Misal kita memiliki variabel:
Target:
Tree dapat memberi aturan:
Nilai tambah:
Variabel:
Target:
Tree mungkin menemukan:
Variabel:
Target:
Tree dapat menemukan segmentasi:
Coba jawab pertanyaan berikut jika Anda melihat pohon:
set.seed(123)
idx_prune <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train_prune <- iris[idx_prune, ]
test_prune <- iris[-idx_prune, ]
tree_full <- rpart(
Species ~ .,
data = train_prune,
method = "class",
control = rpart.control(cp = 0.0001, minsplit = 2)
)
pred_full <- predict(tree_full, newdata = test_prune, type = "class")
acc_full <- mean(pred_full == test_prune$Species)
cp_best <- tree_full$cptable[which.min(tree_full$cptable[, "xerror"]), "CP"]
tree_pruned <- prune(tree_full, cp = cp_best)
pred_pruned <- predict(tree_pruned, newdata = test_prune, type = "class")
acc_pruned <- mean(pred_pruned == test_prune$Species)
c(akurasi_full = acc_full, akurasi_pruned = acc_pruned)
#> akurasi_full akurasi_pruned
#> 0.9555556 0.9777778
Sering kali:
hasil_tree <- data.frame(
aktual = test_prune$Species,
prediksi = pred_pruned
)
head(hasil_tree)
#> aktual prediksi
#> 1 setosa setosa
#> 2 setosa setosa
#> 3 setosa setosa
#> 5 setosa setosa
#> 11 setosa setosa
#> 18 setosa setosa
set.seed(123)
idx_reg <- sample(seq_len(nrow(mtcars)), size = 0.75 * nrow(mtcars))
train_reg_tree <- mtcars[idx_reg, ]
test_reg_tree <- mtcars[-idx_reg, ]
fit_reg_tree <- rpart(
mpg ~ wt + hp + disp + cyl + drat,
data = train_reg_tree,
method = "anova",
control = rpart.control(cp = 0.001, minsplit = 5)
)
pred_reg_tree <- predict(fit_reg_tree, newdata = test_reg_tree)
rmse_reg_tree <- sqrt(mean((test_reg_tree$mpg - pred_reg_tree)^2))
rmse_reg_tree
#> [1] 2.394329
fit_lm_compare <- lm(mpg ~ wt + hp + disp + cyl + drat, data = train_reg_tree)
pred_lm_compare <- predict(fit_lm_compare, newdata = test_reg_tree)
rmse_lm_compare <- sqrt(mean((test_reg_tree$mpg - pred_lm_compare)^2))
c(RMSE_tree = rmse_reg_tree, RMSE_lm = rmse_lm_compare)
#> RMSE_tree RMSE_lm
#> 2.394329 2.484322
Latihan interpretasi:
res_tree <- test_reg_tree$mpg - pred_reg_tree
plot(
pred_reg_tree,
res_tree,
pch = 19,
col = "steelblue",
xlab = "Prediksi",
ylab = "Residual",
main = "Residual Plot Decision Tree Regresi"
)
abline(h = 0, lty = 2, col = "red")
grid_cp <- c(0.1, 0.05, 0.01, 0.005, 0.001)
acc_grid <- numeric(length(grid_cp))
for (i in seq_along(grid_cp)) {
fit_i <- rpart(
Species ~ .,
data = train_prune,
method = "class",
control = rpart.control(cp = grid_cp[i])
)
pred_i <- predict(fit_i, newdata = test_prune, type = "class")
acc_grid[i] <- mean(pred_i == test_prune$Species)
}
data.frame(cp = grid_cp, accuracy = acc_grid)
#> cp accuracy
#> 1 0.100 0.9777778
#> 2 0.050 0.9777778
#> 3 0.010 0.9777778
#> 4 0.005 0.9777778
#> 5 0.001 0.9777778
Tujuan tuning bukan mencari pohon terbesar.
Tujuan tuning adalah mencari kombinasi kompleksitas yang:
cm_tree <- table(
Aktual = test_prune$Species,
Prediksi = pred_pruned
)
cm_tree
#> Prediksi
#> Aktual setosa versicolor virginica
#> setosa 14 0 0
#> versicolor 0 17 1
#> virginica 0 0 13
diag(cm_tree) / rowSums(cm_tree)
#> setosa versicolor virginica
#> 1.0000000 0.9444444 1.0000000
Ini membantu melihat apakah model:
type = "prob" untuk Analisis
Ketidakpastianprob_test <- predict(tree_pruned, newdata = test_prune, type = "prob")
head(prob_test)
#> setosa versicolor virginica
#> 1 1 0 0
#> 2 1 0 0
#> 3 1 0 0
#> 5 1 0 0
#> 11 1 0 0
#> 18 1 0 0
Jika probabilitas untuk dua kelas cukup mirip, model sebenarnya kurang yakin.
Informasi ini berguna untuk:
Explainability adalah kekuatan alami decision tree.
Tree sangat berguna ketika stakeholder ingin tahu:
Model yang sangat akurat tetapi tidak bisa dijelaskan kadang sulit diterima organisasi.
Tree memberi kompromi yang baik antara:
Setelah model dipakai, pohon juga perlu dimonitor.
Perhatikan:
Jika data drift besar, aturan pohon lama bisa menjadi usang.
Contoh:
Dalam kondisi ini, model perlu retraining.
Tree dapat dipakai untuk time series jika kita membangun fitur lag.
Contoh:
y_{t-1},y_{t-2},Namun, tree biasa tidak secara inheren memahami struktur waktu.
Single tree tidak dirancang khusus sebagai algoritma feature selection formal, tetapi split yang muncul sering memberi petunjuk fitur penting.
Gunakan dengan hati-hati, terutama jika data kecil atau fitur berkorelasi tinggi.
Dalam praktik industri, single tree sering dipakai sebagai surrogate model untuk menjelaskan model yang lebih kompleks.
Contoh:
Ini menarik untuk pengajaran lanjutan.
\[ H(S) = - \sum_{c=1}^{C} p_c \log_2 p_c \]
\[ \text{Gain}(S, A) = H(S) - \sum_v \frac{|S_v|}{|S|} H(S_v) \]
\[ G(S) = 1 - \sum_{c=1}^{C} p_c^2 \]
\[ E(S) = 1 - \max_c p_c \]
\[ \min \sum_{i \in R_1}(y_i - \bar{y}_{R_1})^2 + \sum_{i \in R_2}(y_i - \bar{y}_{R_2})^2 \]
\[ R_\alpha(T) = R(T) + \alpha |T| \]
Jika bab ini dipakai di kelas, saran alokasinya:
iris.cptable.xerror minimum.mtcars.cp pada rpart?maxdepth?minsplit?Topik yang dapat dipilih:
Output minimal:
iris.mtcars.cp pada rpart?Decision tree adalah model supervised berbasis aturan yang membagi ruang fitur menjadi region-region sederhana.
Untuk klasifikasi, tree memilih split yang menurunkan impurity.
Untuk regresi, tree memilih split yang menurunkan galat dalam node.
Keunggulan utamanya adalah interpretabilitas, kemampuan menangkap non-linearitas, dan kemudahan komunikasi hasil.
Keterbatasan utamanya adalah ketidakstabilan dan kecenderungan overfitting pada single tree.
Karena itu, penguasaan konsep split, impurity, dan pruning sangat penting sebelum melangkah ke Random Forest dan boosting.
Setelah bab ini, pembaca mampu:
Satu pohon keputusan mudah overfitting. Random Forest mengurangi masalah ini dengan membangun banyak pohon dari bootstrap sample dan mengacak subset fitur pada tiap split.
Prediksi akhir:
Bagging atau bootstrap aggregating bekerja sebagai berikut:
Pada setiap split, hanya sebagian fitur yang boleh dipertimbangkan. Hal ini menurunkan korelasi antar pohon sehingga ensemble menjadi lebih kuat.
Setiap bootstrap sample menyisakan sebagian observasi di luar sampel. Observasi tersebut dapat dipakai untuk estimasi error tanpa perlu validation set terpisah.
library(randomForest)
set.seed(123)
rf_fit <- randomForest(
Species ~ .,
data = iris,
ntree = 500,
mtry = 2,
importance = TRUE
)
print(rf_fit)
#>
#> Call:
#> randomForest(formula = Species ~ ., data = iris, ntree = 500, mtry = 2, importance = TRUE)
#> Type of random forest: classification
#> Number of trees: 500
#> No. of variables tried at each split: 2
#>
#> OOB estimate of error rate: 4.67%
#> Confusion matrix:
#> setosa versicolor virginica class.error
#> setosa 50 0 0 0.00
#> versicolor 0 47 3 0.06
#> virginica 0 4 46 0.08
importance(rf_fit)
#> setosa versicolor virginica MeanDecreaseAccuracy
#> Sepal.Length 6.495113 7.588736 7.690949 11.098105
#> Sepal.Width 4.364415 1.038790 4.546158 5.144762
#> Petal.Length 22.157039 34.060864 27.853055 33.535680
#> Petal.Width 22.482214 32.571528 30.595022 32.839577
#> MeanDecreaseGini
#> Sepal.Length 9.798189
#> Sepal.Width 2.236535
#> Petal.Length 43.093269
#> Petal.Width 44.042372
varImpPlot(rf_fit)
ntree: jumlah pohon,mtry: jumlah fitur kandidat di tiap split,nodesize: ukuran node minimum,importance: apakah ingin menghitung pentingnya
variabel.Kelebihan:
Keterbatasan:
iris.mtry dan ntree, lalu amati perubahan
OOB error.mtry?Random Forest adalah kombinasi efektif antara bagging dan random feature selection. Model ini sering menjadi baseline kuat untuk banyak masalah klasifikasi dan regresi.
Pembaca mampu:
SVM mencari hyperplane yang memisahkan kelas dengan margin terbesar.
Hyperplane linear:
\[ f(x) = \beta^\top x + b \]
Prediksi kelas:
\[ \hat{y} = \mathrm{sign}(\beta^\top x + b) \]
Jika data terpisah sempurna, optimisasi:
\[ \min_{\beta,b} \frac{1}{2}\lVert \beta \rVert^2 \]
dengan kendala:
\[ y_i(\beta^\top x_i + b) \geq 1, \quad i=1,\ldots,n \]
Untuk data yang tidak terpisah sempurna:
\[ \min_{\beta,b,\xi} \frac{1}{2}\lVert \beta \rVert^2 + C\sum_{i=1}^{n}\xi_i \]
dengan:
\[ y_i(\beta^\top x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0 \]
Parameter \(C\) mengontrol trade-off antara margin besar dan penalti salah klasifikasi.
Jika boundary tidak linear, SVM menggunakan kernel:
Kernel RBF yang populer:
\[ K(x_i, x_j) = \exp(-\gamma \lVert x_i - x_j \rVert^2) \]
library(e1071)
iris_bin <- subset(iris, Species != "virginica")
set.seed(123)
idx <- sample(seq_len(nrow(iris_bin)), size = 0.7 * nrow(iris_bin))
train_bin <- iris_bin[idx, ]
test_bin <- iris_bin[-idx, ]
svm_linear <- svm(
Species ~ .,
data = train_bin,
kernel = "linear",
cost = 1,
scale = TRUE
)
svm_rbf <- svm(
Species ~ .,
data = train_bin,
kernel = "radial",
cost = 1,
gamma = 0.5,
scale = TRUE
)
pred_linear <- predict(svm_linear, newdata = test_bin)
pred_rbf <- predict(svm_rbf, newdata = test_bin)
mean(pred_linear == test_bin$Species)
#> [1] 1
mean(pred_rbf == test_bin$Species)
#> [1] 1
cost dan gamma menentukan
performa.cost dan
gamma.SVM adalah metode klasifikasi yang sangat kuat, khususnya pada data berdimensi sedang hingga tinggi. Inti kekuatannya ada pada margin maksimum dan kernel trick.
Setelah mempelajari bab ini, pembaca mampu:
cost, epsilon,
dan kernel.SVR berusaha menemukan fungsi yang sedatar mungkin tetapi tetap menjaga kesalahan prediksi di dalam tabung toleransi \(\epsilon\).
Model linear:
\[ f(x) = \beta^\top x + b \]
Objective function:
\[ \min_{\beta,b,\xi,\xi^*} \frac{1}{2}\lVert \beta \rVert^2 + C \sum_{i=1}^{n}(\xi_i + \xi_i^*) \]
dengan kendala:
\[ y_i - (\beta^\top x_i + b) \leq \epsilon + \xi_i \]
\[ (\beta^\top x_i + b) - y_i \leq \epsilon + \xi_i^* \]
\[ \xi_i, \xi_i^* \geq 0 \]
Loss-nya nol selama prediksi berada dalam radius \(\epsilon\) dari nilai aktual. Hal ini membuat SVR fokus pada kesalahan yang benar-benar penting.
library(e1071)
set.seed(123)
idx <- sample(seq_len(nrow(mtcars)), size = 0.75 * nrow(mtcars))
train_reg <- mtcars[idx, ]
test_reg <- mtcars[-idx, ]
svr_fit <- svm(
mpg ~ wt + hp + disp,
data = train_reg,
type = "eps-regression",
kernel = "radial",
cost = 10,
epsilon = 0.1,
gamma = 0.1,
scale = TRUE
)
svr_pred <- predict(svr_fit, newdata = test_reg)
rmse_svr <- sqrt(mean((test_reg$mpg - svr_pred)^2))
rmse_svr
#> [1] 2.607152
| Aspek | Regresi Linear | SVR |
|---|---|---|
| Bentuk hubungan | linear | linear atau non-linear via kernel |
| Interpretasi | tinggi | lebih rendah |
| Tuning | rendah | tinggi |
| Fleksibilitas | sedang | tinggi |
mtcars untuk membandingkan regresi linear dan
SVR.epsilon.epsilon pada SVR?cost pada SVR?SVR membawa filosofi margin maksimum ke ranah regresi. Model ini sangat berguna ketika hubungan input-output kompleks dan kita ingin kontrol yang baik atas toleransi galat.
Pembaca mampu:
Satu neuron menghitung kombinasi linear lalu menerapkan fungsi aktivasi:
\[ z = w_0 + \sum_{j=1}^{p} w_j x_j \]
\[ a = g(z) \]
Fungsi aktivasi yang umum:
Neural network terdiri dari:
Komposisi fungsi untuk jaringan satu hidden layer:
\[ \hat{y} = g_2\left(W^{(2)} g_1\left(W^{(1)}x + b^{(1)}\right) + b^{(2)}\right) \]
Untuk klasifikasi biner sering dipakai binary cross-entropy:
\[ L = -\frac{1}{n}\sum_{i=1}^{n}\left[y_i\log(\hat{p}_i) + (1-y_i)\log(1-\hat{p}_i)\right] \]
Untuk regresi sering dipakai MSE.
Backpropagation menghitung turunan loss terhadap semua bobot dengan aturan rantai. Setelah gradien diperoleh, parameter diperbarui dengan gradient descent atau variannya.
Jika hidden layer bertambah banyak, model masuk ke kategori deep learning. Kelebihannya:
Tantangannya:
library(nnet)
set.seed(123)
idx <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train_nn <- iris[idx, ]
test_nn <- iris[-idx, ]
nn_fit <- nnet(
Species ~ .,
data = train_nn,
size = 5,
decay = 0.01,
maxit = 500,
trace = FALSE
)
nn_pred <- predict(nn_fit, newdata = test_nn, type = "class")
table(Prediksi = nn_pred, Aktual = test_nn$Species)
#> Aktual
#> Prediksi setosa versicolor virginica
#> setosa 14 0 0
#> versicolor 0 17 0
#> virginica 0 1 13
mean(nn_pred == test_nn$Species)
#> [1] 0.9777778
iris.Neural network memperluas ide regresi dan optimisasi menjadi arsitektur berlapis yang sangat fleksibel. Ini adalah fondasi untuk deep learning modern.
Pembaca mampu:
Model yang sangat baik di data latih belum tentu baik pada data baru. Karena itu evaluasi harus dilakukan secara out-of-sample.
Data dibagi menjadi train dan test. Kadang ditambah validation set untuk tuning.
Kelebihan:
Kekurangan:
Data dibagi menjadi \(K\) fold. Setiap fold bergiliran menjadi validation set, sementara sisanya menjadi training set.
\[ \text{CV Error} = \frac{1}{K}\sum_{k=1}^{K}\text{Error}_k \]
Kelebihan:
Untuk klasifikasi biner:
| Prediksi Positif | Prediksi Negatif | |
|---|---|---|
| Aktual Positif | TP | FN |
| Aktual Negatif | FP | TN |
Metrik penting:
\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
\[ \text{Precision} = \frac{TP}{TP + FP} \]
\[ \text{Recall} = \frac{TP}{TP + FN} \]
\[ F1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}} {\text{Precision} + \text{Recall}} \]
\[ \text{MAE} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| \]
\[ \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} \]
\[ R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} {\sum_{i=1}^{n}(y_i - \bar{y})^2} \]
set.seed(123)
k <- 5
fold_id <- sample(rep(1:k, length.out = nrow(iris)))
acc <- numeric(k)
for (i in 1:k) {
train_cv <- iris[fold_id != i, ]
test_cv <- iris[fold_id == i, ]
fit_cv <- glm(Species == "setosa" ~ Sepal.Length + Sepal.Width +
Petal.Length + Petal.Width,
data = train_cv, family = binomial())
prob_cv <- predict(fit_cv, newdata = test_cv, type = "response")
pred_cv <- ifelse(prob_cv > 0.5, TRUE, FALSE)
acc[i] <- mean(pred_cv == (test_cv$Species == "setosa"))
}
mean(acc)
#> [1] 1
actual <- c(1, 1, 1, 0, 0, 0, 1, 0)
pred <- c(1, 1, 0, 0, 0, 1, 1, 0)
TP <- sum(actual == 1 & pred == 1)
TN <- sum(actual == 0 & pred == 0)
FP <- sum(actual == 0 & pred == 1)
FN <- sum(actual == 1 & pred == 0)
accuracy <- (TP + TN) / (TP + TN + FP + FN)
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
f1 <- 2 * precision * recall / (precision + recall)
c(accuracy = accuracy, precision = precision, recall = recall, f1 = f1)
#> accuracy precision recall f1
#> 0.75 0.75 0.75 0.75
Evaluasi yang benar adalah syarat utama machine learning yang valid. Metrik harus dipilih berdasarkan tujuan, biaya kesalahan, dan karakter data.
UAS menilai kemampuan akhir mahasiswa untuk menyusun proyek machine learning dari awal sampai akhir secara utuh dan profesional.
Kemampuan yang diuji:
| Komponen | Bobot |
|---|---|
| Kejelasan masalah dan nilai analisis | 15% |
| Kualitas data cleaning dan EDA | 15% |
| Ketepatan metode dan tuning | 20% |
| Validasi, evaluasi, dan interpretasi | 25% |
| Report akhir | 15% |
| Presentasi | 10% |
UAS adalah sintesis seluruh mata kuliah. Mahasiswa tidak hanya dituntut menjalankan model, tetapi juga membuktikan bahwa proses analisisnya logis, bersih, dan dapat dipertanggungjawabkan.
Lampiran ini dirancang agar dosen atau mahasiswa dapat langsung mengubah setiap bab menjadi sesi praktikum.
Setiap pertemuan dilengkapi dengan:
Mahasiswa sering mengenal machine learning sebagai daftar algoritma.
Padahal, yang paling penting di awal adalah memahami tipe masalah, tipe data, dan alur kerja analisis.
irismtcarsUSArrestsiris.Bab ini penting karena mahasiswa perlu memahami bahwa banyak algoritma machine learning pada dasarnya adalah optimisasi loss.
mtcarslm() untuk mpg.Mahasiswa sering melihat banyak variabel sebagai hal yang selalu baik.
Padahal, banyak prediktor dapat memicu overfitting dan ketidakstabilan koefisien.
lambda.mtcarscv.glmnet() untuk Ridge.cv.glmnet() untuk Lasso.cv.glmnet() untuk Elastic Net.Pada data sosial, ekonomi, dan survei, jumlah variabel sering terlalu banyak dan saling berkorelasi.
USArrestsprcomp().factanal() dengan satu faktor pada
USArrests.Clustering berbasis jarak perlu diajarkan dengan hati-hati karena mahasiswa sering mengira cluster selalu memiliki jawaban benar tunggal.
USArrestscomplete, average, dan
ward.k.pam().Bab ini memperkenalkan perbedaan cluster keras dan cluster lunak.
nstart.irisiris.k = 3.nstart
berbeda.cmeans().Mahasiswa perlu belajar bahwa boosting kuat, tetapi tidak otomatis menjadi pilihan terbaik tanpa tuning.
mtcarsAirPassengersgbm untuk mtcars.n.trees terbaik.lag1 dan lag12 untuk
AirPassengers.UTS adalah latihan menyusun workflow yang utuh, bukan sekadar menjalankan fungsi R.
Bab ini berguna untuk memperlihatkan dua filosofi klasifikasi yang sangat berbeda:
k.irisk = 3, 5, 7, 9.k,k kecil rawan overfitting?Bab ini menjadi jembatan menuju ensemble tree.
cptable.irismtcarsiris.mtcars.cp,Mahasiswa perlu melihat secara nyata bagaimana banyak pohon dapat menurunkan variance.
irisrandomForest().ntree.mtry.Bab ini memperkenalkan klasifikasi berbasis margin maksimum.
cost dan gamma.irisSVR memperkenalkan versi regresi dari margin maksimum.
epsilon.mtcarsepsilon.epsilon penting?Mahasiswa perlu memahami neural network sebagai perluasan ide optimisasi, bukan sebagai “algoritma ajaib”.
irisnnet() dengan size = 3.size = 5 dan size = 7.Bab ini harus menutup celah umum mahasiswa yang hanya melaporkan akurasi.
irisUAS menuntut sintesis semua materi.
alpha = 0 pada glmnet berarti:
lambda.min pada cv.glmnet adalah:
m pada FCM mengontrol:
k = 1k yang terlalu kecil cenderung:
k besarmtry pada Random Forest adalah:
cost pada SVM mengontrol:
epsilon pada SVR adalah:
cost terlalu besar pada SVR, model cenderung:
b, karena ML berfokus pada pembelajaran pola dari
data.c, karena ada target kontinu yang ingin
diprediksi.b, karena clustering bekerja tanpa label target.b, karena generalisasi berarti performa baik pada data
baru.c, karena tanpa rumusan masalah model mudah salah
arah.a, karena regresi paling umum memakai MSE.c, itu adalah bentuk solusi OLS.b, parameter diperbarui ke arah negatif gradien.c, learning rate terlalu besar bisa membuat loss tidak
stabil.b, skala fitur yang seragam membantu optimisasi.b, Ridge memakai penalti L2.c, penalti L1 bisa membuat koefisien nol.b, Elastic Net berguna saat fitur berkorelasi dan
seleksi dibutuhkan.c, alpha = 0 adalah Ridge.b, lambda.min meminimalkan error
cross-validation.b, PCA meringkas dimensi.b, PCA berguna saat banyak variabel saling
berkorelasi.b, eigenvalue besar berarti komponen menjelaskan varian
besar.a, analisis faktor berfokus pada faktor laten.a, PCA sensitif pada skala karena berbasis
kovarians/korelasi.b, hierarchical clustering menghasilkan
dendrogram.b, complete linkage memakai jarak maksimum.a, medoid adalah observasi aktual sehingga lebih
robust.c, clustering adalah unsupervised learning.b, jarak sangat dipengaruhi skala fitur.a, K-means meminimalkan within-cluster sum of
squares.b, centroid awal memengaruhi solusi akhir.b, FCM mengizinkan keanggotaan parsial.b, m mengontrol tingkat kefuzzyan.a, elbow method sering dipakai untuk memilih jumlah
cluster.b, boosting membangun model secara berurutan.a, weak learner yang umum adalah tree kecil.a, learning rate besar bisa mempercepat
overfitting.b, time series sering diubah menjadi fitur lag.b, baseline diperlukan untuk menilai nilai tambah model
kompleks.b, UTS menilai workflow utuh.a, tanpa baseline tidak ada tolok ukur wajar.b, leakage terjadi saat informasi masa depan bocor ke
training.c, report harus menjelaskan proses dan hasil.b, metrik harus sesuai tujuan dan biaya kesalahan.b, Naive Bayes berasal dari teorema Bayes.b, asumsi kuncinya adalah independensi bersyarat.b, K-NN tidak membangun model parametrik saat
training.c, jarak pada K-NN sensitif terhadap skala.c, k kecil mudah sensitif terhadap
noise.a, tree klasifikasi menurunkan impurity seperti entropy
atau Gini.b, leaf regresi berisi rata-rata target.c, pruning dipakai untuk mengurangi overfitting.a, tree tidak bergantung pada jarak global antarf
fitur.b, split greedy membuat single tree kurang stabil.b, Random Forest membangun banyak tree dari bootstrap
sample.b, mtry adalah jumlah fitur kandidat per
split.b, OOB error dihitung dari observasi yang tidak
terambil dalam bootstrap tertentu.b, averaging banyak tree menurunkan variance.a, importance plot menunjukkan fitur berkontribusi
besar.a, SVM mencari margin maksimum.a, cost menyeimbangkan margin dan penalti
salah klasifikasi.b, kernel radial cocok untuk boundary non-linear.c, support vectors menentukan letak hyperplane.a, skala fitur sangat mempengaruhi margin dan
kernel.a, SVR adalah perluasan SVM ke regresi.b, epsilon adalah tabung toleransi.a, kernel radial menangkap hubungan non-linear.b, cost besar membuat model kurang
permisif terhadap error.b, fleksibilitas kernel adalah keunggulan utama
SVR.a, neuron menghitung kombinasi linear lalu
aktivasi.a, tanpa aktivasi non-linear jaringan kolaps menjadi
model linear.b, backpropagation menghitung gradien bobot.b, deep learning relevan untuk representasi
kompleks.a, neural network rawan overfitting.b, k-fold memberi estimasi performa yang lebih
stabil.b, precision adalah TP per seluruh prediksi
positif.a, recall penting saat false negative mahal.b, RMSE menghukum error besar lebih keras.b, test set dipakai pada evaluasi akhir.b, proyek akhir sebaiknya membandingkan beberapa
model.c, reprodusibilitas adalah syarat dasar proyek yang
baik.b, ringkasan eksekutif menyampaikan inti hasil dengan
cepat.b, keterbatasan menunjukkan batas validitas hasil.c, pemilihan model terbaik harus didukung argumen
teknis.| Aspek | Indikator |
|---|---|
| Kejelasan masalah | audiens paham apa yang dianalisis |
| Kualitas data | sumber dan kualitas data dijelaskan |
| Metodologi | model dan evaluasi dijelaskan benar |
| Hasil | metrik dan interpretasi konsisten |
| Komunikasi | slide rapi dan penjelasan lugas |
| Pertanyaan | mampu mempertahankan keputusan teknis |
iris, mtcars, dan
USArrests.iris.lm() untuk
mpg ~ wt + hp.mtcars.mtcars.cv.glmnet.cv.glmnet.alpha = 0.5.lambda.min tiap model.USArrests.prcomp().factanal() dengan satu faktor jika memakai
USArrests.USArrests.k = 3.pam() dengan k = 3.iris.centers = 3.nstart = 1, 10, dan
25.Species.gbm untuk mtcars.AirPassengers.iris menjadi train dan test.k = 3.k = 5.k = 7.iris.printcp().cp terbaik.mtcars.iris.ntree = 100, 300,
500.mtry.iris.cost.gamma untuk radial.mtcars menjadi train dan test.epsilon.cost.iris menjadi train dan test.nnet() dengan size = 3.size = 5.size = 7.decay.Apakah machine learning selalu lebih baik dari statistika
klasik?
Tidak. Pilihan metode harus mengikuti tujuan analisis, struktur data,
dan kebutuhan interpretasi.
Apakah akurasi tinggi selalu berarti model
bagus?
Tidak. Pada data tidak seimbang, akurasi bisa menyesatkan.
Apakah train error yang kecil berarti model siap
dipakai?
Tidak. Yang penting adalah performa out-of-sample.
Mengapa baseline model wajib dibuat?
Karena model kompleks harus dibuktikan memberi nilai tambah, bukan
diasumsikan selalu unggul.
Apakah semua fitur harus distandardisasi?
Tidak. Tergantung metode. K-NN, SVM, dan PCA sangat membutuhkannya,
sedangkan tree tidak selalu.
Mengapa cross-validation sering dipakai?
Karena ia memberi estimasi performa yang lebih stabil dibanding satu
split tunggal.
Apakah model paling kompleks selalu
terbaik?
Tidak. Kompleksitas berlebih bisa meningkatkan variance.
Apa beda validation set dan test set?
Validation set untuk tuning, test set untuk evaluasi akhir.
Apa itu data leakage?
Kebocoran informasi dari masa depan atau dari target ke proses
training.
Mengapa interpretasi model penting?
Karena keputusan nyata sering memerlukan penjelasan yang dapat
dipertanggungjawabkan.
Salah memilih tipe masalah.
Mahasiswa kadang mengerjakan clustering untuk masalah yang sebenarnya
klasifikasi.
Tidak membedakan fitur dan target.
Ini membuat workflow kacau sejak awal.
Langsung memakai model paling rumit.
Kebiasaan ini membuat evaluasi tidak disiplin.
Mengabaikan eksplorasi data.
Akibatnya model dibangun tanpa memahami struktur data.
Tidak memeriksa missing values.
Hasil model bisa salah atau gagal dijalankan.
Tidak memeriksa ketidakseimbangan kelas.
Ini membuat accuracy kelihatan bagus padahal model gagal menangkap kelas
minoritas.
Melakukan scaling sebelum split.
Ini bisa memicu leakage ringan.
Menggunakan test set untuk tuning.
Ini merusak validitas evaluasi.
Melaporkan angka tanpa interpretasi.
Hasil menjadi miskin makna.
Terlalu fokus pada satu metrik.
Kadang precision, recall, dan F1 jauh lebih relevan.
Mengapa Ridge tidak menghilangkan fitur?
Karena penalti L2 menyusutkan koefisien tanpa mendorong nol secara
keras.
Mengapa Lasso bisa tidak stabil saat fitur sangat
berkorelasi?
Karena ia bisa memilih salah satu fitur secara arbitrer.
Mengapa PCA bukan metode klasifikasi?
Karena PCA mereduksi dimensi, bukan memprediksi kelas.
Apakah cluster selalu punya label benar?
Tidak. Clustering lebih bersifat eksploratif.
Mengapa K-means sensitif pada outlier?
Karena pusat cluster berbasis rata-rata.
Mengapa FCM berguna?
Karena beberapa observasi memang berada pada batas
antarcluster.
Mengapa boosting perlu tuning hati-hati?
Karena model sangat fleksibel dan bisa overfit.
Mengapa Naive Bayes bisa tetap bagus walau asumsi
independensi tidak realistis?
Karena klasifikasi sering masih bekerja baik meski asumsi tidak
sempurna.
Mengapa K-NN butuh scaling?
Karena ia memakai jarak antarf titik.
Mengapa decision tree mudah dijelaskan?
Karena output-nya berupa aturan if-then yang eksplisit.
Mengapa single tree tidak stabil?
Karena split awal sangat mempengaruhi seluruh struktur
berikutnya.
Mengapa Random Forest sering lebih akurat?
Karena banyak tree menurunkan variance.
Mengapa SVM kuat pada data berdimensi menengah sampai
tinggi?
Karena margin maksimum dan kernel dapat membentuk boundary
kuat.
Mengapa SVR menarik?
Karena ia membawa fleksibilitas SVM ke masalah regresi.
Mengapa neural network butuh banyak
tuning?
Karena banyak parameter dan arsitektur mempengaruhi hasil.
Berapa banyak model yang sebaiknya
dibandingkan?
Minimal satu baseline dan satu atau dua model pembanding yang
relevan.
Apakah visualisasi harus banyak?
Tidak. Yang penting informatif dan mendukung argumen.
Apakah report harus panjang?
Tidak. Yang penting jelas, logis, dan lengkap.
Apakah semua output R perlu ditempel ke
report?
Tidak. Pilih output yang penting.
Apa yang harus dilakukan jika dua model punya akurasi
mirip?
Pertimbangkan stabilitas, interpretasi, dan biaya implementasi.
Bagaimana jika model terbaik sulit
dijelaskan?
Jelaskan hasilnya, bandingkan dengan model interpretable, dan tulis
trade-off secara jujur.
Apakah dataset kecil masih boleh dipakai?
Boleh, tetapi batasi klaim dan gunakan evaluasi yang hati-hati.
Apa yang harus dilakukan jika data sangat
kotor?
Dokumentasikan proses cleaning dan jelaskan keterbatasan data.
Apakah boleh memakai data sintetis?
Boleh untuk pembelajaran metode, tetapi proyek utama sebaiknya memakai
data nyata.
Bagaimana memilih topik proyek?
Pilih masalah yang datanya tersedia, targetnya jelas, dan bisa
dievaluasi.
Mengapa reproducibility penting?
Karena hasil harus dapat diulangi oleh orang lain.
Apakah perlu menyimpan seed?
Ya, terutama untuk split acak dan model stokastik.
Bagaimana jika hasil antar-run berbeda?
Catat seed, lakukan pengulangan, dan laporkan variabilitas bila
perlu.
Apa yang harus ditulis pada bagian
keterbatasan?
Keterbatasan data, metode, asumsi, dan ruang lingkup
generalisasi.
Apa ciri proyek machine learning yang
matang?
Masalah jelas, data rapi, evaluasi benar, interpretasi konsisten, dan
kode reprodusibel.
Proporsi prediksi yang benar dari seluruh observasi. Catatan: berguna jika kelas relatif seimbang.
Fungsi non-linear yang diterapkan pada output neuron. Catatan: contoh umum adalah sigmoid, tanh, dan ReLU.
Metode boosting yang menekankan observasi yang salah diprediksi pada iterasi sebelumnya. Catatan: salah satu ensemble klasik.
Serangkaian langkah sistematis untuk menyelesaikan masalah. Catatan: dalam ML, algoritma biasanya mengoptimalkan loss tertentu.
Area under ROC curve untuk mengukur kemampuan model membedakan kelas. Catatan: sering dipakai pada klasifikasi biner.
Prosedur menghitung gradien pada neural network dengan aturan rantai. Catatan: fondasi training deep learning.
Bootstrap aggregating yang menggabungkan banyak model dari bootstrap sample. Catatan: Random Forest dibangun di atas prinsip ini.
Model acuan sederhana yang dipakai sebagai pembanding awal. Catatan: wajib ada pada proyek yang disiplin.
Sekelompok observasi yang diproses bersama saat training. Catatan: umum pada gradient-based learning.
Komponen error karena model terlalu sederhana atau terlalu kaku. Catatan: bias tinggi sering terkait underfitting.
Masalah klasifikasi dengan dua kelas. Catatan: contoh umum adalah ya/tidak atau fraud/tidak.
Visualisasi PCA yang menampilkan observasi dan loading komponen sekaligus. Catatan: berguna untuk interpretasi awal.
Sampel acak dengan pengembalian dari data asli. Catatan: dipakai pada bagging dan Random Forest.
Classification and Regression Trees. Catatan: algoritma pohon biner yang sangat populer.
Pusat cluster pada K-means. Catatan: dihitung sebagai rata-rata anggota cluster.
Kondisi saat distribusi kelas sangat tidak seimbang. Catatan: accuracy sering menyesatkan pada kondisi ini.
Masalah prediksi kategori. Catatan: target berbentuk label atau kelas.
Kelompok observasi yang mirip satu sama lain. Catatan: hasil cluster tidak selalu unik.
Tabel silang antara kelas aktual dan prediksi. Catatan: dasar perhitungan accuracy, precision, recall, dan F1.
Parameter regularisasi pada SVM/SVR. Catatan: mengontrol penalti kesalahan.
Teknik evaluasi dengan membagi data ke beberapa fold. Catatan: memberi estimasi performa lebih stabil.
Kebocoran informasi yang seharusnya tidak tersedia saat training. Catatan: harus dihindari.
Proses menemukan pola berguna dari data. Catatan: machine learning adalah salah satu komponennya.
Pembelajaran dengan neural network berlapis banyak. Catatan: sangat kuat untuk data tidak terstruktur.
Batas yang memisahkan kelas dalam ruang fitur. Catatan: bentuknya tergantung model.
Model berbasis aturan if-then yang membagi ruang fitur secara bertingkat. Catatan: sangat interpretatif.
Teknik mengurangi jumlah variabel efektif. Catatan: contoh utamanya PCA.
Ukuran kedekatan antarobservasi. Catatan: Euclidean dan Manhattan adalah contoh umum.
Regularisasi gabungan L1 dan L2. Catatan: cocok saat fitur berkorelasi.
Strategi menggabungkan banyak model untuk meningkatkan performa. Catatan: bagging dan boosting adalah contoh utama.
Ukuran impurity yang berasal dari teori informasi. Catatan: dipakai pada split decision tree.
Satu putaran penuh melalui seluruh data training. Catatan: umum pada optimisasi neural network.
Lebar tabung toleransi error pada SVR. Catatan: error kecil di dalam tabung tidak dihukum.
Ukuran kuantitatif untuk menilai performa model. Catatan: harus sesuai tujuan masalah.
Metode untuk memodelkan konstruk atau faktor laten. Catatan: berbeda dari PCA.
Variabel input yang dipakai model. Catatan: disebut juga prediktor atau atribut.
Proses merancang atau mentransformasi fitur agar model lebih efektif. Catatan: penting pada banyak proyek praktis.
Rata-rata harmonik precision dan recall. Catatan: berguna untuk data tidak seimbang.
Satu bagian data dalam cross-validation. Catatan: tiap fold bergantian menjadi validation set.
Metode clustering yang memberi derajat keanggotaan parsial. Catatan: cocok untuk batas cluster yang kabur.
Parameter kernel radial pada SVM/SVR. Catatan: mengontrol kelokalan pengaruh observasi.
Kemampuan model bekerja baik pada data baru. Catatan: inti utama machine learning.
Ukuran impurity yang umum dipakai pada CART. Catatan: alternatif entropy.
Vektor turunan parsial loss terhadap parameter. Catatan: menentukan arah pembaruan parameter.
Boosting yang membangun model berdasarkan arah negative gradient dari loss. Catatan: sangat kuat untuk banyak tugas prediksi.
Algoritma optimisasi iteratif berbasis gradien. Catatan: dipakai dari regresi sampai deep learning.
Strategi evaluasi dengan satu kali split train-test. Catatan: sederhana tetapi bisa kurang stabil.
Parameter yang ditetapkan pengguna sebelum training. Catatan: berbeda dari parameter model yang dipelajari.
Ukuran ketidakmurnian kelas dalam node decision tree. Catatan: contoh umum adalah entropy dan Gini.
Penurunan entropy akibat suatu split. Catatan: dipakai untuk memilih split terbaik.
Lapisan pertama neural network yang menerima fitur. Catatan: tidak melakukan prediksi akhir sendiri.
Konstanta dalam model regresi atau model linear. Catatan: sering ditulis \(\beta_0\).
Satu langkah pembaruan parameter. Catatan: banyak algoritma berjalan iteratif.
Cross-validation dengan membagi data menjadi \(K\) bagian. Catatan: salah satu prosedur evaluasi paling umum.
Metode clustering berbasis centroid. Catatan: cepat dan populer untuk data numerik.
Metode clustering berbasis medoid. Catatan: lebih robust terhadap outlier dibanding K-means.
Metode prediksi berdasarkan tetangga terdekat. Catatan: termasuk lazy learner.
Fungsi untuk memetakan atau mengukur kemiripan di ruang fitur yang lebih tinggi. Catatan: inti kekuatan SVM non-linear.
Nilai masa lalu dari sebuah deret waktu. Catatan: fitur penting pada forecasting berbasis ML.
Parameter regularisasi pada Ridge, Lasso, dan Elastic Net. Catatan: mengontrol besar penalti.
Regresi dengan penalti L1. Catatan: dapat melakukan seleksi fitur.
Variabel yang tidak diukur langsung tetapi diasumsikan memengaruhi variabel teramati. Catatan: konsep inti analisis faktor.
Node terminal pada decision tree. Catatan: berisi prediksi akhir.
Ukuran langkah dalam pembaruan parameter. Catatan: terlalu besar bisa tidak stabil, terlalu kecil bisa lambat.
Model yang menghubungkan input dan output secara linear dalam parameter. Catatan: regresi linear adalah contoh utamanya.
Fungsi yang mengukur kesalahan prediksi model. Catatan: training umumnya meminimalkan loss.
Mean absolute error. Catatan: lebih robust terhadap outlier daripada RMSE.
Jarak antara hyperplane dan observasi terdekat pada SVM. Catatan: SVM berusaha memaksimalkan margin.
Observasi representatif yang menjadi pusat cluster pada K-medoids. Catatan: berbeda dari centroid yang berupa rata-rata.
Sebagian kecil data yang dipakai per langkah training. Catatan: umum pada deep learning.
Ukuran impurity sederhana berbasis proporsi kelas mayoritas. Catatan: kurang sensitif untuk split awal dibanding Gini atau entropy.
Representasi matematis atau algoritmik dari hubungan data. Catatan: model dipakai untuk prediksi atau pemahaman pola.
Klasifikasi dengan lebih dari dua kelas. Catatan: contoh klasik
adalah dataset iris.
Korelasi tinggi antarfitur. Catatan: masalah ini memotivasi regularisasi pada regresi.
Klasifikasi probabilistik berbasis teorema Bayes dan asumsi independensi bersyarat. Catatan: sangat populer untuk data teks.
Model berlapis yang tersusun dari neuron-neuron buatan. Catatan: sangat fleksibel tetapi butuh tuning.
Simpul dalam struktur tree. Catatan: bisa berupa root, internal, atau leaf.
Hubungan yang tidak dapat dijelaskan dengan garis lurus sederhana. Catatan: banyak model ML unggul pada pola ini.
Fungsi yang dioptimalkan saat training. Catatan: sering sama atau sangat dekat dengan loss function.
Representasi variabel kategorik menjadi kolom indikator. Catatan: umum diperlukan pada model tertentu.
Estimasi error pada Random Forest dari observasi yang tidak masuk bootstrap sample tertentu. Catatan: mengurangi kebutuhan validation set terpisah.
Observasi ekstrem yang berbeda jauh dari sebagian besar data. Catatan: dapat memengaruhi model secara berbeda tergantung metodenya.
Kondisi saat model terlalu menyesuaikan data latih. Catatan: generalisasi ke data baru menjadi buruk.
Principal component analysis. Catatan: metode utama reduksi dimensi linier.
Nilai internal model yang dipelajari dari data. Catatan: berbeda dari hyperparameter.
Pembagian ruang fitur menjadi bagian-bagian tertentu. Catatan: decision tree bekerja dengan partisi bertingkat.
Rangkaian langkah analisis dari data mentah sampai evaluasi atau deployment. Catatan: penting untuk workflow yang rapi.
Proporsi prediksi positif yang benar. Catatan: penting saat false positive mahal.
Output yang dihasilkan model untuk observasi baru. Catatan: bisa berupa nilai, kelas, atau probabilitas.
Variabel input dalam model. Catatan: sinonim dengan fitur atau kovariat.
Tahap pembersihan dan persiapan data sebelum modeling. Catatan: termasuk scaling, encoding, dan handling missing values.
Proses memotong cabang tree agar lebih sederhana dan stabil. Catatan: penting pada single tree.
Ensemble banyak decision tree dengan bootstrap dan random feature selection. Catatan: sangat kuat sebagai baseline.
Proporsi kelas positif aktual yang berhasil ditangkap model. Catatan: penting saat false negative mahal.
Masalah prediksi target kontinu. Catatan: contoh target adalah harga atau jumlah.
Penambahan penalti untuk mengontrol kompleksitas model. Catatan: membantu mencegah overfitting.
Rectified linear unit. Catatan: fungsi aktivasi populer pada deep learning.
Selisih antara nilai aktual dan prediksi. Catatan: analisis residual penting pada regresi.
Regresi dengan penalti L2. Catatan: efektif untuk multikolinearitas.
Root mean squared error. Catatan: menghukum error besar lebih kuat daripada MAE.
Kurva trade-off true positive rate dan false positive rate. Catatan: sering dipakai untuk klasifikasi biner.
Node pertama pada decision tree. Catatan: split awal biasanya sangat menentukan.
Proses mengambil aturan if-then dari model tree. Catatan: berguna untuk komunikasi hasil.
Penyesuaian skala variabel input. Catatan: penting untuk metode berbasis jarak atau margin.
Plot eigenvalue atau proporsi varian pada PCA. Catatan: membantu memilih jumlah komponen.
Nilai awal untuk generator bilangan acak. Catatan: penting untuk reproducibility.
Pembelajaran dengan sebagian data berlabel dan sebagian tidak. Catatan: berguna saat label mahal.
Istilah lain untuk recall pada klasifikasi biner. Catatan: sering dipakai di bidang medis.
Ukuran kualitas clustering berbasis kekompakan dan pemisahan cluster. Catatan: makin besar biasanya makin baik.
Versi SVM yang mengizinkan beberapa pelanggaran margin. Catatan: lebih realistis untuk data nyata.
Aturan pemisahan node dalam decision tree. Catatan: dipilih untuk menurunkan impurity atau error.
Transformasi agar fitur memiliki mean nol dan simpangan baku satu. Catatan: sangat penting untuk PCA, K-NN, dan SVM.
Gradient descent yang memperbarui parameter dengan sebagian kecil data. Catatan: umum pada dataset besar.
Observasi yang menentukan posisi hyperplane pada SVM. Catatan: tidak semua titik data menjadi support vector.
Metode klasifikasi berbasis margin maksimum. Catatan: dapat diperluas dengan kernel.
Versi regresi dari SVM. Catatan: memakai epsilon-insensitive loss.
Pembelajaran dengan input dan target berlabel. Catatan: mencakup regresi dan klasifikasi.
Split pengganti saat variabel utama pada node memiliki nilai hilang. Catatan: tersedia pada beberapa implementasi tree.
Bagian data yang disimpan untuk evaluasi akhir. Catatan: tidak boleh dipakai untuk tuning.
Nilai batas untuk membuat keputusan atau split. Catatan: muncul pada tree dan klasifikasi probabilistik.
Data yang terurut menurut waktu. Catatan: perlu perhatian pada lag, tren, dan musim.
Bagian data yang dipakai melatih model. Catatan: menjadi basis belajar parameter.
Proses memilih hyperparameter terbaik. Catatan: biasanya memakai validation set atau cross-validation.
Pembelajaran tanpa label target. Catatan: clustering dan reduksi dimensi adalah contoh umum.
Kondisi saat model terlalu sederhana untuk menangkap pola data. Catatan: biasanya terkait bias tinggi.
Bagian data untuk memilih model atau hyperparameter. Catatan: berbeda dari test set.
Komponen error karena model terlalu sensitif terhadap data latih. Catatan: variance tinggi sering terkait overfitting.
Ukuran kontribusi fitur dalam model tertentu. Catatan: umum dilaporkan pada model tree-based.
Model sederhana yang performanya sedikit lebih baik dari tebakan acak. Catatan: boosting menggabungkan banyak weak learner.
Bentuk regularisasi pada neural network. Catatan: konsepnya serupa penalti L2.
Jumlah kuadrat jarak dalam cluster. Catatan: objective function utama K-means.
glmnet, cluster,
e1071, rpart, randomForest,
gbm, dan nnet.Struktur ebook ini sengaja dibuat bertahap: mulai dari fondasi, lalu ke metode yang makin kompleks, dan ditutup dengan evaluasi serta proyek. Dengan alur ini, pembaca tidak hanya menghafal algoritma, tetapi memahami alasan kapan dan mengapa sebuah metode dipakai.