Pohon Keputusan: Dasar Ensemble
Bangun dan visualisasikan pohon keputusan dengan rpart serta pahami pertukaran bias-varian.
Pohon Keputusan: Dasar Ensemble adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Cara Pohon Keputusan Membagi Data
Pohon keputusan secara rekursif membagi ruang fitur menjadi wilayah-wilayah persegi panjang. Di setiap simpul, algoritme mencari semua fitur dan semua titik pemisahan yang mungkin untuk menemukan pemisahan yang paling baik memisahkan variabel target. Hasilnya adalah pohon yang terdiri atas aturan jika-maka.
library(rpart)
# Fit a classification tree
tree <- rpart(
Species ~ .,
data = iris,
method = 'class' # use 'anova' for regression
)
print(tree)Kriteria Pemisahan GINI vs Entropi
Kriteria pemisahan mengukur ketidakmurnian sebuah simpul. Ketidakmurnian Gini mengukur probabilitas salah mengklasifikasikan elemen yang dipilih secara acak. Entropi (perolehan informasi) mengukur pengurangan ketidakteraturan informasi. Keduanya biasanya menghasilkan pohon yang serupa; Gini lebih cepat dihitung dan merupakan pilihan bawaan rpart.
# Default: Gini impurity (parms = list(split = 'gini'))
tree_gini <- rpart(Species ~ ., data = iris, method = 'class')
# Using information gain (entropy)
tree_entropy <- rpart(
Species ~ ., data = iris, method = 'class',
parms = list(split = 'information')
)
cat('Gini root split:', tree_gini$frame$var[1])
cat('Entropy root split:', tree_entropy$frame$var[1])printcp() — Tabel Kompleksitas
printcp(tree) mencetak tabel parameter kompleksitas (CP). Setiap baris menampilkan ukuran pohon (jumlah pemisahan), galat relatifnya pada data pelatihan, dan galat tervalidasi silang (xerror). Tabel CP digunakan untuk menemukan tingkat pemangkasan yang optimal.
tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova',
control = rpart.control(minsplit = 5, cp = 0.001))
printcp(tree)
# Identify the CP with minimum cross-validated error
best_cp <- tree$cptable[
which.min(tree$cptable[, 'xerror']),
'CP'
]
cat('Best CP:', best_cp)prune() — Memangkas Pohon
prune(tree, cp) memangkas pohon hingga tingkat kompleksitas yang ditentukan oleh cp. Pemangkasan mencegah overfitting dengan menggabungkan cabang yang hanya memberikan sedikit nilai prediktif. Pendekatan standar adalah menemukan CP yang meminimalkan galat CV, lalu melakukan pemangkasan.
best_cp <- tree$cptable[
which.min(tree$cptable[, 'xerror']), 'CP'
]
pruned_tree <- prune(tree, cp = best_cp)
cat('Original tree nodes:', nrow(tree$frame))
cat('Pruned tree nodes:', nrow(pruned_tree$frame))rpart.plot() — Memvisualisasikan Pohon
rpart.plot(tree) dari paket rpart.plot menghasilkan visualisasi pohon keputusan yang rapi dan berwarna. Setiap simpul internal menampilkan aturan pemisahan; setiap daun menampilkan kelas prediksi dan proporsi sampel pelatihan.
library(rpart.plot)
tree <- rpart(Species ~ ., data = iris, method = 'class')
pruned <- prune(tree, cp = 0.02)
rpart.plot(
pruned,
type = 4, # split labels on branches
extra = 104, # show class + probability
fallen.leaves = TRUE
)Kompromi Bias-Varians
Pohon yang dalam dan tidak dipangkas memiliki bias rendah (hampir sempurna menyesuaikan data pelatihan), tetapi varians tinggi (perubahan kecil pada data menghasilkan pohon yang sangat berbeda). Pohon yang dangkal atau dipangkas memiliki bias lebih tinggi, tetapi varians lebih rendah. Pohon yang optimal menyeimbangkan kedua sumber galat ini.
Metode ansambel seperti hutan acak dan boosting mengatasi kompromi ini secara langsung.
# Deep tree = low bias, high variance (overfits)
deep_tree <- rpart(medv ~ ., data = MASS::Boston,
control = rpart.control(minsplit = 2, cp = 0))
# Shallow tree = high bias, low variance (underfits)
shallow_tree <- rpart(medv ~ ., data = MASS::Boston,
control = rpart.control(maxdepth = 2))
cat('Deep nodes:', nrow(deep_tree$frame))
cat('Shallow nodes:', nrow(shallow_tree$frame))Overfitting pada Pohon Keputusan
Pohon yang tidak dipangkas dapat mencapai galat pelatihan nol dengan menghafalkan setiap contoh pelatihan. Ketika pohon yang sama dievaluasi pada data yang belum pernah dilihat, kinerjanya menurun drastis. Ini merupakan contoh klasik overfitting dalam pembelajaran terawasi.
set.seed(42)
train_idx <- sample(nrow(MASS::Boston), 400)
train_bos <- MASS::Boston[train_idx, ]
test_bos <- MASS::Boston[-train_idx, ]
# Fully grown tree
full <- rpart(medv ~ ., data = train_bos,
control = rpart.control(cp = 0, minsplit = 2))
train_pred <- predict(full, train_bos)
test_pred <- predict(full, test_bos)
cat('Train RMSE:', sqrt(mean((train_pred - train_bos$medv)^2)))
cat('Test RMSE:', sqrt(mean((test_pred - test_bos$medv)^2)))Kepentingan Variabel dari rpart
rpart mencatat variable.importance untuk setiap prediktor: total peningkatan pada kriteria pemisahan yang dapat dikaitkan dengan variabel tersebut di semua pemisahan. Ini memberikan indikasi cepat tentang fitur yang paling memengaruhi keputusan model.
tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova')
# Variable importance (sorted)
imp <- sort(tree$variable.importance, decreasing = TRUE)
print(imp)
# Quick barplot
barplot(imp, las = 2, main = 'Variable Importance',
col = 'steelblue', cex.names = 0.8)Dari Pohon ke Ansambel
Satu pohon keputusan tidak stabil: pengambilan sampel ulang data dapat menghasilkan pohon yang sangat berbeda. Metode ansambel memanfaatkan ketidakstabilan ini:
- Bagging / Hutan Acak: Merata-ratakan banyak pohon pada sampel bootstrap.
- Boosting: Membangun pohon secara berurutan, dengan setiap pohon memperbaiki galat pohon sebelumnya.
- Keduanya mengurangi varians sambil mempertahankan daya ekspresif pohon.
# Demonstrating instability of a single tree
set.seed(1); t1 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
set.seed(2); t2 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
# Root split may differ between trees
cat('Tree 1 root split:', t1$frame$var[1])
cat('Tree 2 root split:', t2$frame$var[1])Parameter Kontrol rpart
rpart.control() mengatur cara pohon tumbuh. Parameter utama: cp (penalti kompleksitas), minsplit (jumlah pengamatan minimum untuk mencoba suatu pemisahan), minbucket (ukuran daun minimum), dan maxdepth. Memahami parameter-parameter ini sangat penting untuk menyetel model berbasis pohon.
ctrl <- rpart.control(
cp = 0.005, # complexity penalty
minsplit = 20, # min obs to try a split
minbucket = 7, # min obs in any leaf
maxdepth = 10 # max tree depth
)
tree <- rpart(medv ~ ., data = MASS::Boston,
method = 'anova', control = ctrl)
printcp(tree)Mengevaluasi Kinerja Pohon
Setelah pemangkasan, evaluasilah pohon pada set pengujian yang disisihkan. Untuk regresi, hitung RMSE dan R-kuadrat; untuk klasifikasi, hitung akurasi dan matriks kebingungan. Bandingkan metrik ini dengan model pembanding untuk memahami nilai yang diberikan oleh satu pohon.
pruned_tree <- prune(tree, cp = best_cp)
test_pred <- predict(pruned_tree, newdata = test_bos)
rmse <- sqrt(mean((test_pred - test_bos$medv)^2))
ss_res <- sum((test_pred - test_bos$medv)^2)
ss_tot <- sum((test_bos$medv - mean(test_bos$medv))^2)
r2 <- 1 - ss_res / ss_tot
cat('RMSE:', round(rmse, 3))
cat('R2:', round(r2, 3))Pemeriksaan Singkat
Pernyataan mana yang paling tepat menjelaskan tujuan memanggil prune(tree, cp = best_cp)?
Ringkasan Pohon Keputusan
Hal-hal penting dari Pohon Keputusan — Dasar Ansambel:
- Pohon secara rekursif membagi ruang fitur; pemisahan menggunakan kriteria Gini atau entropi.
rpart(y ~ ., data, method)menyesuaikan pohon;printcp()menampilkan tabel kompleksitas.- Temukan CP dengan galat tervalidasi silang minimum, lalu gunakan
prune(tree, cp). rpart.plot()memvisualisasikan struktur pohon.- Pohon yang dalam mengalami overfitting (bias rendah, varians tinggi); pohon yang dangkal mengalami underfitting.
tree$variable.importancemengurutkan prediktor berdasarkan total peningkatan pemisahannya.- Metode ansambel (hutan acak, boosting) mengatasi ketidakstabilan satu pohon.
# Standard rpart workflow
tree <- rpart(y ~ ., data = train, method = 'anova',
control = rpart.control(cp = 0.001))
best_cp <- tree$cptable[which.min(tree$cptable[, 'xerror']), 'CP']
pruned <- prune(tree, cp = best_cp)
test_pred <- predict(pruned, newdata = test)
rmse <- sqrt(mean((test_pred - test$y)^2))
cat('Pruned Tree RMSE:', rmse)Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pohon Keputusan: Dasar Ensemble” gratis?
Ya — teks lengkap “Pohon Keputusan: Dasar Ensemble” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pohon Keputusan: Dasar Ensemble”?
Bangun dan visualisasikan pohon keputusan dengan rpart serta pahami pertukaran bias-varian. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Pohon Keputusan: Dasar Ensemble” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pohon Keputusan: Dasar Ensemble
- Hutan Acak dengan ranger
- Peningkatan Gradien dengan xgboost
- Kepentingan Fitur dan Interpretasi Model