Pengenalan Ekosistem mlr3 untuk Statistical Learning

Gerry Alfa Dito1

Rahma Anisa2

Package

Silahkan install jika belum ada

install.packages("tidyverse")
install.packages("mlr3verse")
install.packages("kknn")
install.packages("e1071")
install.packages("ranger")
install.packages("rpart.plot")

Memanggil Package

library(tidyverse)
library(mlr3verse)

Deskripsi singkat data

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

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

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

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

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

Statistical Learning di R

Di R ada beberapa ekosistem yang bisa digunakan untuk menerapkan statistical learning atau machine learning, yang paling terkenal adalah ekosistem caret dan juga mlr. Jika ingin mempelajari ekosistem caret secara lebih lengkap bisa mengakses link berikut https://topepo.github.io/caret/. Pada tutorial 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/

Proses pemodelan (learning) 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 interpretasi model (jika diperlukan)
  6. Melakukan training dan menghitung performa model/ Komparasi model
  7. Memprediksi respon pada data baru (jika tersedia)

Import data di R

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

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

Import data ke ekosistem mlr3

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

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

Argumen utama dalam fungsi TaskClassif$new adalah sebagai berikut:

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

Menentukan model yang digunakan

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

  1. Regresi Logistik - "classif.log_reg"
  2. KNN - "classif.kknn" - library(kknn)
  3. Decision Tree - "classif.rpart" - library(rpart)
  4. Naive Bayes - "classif.naive_bayes" - library(e1071)
  5. Random Forest - "classif.ranger" - library(ranger)

Sebagai catatan, untuk model-model yang digunakan dalam mlr3 berasal dari package-package lain sehingga package-package tersebut perlu install terlebih dahulu. Kemudian, untuk model klasifikasi (respon biner atau multiclass) selalu diawali dengan kata "classif.". Sedangkan model regresi(respon numerik) diawali dengan kata regr. Selain itu, 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.

Jika ingin mengetahui model-model apa saja yang sudah bisa dijalankan di ekosistem mlr3 bisa dilihat pada link berikut:

  1. https://mlr3learners.mlr-org.com/
  2. https://mlr3extralearners.mlr-org.com/articles/learners/list_learners.html

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

learner_logreg <- lrn("classif.log_reg")
learner_knn <- lrn("classif.kknn",k=10,kernel="rectangular")
learner_tree <- lrn("classif.rpart")
learner_nb <- lrn("classif.naive_bayes")
learner_rf <- lrn("classif.ranger",importance="impurity")

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 tutorial 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_diabetes1 = rsmp("holdout", ratio = 0.8)

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

Melakukan interpretasi model (jika diperlukan)

Tahap ini biasanya dilakukan untuk melihat bagaimana pengaruh peubah-peubah prediktor terhadap respon menurut masing-masing model. Misalnya saja dalam regresi logistik besarnya nilai koefisien dan p value bisa menggambarkan bagaimana pengaruh peubah prediktor terhadap respon. Model-model yang akan digunakan untuk melihat pengaruh tersebut adalah regresi logistik, decision tree dan Random Forest. Berikut adalah sintaksnya

# Regresi Logistik
learner_logreg$train(task = task_diabetes)
summary(learner_logreg$model)
## 
## Call:
## stats::glm(formula = task$formula(), family = "binomial", data = task$data(), 
##     model = FALSE)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.9139  -0.7278   0.4194   0.7338   2.5393  
## 
## Coefficients:
##                            Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               8.3697127  0.7241555  11.558  < 2e-16 ***
## Age                      -0.0162950  0.0094134  -1.731 0.083443 .  
## BMI                      -0.0894983  0.0152167  -5.882 4.06e-09 ***
## BloodPressure             0.0136704  0.0052846   2.587 0.009686 ** 
## DiabetesPedigreeFunction -0.9255279  0.3006644  -3.078 0.002082 ** 
## Glucose                  -0.0349069  0.0037467  -9.317  < 2e-16 ***
## Insulin                   0.0012331  0.0009118   1.352 0.176249    
## Pregnancies              -0.1188551  0.0322586  -3.684 0.000229 ***
## SkinThickness            -0.0014183  0.0069417  -0.204 0.838109    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 972.27  on 751  degrees of freedom
## Residual deviance: 711.73  on 743  degrees of freedom
## AIC: 729.73
## 
## Number of Fisher Scoring iterations: 5
# Decision Tree
learner_tree$train(task = task_diabetes)
rpart.plot::rpart.plot(learner_tree$model,roundint = F,type = 5,tweak = 1.75)

# Random Forest
learner_rf$train(task = task_diabetes)
learner_rf$model$variable.importance
##                      Age                      BMI            BloodPressure 
##                 46.77492                 57.26435                 30.17551 
## DiabetesPedigreeFunction                  Glucose                  Insulin 
##                 42.67091                 86.13760                 23.95150 
##              Pregnancies            SkinThickness 
##                 29.02866                 23.63663

