Modul 8 - Decision Tree
Modul 8 - Decision Tree
2025-03-11
TUJUAN PRAKTIKUM
1. Mahasiswa dapat menggunakan model decision tree
2. Mahasiswa dapat menerapkan regresi tree untuk melakukan prediksi model
3. Mahasiswa dapat menggunakan model random forest
Install Library
Install beberapa library yang digunakan untuk pemodelan pada modul ini dan kepentingan EDA dll.
install.packages("knitr")
install.packages("ISLR")
install.packages("DataExplorer")
install.packages("tree")
install.packages("ggplot2")
install.packages("corrplot")
install.packages("stringr")
install.packages("rpart")
install.packages("rpart.plot")
install.packages("randomForest")
install.packages("gbm")
install.packages("MASS")
Import Library
Library yang digunakan dalam modul ini mencakup :
library(knitr) # Pustaka konverter dari Rmd file ke berbagai file (ex. PDF, HTML etc)
library(ISLR) # Pustaka kumpulan dataset untuk keperluan analisis statistik
library(MASS) # Pustaka kumpulan dataset untuk keperluan analisis statistik
library(DataExplorer) # Pustaka EDA (Exploratory Data Analysis)
library(tree) # Pustaka untuk pemodelan pohon (Decision Tree dan Random Forest)
library(ggplot2) # Pustaka grafik yang dibutuhkan saat proses analisis
library(corrplot) # Pustaka untuk analisis korelasi
library(dplyr) # Pustaka untuk memanipulasi perintah R-lang untuk beberapa task
library(stringr) # Pustaka untuk manipulasi string
library(rpart) # Pustaka decision tree untuk melihatnya dengan mudah
library(rpart.plot) # Pustaka plot hasil dari konversasi dari nilai rpart
library(randomForest) # Pustaka untuk pemodelan random forest
library(gbm) # Pustaka untuk melakukan boosting pada model random forest
1
Melihat Dataset
Kita menggunakan library kable() untuk melihat dataset yang ada dengan masing-masing dari parameter
mewakili format yang menentukan output nantinya.
head_carseats <- head(Carseats, 20) # Membatasi baris keluaran data menjadi 20 baris
kable(head_carseats, format='markdown', align='c', label="Carseats Dataset",
caption="Carseats Dataframe", padding=2)
Sales CompPrice Income Advertising Population Price ShelveLoc Age Education Urban US
9.50 138 73 11 276 120 Bad 42 17 Yes Yes
11.22 111 48 16 260 83 Good 65 10 Yes Yes
10.06 113 35 10 269 80 Medium 59 12 Yes Yes
7.40 117 100 4 466 97 Medium 55 14 Yes Yes
4.15 141 64 3 340 128 Bad 38 13 Yes No
10.81 124 113 13 501 72 Bad 78 16 No Yes
6.63 115 105 0 45 108 Medium 71 15 Yes No
11.85 136 81 15 425 120 Good 67 10 Yes Yes
6.54 132 110 0 108 124 Medium 76 10 No No
4.69 132 113 0 131 124 Medium 76 17 No Yes
9.01 121 78 9 150 100 Bad 26 10 No Yes
11.96 117 94 4 503 94 Good 50 13 Yes Yes
3.98 122 35 2 393 136 Medium 62 18 Yes No
10.96 115 28 11 29 86 Good 53 18 Yes Yes
11.17 107 117 11 148 118 Good 52 18 Yes Yes
8.71 149 95 5 400 144 Medium 76 18 No No
7.58 118 32 0 284 110 Good 63 13 Yes No
12.29 147 74 13 251 131 Good 52 10 Yes Yes
13.91 110 110 0 408 68 Good 46 17 No Yes
8.73 129 76 16 58 121 Medium 69 12 Yes Yes
EDA
introduce(Carseats)
2
plot_intro(Carseats)
Dimension
Metrics
column
All Missing Columns 0%
observation
row
Missing Observations 0%
3
US 0%
Urban 0%
Education 0%
Age 0%
ShelveLoc 0%
Features
Price 0%
Population 0%
Advertising 0%
Income 0%
CompPrice 0%
Sales 0%
−0.050 −0.025 0.000 0.025 0.050
Missing Rows
Band Good
Kunci dari EDA ini untuk memastikan bahwa data yang digunakan dalam kondisi baris data tidak ada yang
hilang dari setiap kolom dengan band yang menandakan data sudah cukup baik untuk dilakukan tahapan
selanjutnya.
4
CompPrice
Sales
Sales 1.00
Income
Advertising
CompPrice 0.06 1.00
Population
Income 0.15−0.08 1.00
Price
Population 0.05−0.09−0.01 0.27 1.00
Education
Age
Price −0.44 0.58−0.06 0.04−0.01 1.00
Plot korelasi diatas dapat dibaca dengan sangat mudah dengan melihat angka yang semakin mendekati
nilai 1 akan berkorelasi positif dengan asumsi bahwa jika satu variabel meningkat, maka variabel lain
juga cenderung meningkat. Dengan kata lain, ada hubungan linier antara kedua variabel di mana mereka
bergerak ke arah yang sama. Sebaliknya asumsi korelasi negatif menyatakan bahwa jika satu variabel
meningkat, maka variabel lain cenderung menurun. Pada grafik korelasi diatas didapatkan beberapa insight
kolom Price berkorelasi positif yang cukup besar terhadap CompPrice dan berkorelasi negatif dengan
kolom Sales. Dengan demikian, kita dapat mengambil kesimpulan fitur penting dari numerik pada data
ini adalah kolom Price.
5
names(data) <- str_to_lower(names(data))
Kita sekarang menggunakan fungsi tree() agar sesuai dengan pohon klasifikasi untuk memprediksi ‘High’
tree() menggunakan semua variabel kecuali Sales(Penjualan). Sintaks fungsi tree() sangat mirip dengan
fungsi lm() pada regresi linear di modul sebelumnya.
# Set up initial tree
tree <- tree(high ~ . -sales, data)
Keluaran dari pohon ini disimpan dalam sebuah list, yang dapat kita rangkum untuk melihat variabel yang
digunakan dalam simpul internal, jumlah simpul terminal, dan tingkat kesalahan pelatihan. Anda juga bisa
memanggil objek itu sendiri untuk mendapatkan seluruh representasi pohon. Node terminal dilambangkan
dengan tanda bintang.
Fungsi summary() mencantumkan variabel yang digunakan sebagai node internal di pohon, jumlah node
terminal, dan tingkat kesalahan (pelatihan).
summary(tree)
##
## Classification tree:
## tree(formula = high ~ . - sales, data = data)
## Variables actually used in tree construction:
## [1] "shelveloc" "price" "income" "compprice" "population"
## [6] "advertising" "age" "us"
## Number of terminal nodes: 27
## Residual mean deviance: 0.4575 = 170.7 / 373
## Misclassification error rate: 0.09 = 36 / 400
Output dari klasifikasi pohon diatas dapat direpresentasikan masing-masing bagian informasinya sebagai
berikut : - Variabel yang benar-benar digunakan dan konstruksi pohon diatas adalah : shelveloc, price,
income, compprice, population, advertising, age dan us. - Banyaknya terminal node atau root dari setiap
ranting cabang pohon ada 27 buah - Rataan residual deviasinya sebesar 0.4575 dikarnakan ini model masih
sangat berkaitan dengan regresi maka hasil ini sangat mempengaruhi kualitas model yang dibuat semakin
kecil atau mendekati niali nol(0). Semakin baik pula model mengeneralisasi terhadap data, untuk kasus
ini RMD cukup besar sehingga diperlukan langkah yang lebih konkrit atau model yang lebih kompleks.
Walaupun error yang dihasilkan sangat sedikit secara persentase sekitar 9 persen jika dipersentasekan.
6
Decision Tree for the Carseat Dataset
7.5
100%
yes high = 0 no
5.6 10
59% 41%
shelveloc = Bad shelveloc = Bad,Medium
4.9 6 11
20% 38% 16%
price >= 103 price >= 134 price >= 98
5.3
12%
age >= 65
Interpretasi : Secara global, pohon keputusan tersebut menunjukkan bahwa faktor utama yang mempen-
garuhi sales dalam dataset Carseat adalah lokasi rak zproduk (shelveloc), harga (price), dan usia pelanggan
(age). Produk dengan lokasi rak yang lebih baik (misalnya, tidak “Bad”) dan harga yang lebih rendah
cenderung memiliki angka penjualan lebih tinggi, seperti terlihat dari node yang lebih hijau. Sebaliknya,
jika lokasi rak buruk dan harga tinggi, sales cenderung lebih rendah. Faktor usia juga berperan dalam
beberapa cabang, tetapi pengaruh utamanya terlihat setelah harga dan lokasi rak dipertimbangkan terlebih
dahulu. Dengan kata lain, strategi pemasaran yang menempatkan produk di lokasi rak yang lebih baik dan
menetapkan harga yang lebih kompetitif kemungkinan besar akan meningkatkan penjualan.
7
##
## test_predictions 0 1
## 0 104 33
## 1 13 50
Interpretasi : Berdasarkan dari hasil prediksi diatas yang terdiri dari 2 kelas diukur menggunakan metrik
confusion dapat di gambarkan perhitungannya sebagai gambar berikut :
Dengan perhitungan diatas kita dapat menghitung beberapa performasi dari sebuah model yang dibuat :
1. Accuracy:
𝑇𝑃 + 𝑇𝑁
Accuracy =
𝑇𝑃 + 𝑇𝑁 + 𝐹𝑃 + 𝐹𝑁
2. Precision:
𝑇𝑃
Precision =
𝑇𝑃 + 𝐹𝑃
3. Recall:
𝑇𝑃
Recall =
𝑇𝑃 + 𝐹𝑁
4. F1 Score:
Precision ⋅ Recall
𝐹1 = 2 ⋅
Precision + Recall
5. Specificity:
𝑇𝑁
Specificity =
𝑇𝑁 + 𝐹𝑃
8
Model yang terbaik adalah model yang menghasilkan akurasi dan presisi tinggi dan Recall yang tinggi
pula, Akurasi dan presisi diibaratkan sebagai metrik pengukuran saat jadinya sebuah model dan tanda
bahwa model bagus, sedangkan recall diibaratkan sebuah timbangan. Jika nilai recall tinggi maka faktor
generalisasi model juga tinggi terhadap data baru yang ada diujikan.
Algoritma Pruning
Algoritma pruning dalam decision tree adalah teknik yang digunakan untuk memotong atau menghilangkan
cabang-cabang yang tidak penting atau tidak relevan dalam pohon keputusan. Tujuan utama dari pruning
adalah untuk mencegah overfitting, yaitu situasi di mana model terlalu kompleks dan terlalu baik dalam
mempelajari data pelatihan, tetapi tidak dapat umumkan dengan baik ke data baru atau tidak terlalu baik
dalam mempelajari data pelatihan.
Berikut merupakan langkah-langkah dalam algoritma pruning didalam decision tree model :
1. Tumbuhkan pohon asli T0 menggunakan data pelatihan.
2. Sebagai fungsi dari � (parameter pinalti), tentukan urutan yang terbaik subpohon
3. Gunakan validasi silang K-fold untuk menemukan � yang meminimalkan kesalahan prediksi rata-rata
kuadrat rata-rata dari kth fold data pelatihan
4. Temukan subpohon terbaik dari Langkah 2 menggunakan � yang ditemukan di langkah sebelumnya.
Selanjutnya, kita mempertimbangkan apakah pemangkasan pohon dapat memberikan hasil yang lebih baik.
Fungsi cv.tree() melakukan validasi silang untuk cv.tree() menentukan tingkat kompleksitas pohon yang
optimal; Pemangkasan kompleksitas yang digunakan untuk memilih urutan pohon untuk dipertimbangkan.
Kita menggunakan argumen FUN=prune.misclass untuk menunjukkan bahwa kami ingin tingkat kesalahan
klasifikasi memandu proses validasi silang dan pemangkasan, daripada default untuk fungsi cv.tree(),
yang merupakan penyimpangan. Fungsi cv.tree() melaporkan jumlah node terminal dari setiap pohon yang
dianggap (ukuran) serta tingkat kesalahan yang sesuai dan nilai dari parameter kompleksitas yang digunakan.
set.seed(3)
cv_tree <- cv.tree(ttree, FUN = prune.misclass)
cv_tree
## $size
## [1] 21 19 14 9 8 5 3 2 1
##
## $dev
## [1] 74 76 81 81 75 77 78 85 81
##
## $k
## [1] -Inf 0.0 1.0 1.4 2.0 3.0 4.0 9.0 18.0
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
Yang paling penting dalam hasil ini adalah $dev, yang sesuai dengan kesalahan validasi silang di setiap
instance. Kita dapat melihat bahwa nilai terkecil terjadi ketika ada 21 node terminal. Mari kita lihat sekilas
bagaimana kesalahan bervariasi dalam jumlah node terminal kita:
plot(cv_tree$size, cv_tree$dev, type='b', xlab="Ukuran Pohon", ylab="Jumlah Galat",main="Ukuran Pohon da
9
Ukuran Pohon dari CV (Cross−Validation) yang error
84
82
Jumlah Galat
80
78
76
74
5 10 15 20
Ukuran Pohon
Berdasarkan grafik diatas, kita dapat memilih ukuran pohon di ukuran 21, kita akan mencoba pruning (pe-
mangkasan) dan melihat evaluasi model dengan asumsi prunning pada data ini apakah dapat meningkatkan
hasil akurasi dari masing-masing kelas pada evaluasi confusion matrix dan periksa untuk melihat apakah
pohon ini berperforma lebih baik pada set pengujian daripada pohon dasar 𝑇0 .
pruned <- prune.misclass(ttree, best = 21)
test_predictions <- predict(pruned, data = test, type = 'class')
table(test_predictions, test$high)
##
## test_predictions 0 1
## 0 79 49
## 1 38 34
Didapatkan hasil diatas ternyata hasilnya lebih buruk dibandingkan dengan pohon 𝑇0 dengan demikian
hasil pemodelan pohon keputusan ini yang terbaik dilakukan tanpa proses pruned, ada alasan juga mengapa
pruned pada data ini menghasilkan hasil yang tidak optimal : - Data yang digunakan cukup kecil hanya 400
baris dan 11 kolom memungkinkan pola yang terbentuk tidak begitu kompleks - Proses pruning pada data
kecil dapat menyebabkan hilangnya banyak informasi yang ada pada pohon keputusan.
TIPS :Dengan begitu, kita harus melihat juga pohon keputusan kita untuk pemodelan awal jika dirasa
pohon dalam rentang cabang yang rendah sekitar 2 - 4 proses pruning sebaiknya tidak dilakukan dan selalu
melihat banyaknya informasi atau baris dari data, jika banyak dan saling berhubungan (korelasi) satu sama
lain maka sebaiknya jangan di pruning.
10
jenis variabel target yang digunakan. Jika decision tree untuk klasifikasi menggunakan variabel target
kategori, pohon regresi digunakan untuk variabel target yang bersifat kontinu. Dalam evaluasi model, pohon
regresi menggunakan metrik yang berbeda dari pohon klasifikasi. Metrik evaluasi yang digunakan dalam
pohon regresi meliputi Mean Squared Error (MSE) dan Root Mean Squared Error (RMSE), yang juga umum
digunakan dalam regresi linear.
Dalam percobaan kali ini kita menggunakan data Boston yang berasal dari library MASS :
Boston <- MASS::Boston
set.seed(1)
train <- sample_frac(Boston, .5)
test <- setdiff(Boston, train)
##
## Regression tree:
## tree(formula = medv ~ ., data = train)
## Variables actually used in tree construction:
## [1] "rm" "lstat" "crim" "age"
## Number of terminal nodes: 7
## Residual mean deviance: 10.38 = 2555 / 246
## Distribution of residuals:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -10.1800 -1.7770 -0.1775 0.0000 1.9230 16.5800
tree_train <- rpart(medv ~ ., data = train)
rpart.plot(tree_train, main = "Regresion Tree for the Boston Dataset", box.palette ="Blue")
11
Regresion Tree for the Boston Dataset
22
100%
yes rm < 7 no
19 39
88% 12%
lstat >= 14 rm < 7.6
14 23
34% 53%
crim >= 11 rm < 6.5
16
24%
age >= 94
10 14 18 21 28 33 45
10% 12% 12% 44% 9% 6% 6%
Seperti yang Anda lihat lstat < 14 adalah partisi pertama di pohon ini. Variabel mengukur persentase
individu dengan status sosial ekonomi yang lebih rendah di daerah terdekat. Berdasarkan dari node terminal
yang berasal dari sisi kiri pohon, ini menunjukkan bahwa wilayah geografis sosial ekonomi yang lebih tinggi
berakhir dengan harga rumah rata-rata yang jauh lebih besar.
##
## Regression tree:
## rpart(formula = medv ~ ., data = train)
##
12
## Variables actually used in tree construction:
## [1] age crim lstat rm
##
## Root node error: 19448/253 = 76.869
##
## n= 253
##
## CP nsplit rel error xerror xstd
## 1 0.551453 0 1.00000 1.00246 0.126271
## 2 0.176101 1 0.44855 0.48456 0.042763
## 3 0.056895 2 0.27245 0.30320 0.030609
## 4 0.040936 3 0.21555 0.27604 0.029893
## 5 0.032768 4 0.17461 0.23875 0.028484
## 6 0.010488 5 0.14185 0.21692 0.027290
## 7 0.010000 6 0.13136 0.21777 0.027336
# Mendapatkan nilai CP yang optimal untuk dilakukan pemangkasan
optimal_cp <- tree_train$cptable[which.min(tree_train$cptable[, "xerror"]), "CP"]
print(paste("Optimal CP:", optimal_cp))
22
100%
yes rm < 7 no
19 39
88% 12%
lstat >= 14 rm < 7.6
14 23
34% 53%
crim >= 11 rm < 6.5
10 16 21 28 33 45
10% 24% 44% 9% 6% 6%
13
# Hitung MSE dan RMSE
pruned_mse <- mean((test$medv - pruned_predictions)^2)
pruned_rmse <- sqrt(pruned_mse)
Random Forest
Random Forest adalah ensemble learning method yang terdiri dari banyak pohon keputusan (decision tree)
untuk meningkatkan akurasi dan mengurangi overfitting. Setiap tree dilatih pada subset data yang dipilih
secara acak dengan teknik bagging (Bootstrap Aggregating), serta menggunakan subset fitur yang berbeda
untuk setiap split, sehingga meningkatkan keragaman model. Untuk klasifikasi, prediksi akhir ditentukan
dengan voting mayoritas dari semua tree, sedangkan untuk regresi, hasilnya adalah rata-rata prediksi se-
mua tree. Metode ini sangat efektif dalam menangani data yang kompleks, robust terhadap outlier, dan
mengurangi risiko overfitting dibandingkan dengan single decision tree.
Berikut merupakan contoh dengan pemodelan data Boston untuk model random forest dengan metode
bagging dan boosting (Gradient Boosting) :
data("Boston")
set.seed(123)
Bagging
Bagging merupakan model pembelajaran yang dilakukan secara pararel, dimana sebuah data dipecah men-
jadi beberapa subset data, kemudian masing-masing subset data dilatih dengan model yang sama. Hasil
dari masing-masing model pada masing masing subset data akan digabungkan sehingga dapat meningkatkan
akurasi model. Bagging dilakukan untuk mengurangi variansi pada model.
set.seed(123)
bagging_model <- randomForest(medv ~ ., data = train, mtry = ncol(train) - 1, ntree = 500)
bagging_predictions <- predict(bagging_model, newdata = test)
14
print(paste("Bagging - RMSE:", bagging_rmse))
15
Bagging: Actual vs Predicted
40
Predicted MEDV
30
20
10
10 20 30 40 50
Actual MEDV
16
Boosting: Actual vs Predicted
50
40
Predicted MEDV
30
20
10
10 20 30 40 50
Actual MEDV
Referensi
1. Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5–32. https://doi.org/10.1023/A:
1010933404324
2. Quinlan, J. R. (1986). Induction of decision trees. Machine Learning, 1(1), 81–106. https://doi.org/
10.1007/BF00116251
3. Friedman, J. H. (2001). Greedy function approximation: A gradient boosting machine. Annals of
Statistics, 29(5), 1189–1232. https://doi.org/10.1214/aos/1013203451
17
4. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining,
inference, and prediction (2nd ed.). Springer. https://doi.org/10.1007/978-0-387-84858-7
5. Rokach, L., & Maimon, O. (2005). Decision trees. In Data mining and knowledge discovery handbook
(pp. 165–192). Springer. https://doi.org/10.1007/0-387-25465-X_9
18