STA551 Pemodelan Klasifikasi - K-Nearest Neighboor (KNN) dengan mlr3

Persiapan

Instalasi Package

Silahkan Install jika belum ada

install.packages("mlr3")
install.packages("mlr3learners")
install.packages("mlr3tuning")
install.packages("kknn")

Memanggil Library

library(mlr3)
library(mlr3learners)
library(mlr3tuning)
## Loading required package: paradox
library(paradox)

Data

Deskripsi 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.

Import Data di R

data_diabetes <- read.csv("https://raw.githubusercontent.com/gerrydito/Model-Klasifikasi/master/Praktikum/KNN/diabetes.csv",
                          stringsAsFactors = TRUE)

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

Pemodelan Klasifikasi di R dengan mlr3

Di R ada beberapa ekosistem yang bisa digunakan untuk menerpkan model klasifikasi atau machine learning, yang paling terkenal adalah ekosistem caret dan juga mlr. Jika ingin mempelajari ekosistem secara lebih lengkap bisa mengakses link berikut https://topepo.github.io/caret/. Pada praktikum kali ini kita akan menggunakan ekosistem mlr (atau sekarang berubah nama menjadi mlr3). Jika tertarik belajar lebih lanjut tentang ekosistem ini bisa mengakses link-link berikut:

  1. https://mlr3.mlr-org.com/

  2. https://mlr3book.mlr-org.com/

  3. https://mlr3gallery.mlr-org.com/

Langkah-langkah pemodelan klasifikasi menggunakan ekosistem mlr3:

  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

  6. Tuning Hiperparameter (jika diperlukan)

  7. Memprediksi respon pada data baru (jika tersedia)

1. Import data di R

Data sudah diimport di atas.

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

2. 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

3. Menentukan Model yang digunakan

Pada tahap ini fungsi yang digunakan adalah lrn yang memiliki argumen utama nama model yang ingin digunakan. Pada praktikum kali ini model yang digunakan adalah model KNN, sehingga argumen yang digunakan adalah "classif.kknn". Sebagai catatan, untuk model-model klasifikasi, nama model pada package mlr3 ini akan selalu diawali dengan kata "classif.".

Kemudian fungsi lrn juga memungkinkan untuk memasukan argumen-argumen dari package asalnya (termasuk hiperparameter). Sebagai contoh model KNN dari package kknn memiliki argumen-argumen yang bisa dilihat dengan menggunakan

as.data.table(lrn("classif.kknn")$param_set)
##          id    class lower upper
## 1:        k ParamInt     1   Inf
## 2: distance ParamDbl     0   Inf
## 3:   kernel ParamFct    NA    NA
## 4:    scale ParamLgl    NA    NA
## 5:  ykernel ParamUty    NA    NA
##                                                            levels nlevels
## 1:                                                                    Inf
## 2:                                                                    Inf
## 3: rectangular,triangular,epanechnikov,biweight,triweight,cos,...      10
## 4:                                                     TRUE,FALSE       2
## 5:                                                                    Inf
##    is_bounded special_vals default storage_type  tags
## 1:      FALSE    <list[0]>       7      integer train
## 2:      FALSE    <list[0]>       2      numeric train
## 3:       TRUE    <list[0]> optimal    character train
## 4:       TRUE    <list[0]>    TRUE      logical train
## 5:      FALSE    <list[0]>                 list train

Berdasarkan output diatas argumen-argumen yang bisa digunakan dalam classif.kknn ada di kolom id. Selanjutnya, kolom class menunjukkan tipe data argumen tersebut. Kolom lower, upper dan levels merupakan isi/nilai dari argumen tersebut. Misalnya saja argumen k itu tipe datanya Interger dan nilai yang paling kecil bisa mengisi minimal 1.

Untuk menjalankan model knn yang biasa kita harus mengisi argumen kernel dengan rectangle. Secara lengkap berikut adalah sintaksnya

learner_diabetes <- lrn("classif.kknn",
                        k=10,
                        kernel="rectangular")

Catatan:

Daftar model-model yang dapat diakses menggunakan package mlr3 adalah sebagai berikut:

  1. classif.featureless : Simple baseline classification learner, constantly predicts the label that is most frequent in the training set.

  2. classif.rpart : Single classification tree from rpart. regr.featureless : Simple baseline regression learner, constantly predicts with the mean.

  3. regr.rpart : Single regression tree from rpart.

