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

648 lines
43 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:30:50+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## အစားအစာအမျိုးအစား ခွဲခြားခြင်း ၂\n",
"\n",
"ဒီ classification သင်ခန်းစာအပိုင်း (ဒုတိယပိုင်း) မှာ categorical data ကို ခွဲခြားဖို့ `ပိုမိုကောင်းမွန်တဲ့နည်းလမ်းများ` ကို လေ့လာသင်ယူမှာဖြစ်ပါတယ်။ ထို့အပြင် classifier တစ်ခုကို ရွေးချယ်ခြင်းက အခြားတစ်ခုနဲ့ ဘယ်လိုကွာခြားမှုတွေရှိမလဲဆိုတာကိုလည်း သင်ယူပါမယ်။\n",
"\n",
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **လိုအပ်ချက်များ**\n",
"\n",
"ယခင်သင်ခန်းစာများကိုပြီးစီးထားသည်ဟုယူဆပါသည်၊ အကြောင်းမူမကျော်လွှားဘဲ ယခင်သင်ခန်းစာများမှ သင်ယူခဲ့သော အကြောင်းအရာများကို ဆက်လက်အသုံးပြုသွားမည်ဖြစ်သည်။\n",
"\n",
"ဒီသင်ခန်းစာအတွက် အောက်ပါ packages များလိုအပ်ပါမယ်-\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages များ](https://www.tidyverse.org/packages) ရဲ့စုစည်းမှုဖြစ်ပြီး data science ကို ပိုမိုလွယ်ကူစေပြီး ပိုမိုပျော်ရွှင်စေဖို့ ရည်ရွယ်ထားပါတယ်။\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework သည် modeling နဲ့ machine learning အတွက် [packages များ](https://www.tidymodels.org/packages/) ရဲ့စုစည်းမှုဖြစ်ပါတယ်။\n",
"\n",
"- `themis`: [themis package](https://themis.tidymodels.org/) သည် Unbalanced Data ကို ကိုင်တွယ်ဖို့ Extra Recipes Steps များပေးစွမ်းပါတယ်။\n",
"\n",
"ဒီ packages များကို အောက်ပါအတိုင်း install လုပ်နိုင်ပါတယ်-\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"အခြားနည်းလမ်းအနေနဲ့ အောက်ပါ script သည် module ကိုပြီးစီးဖို့လိုအပ်သော packages များရှိမရှိ စစ်ဆေးပြီး မရှိပါက install လုပ်ပေးပါမယ်။\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. အမျိုးအစားခွဲမြေပုံ**\n",
"\n",
"ကျွန်တော်တို့ [အတန်းမတိုင်မီ](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) မှာ မေးခွန်းတစ်ခုကို ဖြေရှင်းဖို့ ကြိုးစားခဲ့ပါတယ်။ အဲဒါကတော့ - မော်ဒယ်များစွာအနက် ဘယ်ဟာကို ရွေးချယ်ရမလဲ? အဓိကအားဖြင့် ဒါဟာ ဒေတာရဲ့ လက္ခဏာများနဲ့ ကျွန်တော်တို့ ဖြေရှင်းချင်တဲ့ ပြဿနာအမျိုးအစား (ဥပမာ အမျိုးအစားခွဲခြားခြင်း၊ regression) ပေါ်မူတည်ပါတယ်။\n",
"\n",
"ယခင်က Microsoft ရဲ့ cheat sheet ကို အသုံးပြုပြီး ဒေတာကို အမျိုးအစားခွဲခြားတဲ့အခါ ရွေးချယ်နိုင်တဲ့ အခြားရွေးချယ်မှုများကို လေ့လာခဲ့ပါတယ်။ Python ရဲ့ Machine Learning framework ဖြစ်တဲ့ Scikit-learn ကလည်း အလားတူ cheat sheet တစ်ခုကို ပေးထားပြီး၊ ဒါဟာ သင့်ရဲ့ estimators (အမျိုးအစားခွဲခြင်းလုပ်ဆောင်သူများ) ကို ပိုမိုသေချာစွာ ရှုမြင်နိုင်အောင် ကူညီပေးနိုင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> အကြံပြုချက်: [ဒီမြေပုံကို အွန်လိုင်းမှာကြည့်ရှုပါ](https://scikit-learn.org/stable/tutorial/machine_learning_map/)၊ လမ်းကြောင်းတစ်လျှောက်တွင် နှိပ်ပြီး documentation ကိုဖတ်ရှုနိုင်ပါတယ်။\n",
">\n",
"> [Tidymodels reference site](https://www.tidymodels.org/find/parsnip/#models) သည် မော်ဒယ်အမျိုးအစားများအကြောင်း အလွန်ကောင်းမွန်သော documentation ကိုလည်း ပေးဆောင်ထားပါတယ်။\n",
"\n",
"### **အစီအစဉ်** 🗺️\n",
"\n",
"ဒီမြေပုံက သင့်ဒေတာကို ရှင်းလင်းစွာ နားလည်ပြီးပြီဆိုရင်၊ လမ်းကြောင်းတစ်လျှောက် 'လမ်းလျှောက်' သလို ဆုံးဖြတ်ချက်တစ်ခုရဖို့ အလွန်အသုံးဝင်ပါတယ်။\n",
"\n",
"- ကျွန်တော်တို့မှာ \\>50 နမူနာရှိတယ်\n",
"\n",
"- ကဏ္ဍတစ်ခုကို ခန့်မှန်းချင်တယ်\n",
"\n",
"- Label ထည့်ထားတဲ့ ဒေတာရှိတယ်\n",
"\n",
"- 100,000 နမူနာထက် နည်းတယ်\n",
"\n",
"- ✨ Linear SVC ကို ရွေးချယ်နိုင်တယ်\n",
"\n",
"- အဲဒါမအောင်မြင်ရင်၊ ကျွန်တော်တို့မှာ နံပါတ်ဆိုင်ရာ ဒေတာရှိတဲ့အတွက်\n",
"\n",
" - ✨ KNeighbors Classifier ကို စမ်းကြည့်နိုင်တယ်\n",
"\n",
" - အဲဒါလည်း မအောင်မြင်ရင် ✨ SVC နဲ့ ✨ Ensemble Classifiers ကို စမ်းကြည့်ပါ\n",
"\n",
"ဒီလမ်းကြောင်းက အလွန်အသုံးဝင်တဲ့ လမ်းညွှန်တစ်ခုပါ။ အခုတော့ [tidymodels](https://www.tidymodels.org/) မော်ဒယ်ဖွဲ့စည်းမှုကို အသုံးပြုပြီး အလုပ်စတင်ကြရအောင်။ ဒီ framework က R packages တွေကို တစ်ရပ်တည်းအောင် စနစ်တကျ ဖွဲ့စည်းထားပြီး၊ ကောင်းမွန်တဲ့ စာရင်းအင်းဆိုင်ရာ လေ့ကျင့်မှုတွေကို အားပေးဖို့ ဖန်တီးထားတာပါ 😊။\n",
"\n",
"## 2. ဒေတာကို ခွဲခြားပြီး မညီမျှတဲ့ ဒေတာအစုကို ကိုင်တွယ်ပါ။\n",
"\n",
"ယခင်သင်ခန်းစာတွေမှာ ကျွန်တော်တို့က အစားအစာအမျိုးအစားတွေမှာ ရှိနေတဲ့ ပုံမှန်ပါဝင်ပစ္စည်းတွေကို တွေ့ရှိခဲ့ပါတယ်။ ထို့အပြင် အစားအစာအမျိုးအစားအရ အရေအတွက်မှာလည်း မညီမျှမှုတွေ ရှိနေပါတယ်။\n",
"\n",
"ဒီအရာတွေကို ကျွန်တော်တို့\n",
"\n",
"- `dplyr::select()` ကို အသုံးပြုပြီး၊ မတူညီတဲ့ အစားအစာအမျိုးအစားတွေကြားမှာ ရှုပ်ထွေးမှု ဖြစ်စေတဲ့ အများဆုံးပါဝင်ပစ္စည်းတွေကို ဖယ်ရှားပါမယ်။\n",
"\n",
"- ဒေတာကို မော်ဒယ်ဖွဲ့စည်းဖို့ အသင့်ဖြစ်အောင် ပြင်ဆင်ပေးတဲ့ `recipe` ကို အသုံးပြုပြီး၊ `over-sampling` algorithm ကို လျှောက်ထားပါမယ်။\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. Multinomial Regression မော်ဒယ်များကို ကျော်လွန်ခြင်း\n",
"\n",
"ယခင် သင်ခန်းစာမှာ ကျွန်တော်တို့ Multinomial Regression မော်ဒယ်များကို လေ့လာခဲ့ပါတယ်။ အခုတော့ Classification အတွက် ပိုမိုတိကျပြီး လွယ်ကူတဲ့ မော်ဒယ်များကို ရှာဖွေကြည့်ရအောင်။\n",
"\n",
"### Support Vector Machines\n",
"\n",
"Classification အနေနဲ့ `Support Vector Machines` ဆိုတာ *hyperplane* တစ်ခုကို ရှာဖွေပြီး အတန်းတွေကို \"အကောင်းဆုံး\" ခွဲခြားဖို့ ကြိုးစားတဲ့ Machine Learning နည်းလမ်းတစ်ခုဖြစ်ပါတယ်။ အောက်မှာ ရိုးရှင်းတဲ့ ဥပမာတစ်ခုကို ကြည့်ရအောင်:\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~ သည် classes များကို ခွဲခြားပေးမည်မဟုတ်ပါ။ H2~ သည် ခွဲခြားပေးနိုင်သော်လည်း အနည်းငယ်သော margin ဖြင့်သာ ဖြစ်သည်။ H3~ သည် အများဆုံး margin ဖြင့် classes များကို ခွဲခြားပေးသည်။\n",
"\n",
"#### Linear Support Vector Classifier\n",
"\n",
"Support-Vector Clustering (SVC) သည် Support-Vector Machines များ၏ ML နည်းလမ်းများအုပ်စုမှ ဆင်းသက်လာသော နည်းလမ်းတစ်ခုဖြစ်သည်။ SVC တွင် hyperplane ကို training observations များ၏ `အများစု` ကို မှန်ကန်စွာ ခွဲခြားပေးနိုင်ရန် ရွေးချယ်ပေးသော်လည်း၊ `အချို့သော` observations များကို မှားယွင်းစွာ ခွဲခြားပေးနိုင်သည်။ အချို့သော point များကို မှားနေစေခြင်းအား ခွင့်ပြုခြင်းဖြင့် SVM သည် outliers များအပေါ်တွင် ပိုမိုတည်ငြိမ်လာပြီး၊ ဒါကြောင့် data အသစ်များအပေါ်တွင် ပိုမိုကောင်းမွန်စွာ အထွေထွေပြုနိုင်သည်။ ဤအခြေအနေကို ထိန်းညှိပေးသည့် parameter ကို `cost` ဟု ခေါ်ပြီး၊ ၎င်း၏ ပုံမှန်တန်ဖိုးမှာ 1 ဖြစ်သည် (e.g., `help(\"svm_poly\")` ကို ကြည့်ပါ)။\n",
"\n",
"ယခု `degree = 1` ကို polynomial SVM မော်ဒယ်တွင် သတ်မှတ်ခြင်းဖြင့် linear SVC တစ်ခုကို ဖန်တီးကြည့်ရအောင်။\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* ထဲမှာ preprocessing အဆင့်များနှင့် model specification ကိုဖမ်းဆီးထားပြီးဖြစ်သောကြောင့် linear SVC ကို training လုပ်ပြီး ရလဒ်များကိုအတူတူအကဲဖြတ်နိုင်ပါပြီ။ Performance metrics အတွက် `accuracy`, `sensitivity`, `Positive Predicted Value` နှင့် `F Measure` ကိုအကဲဖြတ်ပေးမယ့် metric set တစ်ခုကိုဖန်တီးကြစို့။\n",
"\n",
"> `augment()` က prediction တွေကိုထည့်ပေးမယ့် column(s) ကိုပေးထားတဲ့ data ထဲမှာထည့်ပေးပါမယ်။\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) သည် အတန်းများအကြား မလိုင်းတန်းဖြစ်သော နယ်နိမိတ်ကို လိုက်လျောညီထွေဖြစ်စေရန်အတွက် အထောက်အပံ့ဗက်တာအမျိုးအစားခွဲခြားမှု၏ တိုးချဲ့မှုတစ်ခုဖြစ်သည်။ အဓိကအားဖြင့် SVM များသည် *kernel trick* ကို အသုံးပြု၍ အတန်းများအကြား မလိုင်းတန်းဆက်နွှယ်မှုများကို လိုက်လျောညီထွေဖြစ်စေရန် feature space ကို ချဲ့ထွင်ပေးသည်။ SVM များတွင် အသုံးပြုသော လူကြိုက်များပြီး အလွန်လွယ်ကူသော kernel function တစ်ခုမှာ *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), Hands-on Machine Learning with R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
">\n",
"> ပိုမိုသိရှိရန်။\n",
"\n",
"### အနီးဆုံးအိမ်နီးချင်း ခွဲခြားမှု\n",
"\n",
"*K*-nearest neighbor (KNN) သည် observation တစ်ခုစီကို အခြား observation များနှင့် *တူညီမှု* အပေါ်အခြေခံ၍ ခန့်မှန်းပေးသော algorithm တစ်ခုဖြစ်သည်။\n",
"\n",
"အခုတစ်ခါ ကျွန်ုပ်တို့ရဲ့ data ကို အသုံးပြု၍ တစ်ခုကို fit လုပ်ကြည့်ရအောင်။\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": [
"မော်ဒယ်သည် လိုအပ်သလို အလုပ်မလုပ်နေသလိုပဲ။ `help(\"nearest_neighbor\")` ကိုကြည့်ပြီး မော်ဒယ်၏ arguments များကို ပြောင်းလဲခြင်းဖြင့် မော်ဒယ်၏ စွမ်းဆောင်ရည်ကို တိုးတက်စေမည်ဖြစ်သည်။ စမ်းသပ်ကြည့်ရန် သေချာပါစေ။\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 classifiers\n",
"\n",
"Ensemble algorithm များသည် အခြေခံမော်ဒယ်များစွာကို ပေါင်းစည်းခြင်းဖြင့် အကောင်းဆုံးမော်ဒယ်တစ်ခုကို ဖန်တီးရန် အလုပ်လုပ်သည်။ ၎င်းသည် အောက်ပါနည်းလမ်းများဖြင့် ဖြစ်နိုင်သည်-\n",
"\n",
"`bagging`: အခြေခံမော်ဒယ်များစုစည်းမှုကို *အလယ်ပျမ်းမျှ function* ဖြင့် လုပ်ဆောင်ခြင်း\n",
"\n",
"`boosting`: မော်ဒယ်များ၏ အစဉ်အလာကို တိုးတက်စေရန် တစ်ခုနှင့်တစ်ခု ဆက်လက်တည်ဆောက်ခြင်း။\n",
"\n",
"အရင်ဆုံး Random Forest မော်ဒယ်ကို စမ်းကြည့်ရအောင်။ ၎င်းသည် ဆုံးဖြတ်မှုအပင်များစွာကို တည်ဆောက်ပြီး အလယ်ပျမ်းမျှ function ကို အသုံးပြုကာ ပိုမိုကောင်းမွန်သော မော်ဒယ်တစ်ခုကို ဖန်တီးသည်။\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 နည်းလမ်းတစ်ခုဖြစ်ပြီး၊ အပင်တစ်ခုစီသည် ယခင်အပင်များ၏ရလဒ်များအပေါ် မူတည်ကာ အမှားကို တဖြည်းဖြည်း လျှော့ချရန် ကြိုးစားသည်။ ၎င်းသည် မှားယွင်းစွာ ခွဲခြားထားသော အရာများ၏ အလေးချိန်များကို အာရုံစိုက်ပြီး၊ နောက်ထပ် classifier အတွက် fit ကို ပြင်ဆင်ကာ မှန်ကန်စေရန် ကြိုးစားသည်။\n",
"\n",
"ဤမော်ဒယ်ကို fit လုပ်ရန် နည်းလမ်းအမျိုးမျိုးရှိသည် ( `help(\"boost_tree\")` ကို ကြည့်ပါ )။ ဤဥပမာတွင် Boosted trees ကို `xgboost` engine ဖြင့် fit လုပ်ပါမည်။\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",
"> - [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/> - AdaBoost မော်ဒယ်ကို လေ့လာနိုင်ပြီး၊ xgboost အစားထိုးအဖြစ် အသုံးချနိုင်သော မော်ဒယ်တစ်ခုဖြစ်သည်။\n",
">\n",
"> Ensemble classifiers အကြောင်း ပိုမိုလေ့လာရန်။\n",
"\n",
"## 4. အပို - မော်ဒယ်များစွာကို နှိုင်းယှဉ်ခြင်း\n",
"\n",
"ဒီ lab မှာ မော်ဒယ်အမျိုးမျိုးစွာကို အဆင့်ဆင့် လေ့လာပြီးဖြစ်ပါတယ် 🙌။ မတူညီတဲ့ preprocessor set တွေနဲ့/သို့မဟုတ် မော်ဒယ်အထူးပြုချက်များကို အသုံးပြုပြီး workflows များစွာကို တစ်ခုချင်းစီ ဖန်တီးရတာ အချိန်စားတတ်သလို၊ တစ်ခုချင်း performance metrics တွေကို တွက်ချက်ရတာလည်း မလွယ်ကူနိုင်ပါဘူး။\n",
"\n",
"ဒါကို ဖြေရှင်းနိုင်မလားဆိုတာ ကြည့်ကြရအောင်။ Training set ပေါ်မှာ workflows များစွာကို fit လုပ်ပြီး၊ Test set အပေါ်မှာ အခြေခံပြီး performance metrics တွေကို ပြန်ပေးနိုင်မယ့် function တစ်ခု ဖန်တီးကြည့်မယ်။ ဒီအတွက် [purrr](https://purrr.tidyverse.org/) package ထဲက `map()` နဲ့ `map_dfr()` ကို အသုံးပြုမယ်။ ဒီ function တွေက list ထဲမှာရှိတဲ့ element တစ်ခုချင်းစီကို လိုအပ်တဲ့ function တွေ သက်ဆိုင်ရာအတိုင်း လျှောက်သုံးနိုင်စေတယ်။\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) function တွေက for loops များစွာကို အစားထိုးပြီး၊ ပိုမိုရိုးရှင်းပြီး ဖတ်ရလွယ်ကူတဲ့ code တွေ ရေးနိုင်စေတယ်။ [`map()`](https://purrr.tidyverse.org/reference/map.html) function တွေကို ပိုမိုနားလည်ဖို့အတွက် အကောင်းဆုံးနေရာကတော့ R for data science ထဲက [iteration chapter](http://r4ds.had.co.nz/iteration.html) ဖြစ်ပါတယ်။\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/) package သည် အသုံးပြုသူများကို မော်ဒယ်အရေအတွက်များစွာကို ဖန်တီးပြီး လွယ်ကူစွာ အသုံးချနိုင်စေသော်လည်း၊ ၎င်းသည် `cross-validation` ကဲ့သို့သော ပြန်လည်နမူနာယူမှုနည်းလမ်းများနှင့် အဓိကအားဖြင့် အလုပ်လုပ်ရန် ဒီဇိုင်းထုတ်ထားသည်။ ဤနည်းလမ်းကို ကျွန်ုပ်တို့ မဖော်ပြရသေးပါ။\n",
"\n",
"## **🚀စိန်ခေါ်မှု**\n",
"\n",
"ဤနည်းလမ်းတစ်ခုစီတွင် သင်ပြင်ဆင်နိုင်သည့် parameter များစွာရှိပြီး၊ ဥပမာအားဖြင့် SVMs တွင် `cost`၊ KNN တွင် `neighbors`၊ Random Forest တွင် `mtry` (Randomly Selected Predictors) စသည်ဖြင့်ပါဝင်သည်။\n",
"\n",
"မော်ဒယ်တစ်ခုစီ၏ ပုံမှန် parameter များကို သုတေသနပြုပြီး၊ parameter များကို ပြင်ဆင်ခြင်းက မော်ဒယ်၏ အရည်အသွေးအပေါ် အဘယ်အရာကို ဆိုလိုသည်ကို စဉ်းစားပါ။\n",
"\n",
"မော်ဒယ်တစ်ခုနှင့် ၎င်း၏ parameter များအကြောင်း ပိုမိုသိရှိလိုပါက `help(\"model\")` ကို အသုံးပြုပါ၊ ဥပမာအားဖြင့် `help(\"rand_forest\")`။\n",
"\n",
"> လက်တွေ့အနေဖြင့်၊ ဤ parameter များအတွက် *အကောင်းဆုံးတန်ဖိုးများ* ကို *ခန့်မှန်း* ရန်၊ `simulated data set` ပေါ်တွင် မော်ဒယ်များစွာကို လေ့ကျင့်ပြီး၊ မော်ဒယ်များ၏ စွမ်းဆောင်ရည်ကို တိုင်းတာခြင်းဖြင့် ပြုလုပ်သည်။ ဤလုပ်ငန်းစဉ်ကို **tuning** ဟု ခေါ်သည်။\n",
"\n",
"### [**Post-lecture quiz**](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 ကို ပိုမိုကြိုဆိုဖွယ်ကောင်းစေပြီး စိတ်ဝင်စားဖွယ်ကောင်းစေသော ပုံဆွဲများကို ဖန်တီးပေးသည့်အတွက် ကျေးဇူးတင်ပါသည်။ ၎င်း၏ [gallery](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) တို့သည် ဤ module ၏ မူရင်း Python ဗားရှင်းကို ဖန်တီးပေးသည့်အတွက် ♥️\n",
"\n",
"ပျော်ရွှင်စွာ လေ့လာကြပါစေ၊\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>Artwork by @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}