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/km/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

648 lines
40 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/map.e963a6a51349425a.webp\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\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",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/svm.621ae7b516d678e0.webp\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\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",
"> - <https://algotech.netlify.app/blog/xgboost/> - រៀបរាប់ពីម៉ូដែល 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",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/r_learners_sm.f9199f76f1e2e493.webp\"\n",
" width=\"569\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**: \nឯកសារនេះត្រូវបានបកប្រែក្នុងការប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមប្រយ័ត្នថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុសឬមិនត្រឹមត្រូវ។ ឯកសារដើមដែលមានភាសាម្តាយគួរត្រូវបានគេរំពឹងថាជាមូលដ្ឋានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសឆ្គងណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}