Catatan:

  1. Data yang digunakan untuk menjalankan model-model tanpa pembagian data (training dan testing)
  2. rpart.plot berasal dari package rpart.plot.
  3. Argumen type dalam rpart.plot digunakan untuk menentukan bagimana pohon di gambarkan. Argumen tweak digunakan untuk memperbesar gambar. Lihat help untuk lebih lengkapnya.
  4. Nilai variable importance untuk Random Forest diatas adalah nilai Gini Impurity. Semakin besar nilainya maka akan semakin berpengaruh prediktor tersebut. Jika ingin mengetahui Gini Impurity secara lebih lengkap bisa melihat link berikut https://victorzhou.com/blog/gini-impurity/

Dibawah ini merupakan sintaks untuk mengubah output variable importance ke dalam data.frame agar mudah untuk diurutkan dan di buat grafiknya.

importance <- data.frame(Predictors = names(learner_rf$model$variable.importance),
                         impurity = learner_rf$model$variable.importance
                         )
rownames(importance) <- NULL

importance %>% arrange(desc(impurity))
##                 Predictors impurity
## 1                  Glucose 86.13760
## 2                      BMI 57.26435
## 3                      Age 46.77492
## 4 DiabetesPedigreeFunction 42.67091
## 5            BloodPressure 30.17551
## 6              Pregnancies 29.02866
## 7                  Insulin 23.95150
## 8            SkinThickness 23.63663

Melakukan training dan menghitung performa model

Pada tahap ini kita bisa menerapkan model yang sudah kita definisikan diawal 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_knn,
                               resampling = resample_diabetes1,
                               store_models = TRUE
                               )
## INFO  [14:45:09.057] Applying learner 'classif.kknn' on task 'diabetes' (iter 1/1)

Berdasarkan sintaks diatas kita melakukan training untuk model KNN, jika ingin melakukan training untuk model lainnya cukup ganti learner=learner_knn dengan learner_logreg,learner_nb,learner_tree dan learner_rf.

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_id   truth response
## 1:     13    Case     Case
## 2:     16    Case  Control
## 3:     21 Control  Control
## 4:     25    Case  Control
## 5:     33 Control  Control
## 6:     40 Control     Case

Confusion matrix bisa dikeluarkan dengan sintaks dibawah ini

train_test_diabetes$prediction()$confusion
##          truth
## response  Case Control
##   Case      26      18
##   Control   25      81

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

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.7133333           0.8181818           0.5098039

Komparasi model

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

learner_diabetes <- list(learner_logreg,learner_knn,
                         learner_tree,learner_nb,learner_rf)

Langkah berikutnya kita menentukan metode pembagian data. Metode pembagian data yang awal yang sudah disimpan pada objek resample_diabetes1 bisa kita gunakan. Namun disini kita akan mencoba untuk menggunakan metode cross-validation

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

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

