{ "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" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "jsFutf_ygqSx" }, "source": [ "# បង្កើតម៉ូដែលច្នៃប្រឌិតចំណាត់ថ្នាក់៖ ម្ហូបអាស៊ី និងឥណ្ឌាដែលឆ្ងាញ់\n" ] }, { "cell_type": "markdown", "metadata": { "id": "HD54bEefgtNO" }, "source": [ "## ម៉ាស៊ីនចំនួនចំណាត់ថ្នាក់ចំណីអាហារ 2\n", "\n", "នៅមេរៀនចំណាត់ថ្នាក់ទីពីរនេះ យើងនឹងស្វែងយល់អំពី `វិធីផ្សេងទៀត` ដើម្បីចាត់ថ្នាក់ទិន្នន័យប្រភេទកាតេហ្គូរិ។ យើងនឹងរៀនអំពីផលប៉ះពាល់នៃការជ្រើសរើសម៉ាស៊ីនចំណាត់ថ្នាក់មួយប្រសិនបើប្រៀបធៀបនឹងម៉ាស៊ីនដទៃទៀតផងដែរ។\n", "\n", "### [**ប្រលងមុនបង្រៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n", "\n", "### **លក្ខខណ្ឌមុន**\n", "\n", "យើងសន្មត់ថាអ្នកបានបញ្ចប់មេរៀនមុននេះហើយ ព្រោះយើងនឹងបន្តយកមកប្រើប្រាស់កន្លែងខ្លះៗដែលយើងបានរៀនមុន។\n", "\n", "សម្រាប់មេរៀននេះ យើងត្រូវការបណ្ណាល័យដូចខាងក្រោម៖\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជាក្រោមស្ទូមបណ្ណាល័យ R ដែលបង្កើតឡើងដើម្បីធ្វើឱ្យវិទ្យាសាស្រ្តទិន្នន័យរហ័សលឿន ស្រួល និងរីករាយជាងមុន!\n", "\n", "- `tidymodels`: សំណុំបណ្ណាល័យ [tidymodels](https://www.tidymodels.org/) គឺជាគោលការណ៍ នៃការប្រមូលផ្តុំបណ្ណាល័យសម្រាប់ម៉ូឌែល និងសិក្សាវីលម៉ាស៊ីន។\n", "\n", "- `themis`: បណ្ណាល័យ [themis](https://themis.tidymodels.org/) ផ្តល់ជំនួយក្នុងការបន្ថែមជំហានលើការដោះស្រាយទិន្នន័យមិនស្មើជាមួយ។\n", "\n", "អ្នកអាចដំឡើងវាបាន ដូច្នេះ៖\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n", "\n", "ជាជម្រើសមួយទៀត កូដខាងក្រោមនេះពិនិត្យថាតើអ្នកមានបណ្ណាល័យដែលចាំបាច់សម្រាប់បញ្ចប់មេរៀននេះរួចមែនទេ បើយ៉ាងហោចណាស់វានឹងដំឡើងអោយអ្នកប្រសិនបើវាបាត់បង់។\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": [ "ឥឡូវនេះ យើងចាប់ផ្តើមភ្លាមៗ!\n", "\n", "## **1. ផែនទីចំណាត់ថ្នាក់**\n", "\n", "នៅក្នុង [មេរៀនមុនរបស់យើង](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) យើងបានព្យាយាមឆ្លើយសំណួរ៖ តើយើងត្រូវជ្រើសរើសរវាងម៉ូដែលជាច្រើនយ៉ាងដូចម្តេច? ក្នុងការធ្វើដូចនេះ សម្រាប់ភាគច្រើន វាអាស្រ័យលើលក្ខណៈរបស់ទិន្នន័យ និងប្រភេទបញ្ហាដែលយើងចង់ដោះស្រាយ (ឧទាហរណ៍ ចំណាត់ថ្នាក់ឬវិភាគជំហាន?)\n", "\n", "មុននេះ យើងបានរៀនអំពីជម្រើសនានាដែលអ្នកមានពេលចាត់ថ្នាក់ទិន្នន័យដោយប្រើសន្លឹកបន្លឺរបស់ Microsoft។ ស៊ុមម៉ាស៊ីនរៀនរបស់ Python ដែលមានឈ្មោះ Scikit-learn ផ្តល់ជូនសន្លឹកបន្លឺដដែល តែមានលំដាប់លម្អិតបន្ថែម ដែលអាចជួយបង្ហាញដល់អ្នកកាន់តែត្រឹមត្រូវចំពោះអ្នកប៉ាន់ស្មាន (ពាក្យផ្សេងមួយសម្រាប់អ្នកចាត់ថ្នាក់)។\n", "\n", "

\n", " \n", "

\n" ] }, { "cell_type": "markdown", "metadata": { "id": "u1i3xRIVg7vG" }, "source": [ "> យោបល់៖ [ចូលទៅកាន់ផែនទីនេះតាមអ៊ិនធឺរណិត](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ហើយចុចតាមផ្លូវដើម្បីអានឯកសារ។\n", ">\n", "> គេហទំព័រ [អ្នកយោង Tidymodels](https://www.tidymodels.org/find/parsnip/#models) ក៏ផ្តល់ឯកសារល្អឥតខ្ចោះអំពីប្រភេទគំរូផ្សេងៗ។\n", "\n", "### **ផែនការ** 🗺️\n", "\n", "ផែនទីនេះមានប្រយោជន៍ខ្លាំងពេលអ្នកមានការយល់ដឹងច្បាស់លាស់ពីទិន្នន័យរបស់អ្នក ដើម្បីអ្នកអាច 'ដើរ' តាមផ្លូវរបស់វាទៅកាន់ការសម្រេចចិត្ត៖\n", "\n", "- យើងមាន \\>50 នៃគំរូ\n", "\n", "- យើងចង់ទាយថាភាពជាប្រភេទណាមួយ\n", "\n", "- យើងមានទិន្នន័យដែលបានតម្រៀបស្លាក\n", "\n", "- យើងមានគំរូតិចជាង 100K\n", "\n", "- ✨ យើងអាចជ្រើសយក Linear SVC\n", "\n", "- ប្រសិនបើវាមិនដំណើរការ តែព្រោះយើងមានទិន្នន័យលេខ\n", "\n", " - យើងអាចសាកល្បង ✨ KNeighbors Classifier\n", "\n", " - ប្រសិនបើវាមិនដំណើរការ សាកល្បង ✨ SVC និង ✨ Ensemble Classifiers\n", "\n", "នេះជារបៀបតាមដានដែលមានប្រយោជន៍ខ្លាំង។ ឥឡូវនេះ យើងចាប់ផ្តើមដោយប្រើ [tidymodels](https://www.tidymodels.org/) ស៊េរីម៉ូឌែល ដែលជាសំណុំប្រព័ន្ធ R ដែលមានរបៀបច្បាស់លាស់ និងមានភាពបត់បែនដែលបានបង្កើតឡើងដើម្បីលើកទឹកចិត្តអនុវត្តន៍ស្ថិតិសាស្ត្រល្អ 😊។\n", "\n", "## 2. បំបែកទិន្នន័យ និងដោះស្រាយបញ្ហាទិន្នន័យមិនសមម តម្រូវ។\n", "\n", "ពីមេរៀនមុនៗ យើងបានរៀនថានៅក្នុងម្ហូបមានសមាសធាតុទូទៅមួយចំនួន។ ផងដែរ ទេពកោសល្យនៃចំនួនម្ហូបមានការបែងចែកមិនសមស្រប។\n", "\n", "យើងនឹងដោះស្រាយរឿងនេះដោយ\n", "\n", "- លុបចោលសមាសធាតុំសហច្រើនបំផុតដែលបង្កើតភាពច្របូកច្របល់ក្នុងចន្លោះម្ហូបផ្សេងៗ ដោយប្រើ `dplyr::select()`។\n", "\n", "- ប្រើ `recipe` ដែលដំណើរការព្រមព្រៀងទិន្នន័យត្រៀមសម្រាប់ម៉ូឌែល ដោយអនុវត្តវិធីសាស្រ្ត `over-sampling`។\n", "\n", "យើងបានមើលរឿងខាងលើនៅក្នុងមេរៀនមុនទេ ដូច្នេះវាគួរតែស្រួលណាស់ 🥳!\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": [ "### ដោះស្រាយជាមួយទិន្នន័យដែលមិនសមភាព\n", "\n", "ទិន្នន័យដែលមិនសមភាពជាញឹកញាប់មានផលប៉ះពាល់អវិជ្ជមានលើការប្រតილពកម្មរបស់ម៉ូឌែល។ ម៉ូឌែលជាច្រើនអនុវត្តបានល្អបំផុតពេលដែលចំនួនការសង្កេតស្មើគ្នា ហើយ ដូច្នេះ មិនងាយស្រួលជាមួយទិន្នន័យមិនសមភាពឡើយ។\n", "\n", "មានវិធីធំៗពីរចម្បងសម្រាប់ដោះស្រាយទិន្នន័យមិនសមភាព៖\n", "\n", "- បន្ថែមការសង្កេតទៅក្នុងថ្នាក់តិច: `Over-sampling` ឧ. ប្រើអាល់ហ្គរីថម SMOTE ដែលបង្កើតគំរូថ្មីៗក្នុងថ្នាក់តិចដោយប្រើអ្នកជិតខាងដ៏នៅជិតបំផុតនៃករណីទាំងនេះ។\n", "\n", "- លុបការសង្កេតចេញពីថ្នាក់ធំ: `Under-sampling`\n", "\n", "នៅមេរៀនមុន យើងបានបង្ហាញពីវិធីដោះស្រាយទិន្នន័យមិនសមភាពដោយប្រើ `recipe`។ recipe អាចគិតថាជាផែនការដែលពិពណ៌នាថាតើជំហានអ្វីខ្លះគួរត្រូវអនុវត្តទៅលើសំណុំទិន្នន័យមួយ ដើម្បីធ្វើឱ្យវាត្រូវបានរៀបចំសម្រាប់វិភាគទិន្នន័យ។ ក្នុងករណីរបស់យើង យើងចង់មានការចែកចាយស្មើគ្នានៅចំនួនសំណុំម្ហូបសម្រាប់ `training set` របស់យើង។ យលង់ចូលទៅក្នុងវា។\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": [ "ឥឡូវនេះយើងបានរួចរាល់ក្នុងការបណ្តុះម៉ូឌែលហើយ 👩‍💻👨‍💻!\n", "\n", "## 3. លើសពីម៉ូឌែលមូលដ្ឋានពហុនិម្មិត\n", "\n", "ក្នុងบทเรียนមុនរបស់យើង យើងបានសិក្សាអំពីម៉ូឌែលមូលដ្ឋានពហុនិម្មិត។ យើងនឹងស្រាវជ្រាវម៉ូឌែលបត់បែនផ្សេងទៀតសម្រាប់ការបែងចែកចំណាត់ថ្នាក់។\n", "\n", "### សំណុំគ្រឿងចក្រ Vector Support\n", "\n", "នៅក្នុងបរិបទនៃការបែងចែកចំណាត់ថ្នាក់, `Support Vector Machines` ជាបច្ចេកទេសរៀនម៉ាស៊ីនមួយដែលព្យាយាមរក *hyperplane* ដែល \"ល្អបំផុត\" ក្នុងការបំបែកចំណាត់ថ្នាក់ទៅជា​ថ្នាក់ផ្សេងៗ។ យើងមកមើលឧទាហរណ៍សាមញ្ញមួយ៖\n", "\n", "

\n", " \n", "

https://commons.wikimedia.org/w/index.php?curid=22877598
\n" ] }, { "cell_type": "markdown", "metadata": { "id": "C4Wsd0vZhXYu" }, "source": [ "H1~ មិនបំបែកថ្នាក់ដទៃ។ H2~ បំបែក ដោយទម្លាក់តិចតួចប៉ុណ្ណោះ។ H3~ បំបែកពួកវា ជាមួយទម្លាក់អតិបរមា។\n", "\n", "#### កម្មវិធីចម្លើយអនុគមន៍គូសអថេរបន្សំសេរី\n", "\n", "ការចម្រាញ់គំរូបញ្ជាក់-គូសអថេរ (SVC) គឺជាកូនក្រុមនៃគ្រួសារម៉ាស៊ីនបញ្ជាក់-គូសអថេរនៃបច្ចេកទេសML។ ក្នុង SVC អាក្សរ​ទំព័រត្រូវបានជ្រើសរើសដើម្បីបំបែកបានត្រឹមត្រូវទៅលើការសង្កេតមើលកំណត់ភាគច្រើនក្នុងការបណ្តុះបណ្តាល ប៉ុន្តែអាចកំហុសចំពោះការសង្កេតមើលខ្លះ។ ដោយអនុញ្ញាតឲ្យចំណុចខ្លះស្ថិតនៅផ្នែកខុស អេសវីអំ (SVM) ក្លាយជារឹងមាំបន្ថែមចំពោះចំណុចក្រៅដែន ដែលនាំឲ្យមានការជាក់លើទៅលើទិន្នន័យថ្មីបានកាន់តែប្រសើរ។ ប៉ារ៉ាម៉ែត្រដែលគ្រប់គ្រងការរំលោភនេះ ត្រូវបានហៅថា `cost` ដែលមានតម្លៃលំនាំដើម 1 (សូមមើល `help(\"svm_poly\")`)។\n", "\n", "យើងមកបង្កើត SVC បម្រែបម្រួលបន្ទាត់ដោយកំណត់ `degree = 1` ក្នុងម៉ូដែល SVM បក្សមេណូមិ។\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": [ "ឥឡូវនេះដែលយើងបានចាប់យកជំហានមុនការកាន់ត្រា និងការបញ្ជាក់ម៉ូដែលជាទម្រង់ *workflow* រួចហើយ យើងអាចបន្តហ្វឹកហាត់ SVC រាងបន្ទាត់ ហើយវាយតម្លៃលទ្ធផលពេលជាមួយគ្នា។ សម្រាប់មេត្រីកសមត្ថភាព សូមបង្កើតសំណុំមេត្រីកមួយ ដែលនឹងវាយតម្លៃៈ `accuracy`, `sensitivity`, `Positive Predicted Value` និង `F Measure`\n", "\n", "> `augment()` នឹងបន្ថែមជួរឈរមួយ(ច្រើន)សម្រាប់ការព្យាករណ៍ទៅកាន់ទិន្នន័យដែលបានផ្ដល់។\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": [ "#### ម៉ាស៊ីនវ៉ិចទ័រគាំទ្រ\n", "\n", "ម៉ាស៊ីនវ៉ិចទ័រគាំទ្រ (SVM) គឺជាការពង្រីកនៃអ្នកចាត់ថ្នាក់វ៉ិចទ័រគាំទ្រ ដើម្បីអនុញ្ញាតឱ្យមានព្រំដែនមិនជាស maʻ្លើងរវាងថ្នាក់។ ជាធម្មតា SVMs ប្រើ *trick kernel* ដើម្បីពង្រីកលំហលក្ខណៈ ដើម្បីធ្វើឱ្យសមស្របនឹងសំណាញ់មិនជាស linear រវាងថ្នាក់។ មុខងារ kernel មួយដែលពេញនិយម និងបត់បែនខ្លាំង ដែល SVMs ប្រើគឺ *មុខងារថាមពលគោលកណ្តាល (Radial basis function)*។ មកមើលថាវានឹងដំណើរការយ៉ាងដូចម្តេចលើទិន្នន័យរបស់យើង។\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": [ "ល្អ​ច្រើន 🤩!\n", "\n", "> ✅ សូមមើលៈ\n", ">\n", "> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), ការស្វែងយល់បែបហត្ថកម្មជាមួយ R\n", ">\n", "> - [*Support Vector Machines*](https://www.statlearning.com/), ការណែនាំអំពីការស្វែងយល់ស្ថិតិជាមួយកម្មវិធីក្នុង R\n", ">\n", "> សម្រាប់ការអានបន្ថែម។\n", "\n", "### កម្មវិធីមិត្តភាពជិត\n", "\n", "*K*-nearest neighbor (KNN) គឺជាអាល់ហ្គរីធម៍មួយដែលសំរាប់ការព្យាករណ៍គ្រប់ការត្រួតពិនិត្យដោយផ្អែកលើ *ការស្រដៀង* របស់វាទៅនឹងការត្រួតពិនិត្យផ្សេងទៀត។\n", "\n", "ចាំអោយយើងបញ្ជាក់មួយនៅលើទិន្នន័យរបស់យើង។\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": [ "វាហាក់ដូចជាម៉ូឌែលនេះមិនមែនដំណើរការល្អនោះទេ។ ប្រហែលជាការផ្លាស់ប្តូរព្រិទ្ធិ HR អះអាងនៃម៉ូឌែល (មើល `help(\"nearest_neighbor\")`) នឹងធ្វើឱ្យការសម្រួលម៉ូឌែលមានប្រសិទ្ធភាពល្អប្រសើរឡើង។ ចូរប្រាកដថាបានសាកល្បងវា។\n", "\n", "> ✅ សូមមើល:\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", "> ដើម្បីរៀនបន្ថែមអំពី *K*-Nearest Neighbors classifiers។\n", "\n", "### ម៉ូឌែលប្រភេទ Ensemble\n", "\n", "អាល់ហ្គរីធម์ Ensemble ធ្វើការដោយបញ្ចូលកំណត់ត្រាទាំងមួលមូលបួសទៅក្នុងម៉ូឌែលមួយដែលល្អបំផុត តាមរយៈ:\n", "\n", "`bagging`: ប្រើគោលការណ៍មធ្យមនៃមុខងារច្រើនចំពោះកំណត់ត្រាមូលដ្ឋាន\n", "\n", "`boosting`: ការសង់បណ្ដុំម៉ូឌែលដែលបន្តបណ្តូលគ្នាដើម្បីធ្វើឱ្យមានកំរិតទាយទំនោរល្អប្រសើរ។\n", "\n", "ចាប់ផ្តើមដោយសាកល្បងម៉ូឌែល Random Forest ដែលកសាងបណ្ដុំដើមច្រើននៃដើមឈើសំឡេង ពីនោះប្រើមុខងារមធ្យមមួយសម្រាប់ជាម៉ូឌែលសរុបល្អប្រសើរឡើង។\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": [ "ការងារល្អ 👏!\n", "\n", "ក្រឡាប់ត្រូវតែសាកល្បងជាមួយម៉ូដែល Boosted Tree ផងដែរ។\n", "\n", "Boosted Tree កំណត់វិធីសាស្រ្ត ensemble មួយដែលបង្កើតខ្នាតដើមជាប់លំដាប់ច្រើន ដោយមានរាល់ឈើរុក្ខជាតិមួយ ពឹងផ្អែកលើលទ្ធផលនៃឈើរុក្ខមុនៗ ក្នុងគោលបំណងកាត់បន្ថយកំហុសឲ្យតិចចុះជារបៀបមានលំដាប់។ វាមើលទៅលើទម្ងន់នៃធាតុដែលបានចាត់ទោសមិនត្រឹមត្រូវ ហើយកែសម្រួលការសម្របសម្រួលសម្រាប់អ្នកចាត់ទោសបន្ទាប់ ដើម្បីកែតម្រូវខុស។\n", "\n", "មានវិធីផ្សេងៗក្នុងការសម្របសម្រួលម៉ូដែលនេះ (ចូរមើល `help(\"boost_tree\")`)។ ក្នុងឧទាហរណ៍នេះ យើងនឹងសម្របសម្រួលរៀងរាល់ Boosted trees តាមរយៈម៉ូទ័រ `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": [ "> ✅ សូមមើល៖\n", ">\n", "> - [ការសិក្សាសម្រាប់អ្នកសង្គមវិទ្យា](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n", ">\n", "> - [ការសិក្សាដោយដៃលើម៉ាស៊ីនរៀនជាមួយ R](https://bradleyboehmke.github.io/HOML/)\n", ">\n", "> - [ការណែនាំអំពីការសិក្សាស្ថិតិជាមួយកម្មវិធីនៅក្នុង R](https://www.statlearning.com/)\n", ">\n", "> - - រៀបរាប់ពីម៉ូដែល AdaBoost ដែលជាជម្រើសល្អជាង xgboost។\n", ">\n", "> ដើម្បីស្វែងយល់បន្ថែមអំពី Ensemble classifiers។\n", "\n", "## 4. បន្ថែម - ការប្រៀបធៀបទំលាប់ម៉ូដែលច្រើន\n", "\n", "យើងបានស្ទង់ស្ទាយម៉ូឌែលច្រើនក្នុងមន្ទីរពិសោធន៍នេះ 🙌។ វាអាចក្លាយជាเหนื่อยឬមានការលំបាកក្នុងការបង្កើតច្រើននៃដំណើរការពីជំរើស preprocessors និង/ឬការបញ្ជាក់ម៉ូដែលផ្សេងៗហើយបន្ទាប់មកគណនាម៉ែត្ររបស់ការសម្តែងមួយៗពីរដង។\n", "\n", "ចង់មើលថាតើយើងអាចដោះស្រាយនេះដោយបង្កើតមុខងារមួយដែលធ្វើការតម្រឹមសាច់ដុំដំណើរការជាបញ្ជីនៅលើសំណុំបណ្តុះបណ្តាល បន្ទាប់មកត្រឡប់មកវិញតម្លៃពីគោលការណ៍សម្តែងផ្អែកលើសំណុំតេស្ត។ យើងនឹងប្រើ `map()` និង `map_dfr()` ពីកញ្ចប់ [purrr](https://purrr.tidyverse.org/) ដើម្បីអនុវត្តមុខងារទៅលើមេគ្រួសរបស់បញ្ជីនិមួយៗ។\n", "\n", "> មុខងារ [`map()`](https://purrr.tidyverse.org/reference/map.html) អនុញ្ញាតឱ្យអ្នកជំនួសសម្រាប់វដ្ត for ច្រើនជាមួយកូដដែលខ្លី និងងាយស្រួលក្នុងការអាន។ ទីតាំងល្អបំផុតក្នុងការសិក្សាអំពីមុខងារ [`map()`](https://purrr.tidyverse.org/reference/map.html) គឺជាតិខួរក្បាលដំណើរការ [iteration chapter](http://r4ds.had.co.nz/iteration.html) ក្នុង R សម្រាប់វិទ្យាសាស្ត្រ​ទិន្នន័យ។\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": [ "មកហៅមុខងាររបស់យើងហើយប្រៀបធៀបភាពត្រឹមត្រូវរវាងម៉ូដែលទាំងឡាយ។\n" ] }, { "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/) អនុញ្ញាតឲ្យអ្នកប្រើបង្កើត និងបំពាក់គំរូជាច្រើនបានយ៉ាងងាយស្រួល ប៉ុន្តែភាគច្រើនត្រូវបានរចនាឡើងសម្រាប់ធ្វើការជាមួយបច្ចេកទេស resampling ដូចជា `cross-validation` ដែលជាវិធីសាស្រ្តមួយដែលយើងមិនទាន់បានសិក្សាទេ។\n", "\n", "## **🚀ការប្រឈម**\n", "\n", "បច្ចេកទេសនីមួយៗមានប៉ារ៉ាម៉ែត្រ​ច្រើនដែលអ្នកអាចកែប្រែបាន ដូចជា `cost` នៅក្នុង SVMs, `neighbors` នៅក្នុង KNN, `mtry` (ជាតិអ្នកទស្សនាដែលបានជ្រើសរើសដោយចៃដន្យ) នៅក្នុង Random Forest។\n", "\n", "ស្រាវជ្រាវពីប៉ារ៉ាម៉ែត្រ​លំនៃមួយៗ ហើយគិតពីលទ្ធផលដែលការកែប្រែប៉ារ៉ាម៉ែត្រ​នេះអាចមានសម្រាប់គុណភាពគំរូ។\n", "\n", "ដើម្បីស្វែងយល់បន្ថែមអំពីគំរូជាក់លាក់ និងប៉ារ៉ាម៉ែត្រ​របស់វា សូមប្រើៈ `help(\"model\")` ឧទាហរណ៍ `help(\"rand_forest\")`\n", "\n", "> នៅក្នុងប្រតិបត្តិការណ៍ យើងភាគច្រើន *ប៉ាន់ប្រមាណ* *តម្លៃល្អបំផុត* សម្រាប់វា ដោយបណ្ដេញគំរូជាច្រើនលើ `data set បានស្ទាញ` ហើយវាស់ថាគំរូទាំងនេះអាចប្រតិបត្តិការល្អប៉ុណ្ណាដែរ។ ដំណើរការនេះហៅថា **tuning** ។\n", "\n", "### [**សំនួរប្រលងក្រោយមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n", "\n", "### **ពិនិត្យឡើងវិញ & សិក្សាឯកោ**\n", "\n", "មានពាក្យបច្ចេកទេសជាច្រើនក្នុងមេរៀនទាំងនេះ អូសពេលមួយដើម្បីពិនិត្យមើល [បញ្ជីនេះ](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) នូវពាក្យសម្គាល់មានប្រយោជន៍!\n", "\n", "#### សូមអរគុណចំពោះៈ\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) ដែលបានបង្កើតរូបភាពដ៏អស្ចារ្យ ដែលធ្វើឲ្យ R កាន់តែស្វាគមន៍ និងទាក់ទាញ។ រកឃើញរូបភាពបន្ថែមនៅក្នុង [វិចិត្រសាល](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) និង [Jen Looper](https://www.twitter.com/jenlooper) ដែលបានបង្កើតកំណែ Python ដើមនៃម៉ូឌុលនេះ ♥️\n", "\n", "សូមរំលឹករីករាយក្នុងការសិក្សា,\n", "\n", "[Eric](https://twitter.com/ericntay), ឯកទេសសិស្ស Microsoft Learn លំដាប់មាស។\n", "\n", "

\n", " \n", "

ស្នាដៃដោយ @allison_horst
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n\n\n**ការបដិសេធ**: \nឯកសារនេះត្រូវបានបកប្រែក្នុងការប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមប្រយ័ត្នថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុសឬមិនត្រឹមត្រូវ។ ឯកសារដើមដែលមានភាសាម្តាយគួរត្រូវបានគេរំពឹងថាជាមូលដ្ឋានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសឆ្គងណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" ] } ] }