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.
ML-For-Beginners/translations/ms/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

650 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-06T12:29:34+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"Bina model klasifikasi: Masakan Asia dan India yang Lazat\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Pengelasan Masakan 2\n",
"\n",
"Dalam pelajaran pengelasan kedua ini, kita akan meneroka `lebih banyak cara` untuk mengelaskan data kategori. Kita juga akan mempelajari implikasi memilih satu pengelas berbanding yang lain.\n",
"\n",
"### [**Kuiz Pra-Kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Prasyarat**\n",
"\n",
"Kami mengandaikan bahawa anda telah menyelesaikan pelajaran sebelumnya kerana kita akan membawa beberapa konsep yang telah dipelajari sebelum ini.\n",
"\n",
"Untuk pelajaran ini, kita memerlukan pakej berikut:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) adalah [koleksi pakej R](https://www.tidyverse.org/packages) yang direka untuk menjadikan sains data lebih pantas, mudah dan menyeronokkan!\n",
"\n",
"- `tidymodels`: Kerangka [tidymodels](https://www.tidymodels.org/) adalah [koleksi pakej](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
"\n",
"- `themis`: Pakej [themis](https://themis.tidymodels.org/) menyediakan Langkah Resipi Tambahan untuk Menangani Data Tidak Seimbang.\n",
"\n",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk menyelesaikan modul ini dan memasangnya untuk anda jika ia tiada.\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 pengelasan**\n",
"\n",
"Dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), kita cuba menjawab soalan: bagaimana kita memilih antara pelbagai model? Sebahagian besarnya bergantung pada ciri-ciri data dan jenis masalah yang ingin kita selesaikan (contohnya pengelasan atau regresi?)\n",
"\n",
"Sebelumnya, kita telah mempelajari tentang pelbagai pilihan yang anda ada ketika mengelaskan data menggunakan helaian rujukan Microsoft. Rangka kerja Pembelajaran Mesin Python, Scikit-learn, menawarkan helaian rujukan yang serupa tetapi lebih terperinci yang boleh membantu anda menyempitkan pilihan estimator anda (istilah lain untuk pengelas):\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Petua: [lawati peta ini secara dalam talian](https://scikit-learn.org/stable/tutorial/machine_learning_map/) dan klik sepanjang laluan untuk membaca dokumentasi. \n",
"> \n",
"> [Laman rujukan Tidymodels](https://www.tidymodels.org/find/parsnip/#models) juga menyediakan dokumentasi yang sangat baik tentang pelbagai jenis model.\n",
"\n",
"### **Rancangan** 🗺️\n",
"\n",
"Peta ini sangat berguna apabila anda mempunyai pemahaman yang jelas tentang data anda, kerana anda boleh 'berjalan' di sepanjang laluannya untuk membuat keputusan:\n",
"\n",
"- Kami mempunyai \\>50 sampel\n",
"\n",
"- Kami ingin meramal kategori\n",
"\n",
"- Kami mempunyai data berlabel\n",
"\n",
"- Kami mempunyai kurang daripada 100K sampel\n",
"\n",
"- ✨ Kami boleh memilih Linear SVC\n",
"\n",
"- Jika itu tidak berjaya, kerana kami mempunyai data berangka\n",
"\n",
" - Kami boleh mencuba ✨ KNeighbors Classifier\n",
"\n",
" - Jika itu juga tidak berjaya, cuba ✨ SVC dan ✨ Ensemble Classifiers\n",
"\n",
"Ini adalah laluan yang sangat berguna untuk diikuti. Sekarang, mari kita teruskan dengan menggunakan rangka kerja pemodelan [tidymodels](https://www.tidymodels.org/): satu koleksi pakej R yang konsisten dan fleksibel yang dibangunkan untuk menggalakkan amalan statistik yang baik 😊.\n",
"\n",
"## 2. Bahagikan data dan tangani set data yang tidak seimbang.\n",
"\n",
"Daripada pelajaran sebelumnya, kita belajar bahawa terdapat satu set bahan biasa merentasi masakan kita. Selain itu, terdapat pengagihan yang agak tidak seimbang dalam bilangan masakan.\n",
"\n",
"Kita akan menangani perkara ini dengan\n",
"\n",
"- Membuang bahan yang paling biasa yang mencetuskan kekeliruan antara masakan yang berbeza, menggunakan `dplyr::select()`.\n",
"\n",
"- Menggunakan `recipe` yang memproses data untuk bersedia untuk pemodelan dengan menggunakan algoritma `over-sampling`.\n",
"\n",
"Kita sudah melihat perkara di atas dalam pelajaran sebelumnya, jadi ini sepatutnya 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": [
"### Menangani Data Tidak Seimbang\n",
"\n",
"Data tidak seimbang sering memberi kesan negatif terhadap prestasi model. Kebanyakan model berfungsi dengan baik apabila bilangan pemerhatian adalah sama dan, oleh itu, cenderung menghadapi kesukaran dengan data yang tidak seimbang.\n",
"\n",
"Terdapat dua cara utama untuk menangani set data tidak seimbang:\n",
"\n",
"- menambah pemerhatian kepada kelas minoriti: `Over-sampling` contohnya menggunakan algoritma SMOTE yang secara sintetik menghasilkan contoh baharu bagi kelas minoriti menggunakan jiran terdekat bagi kes-kes ini.\n",
"\n",
"- mengurangkan pemerhatian daripada kelas majoriti: `Under-sampling`\n",
"\n",
"Dalam pelajaran sebelumnya, kami telah menunjukkan cara menangani set data tidak seimbang menggunakan `recipe`. Recipe boleh dianggap sebagai pelan tindakan yang menerangkan langkah-langkah yang perlu diterapkan pada set data untuk menjadikannya sedia untuk analisis data. Dalam kes kita, kita mahu mempunyai pengagihan yang sama dalam bilangan masakan kita untuk `training set` kita. Mari kita teruskan.\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 bersedia untuk melatih model 👩‍💻👨‍💻!\n",
"\n",
"## 3. Melangkaui model regresi multinomial\n",
"\n",
"Dalam pelajaran sebelumnya, kita telah melihat model regresi multinomial. Mari kita terokai 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 cuba mencari *hyperplane* yang \"paling baik\" memisahkan kelas-kelas. Mari kita lihat contoh mudah:\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 maksimum.\n",
"\n",
"#### Pengelas Linear Support Vector\n",
"\n",
"Support-Vector clustering (SVC) adalah sebahagian daripada keluarga teknik ML Support-Vector machines. Dalam SVC, hyperplane dipilih untuk memisahkan `kebanyakan` pemerhatian latihan dengan betul, tetapi `mungkin salah klasifikasi` beberapa pemerhatian. Dengan membenarkan beberapa titik berada di sisi yang salah, SVM menjadi lebih tahan terhadap outlier dan dengan itu memberikan generalisasi yang lebih baik kepada data baharu. Parameter yang mengawal pelanggaran ini dirujuk sebagai `cost` yang mempunyai nilai lalai 1 (lihat `help(\"svm_poly\")`).\n",
"\n",
"Mari kita cipta SVC linear dengan menetapkan `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 kita telah menangkap langkah-langkah prapemprosesan dan spesifikasi model ke dalam *workflow*, kita boleh terus melatih SVC linear dan menilai hasilnya pada masa yang sama. Untuk metrik prestasi, mari kita cipta satu set metrik yang akan menilai: `accuracy`, `sensitivity`, `Positive Predicted Value` dan `F Measure`.\n",
"\n",
"> `augment()` akan menambah lajur untuk ramalan kepada 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": [
"#### Mesin Vektor Sokongan\n",
"\n",
"Mesin vektor sokongan (SVM) adalah lanjutan daripada pengklasifikasi vektor sokongan untuk menyesuaikan sempadan tidak linear antara kelas. Secara asasnya, SVM menggunakan *helah kernel* untuk memperluaskan ruang ciri bagi menyesuaikan hubungan tidak linear antara kelas. Salah satu fungsi kernel yang popular dan sangat fleksibel yang digunakan oleh SVM ialah *Fungsi asas radial.* Mari kita lihat bagaimana ia berprestasi 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": [
"Lebih baik 🤩!\n",
"\n",
"> ✅ Sila 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 with Applications in R\n",
">\n",
"> untuk bacaan lanjut.\n",
"\n",
"### Pengelas Neighbor Terdekat\n",
"\n",
"*K*-nearest neighbor (KNN) adalah algoritma di mana setiap pemerhatian diramal berdasarkan *keserupaan* dengan pemerhatian lain.\n",
"\n",
"Mari kita sesuaikan satu dengan 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": [
"Model ini nampaknya tidak berfungsi dengan baik. Mungkin dengan mengubah argumen model (lihat `help(\"nearest_neighbor\")`) akan meningkatkan prestasi model. Pastikan untuk mencubanya.\n",
"\n",
"> ✅ Sila 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 mengetahui lebih lanjut tentang pengklasifikasi *K*-Nearest Neighbors.\n",
"\n",
"### Pengklasifikasi Ensemble\n",
"\n",
"Algoritma ensemble berfungsi dengan menggabungkan beberapa penganggar asas untuk menghasilkan model yang optimum sama ada melalui:\n",
"\n",
"`bagging`: menggunakan *fungsi purata* pada koleksi model asas\n",
"\n",
"`boosting`: membina urutan model yang saling melengkapi untuk meningkatkan prestasi ramalan.\n",
"\n",
"Mari kita mulakan dengan mencuba model Random Forest, yang membina koleksi besar pokok keputusan kemudian menggunakan fungsi purata 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 yang bagus 👏!\n",
"\n",
"Mari kita juga cuba dengan model Boosted Tree.\n",
"\n",
"Boosted Tree mendefinisikan kaedah ensemble yang mencipta satu siri pokok keputusan secara berurutan di mana setiap pokok bergantung pada hasil pokok sebelumnya dalam usaha untuk mengurangkan ralat secara beransur-ansur. Ia memberi tumpuan kepada berat item yang diklasifikasikan secara salah dan menyesuaikan padanan untuk pengklasifikasi seterusnya bagi membetulkan.\n",
"\n",
"Terdapat pelbagai cara untuk memadankan model ini (lihat `help(\"boost_tree\")`). Dalam contoh ini, kita akan memadankan Boosted trees melalui enjin `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": [
"> ✅ Sila lihat:\n",
">\n",
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\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",
"> - <https://algotech.netlify.app/blog/xgboost/> - Membincangkan model AdaBoost yang merupakan alternatif yang baik kepada xgboost.\n",
">\n",
"> untuk mempelajari lebih lanjut tentang pengelas Ensemble.\n",
"\n",
"## 4. Tambahan - membandingkan pelbagai model\n",
"\n",
"Kita telah melatih sejumlah besar model dalam makmal ini 🙌. Ia boleh menjadi membosankan atau membebankan untuk mencipta banyak aliran kerja daripada pelbagai set pemprosesan awal dan/atau spesifikasi model, kemudian mengira metrik prestasi satu persatu.\n",
"\n",
"Mari kita lihat jika kita boleh menyelesaikan ini dengan mencipta satu fungsi yang melatih senarai aliran kerja pada set latihan, kemudian mengembalikan metrik prestasi berdasarkan set ujian. Kita akan menggunakan `map()` dan `map_dfr()` daripada pakej [purrr](https://purrr.tidyverse.org/) untuk menerapkan fungsi kepada setiap elemen dalam senarai.\n",
"\n",
"> Fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) membolehkan anda menggantikan banyak gelung for dengan kod yang lebih ringkas dan mudah dibaca. Tempat terbaik untuk mempelajari fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) adalah dalam [bab iterasi](http://r4ds.had.co.nz/iteration.html) dalam buku R for Data Science.\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": [
"[**workflowset**](https://workflowsets.tidymodels.org/) membolehkan pengguna mencipta dan dengan mudah melatih sejumlah besar model, tetapi ia kebanyakannya direka untuk digunakan bersama teknik pensampelan semula seperti `cross-validation`, satu pendekatan yang kita belum bincangkan.\n",
"\n",
"## **🚀Cabaran**\n",
"\n",
"Setiap teknik ini mempunyai sejumlah besar parameter yang boleh anda ubah suai, contohnya `cost` dalam SVM, `neighbors` dalam KNN, `mtry` (Predictor yang Dipilih Secara Rawak) dalam Random Forest.\n",
"\n",
"Selidik parameter lalai untuk setiap satu dan fikirkan apa maksud mengubah suai parameter ini terhadap kualiti model.\n",
"\n",
"Untuk mengetahui lebih lanjut tentang model tertentu dan parameternya, gunakan: `help(\"model\")` contohnya `help(\"rand_forest\")`\n",
"\n",
"> Dalam amalan, kita biasanya *menganggar* *nilai terbaik* untuk parameter ini dengan melatih banyak model pada `set data simulasi` dan mengukur sejauh mana prestasi semua model ini. Proses ini dipanggil **tuning**.\n",
"\n",
"### [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Ulasan & Kajian Kendiri**\n",
"\n",
"Terdapat banyak istilah teknikal dalam pelajaran ini, jadi luangkan masa untuk menyemak [senarai ini](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) istilah berguna!\n",
"\n",
"#### TERIMA KASIH KEPADA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) kerana mencipta ilustrasi yang menakjubkan yang menjadikan R lebih mesra dan menarik. Cari 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) kerana mencipta versi asal modul ini dalam Python ♥️\n",
"\n",
"Selamat Belajar,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Duta Pelajar Microsoft Learn Emas.\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 perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
]
}
]
}