Pendekatan bagging (bootstrap + aggregating) merupakan salah satu pendekatan paling sederhana pada metode ensemble. Meskipun pendekatan ini dapat dipakai luas untuk berbagai algoritma pemodelan, pada dokumen ini kita akan membatasi diskusi pada metode bagging untuk klasifikasi dengan base learner berupa pohon klasifikasi.
Andaikan kita memiliki sebuah data training D yang berisi beberapa variabel prediktor dan sebuah variabel target kelas (kita batasi pembahasan untuk variabel target memiliki hanya dua kelas). Secara umum, tahapan pemodelan bagging untuk klasifikasi adalah berikut ini.
Lakukan prosedur bootstrap untuk melakukan resampling (yaitu sampling with replacement) pada D. Andaikan kita dapatkan \(D_b\)
Susun model pohon klasifikasi menggunakan \(D_b\) dan peroleh modelnya
Ulangi langkah 1-2 hingga k kali. Misalkan \(k=100\), maka kita akan memiliki 100 buah pohon klasifikasi
Proses prediksi dilakukan dengan menentukan prediksi dari suatu amatan menggunakan setiap 100 pohon yang terbentuk. Masing-masing pohon bisa memberikan prediksi yang berbeda. Prediksi akhir diperoleh secara agregat dengan melakukan proses majority voting atau voting dengan suara terbanyak. Jika kelas prediksi yang dominan adalah YA, maka prediksi final adalah YA. Sebaliknya, jika yang dominan adalah TIDAK, maka prediksi finalnya TIDAK.
Karena adanya proses agregasi, bagging efektif dalam mereduksi ragam dugaan dari masing-masing base learner (ingat, umumnya merata-ratakan menyebabkan ragam mengecil), meskipun tidak selalu berhasil. Proses agregasi ini lebih efektif jika base learner yang digunakan adalah yang kurang stabil seperti pohon klasifikasi dan k-NN.
Salah satu fungsi yang dapat digunakan untuk menjalankan algoritma bagging di R adalah bagging() yang tersedia pada package ipred.
Berikut ini ilustrasi penerapannya pada data winequality-red.csv yang memuat informasi karakteristik 1599 anggur merah di Portugas, beserta dengan hasil penilaian kualitasnya menurut pakar wine. Data diperoleh dari UCI Machine Learning Repository, pada laman https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/.
Nilai kualitas yang semula berada pada selang 0-10 dikelompokkan terlbeih dahulu menjadi dua kelas yaitu yang nilainya kurang dari atau sama dengan 6 masuk dalam kelas 0 (kurang), selainnya dimasukkan pada kelas 1 (baik).
Pada program di bawah ini, replikasi bootstrap yang dilakukan adalah 100 kali, yang berarti ada 100 kali pengambilan sampel ulang dari data dan 100 kali pembuatan pohon klasifikasi dari setiap sampel tersebut. Pohon yang dibuat sedemikian rupa dengan setting minsplit=20 dan cp=0. Pembaca yang ingin mengikuti lebih jauh tentang opsi minsplit dan cp silakan melihat dokumen lain pada folder https://rpubs.com/bagusco.
Opsi lain yang digunakan pada program ini adalah coob=TRUE yang berarti bahwa kita meminta program menghitung out-of-bag error, yaitu tingkat kesalahan prediksi yang didasarkan pada amatan yang tidak terpilih pada proses bootstrap. Ini adalah salah satu keuntungan menerapkan bagging dimana dugaan tingkat kesalahan klasifikasi tidak harus dihitung menggunakan validasi silang. PAda saat proses resampling ada saja amatan yang tidak terambil, dan itu disebut sebagai amatan out-of-bag (OOB), yang kemudian diprediksi seperti berlaku sebagai data testing.
#membaca data
data <- read.csv('D:/winequality-red.csv', sep=";",header = TRUE)
data$quality <- ifelse(data$quality <= 6, 0, 1)
#model bagging
library(ipred)
## Warning: package 'ipred' was built under R version 3.5.3
library(rpart)
model_bag <- bagging(
formula = as.factor(quality) ~ .,
data = data,
nbagg = 100,
coob = TRUE,
control = rpart.control(minsplit = 20, cp = 0)
)
Untuk melihat ringkasan dari model yang telah diperoleh, dapat memanggilnya saja dan kita dapatkan bahwa error OOB sekitar 10.3% atau dengan demikian akurasi modelnya adalah 89.7%.
model_bag
##
## Bagging classification trees with 100 bootstrap replications
##
## Call: bagging.data.frame(formula = as.factor(quality) ~ ., data = data,
## nbagg = 100, coob = TRUE, control = rpart.control(minsplit = 20,
## cp = 0))
##
## Out-of-bag estimate of misclassification error: 0.1032
Secara umum, tingkat kesalahan klasifikasi akan menurun jika banyaknya ulangan bootstrap ditambah. Namun pada titik tertentu sudah tidak mengecil/turun lagi.
Program di bawah ini mengilustrasikan bagaimana nilai error OOB untuk banyaknya pohon sebanyak 10 hingga 100. Tampak bahwa pada angka sekitar \(k = 70\) sudah relatif stabil.
set.seed(1104)
ooberr <- NULL
for (banyakpohon in seq(10,100, by=2)) {
model_bag <- bagging(formula = as.factor(quality) ~ .,
data = data, nbagg = banyakpohon,
coob = TRUE, control = rpart.control(minsplit = 20, cp = 0))
ooberr[banyakpohon] <- model_bag$err
}
plot(seq(10,100, by=2) , na.omit(ooberr), type="b", xlab="banyaknya pohon", ylab="error OOB")
Jika model sudah didapatkan, maka melakukan prediksi dapat dilakukan dengan mudah menggunakan fungsi predict() terhadap amatan yang tersimpan pada suatu dataframe.
Berikut ini ilustrasi proses prediksi kualitas anggur merah dengan karakteristik sebagai berikut:
1 - fixed acidity = 8.1
2 - volatile acidity = 0.45
3 - citric acid = 0.10
4 - residual sugar = 2.1
5 - chlorides = 0.080
6 - free sulfur dioxide = 14
7 - total sulfur dioxide = 43
8 - density = 0.9981
9 - pH = 4.50
10 - sulphates = 0.64
11 - alcohol = 10.3
Hasil prediksi menunjukkan bahwa kualitas anggur tersebut tergolong kurang (kategori 0).
set.seed(1104)
model_bag <- bagging(
formula = as.factor(quality) ~ .,
data = data,
nbagg = 70,
coob = TRUE,
control = rpart.control(minsplit = 20, cp = 0))
anggurbaru <- data.frame(
fixed.acidity = 8.1,
volatile.acidity = 0.45,
citric.acid = 0.10,
residual.sugar = 2.1,
chlorides = 0.080,
free.sulfur.dioxide = 14,
total.sulfur.dioxide = 43,
density = 0.9981,
pH = 4.50,
sulphates = 0.64,
alcohol = 10.3)
predict(model_bag, newdata=anggurbaru)
## [1] 0
## Levels: 0