Selain itu, model-model lainnya bisa diakses menggunakan package mlr3learners yang daftarnya bisa di lihat pada link https://mlr3learners.mlr-org.com/. Sebagai catatan untuk menjalankan model-model tersebut package asalnya harus diinstall terlebih dahulu.

4. Menentukan cara pembagian data

Penentuan cara pembagian data bisa dilakukan dengan fungsi rsmp. Adapun pembagian data yang bisa digunakan dalam package mlr3 adalah sebagai berikut

as.data.table(mlr_resamplings)
##            key        params iters
## 1:   bootstrap repeats,ratio    30
## 2:      custom                   0
## 3:          cv         folds    10
## 4:     holdout         ratio     1
## 5:    insample                   1
## 6:         loo                  NA
## 7: repeated_cv repeats,folds   100
## 8: subsampling repeats,ratio    30

Pada kolom key adalah nama-nama dari tipe-tipe pembagian data. Penjelasan untuk masing-masing pembagian data tersebut dapat di cari di internet. Pada praktikum ini kita membagi data menjadi dua bagian yaitu data training dan data testing dengan proporsi data training sebesar 0.8 dari data dan data testing sebesar 0.2. Pembagian ini bisa dilakukan dengan menggunakan menggunakan menggunakan pembagian data "holdout" dan proporsi tadi bisa dipenuhi dengan menambahkan argumen ratio=0.8.

resample_diabetes = rsmp("holdout",
                         ratio = 0.8)

Pembagian data ini dimaksudkan untuk mengevaluasi kemampuan prediksi model untuk data baru.

Agar tidak berubah-ubah dalam penarikan sample, maka digunakan fungsi set.seed()

set.seed(123)
resample_diabetes$instantiate(task = task_diabetes)

5. Melakukan training dan menghitung performa model

Setelah pembagian data sudah dilakukan, selanjutnya kita bisa menerapkan model tersebut pada data training dan kemudian mengevaluasi kemampuan prediksi dengan data testing. Hal tersebut bisa dilakukan dengan menggunakan fungsi resample.

train_test_diabetes = resample(task = task_diabetes,
                               learner = learner_diabetes,
                               resampling = resample_diabetes,
                               store_models = TRUE
                               )
## INFO  [11:27:47.767] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1)
## Warning: package 'kknn' was built under R version 4.1.1

Jika kita ingin mengeluarkan hasil prediksi pada data testing bisa menggunakan sintaks dibawah ini.

prediksi_test = as.data.table(train_test_diabetes$prediction())
head(prediksi_test)
##    row_ids   truth response
## 1:       1    Case     Case
## 2:       3    Case     Case
## 3:       9    Case  Control
## 4:      17    Case     Case
## 5:      22    Case     Case
## 6:      27 Control  Control

Confusion matrix bisa dikeluarkan dengan sintaks dibawah ini

train_test_diabetes$prediction()$confusion
##          truth
## response  Case Control
##   Case      33      15
##   Control   23      79

Untuk menghitung performa model dengan menggunakan ukuran akurasi bisa menggunakan sintaks dibawah ini. Fungsi msr merupakan fungsi yang dapat mengakses ukuran-ukuran kebaikan model yang ada di dalam package mlr3.

train_test_diabetes$aggregate(msr("classif.acc"))
## classif.acc 
##   0.7466667

Ukuran kebaikan model yang ada di package mlr3 bisa dilihat di link https://mlr3.mlr-org.com/reference/mlr_measures.html. Sebagai catatan, terdapat beberapa ukuran yang membutuhkan prediksi yang dikeluarkan berupa peluang bukan berupa kelas.

Kemudian jika ada lebih dari satu ukuran kebaikan model yang ingin kita gunakan, kita bisa melakukannya dengan sintaks dibawah ini.

train_test_diabetes$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
##         classif.acc classif.specificity classif.sensitivity 
##           0.7466667           0.8404255           0.5892857

6. Tuning Hiperparameter (jika diperlukan)

Tahap tuning hiperparameter ini merupakan tahap optional dari pemodelan. Dalam ekosistem mlr3 kita bisa melakukannya dengan bantuan package mlr3tuning dan paradox. Hal pertama yang dilakukan untuk tuning hiperparameter ini adalah dengan menentukan hiperameter mana yang ingin kita tuning. Tujuan dari tuning ini adalah untuk mencari hiperparameter yang optimal berdasarkan ukuran tertentu. Misalnya saja kita menggunakan akurasi, berarti hiperparameter yang optimal merupakan hiperparameter yang menyebabkan nilai akurasi paling tinggi.

