Komparasi Beberapa Model Klasifikasi dengan mlr3

Informasi

Tutorial ini merupakan kelanjutan dari tutorial https://rpubs.com/gdito/KNN-mlr3. Silahkan kunjungi laman tersebut jika belum familiar dengan mlr3.

Package

Silahkan install jika belum ada

install.packages("tidyverse")
install.packages("mlr3pipelines") #baru
install.packages("magrittr") # baru
install.packages("mlr3")
install.packages("mlr3learners")
install.packages("kknn")
library(mlr3)
library(mlr3pipelines) #baru
library(magrittr) #baru
library(mlr3learners)

Deskripsi singkat data

Data yang digunakan pada praktikum 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

Komparasi model-model klasifikasi

Pada bagian ini akan dibahas bagaimana melakukan komperasi model-model klasifikasi yang dilustrasikan menggunakan KNN dan regresi logistik. Adapun langkah-langkah pemodelannya mirip dengan KNN pada tutorial sebelumnya, yaitu:

  1. Import data di R
  2. Import data ke ekosistem mlr3
  3. Menentukan model yang digunakan
  4. Menentukan cara pembagian data
  5. Melakukan training dan menghitung performa model

Pada tutorial ini, komparasi akan dilustrasikan menjadi dua bagian yaitu komparasi dasar, yang hanya membandingkan model-model klasifikasi saja, dan komparasi kompleks, yang menggunakan data preproses terlebih dahulu sebelum melakukan komparasi.

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

Pada tahap ini fungsi TaskClassif digunakan untuk import data dari R ke mlr3. Karena target/peubah respon dari data ini adalah peubah biner maka termasuk dalam masalah klasifikasi.

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

Komparasi Dasar

Pada bagian ini, kita akan melakukan komparasi performa model antara model KNN dan Regresi logistik

Menentukan model yang digunakan

Model yang ingin dikomparasikan dapat dimasukan ke dalam list seperti sintaks dibawa ini

learner_diabetes <- list(lrn("classif.kknn",k=29,kernel="rectangular"),
                         lrn("classif.log_reg"))

Setiap model yang didefinisikan diatas tetap menggunakan fungsi lrn seperti jika kita ingin menjalankan satu model saja.

Menentukan cara pembagian data

Metode pembagian data ditentukan dengan menggunakan fungsi rsmp.

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

Metode pembagian data yang dipilih disini adalah metode cross-validation

Komparasi model

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  [09:23:40.266] Benchmark with 20 resampling iterations 
## INFO  [09:23:42.622] Applying learner 'classif.kknn' on task 'diabetes' (iter 1/10) 
## INFO  [09:23:51.529] Applying learner 'classif.kknn' on task 'diabetes' (iter 2/10) 
## INFO  [09:23:52.303] Applying learner 'classif.kknn' on task 'diabetes' (iter 3/10) 
## INFO  [09:23:52.638] Applying learner 'classif.kknn' on task 'diabetes' (iter 4/10) 
## INFO  [09:23:53.041] Applying learner 'classif.kknn' on task 'diabetes' (iter 5/10) 
## INFO  [09:23:53.412] Applying learner 'classif.kknn' on task 'diabetes' (iter 6/10) 
## INFO  [09:23:53.803] Applying learner 'classif.kknn' on task 'diabetes' (iter 7/10) 
## INFO  [09:23:54.473] Applying learner 'classif.kknn' on task 'diabetes' (iter 8/10) 
## INFO  [09:23:55.477] Applying learner 'classif.kknn' on task 'diabetes' (iter 9/10) 
## INFO  [09:23:56.342] Applying learner 'classif.kknn' on task 'diabetes' (iter 10/10) 
## INFO  [09:23:56.994] Applying learner 'classif.log_reg' on task 'diabetes' (iter 1/10) 
## INFO  [09:23:57.165] Applying learner 'classif.log_reg' on task 'diabetes' (iter 2/10) 
## INFO  [09:23:57.374] Applying learner 'classif.log_reg' on task 'diabetes' (iter 3/10) 
## INFO  [09:23:57.557] Applying learner 'classif.log_reg' on task 'diabetes' (iter 4/10) 
## INFO  [09:23:57.679] Applying learner 'classif.log_reg' on task 'diabetes' (iter 5/10) 
## INFO  [09:23:57.820] Applying learner 'classif.log_reg' on task 'diabetes' (iter 6/10) 
## INFO  [09:23:57.908] Applying learner 'classif.log_reg' on task 'diabetes' (iter 7/10) 
## INFO  [09:23:58.560] Applying learner 'classif.log_reg' on task 'diabetes' (iter 8/10) 
## INFO  [09:23:58.671] Applying learner 'classif.log_reg' on task 'diabetes' (iter 9/10) 
## INFO  [09:23:58.770] Applying learner 'classif.log_reg' on task 'diabetes' (iter 10/10) 
## INFO  [09:23:58.874] 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.specificity"),
             msr("classif.sensitivity")
              ))
