Naive Bayes dan Support vector Machine (SVM) dengan mlr3

Gerry Alfa Dito

Package

Silahkan install jika belum ada

install.packages("tidyverse")
install.packages("mlr3verse")
install.packages("e1071")

Memanggil Package

library(tidyverse)
library(mlr3verse)

Deskripsi singkat data

Data yang digunakan pada tutorial kali ini adalah data yang bernama Pima Indian Diabetes yang sudah sedikit diedit. Berikut adalah informasi singkat mengenai data

This dataset is originally from the National Institute of Diabetes and Digestive and Kidney Diseases. The objective of the dataset is to diagnostically predict whether or not a patient has diabetes, based on certain diagnostic measurements included in the dataset. Several constraints were placed on the selection of these instances from a larger database. In particular, all patients here are females at least 21 years old of Pima Indian heritage.

Content The datasets consists of several medical predictor variables and one target variable, Outcome. Predictor variables includes the number of pregnancies the patient has had, their BMI, insulin level, age, and so on.

Acknowledgements Smith, J.W., Everhart, J.E., Dickson, W.C., Knowler, W.C., & Johannes, R.S. (1988). Using the ADAP learning algorithm to forecast the onset of diabetes mellitus. In Proceedings of the Symposium on Computer Applications and Medical Care (pp. 261–265). IEEE Computer Society Press.

data ini bisa diperoleh di link berikut ini https://github.com/gerrydito/Model-Klasifikasi/tree/master/Praktikum/KNN

Pemodelan Naive Bayes dan SVM

Import data di R

data_diabetes <- read.csv("diabetes.csv",stringsAsFactors = TRUE)
head(data_diabetes)
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           6     148            72            35       0 33.6
## 2           1      85            66            29       0 26.6
## 3           8     183            64             0       0 23.3
## 4           1      89            66            23      94 28.1
## 5           0     137            40            35     168 43.1
## 6           5     116            74             0       0 25.6
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.627  50    Case
## 2                    0.351  31 Control
## 3                    0.672  32    Case
## 4                    0.167  21 Control
## 5                    2.288  33    Case
## 6                    0.201  30 Control

Khusus yang menggunakan R versi 4.00 keatas, argumen stringsAsFactors = TRUE disertakan agar data yang berbentuk string bisa berubah menjadi factor.

Import data ke ekosistem mlr3

Import data ke mlr3 bisa dilakukan dengan menggunakan fungsi TaskClassif$new atau TaskRegr$new yang berasal dari package mlr3. TaskClassif$new digunakan jika peubah respon kita berupa peubah biner atau multiclass, sedangkan TaskRegr$new digunakan jika responya berupa peubah numerik.

task_diabetes = TaskClassif$new(id="diabetes",backend = data_diabetes,
                                target = "Outcome",positive ="Case")

Argumen utama dalam fungsi TaskClassif$new adalah sebagai berikut:

  1. id yang merupakan nama dari task (bisa diisi dengan nama apapun)
  2. backend adalah data yang ingin dimodelkan dengan catatan peubah respon-nya harus berupa factor
  3. target adalah nama kolom yang dijadikan peubah respon
  4. positive adalah nama kelas positif dari peubah respon

Menentukan model yang digunakan

Pada tahap ini fungsi yang digunakan adalah lrn yang memiliki argumen utama nama model yang ingin digunakan. Berikut adalah model-model yang akan digunakan beserta argumen di dalam fungsi lrn dan asal packagenya:

  1. Naive Bayes - "classif.naive_bayes" - library(e1071)
  2. SVM - "classif.svm" - library(e1071)

Sebagai catatan, untuk model-model yang digunakan dalam mlr3 berasal dari package-package lain sehingga package-package tersebut perlu install terlebih dahulu.

Argumen-argumen yang bisa dimasukkan pada "classif.naive_bayes" dan "classif.svm"adalah sebagai berikut.

as.data.table(lrn("classif.naive_bayes")$param_set)
##           id    class lower upper levels nlevels is_bounded special_vals
## 1:   laplace ParamDbl     0   Inf            Inf      FALSE    <list[0]>
## 2: threshold ParamDbl  -Inf   Inf            Inf      FALSE    <list[0]>
## 3:       eps ParamDbl  -Inf   Inf            Inf      FALSE    <list[0]>
##    default storage_type    tags
## 1:       0      numeric   train
## 2:   0.001      numeric predict
## 3:       0      numeric predict
as.data.table(lrn("classif.svm")$param_set)
##                  id    class lower upper                             levels
##  1:            type ParamFct    NA    NA C-classification,nu-classification
##  2:            cost ParamDbl     0   Inf                                   
##  3:              nu ParamDbl  -Inf   Inf                                   
##  4:          kernel ParamFct    NA    NA   linear,polynomial,radial,sigmoid
##  5:          degree ParamInt     1   Inf                                   
##  6:           coef0 ParamDbl  -Inf   Inf                                   
##  7:           gamma ParamDbl     0   Inf                                   
##  8:       cachesize ParamDbl  -Inf   Inf                                   
##  9:       tolerance ParamDbl     0   Inf                                   
## 10:       shrinking ParamLgl    NA    NA                         TRUE,FALSE
## 11:           cross ParamInt     0   Inf                                   
## 12:          fitted ParamLgl    NA    NA                         TRUE,FALSE
## 13:           scale ParamUty    NA    NA                                   
## 14:   class.weights ParamUty    NA    NA                                   
## 15: decision.values ParamLgl    NA    NA                         TRUE,FALSE
##     nlevels is_bounded special_vals          default storage_type    tags
##  1:       2       TRUE    <list[0]> C-classification    character   train
##  2:     Inf      FALSE    <list[0]>                1      numeric   train
##  3:     Inf      FALSE    <list[0]>              0.5      numeric   train
##  4:       4       TRUE    <list[0]>           radial    character   train
##  5:     Inf      FALSE    <list[0]>                3      integer   train
##  6:     Inf      FALSE    <list[0]>                0      numeric   train
##  7:     Inf      FALSE    <list[0]>   <NoDefault[3]>      numeric   train
##  8:     Inf      FALSE    <list[0]>               40      numeric   train
##  9:     Inf      FALSE    <list[0]>            0.001      numeric   train
## 10:       2       TRUE    <list[0]>             TRUE      logical   train
## 11:     Inf      FALSE    <list[0]>                0      integer   train
## 12:       2       TRUE    <list[0]>             TRUE      logical   train
## 13:     Inf      FALSE    <list[0]>             TRUE         list   train
## 14:     Inf      FALSE    <list[0]>                          list   train
## 15:       2       TRUE    <list[0]>            FALSE      logical predict