Pada model KNN, hiperparameter yang kita tuning adalah k atau banyaknya tetangga. Kemudian ukuran yang digunakan disini adalah akurasi. Langkah-langkah tuning hiperparameter pada ekosistem mlr3 adalah sebagai berikut:

  1. Menentukan hiperparameter yang akan dituning beserta nilai-nilai yang akan dituning. Ini bisa dilakukan dengan menggunakan fungsi ParamSet$new dari package paradox.

  2. Menentukan kapan pencarian hiperparameter ini berhenti. Ini dilakukan dengan menggunakan fungsi trm dari package mlr3tuning.

  3. Memasukan informasi-informasi yang dibutuhkan untuk melakukan tuning ke dalam fungsi TuningInstanceSingleCrit.

  4. Menentukan bagaimana algoritma tuning hiperparameter. Ini menggunakan fungsi tnr dari package mlr3tuning

  5. Menjalankan tuning hiperparameter.

Langkah 1 sampai 3 bisa dilihat dari sintaks dibawah ini:

param_bound <- ParamSet$new(params = list(ParamInt$new("k",
                                                       lower = 2,
                                                       upper = 30)))
terminate = trm("evals",
                n_evals = 29)
tuning_setting <- TuningInstanceSingleCrit$new(task = task_diabetes,
                                               learner = learner_diabetes,
                                               resampling = resample_diabetes,
                                               measure = msr("classif.acc"),
                                               search_space = param_bound,
                                               terminator = terminate
                             )

hiperparameter k memiliki tipe data bilangan bulat sehingga hiparameternya adalah fungsi ParamInt$new digunakan.

Fungsi-fungsi yang bisa digunakan sesuai dengan tipe data hiperparameter bisa dilihat di https://github.com/mlr-org/paradox.

Kemudian fungsi trm membutuhkan argumen utama nama metode pemberentian, yang secara lengkah bisa dilihat di link https://cheatsheets.mlr-org.com/mlr3tuning.pdf , selanjutnya argumen kedua dalam kasus ini n_evals akan berubah-ubah sesuai dengan metode pemberentian yang dipilih. Argumen "evals berarti metode pemberentian yang dipilih adalah metode iterasi, yang mana tuning hiperparameter akan berhenti saat mencapai iterasi tertentu (dalam hal ini saat iterasi 29).

Langkah ke-4 dan ke-5 bisa dilihat pada sintaks dibawah ini

tuner <- tnr("grid_search",
             resolution = 29)
