Salah satu fungsi yang dapat digunakan untuk menjalankan algoritma AdaBoost di R adalah boosting() yang tersedia pada package adabag.
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, hanya untuk menyederhanakan ilustrasi, digunakan iterasi sebanyak 5 kali. Artinya ada 5 stump/pohon kecil yang dibuat secara sekuensial yang diatur sedemikian rupa menggunakan opsi mfinal=3.
Opsi pohon yang digunakan adalah maxdepth=1 untuk meminta program membuat stump sebagai weak learner dari algoritma boosting. Pembaca dapat menghilangkan opsi tersebut jika ingin menggunakan pohon klasifikasi biasa sebagai weak lerner.
Algoritma dijalankan dan model yang diperoleh disimpan pada objek dengan nama model.adaboost . Oh ya… model dibuat menggunakan data training yang sebelumnya diambil secara acak dari data lengkap.
#membaca data
data <- read.csv('D:/winequality-red.csv', sep=";",header = TRUE)
data$quality <- as.factor(ifelse(data$quality <= 6, 0, 1))
library(adabag)
## Warning: package 'adabag' was built under R version 3.5.3
## Loading required package: rpart
## Loading required package: caret
## Loading required package: lattice
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.5.3
## Loading required package: foreach
## Loading required package: doParallel
## Warning: package 'doParallel' was built under R version 3.5.3
## Loading required package: iterators
## Loading required package: parallel
library(caret)
#membagi data menjadi dua bagian: training dan testing
set.seed(1104)
acak <- createDataPartition(data$quality, p=0.7, list = F)
train <- data[acak, ]
test <- data[-acak, ]
#membangun model dengan algoritma adaboost
model.adaboost <- boosting(quality~., data=train,
mfinal=5, control=rpart.control(maxdepth=1),
coeflearn='Freund')
Berikut ini perintah untuk menampilkan stump pertama dan kedua (dari 5 stump yang ada) dan juga menampilkan bobot suara dari
#menampilkan stump pertama
model.adaboost$trees[1]
## [[1]]
## n= 1120
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 1120 163 0 (0.85446429 0.14553571)
## 2) alcohol< 11.55 947 72 0 (0.92397043 0.07602957) *
## 3) alcohol>=11.55 173 82 1 (0.47398844 0.52601156) *
#menampilkan bobot dari stump pertama
model.adaboost$weights[1]
## [1] 1.672917
#menampilkan stump kedua
model.adaboost$trees[2]
## [[1]]
## n= 1120
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 1120 317 0 (0.7169643 0.2830357)
## 2) sulphates< 0.675 668 83 0 (0.8757485 0.1242515) *
## 3) sulphates>=0.675 452 218 1 (0.4823009 0.5176991) *
#menampilkan bobot dari stump kedua
model.adaboost$weights[2]
## [1] 0.842518
Untuk mengilustrasikan bagaimana proses prediksi final menggunakan 5 pohon, program berikut ini melakukan secara berurutan hal-hal berikut:
menentukan amatan yang mau diprediksi (diambil dari salah satu wine merah yang ada pada data testing)
memprediksi menggunakan pohon/stump pertama, kedua, hingga yang kelima
menjumlahkan bobot untuk prediksi kategori 0
menjumlahkan bobot untuk prediksi kategori 1
menentukan kelas mana yang suaranya paling tinggi, dan itu adalah kelas prediksinya
Sebagai pembanding, dilakukan juga prediksi langsung menggunakan model hasil boosting.
maudiprediksi <- test[1,]
prob1 <- predict(model.adaboost$trees[1], maudiprediksi)
prob2 <- predict(model.adaboost$trees[2], maudiprediksi)
prob3 <- predict(model.adaboost$trees[3], maudiprediksi)
prob4 <- predict(model.adaboost$trees[4], maudiprediksi)
prob5 <- predict(model.adaboost$trees[5], maudiprediksi)
prediksi1 <- ifelse(prob1[[1]][1]>prob1[[1]][2],0,1)
prediksi2 <- ifelse(prob2[[1]][1]>prob2[[1]][2],0,1)
prediksi3 <- ifelse(prob3[[1]][1]>prob3[[1]][2],0,1)
prediksi4 <- ifelse(prob4[[1]][1]>prob4[[1]][2],0,1)
prediksi5 <- ifelse(prob5[[1]][1]>prob5[[1]][2],0,1)
bobot1 <- model.adaboost$weights[1]
bobot2 <- model.adaboost$weights[2]
bobot3 <- model.adaboost$weights[3]
bobot4 <- model.adaboost$weights[4]
bobot5 <- model.adaboost$weights[5]
hasil <- cbind(c(prediksi1, prediksi2, prediksi3, prediksi4, prediksi5),
c(bobot1, bobot2, bobot3, bobot4, bobot5))
hasil
## [,1] [,2]
## [1,] 0 1.6729166
## [2,] 0 0.8425180
## [3,] 0 1.1381941
## [4,] 1 0.3284217
## [5,] 1 0.3113426
Terlihat bahwa stump pertama, kedua, dan ketiga memberikan prediksi bahwa anggur merah tersebut termasuk kelas kurang (kelas 0), sedangkan stump keempat dan kelima prediksinya masuk ke kelas baik (kelas 1). Kolom kedua menampilkan bobot dari masing-masing stump.
Berikut ini perhitungan jumlah bobot dari stump yang memberikan prediksi 0 dan stump yang memberikan prediksi 1.
sumbobot.0 <- (1-prediksi1)*bobot1+
(1-prediksi2)*bobot2+
(1-prediksi3)*bobot3+
(1-prediksi4)*bobot4+
(1-prediksi5)*bobot5
sumbobot.1 <- prediksi1*bobot1+
prediksi2*bobot2+
prediksi3*bobot3+
prediksi4*bobot4+
prediksi5*bobot5
prediksifinal <- ifelse(sumbobot.0 > sumbobot.1, 0, 1)
c(sumbobot.0, sumbobot.1, prediksifinal)
## [1] 3.6536286 0.6397644 0.0000000
Jumlah bobot suara dari stump yang memberikan prediksi 0 adalah 3.6 sedangkan jumlah bobot suara stump yang memberikan prediksi 1 adalah 0.6. Karena lebih besar yang 0, maka kelas prediksi final/akhir adalah 0.
DAn berikut jika langsung melakukan prediksi menggunakan objek model.adaboost, yang hasil prediksinya juga memberikan kelas 0.
prediksi.langsung <- predict(model.adaboost, maudiprediksi)$class
prediksi.langsung
## [1] "0"
Kita dapat menggunakan data test untuk melakukan proses pemeriksaan performa prediksi model. Tahapannya adalah: pertama amatan pada data test kita prediksi menggunakan model adaboost, selanjutnya hasil prediksi kita bandingkan dengan kelas aslinya.
fungsi confusionMatrix() kita gunakan untuk menampilkan berbagai ukuran ketepatan klasifikasi.
prediksi.boost <- predict(model.adaboost, test)$class
confusionMatrix(as.factor(prediksi.boost),
test$quality, positive = "1")
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 398 34
## 1 16 31
##
## Accuracy : 0.8956
## 95% CI : (0.8647, 0.9215)
## No Information Rate : 0.8643
## P-Value [Acc > NIR] : 0.02358
##
## Kappa : 0.4962
## Mcnemar's Test P-Value : 0.01621
##
## Sensitivity : 0.47692
## Specificity : 0.96135
## Pos Pred Value : 0.65957
## Neg Pred Value : 0.92130
## Prevalence : 0.13570
## Detection Rate : 0.06472
## Detection Prevalence : 0.09812
## Balanced Accuracy : 0.71914
##
## 'Positive' Class : 1
##
Secara umum kita bisa lihat bahwa akurasinya sekitar 89%-90%.
Pembaca dapat mengubah banyaknya iterasi pada proses boosting (gunakan opsi mfinal) dengan mengubah ke nilai yang jauh lebih besar dari 5. Default dari fungsi ini adalah 100.