0% menganggap dokumen ini bermanfaat (0 suara)
11 tayangan18 halaman

Modul 8 - Decision Tree

Modul ini mengajarkan mahasiswa tentang penggunaan model decision tree, regresi tree, dan random forest dalam analisis data. Mahasiswa juga dilatih untuk melakukan eksplorasi data (EDA) menggunakan berbagai library di R dan memahami analisis korelasi antar fitur. Selain itu, modul ini mencakup pemodelan dengan data train dan test untuk memprediksi kelas berdasarkan fitur yang ada.

Diunggah oleh

usertini.lpg
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
11 tayangan18 halaman

Modul 8 - Decision Tree

Modul ini mengajarkan mahasiswa tentang penggunaan model decision tree, regresi tree, dan random forest dalam analisis data. Mahasiswa juga dilatih untuk melakukan eksplorasi data (EDA) menggunakan berbagai library di R dan memahami analisis korelasi antar fitur. Selain itu, modul ini mencakup pemodelan dengan data train dan test untuk memprediksi kelas berdasarkan fitur yang ada.

Diunggah oleh

usertini.lpg
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 18

Modul 8 Praktikum SSD

Sains Data ITERA

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)

Table 1: Carseats Dataframe

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)

## rows columns discrete_columns continuous_columns all_missing_columns


## 1 400 11 3 8 0
## total_missing_values complete_rows total_observations memory_usage
## 1 0 400 4400 35200
Berdasarkan data diatas jumlah baris data ada 400 data, kolom (fitur) sebanyak 11 buah, kolom yang
bertipe diskrit (non-numerik) sebanyak 3 buah, kolom kontinu (numerik) sebanyak 8 buah, seluruh kolom
tidak ada yang hilang angkanya, missing value (NaN) atau nilai hilang pastinya juga 0, total observation
menggambarkan banyaknya jumlah baris x jumlah kolom dan memori_usage menggambarkan banyaknya
resource memori yang digunakan sebesar 35200kb atau 35,2Mb.

2
plot_intro(Carseats)

Memory Usage: 34.4 Kb

Discrete Columns 27%

Continuous Columns 73%

Dimension
Metrics

column
All Missing Columns 0%
observation
row

Complete Rows 100%

Missing Observations 0%

0% 25% 50% 75% 100%


Value
Plot diatas menunjukan salah satu cara melihat beberapa metrik penting untuk mengukur data dalam
EDA yang baik atau tidak dan lebih visual dibandingkan dengan pembacaan yang yang diatas, ada 3
dimensi yakni kolom, observasi, dan baris, masing-masing dimensi mewakili beberapa metrik dari kolom
diskrit, kolom kontinu yang disertai dengan persentase, persentase kolom kosong, persentase baris data
yang sudah komplit dan observasi yang hilang atau dibaca dalam 1 baris data ada yang hilang data dan
berapa persentasenya.
plot_missing(Carseats)

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.

Analisis Kedekatan Numerik (Korelasi)


Analisis korelasi diperlukan untuk menemukan kedekatan faktor numerik/diskrit. Dengan analisis korelasi
kita dapat menilai bahwa fitur (kolom numerik) apa saja yang saling berdekatan dan dapat menentukan
kolom manakah yang dapat dijadikan sebagai target dalam pemodelan.
# Memilih data yang bertipe numerik
numeric_data<- Carseats %>%
select_if(is.numeric)

# Plot korelasi antara data


corrplot(cor(numeric_data),
method = "number",
type = "lower"
)

4
CompPrice
Sales
Sales 1.00

Income

Advertising
CompPrice 0.06 1.00

Population
Income 0.15−0.08 1.00

Advertising 0.27−0.02 0.06 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

Age −0.23−0.10 0.00 0.00−0.04−0.10 1.00

Education −0.05 0.03−0.06−0.03−0.11 0.01 0.01 1.00

−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1

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.

Identifikasi Awal Pemilihan Fitur