tuner$optimize(tuning_setting)
## INFO  [11:27:49.150] [bbotk] Starting to optimize 1 parameter(s) with '<OptimizerGridSearch>' and '<TerminatorEvals> [n_evals=29]' 
## INFO  [11:27:49.221] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:49.248] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:49.259] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:49.309] [mlr3]  Finished benchmark 
## INFO  [11:27:49.383] [bbotk] Result of batch 1: 
## INFO  [11:27:49.387] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:49.387] [bbotk]  28   0.7466667 03e1ce51-8f42-4fe8-bfb3-c395ec47c95e 
## INFO  [11:27:49.390] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:49.426] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:49.439] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:49.507] [mlr3]  Finished benchmark 
## INFO  [11:27:49.598] [bbotk] Result of batch 2: 
## INFO  [11:27:49.601] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:49.601] [bbotk]  26   0.7466667 8630c736-fa12-4c2f-9e59-3ea7a3776810 
## INFO  [11:27:49.603] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:49.630] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:49.642] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:49.697] [mlr3]  Finished benchmark 
## INFO  [11:27:49.750] [bbotk] Result of batch 3: 
## INFO  [11:27:49.752] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:49.752] [bbotk]  14   0.7266667 47567c09-fc58-477f-98ea-d1cafc750fd2 
## INFO  [11:27:49.754] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:49.771] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:49.778] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:49.809] [mlr3]  Finished benchmark 
## INFO  [11:27:49.856] [bbotk] Result of batch 4: 
## INFO  [11:27:49.862] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:49.862] [bbotk]  13   0.7266667 ec990436-5c8c-425a-a978-d82d74d6d983 
## INFO  [11:27:49.864] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:49.883] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:49.890] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:49.942] [mlr3]  Finished benchmark 
## INFO  [11:27:50.063] [bbotk] Result of batch 5: 
## INFO  [11:27:50.080] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:50.080] [bbotk]  19   0.7666667 d48cb88c-28b2-47fc-8abb-dbb4886de213 
## INFO  [11:27:50.084] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.138] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.150] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.216] [mlr3]  Finished benchmark 
## INFO  [11:27:50.312] [bbotk] Result of batch 6: 
## INFO  [11:27:50.314] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:50.314] [bbotk]  22        0.76 d893fc16-9e73-4e60-b6db-36d0d8a70463 
## INFO  [11:27:50.316] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.334] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.346] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.381] [mlr3]  Finished benchmark 
## INFO  [11:27:50.434] [bbotk] Result of batch 7: 
## INFO  [11:27:50.436] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:50.436] [bbotk]  15   0.7466667 edf59971-e572-4d23-a3e3-04d083d5dbf2 
## INFO  [11:27:50.437] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.462] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.471] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.507] [mlr3]  Finished benchmark 
## INFO  [11:27:50.555] [bbotk] Result of batch 8: 
## INFO  [11:27:50.557] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:50.557] [bbotk]  17   0.7466667 095e5da0-e443-4afb-89cd-30bb748b013e 
## INFO  [11:27:50.558] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.578] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.586] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.621] [mlr3]  Finished benchmark 
## INFO  [11:27:50.674] [bbotk] Result of batch 9: 
## INFO  [11:27:50.675] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:50.675] [bbotk]  12        0.76 a60512fe-9a4f-4645-a55b-df57b37e9170 
## INFO  [11:27:50.677] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.695] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.702] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.734] [mlr3]  Finished benchmark 
## INFO  [11:27:50.781] [bbotk] Result of batch 10: 
## INFO  [11:27:50.783] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:50.783] [bbotk]  7   0.7666667 551cb389-cb79-4488-8cd4-e8c64d849abf 
## INFO  [11:27:50.784] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.847] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.855] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.885] [mlr3]  Finished benchmark 
## INFO  [11:27:50.933] [bbotk] Result of batch 11: 
## INFO  [11:27:50.936] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:50.936] [bbotk]  2   0.7533333 6233db3a-3b27-4f9b-87a7-5b6a9a5a30a9 
## INFO  [11:27:50.937] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:50.955] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:50.963] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:50.997] [mlr3]  Finished benchmark 
## INFO  [11:27:51.050] [bbotk] Result of batch 12: 
## INFO  [11:27:51.052] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.052] [bbotk]  11        0.76 2b09bd4a-22ca-4ee3-a63f-ec9b3f65157f 
## INFO  [11:27:51.053] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.070] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.079] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.110] [mlr3]  Finished benchmark 
## INFO  [11:27:51.161] [bbotk] Result of batch 13: 
## INFO  [11:27:51.162] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.162] [bbotk]  21        0.76 6d5439ec-dffc-4eb5-9109-8721a0f2fd06 
## INFO  [11:27:51.164] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.180] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.195] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.229] [mlr3]  Finished benchmark 
## INFO  [11:27:51.283] [bbotk] Result of batch 14: 
## INFO  [11:27:51.285] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.285] [bbotk]  18   0.7466667 ae92aac2-8a86-416e-9a8a-6b6678737d57 
## INFO  [11:27:51.286] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.304] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.313] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.347] [mlr3]  Finished benchmark 
## INFO  [11:27:51.411] [bbotk] Result of batch 15: 
## INFO  [11:27:51.414] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:51.414] [bbotk]  3   0.7733333 a52baa8d-b83b-40d4-be67-8b1093a15642 
## INFO  [11:27:51.416] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.440] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.454] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.504] [mlr3]  Finished benchmark 
## INFO  [11:27:51.572] [bbotk] Result of batch 16: 
## INFO  [11:27:51.574] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.574] [bbotk]  25   0.7466667 354ce27d-cac9-49f9-bbe0-3567c70f3c7e 
## INFO  [11:27:51.578] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.604] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.613] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.667] [mlr3]  Finished benchmark 
## INFO  [11:27:51.720] [bbotk] Result of batch 17: 
## INFO  [11:27:51.722] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.722] [bbotk]  24   0.7466667 b8d0168f-39c0-4b40-856f-1ca6f83966b0 
## INFO  [11:27:51.723] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.741] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.749] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.781] [mlr3]  Finished benchmark 
## INFO  [11:27:51.833] [bbotk] Result of batch 18: 
## INFO  [11:27:51.835] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.835] [bbotk]  16   0.7466667 3130b3e2-a9a6-401f-9e9c-98e8e1af1a58 
## INFO  [11:27:51.836] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.853] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.860] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:51.894] [mlr3]  Finished benchmark 
## INFO  [11:27:51.941] [bbotk] Result of batch 19: 
## INFO  [11:27:51.943] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:51.943] [bbotk]  29        0.74 c1daa089-de9e-44bc-b845-216e542d991f 
## INFO  [11:27:51.944] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:51.964] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:51.972] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.012] [mlr3]  Finished benchmark 
## INFO  [11:27:52.076] [bbotk] Result of batch 20: 
## INFO  [11:27:52.078] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:52.078] [bbotk]  10   0.7466667 99313796-7529-495a-9b65-534c9506da7a 
## INFO  [11:27:52.080] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.102] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.116] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.180] [mlr3]  Finished benchmark 
## INFO  [11:27:52.268] [bbotk] Result of batch 21: 
## INFO  [11:27:52.269] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:52.269] [bbotk]  20   0.7666667 69a5822b-921d-4b25-99b9-161ce89c9af3 
## INFO  [11:27:52.271] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.289] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.297] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.339] [mlr3]  Finished benchmark 
## INFO  [11:27:52.399] [bbotk] Result of batch 22: 
## INFO  [11:27:52.401] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:52.401] [bbotk]  23   0.7466667 1e4d397f-626b-481e-82e2-cfcde93b524f 
## INFO  [11:27:52.403] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.421] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.429] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.466] [mlr3]  Finished benchmark 
## INFO  [11:27:52.559] [bbotk] Result of batch 23: 
## INFO  [11:27:52.564] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:52.564] [bbotk]  9   0.7466667 557c1af5-4f6b-435b-a69d-e2e67d9845c3 
## INFO  [11:27:52.570] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.605] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.619] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.679] [mlr3]  Finished benchmark 
## INFO  [11:27:52.760] [bbotk] Result of batch 24: 
## INFO  [11:27:52.762] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:52.762] [bbotk]  6   0.7466667 b731425d-e2e3-4e6e-ba5d-958400ad9add 
## INFO  [11:27:52.763] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.787] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.795] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.827] [mlr3]  Finished benchmark 
## INFO  [11:27:52.875] [bbotk] Result of batch 25: 
## INFO  [11:27:52.877] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:52.877] [bbotk]  5   0.7466667 b012b939-b2c7-4b2a-96bb-9cc911e04a0f 
## INFO  [11:27:52.878] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:52.895] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:52.902] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:52.942] [mlr3]  Finished benchmark 
## INFO  [11:27:52.987] [bbotk] Result of batch 26: 
## INFO  [11:27:52.988] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:52.988] [bbotk]  27   0.7466667 7efe074c-1506-4d09-a585-013d8aa15a25 
## INFO  [11:27:52.990] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:53.008] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:53.018] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:53.051] [mlr3]  Finished benchmark 
## INFO  [11:27:53.109] [bbotk] Result of batch 27: 
## INFO  [11:27:53.111] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:53.111] [bbotk]  8   0.7666667 7c7db53d-a564-4d20-850d-f93b9f1d145d 
## INFO  [11:27:53.112] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:53.136] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:53.147] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:53.193] [mlr3]  Finished benchmark 
## INFO  [11:27:53.313] [bbotk] Result of batch 28: 
## INFO  [11:27:53.324] [bbotk]  k classif.acc                                uhash 
## INFO  [11:27:53.324] [bbotk]  4   0.7733333 b2a61880-49df-4ad9-9683-22cf569ed85a 
## INFO  [11:27:53.327] [bbotk] Evaluating 1 configuration(s) 
## INFO  [11:27:53.358] [mlr3]  Running benchmark with 1 resampling iterations 
## INFO  [11:27:53.376] [mlr3]  Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1) 
## INFO  [11:27:53.424] [mlr3]  Finished benchmark 
## INFO  [11:27:53.480] [bbotk] Result of batch 29: 
## INFO  [11:27:53.482] [bbotk]   k classif.acc                                uhash 
## INFO  [11:27:53.482] [bbotk]  30        0.74 1fbaa315-61bc-41c6-a33e-aa53eb842fc1 
## INFO  [11:27:53.496] [bbotk] Finished optimizing after 29 evaluation(s) 
## INFO  [11:27:53.497] [bbotk] Result: 
## INFO  [11:27:53.499] [bbotk]  k learner_param_vals  x_domain classif.acc 
## INFO  [11:27:53.499] [bbotk]  3          <list[2]> <list[1]>   0.7733333
##    k learner_param_vals  x_domain classif.acc
## 1: 3          <list[2]> <list[1]>   0.7733333