Komparasi model 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  [14:45:09.615] Benchmark with 50 resampling iterations 
## INFO  [14:45:09.636] Applying learner 'classif.log_reg' on task 'diabetes' (iter 6/10) 
## INFO  [14:45:09.668] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 1/10) 
## INFO  [14:45:09.743] Applying learner 'classif.rpart' on task 'diabetes' (iter 3/10) 
## INFO  [14:45:09.784] Applying learner 'classif.rpart' on task 'diabetes' (iter 5/10) 
## INFO  [14:45:09.815] Applying learner 'classif.rpart' on task 'diabetes' (iter 7/10) 
## INFO  [14:45:09.838] Applying learner 'classif.kknn' on task 'diabetes' (iter 3/10) 
## INFO  [14:45:09.874] Applying learner 'classif.kknn' on task 'diabetes' (iter 10/10) 
## INFO  [14:45:09.908] Applying learner 'classif.rpart' on task 'diabetes' (iter 1/10) 
## INFO  [14:45:09.931] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 7/10) 
## INFO  [14:45:09.972] Applying learner 'classif.ranger' on task 'diabetes' (iter 6/10) 
## INFO  [14:45:10.134] Applying learner 'classif.ranger' on task 'diabetes' (iter 8/10) 
## INFO  [14:45:10.238] Applying learner 'classif.log_reg' on task 'diabetes' (iter 2/10) 
## INFO  [14:45:10.259] Applying learner 'classif.rpart' on task 'diabetes' (iter 4/10) 
## INFO  [14:45:10.283] Applying learner 'classif.kknn' on task 'diabetes' (iter 2/10) 
## INFO  [14:45:10.324] Applying learner 'classif.kknn' on task 'diabetes' (iter 6/10) 
## INFO  [14:45:10.357] Applying learner 'classif.log_reg' on task 'diabetes' (iter 7/10) 
## INFO  [14:45:10.379] Applying learner 'classif.log_reg' on task 'diabetes' (iter 5/10) 
## INFO  [14:45:10.403] Applying learner 'classif.rpart' on task 'diabetes' (iter 9/10) 
## INFO  [14:45:10.427] Applying learner 'classif.ranger' on task 'diabetes' (iter 1/10) 
## INFO  [14:45:10.608] Applying learner 'classif.rpart' on task 'diabetes' (iter 2/10) 
## INFO  [14:45:10.642] Applying learner 'classif.ranger' on task 'diabetes' (iter 7/10) 
## INFO  [14:45:10.759] Applying learner 'classif.ranger' on task 'diabetes' (iter 5/10) 
## INFO  [14:45:11.145] Applying learner 'classif.log_reg' on task 'diabetes' (iter 9/10) 
## INFO  [14:45:11.170] Applying learner 'classif.kknn' on task 'diabetes' (iter 9/10) 
## INFO  [14:45:11.206] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 6/10) 
## INFO  [14:45:11.240] Applying learner 'classif.kknn' on task 'diabetes' (iter 5/10) 
## INFO  [14:45:11.276] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 8/10) 
## INFO  [14:45:11.308] Applying learner 'classif.log_reg' on task 'diabetes' (iter 10/10) 
## INFO  [14:45:11.331] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 10/10) 
## INFO  [14:45:11.370] Applying learner 'classif.kknn' on task 'diabetes' (iter 1/10) 
## INFO  [14:45:11.416] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 5/10) 
## INFO  [14:45:11.452] Applying learner 'classif.ranger' on task 'diabetes' (iter 10/10) 
## INFO  [14:45:11.566] Applying learner 'classif.log_reg' on task 'diabetes' (iter 4/10) 
## INFO  [14:45:11.588] Applying learner 'classif.log_reg' on task 'diabetes' (iter 8/10) 
## INFO  [14:45:11.609] Applying learner 'classif.kknn' on task 'diabetes' (iter 4/10) 
## INFO  [14:45:11.647] Applying learner 'classif.log_reg' on task 'diabetes' (iter 1/10) 
## INFO  [14:45:11.670] Applying learner 'classif.ranger' on task 'diabetes' (iter 4/10) 
## INFO  [14:45:11.777] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 4/10) 
## INFO  [14:45:11.806] Applying learner 'classif.rpart' on task 'diabetes' (iter 6/10) 
## INFO  [14:45:11.825] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 9/10) 
## INFO  [14:45:11.870] Applying learner 'classif.kknn' on task 'diabetes' (iter 7/10) 
## INFO  [14:45:11.902] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 3/10) 
## INFO  [14:45:11.931] Applying learner 'classif.ranger' on task 'diabetes' (iter 3/10) 
## INFO  [14:45:12.044] Applying learner 'classif.naive_bayes' on task 'diabetes' (iter 2/10) 
## INFO  [14:45:12.091] Applying learner 'classif.ranger' on task 'diabetes' (iter 9/10) 
## INFO  [14:45:12.192] Applying learner 'classif.ranger' on task 'diabetes' (iter 2/10) 
## INFO  [14:45:12.271] Applying learner 'classif.rpart' on task 'diabetes' (iter 8/10) 
## INFO  [14:45:12.287] Applying learner 'classif.rpart' on task 'diabetes' (iter 10/10) 
## INFO  [14:45:12.530] Applying learner 'classif.kknn' on task 'diabetes' (iter 8/10) 
## INFO  [14:45:12.585] Applying learner 'classif.log_reg' on task 'diabetes' (iter 3/10) 
## INFO  [14:45:12.628] Finished benchmark

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

Hasil Komparasi model

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

result = bmr$aggregate(msr("classif.acc")
              )
result
##    nr      resample_result  task_id          learner_id resampling_id iters
## 1:  1 <ResampleResult[21]> diabetes     classif.log_reg            cv    10
## 2:  2 <ResampleResult[21]> diabetes        classif.kknn            cv    10
## 3:  3 <ResampleResult[21]> diabetes       classif.rpart            cv    10
## 4:  4 <ResampleResult[21]> diabetes classif.naive_bayes            cv    10
## 5:  5 <ResampleResult[21]> diabetes      classif.ranger            cv    10
##    classif.acc
## 1:   0.7712281
## 2:   0.7421053
## 3:   0.7632456
## 4:   0.7565965
## 5:   0.7672632

Berdasarkan nilai akurasi model yang memiliki performa prediksi terbaik adalah model regresi logistik.

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. Datanya bisa di download di link berikut

https://github.com/gerrydito/Model-Klasifikasi/tree/master/Praktikum/KNN

data_diabetes_baru <- read.csv("diabetes_baru.csv")
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

Sebagai contoh kita menggunakan model regresi logistik sebagai model terbaik, berikut sintaksnya.

learner_logreg$train(task = task_diabetes)
prediksi_data_baru_logreg <- learner_logreg$predict_newdata(newdata = data_diabetes_baru)
as.data.table(prediksi_data_baru_logreg)
##     row_id truth response
##  1:      1  <NA>     Case
##  2:      2  <NA>  Control
##  3:      3  <NA>  Control
##  4:      4  <NA>     Case
##  5:      5  <NA>  Control
##  6:      6  <NA>  Control
##  7:      7  <NA>     Case
##  8:      8  <NA>  Control
##  9:      9  <NA>  Control
## 10:     10  <NA>     Case
## 11:     11  <NA>     Case
## 12:     12  <NA>  Control
## 13:     13  <NA>  Control
## 14:     14  <NA>     Case
## 15:     15  <NA>     Case
## 16:     16  <NA>  Control

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.