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
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:
Proses pemodelan (learning) menggunakan ekosistem mlr3:
- Import data di R
- Import data ke ekosistem mlr3
- Menentukan model yang digunakan
- Menentukan cara pembagian data
- Melakukan interpretasi model (jika diperlukan)
- Melakukan training dan menghitung performa model/ Komparasi model
- Memprediksi respon pada data baru (jika tersedia)
Import data di R
## 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:
idyang merupakan nama dari task (bisa diisi dengan nama apapun)backendadalah data yang ingin dimodelkan dengan catatan peubah respon-nya harus berupa factortargetadalah nama kolom yang dijadikan peubah responpositiveadalah 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:
- Regresi Logistik -
"classif.log_reg" - KNN -
"classif.kknn"-library(kknn) - Decision Tree -
"classif.rpart"-library(rpart) - Naive Bayes -
"classif.naive_bayes"-library(e1071) - 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
## 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:
- https://mlr3learners.mlr-org.com/
- https://mlr3extralearners.mlr-org.com/articles/learners/list_learners.html
Untuk menjalankan model-model tersebut kita bisa tulis seperti dibawah ini
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
## 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.
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
##
## 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)## 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:
- Data yang digunakan untuk menjalankan model-model tanpa pembagian data (training dan testing)
rpart.plotberasal dari packagerpart.plot.- Argumen
typedalamrpart.plotdigunakan untuk menentukan bagimana pohon di gambarkan. Argumentweakdigunakan untuk memperbesar gambar. Lihat help untuk lebih lengkapnya. - 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.
## 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
## 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.
## 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
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
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.
## 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.
## 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
## 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.