Fungsi tnr memiliki satu argumen utama yaitu nama algoritma tuningnya, sedangkan argumen kedua dan ketiga itu bergantung pada algoritma tuning yang dipilih. Secara lengkah algoritma-algortima tuning bisa diakses bisa dilihat pada https://cheatsheets.mlr-org.com/mlr3tuning.pdf. Pada kasus sintaks diatas, algoritma yang dipilih adalah "grid_search" sedangkan argumen tambahan yang mungkin adalah resolution dan batch.

Argumen resolution digunakan untuk menentukan banyak nilai yang dicoba dari batas atas dan bawah hiperparameter yang sudah ditentukan menggunakan fungsi ParamSet$new diatas. Pada kasus ini, nilai k akan dicari dari nilai 2 sampai 30 berarti ada 29 nilai yang dicoba.

Oleh karena itu kita atur resolution=29. Jika kita mengatur resolusi kurang dari 29 maka tidak semua nilai k antara 2 sampai 30 akan dicoba. Argumen “batch_size” umumnya bisa diabaikan.

Kemudian hasil tuning hiperparameternya bisa dilihat pada sintaks dibawah ini. Ini berarti nilai k yang paling optimal berdasarkan nilai akurasi adalah 3, yang menghasilkan akurasi sekitar 77.33%.

