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:
- Import data di R
- Import data ke ekosistem mlr3
- Menentukan model yang digunakan
- Menentukan cara pembagian data
- 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