Keterangan untuk masing-masing argumen dapat melihat package asal kedua metode yaitu package e1071.

Untuk menjalankan model-model tersebut kita bisa tulis seperti dibawah ini

learner_nb <- lrn("classif.naive_bayes")
learner_svm <- lrn("classif.svm")

Menentukan cara pembagian data

Penentuan cara pembagian data bisa dilakukan dengan fungsi rsmp.

resample_diabetes_cv = rsmp("cv",folds=10)

Metode pembagian data yang dipilih disini adalah metode cross-validation dengan 10 folds atau lipatan. Setelah kedua hal ini sudah dilakukan, selanjutnya komparasi model bisa dilakukan

Komparasi model

Pada bagian ini kita akan melakukan komparasi model antar model yang sudah kita definisikan diatas. Langkah pertama yang kita lakukan adalah mengabungkan learner yang sudah kita definisikan diawal ke dalam list

learner_diabetes <- list(learner_nb,learner_svm)

Komparasi model bisa dilakukan dengan menggunakan fungsi benchmark_design dan benchmark. Fungsi benchmark_design digunakan untuk memasukan informasi-inforamsi yang dibutuhkan untuk komparasi, seperti data yang digunakan (tasks), model yang ingin dikomparasi (learners) dan metode pembagian data yang digunakan (resamplings).

design <- benchmark_grid(tasks = task_diabetes,
                         learners = learner_diabetes,
                         resamplings = resample_diabetes_cv 
                         )

Kemudian fungsi benchmark digunakan untuk menjalankan/ running komparasi model berdasarkan desain yang sudah dirancang.

bmr = benchmark(design,store_models = TRUE)
## INFO  [12:12:58.698] Benchmark with 20 resampling iterations 
## INFO  [12:12:58.990] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 3/10) 
## INFO  [12:12:59.124] Applying learner 'classif.svm' on task 'diabetes' (iter 1/10) 
## INFO  [12:12:59.199] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 7/10) 
## INFO  [12:12:59.233] Applying learner 'classif.svm' on task 'diabetes' (iter 3/10) 
## INFO  [12:12:59.295] Applying learner 'classif.svm' on task 'diabetes' (iter 5/10) 
## INFO  [12:12:59.368] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 1/10) 
## INFO  [12:12:59.402] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 2/10) 
## INFO  [12:12:59.434] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 5/10) 
## INFO  [12:12:59.468] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 10/10) 
## INFO  [12:12:59.508] Applying learner 'classif.svm' on task 'diabetes' (iter 2/10) 
## INFO  [12:12:59.571] Applying learner 'classif.svm' on task 'diabetes' (iter 7/10) 
## INFO  [12:12:59.654] Applying learner 'classif.svm' on task 'diabetes' (iter 10/10) 
## INFO  [12:12:59.769] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 4/10) 
## INFO  [12:12:59.800] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 6/10) 
## INFO  [12:12:59.834] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 9/10) 
## INFO  [12:12:59.880] Applying learner 'classif.svm' on task 'diabetes' (iter 9/10) 
## INFO  [12:12:59.944] Applying learner 'classif.svm' on task 'diabetes' (iter 4/10) 
## INFO  [12:13:00.043] Applying learner 'classif.svm' on task 'diabetes' (iter 6/10) 
## INFO  [12:13:00.131] Applying learner 'classif.svm' on task 'diabetes' (iter 8/10) 
## INFO  [12:13:00.194] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 8/10) 
## INFO  [12:13:00.239] Finished benchmark

Karena terdapat 2 model dan masing-masing model menjalankan 10-folds cross-validation maka iterasi yang dilakukan ada sebanyak 20 kali.

Hasil Komparasi model

Hasil komparasi model dapat berupa nilai-nilai ukuran kebaikan model yang ditentukan oleh pengguna.

result = bmr$aggregate(list(msr("classif.acc"),
                            msr("classif.bacc") # balanced accuracy
                            ,
                                msr("classif.sensitivity"),
                                msr("classif.specificity"),
                                msr("classif.precision")
                                )
              )
result
##    nr      resample_result  task_id          learner_id resampling_id iters
## 1:  1 <ResampleResult[21]> diabetes classif.naive_bayes            cv    10
## 2:  2 <ResampleResult[21]> diabetes         classif.svm            cv    10
##    classif.acc classif.bacc classif.sensitivity classif.specificity
## 1:   0.7579123    0.7205343           0.6105286           0.8305400
## 2:   0.7606316    0.7075371           0.5387718           0.8763024
##    classif.precision
## 1:         0.6543094
## 2:         0.6911870

Berdasarkan nilai akurasi model yang memiliki performa prediksi terbaik adalah model regresi svm karena dari kelima kriteria/metric 4 diantaranya unggul.