tuning_setting$result
##    k learner_param_vals  x_domain classif.acc
## 1: 3          <list[2]> <list[1]>   0.7733333

Kemudian jika kita ingin menampilkan semua nilai k beserta akurasinya bisa menggunakan sintaks dibawah ini.

tuning_setting$archive$data()

7. Memprediksi respon pada data baru (jika tersedia)

Pada bagian ini akan diilustrasikan bagimana jika kita menerima data baru yang tidak memiliki peubah respon. Berikut dibawah ini adalah datanya.

data_diabetes_baru <- read.csv("https://raw.githubusercontent.com/gerrydito/Model-Klasifikasi/master/Praktikum/KNN/diabetes_baru.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

Untuk melakukan hal ini kita bisa menggunakan sintaks dibawah ini

learner_diabetes$param_set$values <- tuning_setting$result_learner_param_vals
learner_diabetes$train(task = task_diabetes)
prediksi_data_baru <- learner_diabetes$predict_newdata(newdata = data_diabetes_baru)
## Warning: package 'kknn' was built under R version 4.1.1
as.data.table(prediksi_data_baru)
##     row_ids truth response
##  1:       1  <NA>     Case
##  2:       2  <NA>  Control
##  3:       3  <NA>  Control
##  4:       4  <NA>  Control
##  5:       5  <NA>  Control
##  6:       6  <NA>  Control
##  7:       7  <NA>     Case
##  8:       8  <NA>  Control
##  9:       9  <NA>  Control
## 10:      10  <NA>  Control
## 11:      11  <NA>     Case
## 12:      12  <NA>  Control
## 13:      13  <NA>  Control
## 14:      14  <NA>  Control
## 15:      15  <NA>     Case
## 16:      16  <NA>  Control

Sintaks learner_diabetes$param_set$values <- tuning_setting$result_learner_param_vals digunakan untuk mengganti hiperparameter dengan hiperparameter yang sudah optimal. Kemudian fungsi $train digunakan untuk melakukan training pada data keseluruhan (tanpa ada proses pembagian data).

Terakhir, fungsi predict_newdata digunakan untuk melakukan prediksi pada data baru.


  1. IPB University, ↩︎

  2. Badan Informasi Geospasial, ↩︎