You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
648 lines
26 KiB
648 lines
26 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_12-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": []
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "fab50046ca413a38939d579f8432274f",
|
|
"translation_date": "2025-09-04T08:42:59+00:00",
|
|
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
|
|
"language_code": "id"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "jsFutf_ygqSx"
|
|
},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HD54bEefgtNO"
|
|
},
|
|
"source": [
|
|
"## Pengklasifikasi Masakan 2\n",
|
|
"\n",
|
|
"Dalam pelajaran klasifikasi kedua ini, kita akan mengeksplorasi `lebih banyak cara` untuk mengklasifikasikan data kategorikal. Kita juga akan mempelajari dampak dari memilih satu pengklasifikasi dibandingkan yang lain.\n",
|
|
"\n",
|
|
"### [**Kuis Pra-Pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
|
|
"\n",
|
|
"### **Prasyarat**\n",
|
|
"\n",
|
|
"Kami mengasumsikan bahwa Anda telah menyelesaikan pelajaran sebelumnya karena kita akan melanjutkan beberapa konsep yang telah dipelajari sebelumnya.\n",
|
|
"\n",
|
|
"Untuk pelajaran ini, kita memerlukan paket-paket berikut:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) adalah [koleksi paket R](https://www.tidyverse.org/packages) yang dirancang untuk membuat ilmu data lebih cepat, mudah, dan menyenangkan!\n",
|
|
"\n",
|
|
"- `tidymodels`: Kerangka kerja [tidymodels](https://www.tidymodels.org/) adalah [koleksi paket](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
|
|
"\n",
|
|
"- `themis`: Paket [themis](https://themis.tidymodels.org/) menyediakan Langkah-Langkah Resep Tambahan untuk Menangani Data yang Tidak Seimbang.\n",
|
|
"\n",
|
|
"Anda dapat menginstalnya dengan perintah berikut:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
|
|
"\n",
|
|
"Sebagai alternatif, skrip di bawah ini akan memeriksa apakah Anda sudah memiliki paket-paket yang diperlukan untuk menyelesaikan modul ini dan akan menginstalnya untuk Anda jika belum tersedia.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vZ57IuUxgyQt"
|
|
},
|
|
"source": [
|
|
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
|
|
"\n",
|
|
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "z22M-pj4g07x"
|
|
},
|
|
"source": [
|
|
"## **1. Peta klasifikasi**\n",
|
|
"\n",
|
|
"Dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), kita mencoba menjawab pertanyaan: bagaimana kita memilih di antara beberapa model? Sebagian besar, itu tergantung pada karakteristik data dan jenis masalah yang ingin kita selesaikan (misalnya klasifikasi atau regresi?).\n",
|
|
"\n",
|
|
"Sebelumnya, kita telah mempelajari berbagai opsi yang tersedia saat mengklasifikasikan data menggunakan cheat sheet dari Microsoft. Kerangka kerja Machine Learning Python, Scikit-learn, menawarkan cheat sheet serupa tetapi lebih rinci yang dapat membantu mempersempit pilihan estimator Anda (istilah lain untuk classifier):\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/map.png\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption></figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "u1i3xRIVg7vG"
|
|
},
|
|
"source": [
|
|
"> Tip: [kunjungi peta ini secara online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) dan klik sepanjang jalur untuk membaca dokumentasi. \n",
|
|
"> \n",
|
|
"> [Situs referensi Tidymodels](https://www.tidymodels.org/find/parsnip/#models) juga menyediakan dokumentasi yang sangat baik tentang berbagai jenis model.\n",
|
|
"\n",
|
|
"### **Rencana** 🗺️\n",
|
|
"\n",
|
|
"Peta ini sangat membantu setelah Anda memiliki pemahaman yang jelas tentang data Anda, karena Anda dapat 'menelusuri' jalurnya untuk membuat keputusan:\n",
|
|
"\n",
|
|
"- Kami memiliki \\>50 sampel\n",
|
|
"\n",
|
|
"- Kami ingin memprediksi sebuah kategori\n",
|
|
"\n",
|
|
"- Kami memiliki data berlabel\n",
|
|
"\n",
|
|
"- Kami memiliki kurang dari 100K sampel\n",
|
|
"\n",
|
|
"- ✨ Kami dapat memilih Linear SVC\n",
|
|
"\n",
|
|
"- Jika itu tidak berhasil, karena kami memiliki data numerik\n",
|
|
"\n",
|
|
" - Kami dapat mencoba ✨ KNeighbors Classifier\n",
|
|
"\n",
|
|
" - Jika itu juga tidak berhasil, coba ✨ SVC dan ✨ Ensemble Classifiers\n",
|
|
"\n",
|
|
"Ini adalah jalur yang sangat membantu untuk diikuti. Sekarang, mari langsung mempraktikkannya menggunakan kerangka kerja [tidymodels](https://www.tidymodels.org/): kumpulan paket R yang konsisten dan fleksibel yang dikembangkan untuk mendorong praktik statistik yang baik 😊.\n",
|
|
"\n",
|
|
"## 2. Membagi data dan menangani set data yang tidak seimbang.\n",
|
|
"\n",
|
|
"Dari pelajaran sebelumnya, kita belajar bahwa ada sekumpulan bahan umum di berbagai masakan kita. Selain itu, terdapat distribusi yang cukup tidak merata dalam jumlah masakan.\n",
|
|
"\n",
|
|
"Kita akan menangani ini dengan:\n",
|
|
"\n",
|
|
"- Menghapus bahan yang paling umum yang menciptakan kebingungan antara masakan yang berbeda, menggunakan `dplyr::select()`.\n",
|
|
"\n",
|
|
"- Menggunakan `recipe` yang memproses data agar siap untuk pemodelan dengan menerapkan algoritma `over-sampling`.\n",
|
|
"\n",
|
|
"Kita sudah membahas hal di atas dalam pelajaran sebelumnya, jadi ini seharusnya mudah 🥳!\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "6tj_rN00hClA"
|
|
},
|
|
"source": [
|
|
"# Load the core Tidyverse and Tidymodels packages\n",
|
|
"library(tidyverse)\n",
|
|
"library(tidymodels)\n",
|
|
"\n",
|
|
"# Load the original cuisines data\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
|
|
"\n",
|
|
"# Drop id column, rice, garlic and ginger from our original data set\n",
|
|
"df_select <- df %>% \n",
|
|
" select(-c(1, rice, garlic, ginger)) %>%\n",
|
|
" # Encode cuisine column as categorical\n",
|
|
" mutate(cuisine = factor(cuisine))\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create data split specification\n",
|
|
"set.seed(2056)\n",
|
|
"cuisines_split <- initial_split(data = df_select,\n",
|
|
" strata = cuisine,\n",
|
|
" prop = 0.7)\n",
|
|
"\n",
|
|
"# Extract the data in each split\n",
|
|
"cuisines_train <- training(cuisines_split)\n",
|
|
"cuisines_test <- testing(cuisines_split)\n",
|
|
"\n",
|
|
"# Display distribution of cuisines in the training set\n",
|
|
"cuisines_train %>% \n",
|
|
" count(cuisine) %>% \n",
|
|
" arrange(desc(n))"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zFin5yw3hHb1"
|
|
},
|
|
"source": [
|
|
"### Mengatasi Data yang Tidak Seimbang\n",
|
|
"\n",
|
|
"Data yang tidak seimbang sering kali berdampak negatif pada kinerja model. Banyak model bekerja paling baik ketika jumlah observasi seimbang, sehingga cenderung kesulitan dengan data yang tidak seimbang.\n",
|
|
"\n",
|
|
"Ada dua cara utama untuk menangani data yang tidak seimbang:\n",
|
|
"\n",
|
|
"- menambahkan observasi ke kelas minoritas: `Over-sampling`, misalnya menggunakan algoritma SMOTE yang secara sintetis menghasilkan contoh baru dari kelas minoritas dengan menggunakan tetangga terdekat dari kasus-kasus tersebut.\n",
|
|
"\n",
|
|
"- menghapus observasi dari kelas mayoritas: `Under-sampling`\n",
|
|
"\n",
|
|
"Dalam pelajaran sebelumnya, kami menunjukkan cara menangani data yang tidak seimbang menggunakan sebuah `recipe`. Recipe dapat dianggap sebagai cetak biru yang menjelaskan langkah-langkah apa saja yang harus diterapkan pada sebuah data set agar siap untuk analisis data. Dalam kasus kita, kita ingin memiliki distribusi yang seimbang dalam jumlah masakan untuk `training set` kita. Mari kita langsung mulai.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "cRzTnHolhLWd"
|
|
},
|
|
"source": [
|
|
"# Load themis package for dealing with imbalanced data\n",
|
|
"library(themis)\n",
|
|
"\n",
|
|
"# Create a recipe for preprocessing training data\n",
|
|
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
|
|
" step_smote(cuisine) \n",
|
|
"\n",
|
|
"# Print recipe\n",
|
|
"cuisines_recipe"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KxOQ2ORhhO81"
|
|
},
|
|
"source": [
|
|
"Sekarang kita siap untuk melatih model 👩💻👨💻!\n",
|
|
"\n",
|
|
"## 3. Melampaui model regresi multinomial\n",
|
|
"\n",
|
|
"Dalam pelajaran sebelumnya, kita telah mempelajari model regresi multinomial. Sekarang, mari kita jelajahi beberapa model yang lebih fleksibel untuk klasifikasi.\n",
|
|
"\n",
|
|
"### Support Vector Machines\n",
|
|
"\n",
|
|
"Dalam konteks klasifikasi, `Support Vector Machines` adalah teknik pembelajaran mesin yang berusaha menemukan *hyperplane* yang \"paling baik\" memisahkan kelas-kelas. Mari kita lihat contoh sederhana:\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/svm.png\"\n",
|
|
" width=\"300\"/>\n",
|
|
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "C4Wsd0vZhXYu"
|
|
},
|
|
"source": [
|
|
"H1~ tidak memisahkan kelas. H2~ memisahkan, tetapi hanya dengan margin kecil. H3~ memisahkan dengan margin maksimal.\n",
|
|
"\n",
|
|
"#### Linear Support Vector Classifier\n",
|
|
"\n",
|
|
"Support-Vector clustering (SVC) adalah bagian dari keluarga teknik ML Support-Vector machines. Dalam SVC, hyperplane dipilih untuk memisahkan `sebagian besar` pengamatan pelatihan dengan benar, tetapi `mungkin salah mengklasifikasikan` beberapa pengamatan. Dengan mengizinkan beberapa titik berada di sisi yang salah, SVM menjadi lebih tahan terhadap outlier sehingga lebih baik dalam melakukan generalisasi pada data baru. Parameter yang mengatur pelanggaran ini disebut `cost` yang memiliki nilai default 1 (lihat `help(\"svm_poly\")`).\n",
|
|
"\n",
|
|
"Mari kita buat SVC linear dengan mengatur `degree = 1` dalam model SVM polinomial.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vJpp6nuChlBz"
|
|
},
|
|
"source": [
|
|
"# Make a linear SVC specification\n",
|
|
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svc_linear_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svc_linear_spec)\n",
|
|
"\n",
|
|
"# Print out workflow\n",
|
|
"svc_linear_wf"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "rDs8cWNkhoqu"
|
|
},
|
|
"source": [
|
|
"Sekarang setelah kita menangkap langkah-langkah pra-pemrosesan dan spesifikasi model ke dalam *workflow*, kita dapat melanjutkan untuk melatih linear SVC dan mengevaluasi hasilnya sekaligus. Untuk metrik kinerja, mari kita buat satu set metrik yang akan mengevaluasi: `accuracy`, `sensitivity`, `Positive Predicted Value`, dan `F Measure`.\n",
|
|
"\n",
|
|
"> `augment()` akan menambahkan kolom untuk prediksi ke data yang diberikan.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "81wiqcwuhrnq"
|
|
},
|
|
"source": [
|
|
"# Train a linear SVC model\n",
|
|
"svc_linear_fit <- svc_linear_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svc_linear_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "0UFQvHf-huo3"
|
|
},
|
|
"source": [
|
|
"#### Support Vector Machine\n",
|
|
"\n",
|
|
"Support vector machine (SVM) adalah pengembangan dari support vector classifier untuk mengakomodasi batas non-linear antara kelas. Pada dasarnya, SVM menggunakan *kernel trick* untuk memperbesar ruang fitur agar dapat menyesuaikan hubungan non-linear antara kelas. Salah satu fungsi kernel yang populer dan sangat fleksibel yang digunakan oleh SVM adalah *Radial basis function.* Mari kita lihat bagaimana performanya pada data kita.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "-KX4S8mzhzmp"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Make an RBF SVM specification\n",
|
|
"svm_rbf_spec <- svm_rbf() %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svm_rbf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svm_rbf_spec)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Train an RBF model\n",
|
|
"svm_rbf_fit <- svm_rbf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svm_rbf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "QBFSa7WSh4HQ"
|
|
},
|
|
"source": [
|
|
"Jauh lebih baik 🤩!\n",
|
|
"\n",
|
|
"> ✅ Silakan lihat:\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning dengan R\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning dengan Aplikasi di R\n",
|
|
">\n",
|
|
"> untuk bacaan lebih lanjut.\n",
|
|
"\n",
|
|
"### Klasifikasi Tetangga Terdekat\n",
|
|
"\n",
|
|
"*K*-nearest neighbor (KNN) adalah algoritma di mana setiap observasi diprediksi berdasarkan *kemiripannya* dengan observasi lainnya.\n",
|
|
"\n",
|
|
"Mari kita terapkan algoritma ini pada data kita.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "k4BxxBcdh9Ka"
|
|
},
|
|
"source": [
|
|
"# Make a KNN specification\n",
|
|
"knn_spec <- nearest_neighbor() %>% \n",
|
|
" set_engine(\"kknn\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"knn_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(knn_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"knn_wf_fit <- knn_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"knn_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HaegQseriAcj"
|
|
},
|
|
"source": [
|
|
"Tampaknya model ini tidak bekerja dengan baik. Mungkin mengubah argumen model (lihat `help(\"nearest_neighbor\")`) akan meningkatkan kinerja model. Pastikan untuk mencobanya.\n",
|
|
"\n",
|
|
"> ✅ Silakan lihat:\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> untuk mempelajari lebih lanjut tentang classifier *K*-Nearest Neighbors.\n",
|
|
"\n",
|
|
"### Classifier Ensemble\n",
|
|
"\n",
|
|
"Algoritma ensemble bekerja dengan menggabungkan beberapa estimator dasar untuk menghasilkan model yang optimal, baik dengan cara:\n",
|
|
"\n",
|
|
"`bagging`: menerapkan *fungsi rata-rata* pada kumpulan model dasar\n",
|
|
"\n",
|
|
"`boosting`: membangun serangkaian model yang saling melengkapi untuk meningkatkan kinerja prediktif.\n",
|
|
"\n",
|
|
"Mari kita mulai dengan mencoba model Random Forest, yang membangun kumpulan besar pohon keputusan kemudian menerapkan fungsi rata-rata untuk menghasilkan model keseluruhan yang lebih baik.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "49DPoVs6iK1M"
|
|
},
|
|
"source": [
|
|
"# Make a random forest specification\n",
|
|
"rf_spec <- rand_forest() %>% \n",
|
|
" set_engine(\"ranger\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"rf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(rf_spec)\n",
|
|
"\n",
|
|
"# Train a random forest model\n",
|
|
"rf_wf_fit <- rf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"rf_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "RGVYwC_aiUWc"
|
|
},
|
|
"source": [
|
|
"Kerja bagus 👏!\n",
|
|
"\n",
|
|
"Mari kita juga bereksperimen dengan model Boosted Tree.\n",
|
|
"\n",
|
|
"Boosted Tree mendefinisikan metode ensemble yang menciptakan serangkaian pohon keputusan secara berurutan, di mana setiap pohon bergantung pada hasil dari pohon sebelumnya dalam upaya untuk secara bertahap mengurangi kesalahan. Metode ini berfokus pada bobot item yang salah diklasifikasikan dan menyesuaikan model berikutnya untuk memperbaiki kesalahan tersebut.\n",
|
|
"\n",
|
|
"Ada berbagai cara untuk menyesuaikan model ini (lihat `help(\"boost_tree\")`). Dalam contoh ini, kita akan menyesuaikan Boosted Tree menggunakan mesin `xgboost`.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Py1YWo-micWs"
|
|
},
|
|
"source": [
|
|
"# Make a boosted tree specification\n",
|
|
"boost_spec <- boost_tree(trees = 200) %>% \n",
|
|
" set_engine(\"xgboost\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"boost_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(boost_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"boost_wf_fit <- boost_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"boost_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zNQnbuejigZM"
|
|
},
|
|
"source": [
|
|
"> ✅ Silakan lihat:\n",
|
|
">\n",
|
|
"> - [Machine Learning untuk Ilmuwan Sosial](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning dengan R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [Pengantar Pembelajaran Statistik dengan Aplikasi di R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> - <https://algotech.netlify.app/blog/xgboost/> - Membahas model AdaBoost yang merupakan alternatif bagus untuk xgboost.\n",
|
|
">\n",
|
|
"> untuk mempelajari lebih lanjut tentang Ensemble classifiers.\n",
|
|
"\n",
|
|
"## 4. Tambahan - membandingkan beberapa model\n",
|
|
"\n",
|
|
"Kita telah membuat cukup banyak model dalam lab ini 🙌. Bisa menjadi melelahkan atau merepotkan untuk membuat banyak alur kerja dari berbagai set preprosesor dan/atau spesifikasi model, lalu menghitung metrik kinerja satu per satu.\n",
|
|
"\n",
|
|
"Mari kita lihat apakah kita bisa mengatasi ini dengan membuat fungsi yang menyesuaikan daftar alur kerja pada set pelatihan, lalu mengembalikan metrik kinerja berdasarkan set pengujian. Kita akan menggunakan `map()` dan `map_dfr()` dari paket [purrr](https://purrr.tidyverse.org/) untuk menerapkan fungsi pada setiap elemen dalam daftar.\n",
|
|
"\n",
|
|
"> Fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) memungkinkan Anda menggantikan banyak loop for dengan kode yang lebih ringkas dan lebih mudah dibaca. Tempat terbaik untuk mempelajari fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) adalah bab [iterasi](http://r4ds.had.co.nz/iteration.html) dalam R untuk ilmu data.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Qzb7LyZnimd2"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"# Define a function that returns performance metrics\n",
|
|
"compare_models <- function(workflow_list, train_set, test_set){\n",
|
|
" \n",
|
|
" suppressWarnings(\n",
|
|
" # Fit each model to the train_set\n",
|
|
" map(workflow_list, fit, data = train_set) %>% \n",
|
|
" # Make predictions on the test set\n",
|
|
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
|
|
" # Select desired columns\n",
|
|
" select(model, cuisine, .pred_class) %>% \n",
|
|
" # Evaluate model performance\n",
|
|
" group_by(model) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
|
|
" ungroup()\n",
|
|
" )\n",
|
|
" \n",
|
|
"} # End of function"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "Fwa712sNisDA"
|
|
},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "3i4VJOi2iu-a"
|
|
},
|
|
"source": [
|
|
"# Make a list of workflows\n",
|
|
"workflow_list <- list(\n",
|
|
" \"svc\" = svc_linear_wf,\n",
|
|
" \"svm\" = svm_rbf_wf,\n",
|
|
" \"knn\" = knn_wf,\n",
|
|
" \"random_forest\" = rf_wf,\n",
|
|
" \"xgboost\" = boost_wf)\n",
|
|
"\n",
|
|
"# Call the function\n",
|
|
"set.seed(2056)\n",
|
|
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
|
|
"\n",
|
|
"# Print out performance metrics\n",
|
|
"perf_metrics %>% \n",
|
|
" group_by(.metric) %>% \n",
|
|
" arrange(desc(.estimate)) %>% \n",
|
|
" slice_head(n=7)\n",
|
|
"\n",
|
|
"# Compare accuracy\n",
|
|
"perf_metrics %>% \n",
|
|
" filter(.metric == \"accuracy\") %>% \n",
|
|
" arrange(desc(.estimate))\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KuWK_lEli4nW"
|
|
},
|
|
"source": [
|
|
"Paket [**workflowset**](https://workflowsets.tidymodels.org/) memungkinkan pengguna untuk membuat dan dengan mudah melatih sejumlah besar model, tetapi sebagian besar dirancang untuk bekerja dengan teknik resampling seperti `cross-validation`, sebuah pendekatan yang belum kita bahas.\n",
|
|
"\n",
|
|
"## **🚀Tantangan**\n",
|
|
"\n",
|
|
"Setiap teknik ini memiliki sejumlah besar parameter yang dapat Anda sesuaikan, misalnya `cost` pada SVM, `neighbors` pada KNN, `mtry` (Prediktor yang Dipilih Secara Acak) pada Random Forest.\n",
|
|
"\n",
|
|
"Teliti parameter default masing-masing dan pikirkan apa arti penyesuaian parameter ini terhadap kualitas model.\n",
|
|
"\n",
|
|
"Untuk mengetahui lebih lanjut tentang model tertentu dan parameternya, gunakan: `help(\"model\")` misalnya `help(\"rand_forest\")`\n",
|
|
"\n",
|
|
"> Dalam praktiknya, kita biasanya *mengestimasi* *nilai terbaik* untuk parameter ini dengan melatih banyak model pada `data set simulasi` dan mengukur seberapa baik kinerja semua model tersebut. Proses ini disebut **tuning**.\n",
|
|
"\n",
|
|
"### [**Kuis setelah kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
|
|
"\n",
|
|
"### **Tinjauan & Belajar Mandiri**\n",
|
|
"\n",
|
|
"Ada banyak istilah teknis dalam pelajaran ini, jadi luangkan waktu sejenak untuk meninjau [daftar ini](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) yang berisi istilah-istilah penting!\n",
|
|
"\n",
|
|
"#### TERIMA KASIH KEPADA:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) atas ilustrasi luar biasa yang membuat R lebih ramah dan menarik. Temukan lebih banyak ilustrasi di [galerinya](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
|
|
"\n",
|
|
"[Cassie Breviu](https://www.twitter.com/cassieview) dan [Jen Looper](https://www.twitter.com/jenlooper) atas pembuatan versi Python asli dari modul ini ♥️\n",
|
|
"\n",
|
|
"Selamat Belajar,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemah manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
|
|
]
|
|
}
|
|
]
|
|
} |