Data Carsets yang digunakan memiliki kolom yang sangat beragam tapi bedasarkan analisis korelasi diatas
dapat disimpulkan data yang bertipe numerik sangat erat kedekatannya pada 3 fokus fitur Price, Sales
dan CompPrice. Dalam modul ini kita akan memproses segmen fitur Sales untuk membuat sebuah kelas
sendiri yang terdiri dari 2 kelas dengan ketentuan penjualan yang berada di atas 8 akan dinilai sebagai high
(1) dan yang berada di bawah 8 akan dilabeli sebagai low (0). Angka yang telah ditetapkan merupakan
proses dari mencari rata-rata dari sales yang di round-up (pembulatan keatas).
avg_sales <- mean(Carseats$Sales)
cat("Rataan penjualan : ", avg_sales)

## Rataan penjualan : 7.496325


Kemudian kita lakukan pembuatan kelas atau label untuk ketentuan seperti penjelasan diatas :
data <- Carseats %>%
mutate(high = factor(ifelse(Sales > 8, 1, 0)))

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.

Visualisasi Hasil Model Decision Tree


Kita akan melakukan visualisasi terhadap model yang sudah dibuat sebelumnya agar lebih terlihat dan
mengerti mengenai pohon keputusan dan informasi yang dapat diambil dari setiap node yang melambangkan
keputusan yang dibuat berdasarkan numeriknya.
tree <- rpart(sales ~ ., data = data)
rpart.plot(tree, main = "Decision Tree for the Carseat Dataset", box.palette ="Green")

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

4.5 6.1 3.8 5.8 6.3 9.5 11 13


15% 5% 3% 9% 26% 24% 12% 4%

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.

Pemodealan dengan data train dan data test


Pada percobaan diatas dapat dilihat data yang digunakan adalah secara keseluruhan, pada percobaan kali
ini kita akan mencoba membagi dataset menjadi data train (latih) dan data test (uji) dan memodelkanya
dan melihat hasil prediksi terhadap data test.
# Define our training/testing sets
set.seed(2) # Pembagian Data test dan train agar selalu sama setiap dirunning ulang
train <- sample_n(data, 200) # Data train yang berjumlah 200 baris
test <- setdiff(data, train) # Data test yang berjumlah sisa dari data train (200 baris juga)

# Run the recursive partioning algorithm


ttree <- tree(high ~. -sales, data = train)

# Membuat prediksi dan melihat hasil dari confusion matrix


test_predictions <- predict(ttree, test, type = 'class')
table(test_predictions, test$high)

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 =
𝑇𝑁 + 𝐹𝑃

6. False Positive Rate (FPR):


𝐹𝑃
FPR =
𝐹𝑃 + 𝑇𝑁

7. False Negative Rate (FNR):


𝐹𝑁
FNR =
𝐹𝑁 + 𝑇𝑃

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.

Fitting Regresion Tree


Fitting adalah sebuah metode untuk mencocokkan pola data dalam model, dalam hal ini dilakukan pada
pohon regresi. Pohon regresi merupakan salah satu jenis decision tree, tetapi perbedaannya terletak pada

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)

tree_train <- tree(medv ~ ., data=train)


summary(tree_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.

Hasil MSE dan RMSE


Evaluasi model dari MSE dan RMSE model regresi pohon diatas sebagai berikut:
predictions <- predict(tree_train, newdata = test) # Membuat sebuah prediksi
mse <- mean((test$medv - predictions)^2) # Perhitungan MSE
rmse <- sqrt(mse) # Perhitungan RMSE
print(paste("MSE:", round(mse, 3)))

## [1] "MSE: 35.287"


print(paste("RMSE:", round(rmse, 3)))

## [1] "RMSE: 5.94"


Kita sekarang dapat melanjutkan untuk melihat apakah pemangkasan akan meningkatkan kinerja pohon
ini dan dapat menurunkan nilai MSE dan RMSE dari model aslinya.
printcp(tree_train) # Melihat tabel kompleksitas model dari beberapa skenario pemangkasan

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

## [1] "Optimal CP: 0.0104877315681415"


# Tahapan pemangkasan pada model regresipohon diatas
pruned_tree <- prune(tree_train, cp = optimal_cp)
rpart.plot(pruned_tree, main = "Pruned Regression Tree", box.palette = "Green")

Pruned Regression Tree

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%

# Prediksi dengan model pruned


pruned_predictions <- predict(pruned_tree, newdata = test)

13
# Hitung MSE dan RMSE
pruned_mse <- mean((test$medv - pruned_predictions)^2)
pruned_rmse <- sqrt(pruned_mse)

print(paste("MSE Setelah Pruning:", round(pruned_mse, 3)))

## [1] "MSE Setelah Pruning: 35.164"


print(paste("RMSE Setelah Pruning:", round(pruned_rmse, 3)))

## [1] "RMSE Setelah Pruning: 5.93"


Dapat dilihat pada hasil MSE dan RMSE setelah dilakukan proses pruning MSE dan RMSE mengalami
penurunan dibandingkan dengan data aslinya walaupun hasil yang ditunjukan perbedaan error sangat sedikit
sekali, akan tetapi proses pruning pada data ini berhasil menurunkan nilai error.

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)