result
##     resample_result nr  task_id      learner_id resampling_id iters classif.acc
## 1: <ResampleResult>  1 diabetes    classif.kknn            cv    10   0.7447018
## 2: <ResampleResult>  2 diabetes classif.log_reg            cv    10   0.7726667
##    classif.specificity classif.sensitivity
## 1:           0.8922623           0.4705615
## 2:           0.8850437           0.5576160

Berdasarkan nilai akurasi dan sensitivity model regresi logistik lebih unggul dibandingkan model KNN. Namun, untuk specificity model KNN lebih unggul dibandingkan dengan model regresi logistik.

Komparasi Kompleks

Pada bagian ini, kita akan melakukan komparasi performa model antara model KNN, model KNN dengan peubah di standarisasi, Regresi logistik dan Regresi Logistik dengan PCA. Skema ini bermanfaat saat kita ingin melihat apakah dengan data preprocessing (seperti standarisasi dan PCA) yang kita lakukan sebelum pemodelan dapat meningkatkan performa model

Menentukan model yang digunakan

Penambahan preprocessing data sebelum model pemodelan bisa dilakan dengan menggunakan fungsi po dari package mlr3pipelines. Data preprocessing yang sudah tersedia di dalam package tersebut antara lain, standarisasi peubah, PCA dan penanganan untuk imbalanced data. Daftar lengkapnya bisa dilihat pada situs berikut ini https://mlr3book.mlr-org.com/pipe-pipeops.html.

Sebelum kita menerapkan standarisasi peubah dan PCA, kita akan melihat terlebih dahulu argumen apa saja yang ada di dalam keduanya

po("pca")$param_set
## <ParamSet:pca>
##                id    class lower upper      levels    default value
## 1:         center ParamLgl    NA    NA  TRUE,FALSE       TRUE      
## 2:         scale. ParamLgl    NA    NA  TRUE,FALSE      FALSE      
## 3:          rank. ParamInt     1   Inf                             
## 4: affect_columns ParamUty    NA    NA             <Selector>
po("scale")$param_set
## <ParamSet:scale>
##                id    class lower upper      levels     default value
## 1:         center ParamLgl    NA    NA  TRUE,FALSE        TRUE      
## 2:          scale ParamLgl    NA    NA  TRUE,FALSE        TRUE      
## 3:         robust ParamLgl    NA    NA  TRUE,FALSE <NoDefault> FALSE
## 4: affect_columns ParamUty    NA    NA              <Selector>

Berdasarkan informasi diatas, kita bisa mengatur banyak PCA yang digunakan dengan argumen rank..

Selanjutnya kita akan menerpakan data preprocessing diatas dengan sintaks dibawah ini

knn_standardize <-  po("scale")%>>%
  po("learner",lrn("classif.kknn",k=29,kernel="rectangular"))
logreg_pca <- po("pca",rank.=2) %>>% 
  po("learner",learner=lrn("classif.log_reg"))

Operator %>>% digunakan untuk menyambungkan antara data preprocessing satu dengan data preprocessing lainnya maupun dengan fungsi modelnya (dalam hal ini fungsi lrn).

Setelah itu kita dapat memasukannya ke dalam list model seperti sebelumnya

learner_diabetes2 <- list(lrn("classif.kknn",k=29,kernel="rectangular"),
                         knn_standardize,
                         lrn("classif.log_reg"),
                         logreg_pca
                         )

Menentukan cara pembagian data

Metode pembagian data ditentukan dengan menggunakan fungsi rsmp.

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

Metode pembagian data yang dipilih disini adalah metode cross-validation

Komparasi Model

Pada tahap ini langkah yang dilakukan sama sepeti komparasi dasar diatas

design2 <- benchmark_grid(tasks = task_diabetes,
                         learners = learner_diabetes2,
                         resamplings = resample_diabetes_cv 
                         )
