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
<- read.csv("https://raw.githubusercontent.com/gerrydito/Model-Klasifikasi/master/Praktikum/KNN/diabetes.csv",
data_diabetes 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:
Langkah-langkah pemodelan klasifikasi menggunakan ekosistem mlr3:
Import data di R
Import data ke ekosistem mlr3
Menentukan model yang digunakan
Menentukan cara pembagian data
Melakukan training dan menghitung performa model
Tuning Hiperparameter (jika diperlukan)
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.
= TaskClassif$new(id="diabetes",
task_diabetes backend = data_diabetes,
target = "Outcome",
positive ="Case")
Argumen utama dalam fungsi TaskClassif$new
adalah sebagai berikut:
id
yang merupakan nama dari task (bisa diisi dengan nama apapun)backend
adalah data yang ingin dimodelkan dengan catatan peubah respon-nya harus berupa factortarget
adalah nama kolom yang dijadikan peubah responpositive
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
<- lrn("classif.kknn",
learner_diabetes k=10,
kernel="rectangular")
Catatan:
Daftar model-model yang dapat diakses menggunakan package mlr3
adalah sebagai berikut:
classif.featureless
: Simple baseline classification learner, constantly predicts the label that is most frequent in the training set.classif.rpart
: Single classification tree from rpart. regr.featureless : Simple baseline regression learner, constantly predicts with the mean.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
.
= rsmp("holdout",
resample_diabetes 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)
$instantiate(task = task_diabetes) resample_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.
= resample(task = task_diabetes,
train_test_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.
= as.data.table(train_test_diabetes$prediction())
prediksi_test 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
$prediction()$confusion train_test_diabetes
## 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
.
$aggregate(msr("classif.acc")) train_test_diabetes
## 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.
$aggregate(list(msr("classif.acc"),
train_test_diabetesmsr("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:
Menentukan hiperparameter yang akan dituning beserta nilai-nilai yang akan dituning. Ini bisa dilakukan dengan menggunakan fungsi
ParamSet$new
dari packageparadox
.Menentukan kapan pencarian hiperparameter ini berhenti. Ini dilakukan dengan menggunakan fungsi
trm
dari packagemlr3tuning
.Memasukan informasi-informasi yang dibutuhkan untuk melakukan tuning ke dalam fungsi
TuningInstanceSingleCrit
.Menentukan bagaimana algoritma tuning hiperparameter. Ini menggunakan fungsi
tnr
dari packagemlr3tuning
Menjalankan tuning hiperparameter.
Langkah 1 sampai 3 bisa dilihat dari sintaks dibawah ini:
<- ParamSet$new(params = list(ParamInt$new("k",
param_bound lower = 2,
upper = 30)))
= trm("evals",
terminate n_evals = 29)
<- TuningInstanceSingleCrit$new(task = task_diabetes,
tuning_setting 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
<- tnr("grid_search",
tuner resolution = 29)
$optimize(tuning_setting) tuner
## 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%.
$result tuning_setting
## 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.
$archive$data() tuning_setting
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.
<- read.csv("https://raw.githubusercontent.com/gerrydito/Model-Klasifikasi/master/Praktikum/KNN/diabetes_baru.csv", stringsAsFactors = TRUE
data_diabetes_baru
)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
$param_set$values <- tuning_setting$result_learner_param_vals
learner_diabetes$train(task = task_diabetes)
learner_diabetes<- learner_diabetes$predict_newdata(newdata = data_diabetes_baru) prediksi_data_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.
IPB University, gerry_dito@apps.ipb.ac.id↩︎
Badan Informasi Geospasial, abdul.aziz@big.go.id↩︎