# Split data menjadi train dan test (80:20)


sample_index <- sample(1:nrow(Boston), 0.8 * nrow(Boston))
train <- Boston[sample_index, ]
test <- Boston[-sample_index, ]

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)

# Evaluasi MSE dan RMSE


bagging_mse <- mean((test$medv - bagging_predictions)^2)
bagging_rmse <- sqrt(bagging_mse)

print(paste("Bagging - MSE:", bagging_mse))

## [1] "Bagging - MSE: 14.1767475523814"

14
print(paste("Bagging - RMSE:", bagging_rmse))

## [1] "Bagging - RMSE: 3.76520219276222"

Boosting (Gradient Boosting)


Boosting merupakan model pembelajaran yang dilakukan secara bertahap atau sequential, dimana sebuah
data yang telah latih akan digunakan untuk pelatihan model berikutnya sehingga dapat meningkatkan
prediksi model. Boosting dilakukan untuk mengurangi bias pada model.
set.seed(123)
boosting_model <- gbm(medv ~ ., data = train, distribution = "gaussian", n.trees = 5000, interaction.dep
boosting_predictions <- predict(boosting_model, newdata = test, n.trees = 5000)

# Evaluasi MSE dan RMSE


boosting_mse <- mean((test$medv - boosting_predictions)^2)
boosting_rmse <- sqrt(boosting_mse)

print(paste("Boosting - MSE:", boosting_mse))

## [1] "Boosting - MSE: 11.1639983302697"


print(paste("Boosting - RMSE:", boosting_rmse))

## [1] "Boosting - RMSE: 3.34125699853659"

Perbandingan Evaluasi Model dengan RF (Bagging) dan Boosting (Gradient Boosting)

# Plot Prediksi vs Aktual untuk Bagging


plot(test$medv, bagging_predictions, col = "blue", main = "Bagging: Actual vs Predicted",
xlab = "Actual MEDV", ylab = "Predicted MEDV")
abline(0, 1, col = "red", lwd = 2)

15
Bagging: Actual vs Predicted
40
Predicted MEDV

30
20
10

10 20 30 40 50

Actual MEDV

# Plot Prediksi vs Aktual untuk Boosting


plot(test$medv, boosting_predictions, col = "green", main = "Boosting: Actual vs Predicted",
xlab = "Actual MEDV", ylab = "Predicted MEDV")
abline(0, 1, col = "red", lwd = 2)

16
Boosting: Actual vs Predicted
50
40
Predicted MEDV

30
20
10

10 20 30 40 50

Actual MEDV

comparison <- data.frame(


Model = c("Bagging (Random Forest)", "Boosting (Gradient Boosting)"),
MSE = c(bagging_mse, boosting_mse),
RMSE = c(bagging_rmse, boosting_rmse)
)
print(comparison)

## Model MSE RMSE


## 1 Bagging (Random Forest) 14.17675 3.765202
## 2 Boosting (Gradient Boosting) 11.16400 3.341257
Notes: - Bagging (Random Forest) lebih stabil dan cenderung memiliki performa yang baik tanpa overfitting.
• Boosting (Gradient Boosting) lebih kuat dalam menangkap pola kompleks tetapi bisa lebih rentan
terhadap overfitting jika tidak dituning dengan baik.

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

Anda mungkin juga menyukai