bmr2 = benchmark(design2,store_models = TRUE)
## INFO  [09:24:06.655] Benchmark with 40 resampling iterations 
## INFO  [09:24:06.711] Applying learner 'classif.kknn' on task 'diabetes' (iter 1/10) 
## INFO  [09:24:07.204] Applying learner 'classif.kknn' on task 'diabetes' (iter 2/10) 
## INFO  [09:24:07.520] Applying learner 'classif.kknn' on task 'diabetes' (iter 3/10) 
## INFO  [09:24:07.890] Applying learner 'classif.kknn' on task 'diabetes' (iter 4/10) 
## INFO  [09:24:08.037] Applying learner 'classif.kknn' on task 'diabetes' (iter 5/10) 
## INFO  [09:24:08.222] Applying learner 'classif.kknn' on task 'diabetes' (iter 6/10) 
## INFO  [09:24:08.362] Applying learner 'classif.kknn' on task 'diabetes' (iter 7/10) 
## INFO  [09:24:08.519] Applying learner 'classif.kknn' on task 'diabetes' (iter 8/10) 
## INFO  [09:24:08.678] Applying learner 'classif.kknn' on task 'diabetes' (iter 9/10) 
## INFO  [09:24:08.841] Applying learner 'classif.kknn' on task 'diabetes' (iter 10/10) 
## INFO  [09:24:09.025] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 1/10) 
## INFO  [09:24:09.806] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 2/10) 
## INFO  [09:24:10.740] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 3/10) 
## INFO  [09:24:11.415] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 4/10) 
## INFO  [09:24:12.124] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 5/10) 
## INFO  [09:24:12.896] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 6/10) 
## INFO  [09:24:14.009] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 7/10) 
## INFO  [09:24:14.775] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 8/10) 
## INFO  [09:24:15.423] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 9/10) 
## INFO  [09:24:16.848] Applying learner 'scale.classif.kknn' on task 'diabetes' (iter 10/10) 
## INFO  [09:24:18.380] Applying learner 'classif.log_reg' on task 'diabetes' (iter 1/10) 
## INFO  [09:24:18.574] Applying learner 'classif.log_reg' on task 'diabetes' (iter 2/10) 
## INFO  [09:24:18.736] Applying learner 'classif.log_reg' on task 'diabetes' (iter 3/10) 
## INFO  [09:24:18.938] Applying learner 'classif.log_reg' on task 'diabetes' (iter 4/10) 
## INFO  [09:24:19.110] Applying learner 'classif.log_reg' on task 'diabetes' (iter 5/10) 
## INFO  [09:24:19.278] Applying learner 'classif.log_reg' on task 'diabetes' (iter 6/10) 
## INFO  [09:24:19.460] Applying learner 'classif.log_reg' on task 'diabetes' (iter 7/10) 
## INFO  [09:24:19.642] Applying learner 'classif.log_reg' on task 'diabetes' (iter 8/10) 
## INFO  [09:24:19.844] Applying learner 'classif.log_reg' on task 'diabetes' (iter 9/10) 
## INFO  [09:24:20.083] Applying learner 'classif.log_reg' on task 'diabetes' (iter 10/10) 
## INFO  [09:24:20.242] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 1/10) 
## INFO  [09:24:21.210] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 2/10) 
## INFO  [09:24:21.699] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 3/10) 
## INFO  [09:24:22.243] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 4/10) 
## INFO  [09:24:22.773] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 5/10) 
## INFO  [09:24:23.310] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 6/10) 
## INFO  [09:24:23.838] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 7/10) 
## INFO  [09:24:24.361] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 8/10) 
## INFO  [09:24:24.901] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 9/10) 
## INFO  [09:24:25.407] Applying learner 'pca.classif.log_reg' on task 'diabetes' (iter 10/10) 
## INFO  [09:24:26.058] Finished benchmark

Hasil Komparasi model

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

result2 = bmr2$aggregate(list(msr("classif.acc"),
             msr("classif.specificity"),
             msr("classif.sensitivity")
              ))
result2
##     resample_result nr  task_id          learner_id resampling_id iters
## 1: <ResampleResult>  1 diabetes        classif.kknn            cv    10
## 2: <ResampleResult>  2 diabetes  scale.classif.kknn            cv    10
## 3: <ResampleResult>  3 diabetes     classif.log_reg            cv    10
## 4: <ResampleResult>  4 diabetes pca.classif.log_reg            cv    10
##    classif.acc classif.specificity classif.sensitivity
## 1:   0.7551404           0.8952497           0.4945341
## 2:   0.7551404           0.8952497           0.4945341
## 3:   0.7671053           0.8726702           0.5674603
## 4:   0.7325088           0.8715752           0.4760046

Berdasarkan hasil diatas ternyata standarisasi dan PCA tidak mempengaruhi performa model secara signifikan.

Verifikasi Data Preprosessing

Di bagian ini, kita akan mencoba menelusuri apakah benar data sudah di standarisasikan atau PCA kan sebelum dimodelkan. Pada sintaks dibawah angka 1,11,21 dan 31 berarti kita mengakses lipatan/folds pertama dari masing-masing model (ingat kita menggunakan 10-folds cross-validation).

bmr2$data$state[[1]]$model$data
##      Outcome Age  BMI BloodPressure DiabetesPedigreeFunction Glucose Insulin
##   1: Control  31 26.6            66                    0.351      85       0
##   2:    Case  32 23.3            64                    0.672     183       0
##   3:    Case  26 31.0            50                    0.248      78      88
##   4:    Case  51 25.8            72                    0.587     166     175
##   5: Control  60 36.0            75                    0.546     109       0
##  ---                                                                        
## 672:    Case  23 38.0            64                    0.674      93     160
## 673:    Case  24 44.5            88                    0.646     174     120
## 674: Control  21 36.6            60                    0.453      99     160
## 675: Control  27 36.8            70                    0.340     122       0
## 676: Control  30 26.2            72                    0.245     121     112
##      Pregnancies SkinThickness
##   1:           1            29
##   2:           8             0
##   3:           3            32
##   4:           5            19
##   5:           5            26
##  ---                          
## 672:           2            32
## 673:           2            37
## 674:           2            17
## 675:           2            27
## 676:           5            23
bmr2$data$state[[11]]$model$classif.kknn$model$data
##      Outcome        Age        BMI BloodPressure DiabetesPedigreeFunction
##   1: Control -0.1913303 -0.6913056    -0.1812311              -0.36186869
##   2:    Case -0.1074527 -1.1196966    -0.2885097               0.61995204
##   3:    Case -0.6107185 -0.1201177    -1.0394601              -0.67690774
##   4:    Case  1.4862223 -0.7951580     0.1406048               0.35996836
##   5: Control  2.2411209  0.5289595     0.3015228               0.23456446
##  ---                                                                     
## 672:    Case -0.8623514  0.7885904    -0.2885097               0.62606931
## 673:    Case -0.7784737  1.6323908     0.9988338               0.54042762
## 674: Control -1.0301066  0.6068488    -0.5030669              -0.04988827
## 675: Control -0.5268409  0.6328119     0.0333262              -0.39551364
## 676: Control -0.2752080 -0.7432318     0.1406048              -0.68608364
##          Glucose     Insulin Pregnancies SkinThickness
##   1: -1.11994572 -0.69233341  -0.8590920    0.55719469
##   2:  1.98701257 -0.69233341   1.2107774   -1.30556873
##   3: -1.34187131  0.06906439  -0.2677008    0.74989435
##   4:  1.44805041  0.82180995   0.3236905   -0.08513752
##   5: -0.35905797 -0.69233341   0.3236905    0.36449503
##  ---                                                  
## 672: -0.86631647  0.69202623  -0.5633964    0.74989435
## 673:  1.70167966  0.34593632  -0.5633964    1.07106046
## 674: -0.67609453  0.69202623  -0.5633964   -0.21360397
## 675:  0.05308955 -0.69233341  -0.5633964    0.42872825
## 676:  0.02138590  0.27671834   0.3236905    0.17179536
bmr2$data$state[[21]]$model$data
##      Outcome Age  BMI BloodPressure DiabetesPedigreeFunction Glucose Insulin
##   1: Control  31 26.6            66                    0.351      85       0
##   2:    Case  32 23.3            64                    0.672     183       0
##   3:    Case  26 31.0            50                    0.248      78      88
##   4:    Case  51 25.8            72                    0.587     166     175
##   5: Control  60 36.0            75                    0.546     109       0
##  ---                                                                        
## 672:    Case  23 38.0            64                    0.674      93     160
## 673:    Case  24 44.5            88                    0.646     174     120
## 674: Control  21 36.6            60                    0.453      99     160
## 675: Control  27 36.8            70                    0.340     122       0
## 676: Control  30 26.2            72                    0.245     121     112
##      Pregnancies SkinThickness
##   1:           1            29
##   2:           8             0
##   3:           3            32
##   4:           5            19
##   5:           5            26
##  ---                          
## 672:           2            32
## 673:           2            37
## 674:           2            17
## 675:           2            27
## 676:           5            23
bmr2$data$state[[31]]$model$classif.log_reg$model$data
##      Outcome        PC1         PC2
##   1: Control  82.455183  28.7849044
##   2:    Case  74.892113 -68.3091093
##   3:    Case  -4.385722  46.5138397
##   4:    Case -98.526921 -38.5072639
##   5: Control  80.241661  -0.6901102
##  ---                               
## 672:    Case -77.610032  36.6130773
## 673:    Case -46.220964 -49.2003681
## 674: Control -77.251067  30.6613485
## 675: Control  78.856339  -7.7785462
## 676: Control -31.961800   2.7570849

Berdasarkan output diatas kita bisa yakin bahwa data sudah di standarisasikan atau PCA kan sebelum dimodelkan