{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_3-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "5015d65d61ba75a223bfc56c273aa174", "translation_date": "2025-09-06T11:35:36+00:00", "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb", "language_code": "my" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "EgQw8osnsUV-" } }, { "cell_type": "markdown", "source": [ "## Linear and Polynomial Regression for Pumpkin Pricing - Lesson 3\n", "

\n", " \n", "

Infographic by Dasani Madipalli
\n", "\n", "\n", "#### အကျဉ်းချုပ်\n", "\n", "ယခုအချိန်အထိ သင်သည် သင်ခန်းစာတစ်ခုလုံးတွင် အသုံးပြုမည့် ဖရုံစျေးနှုန်း dataset မှ စမ်းသပ်ဒေတာများနှင့် regression ဆိုတာဘာလဲဆိုတာကို လေ့လာပြီးဖြစ်ပါပြီ။ သင်သည် `ggplot2` ကို အသုံးပြု၍ visualization လည်း ပြုလုပ်ပြီးဖြစ်ပါသည်။💪\n", "\n", "ယခု သင်သည် ML အတွက် regression ကို ပိုမိုနက်နက်ရှိုင်းရှိုင်း လေ့လာရန် အသင့်ဖြစ်နေပါပြီ။ ဒီသင်ခန်းစာမှာ *basic linear regression* နဲ့ *polynomial regression* ဆိုတဲ့ regression အမျိုးအစားနှစ်မျိုးနဲ့ ဒီနည်းလမ်းတွေမှာ ပါဝင်တဲ့ သင်္ချာအချို့ကို လေ့လာသင်ယူရမှာ ဖြစ်ပါတယ်။\n", "\n", "> ဒီသင်ရိုးတစ်ခုလုံးအတွင်း သင်္ချာအပေါ် နည်းနည်းသာ သိရှိထားရမယ်လို့ သတ်မှတ်ထားပြီး အခြားနယ်ပယ်တွေကနေ လာတဲ့ ကျောင်းသားတွေ အတွက် နားလည်ရလွယ်ကူအောင် လုပ်ဆောင်ထားပါတယ်။ 🧮 မှတ်ချက်တွေ၊ အကြောင်းအရာကို ရှင်းပြတဲ့ ပုံစံတွေ၊ နိဒါန်းပုံစံတွေ၊ နားလည်မှုကို အထောက်အကူဖြစ်စေမယ့် အခြားသော သင်ကြားရေးကိရိယာတွေကို သတိထားပါ။\n", "\n", "#### ပြင်ဆင်မှု\n", "\n", "သတိပေးချက်အနေနဲ့ သင်သည် ဒီဒေတာကို load လုပ်ပြီး အမေးအဖြေများကို ရှာဖွေဖို့ ဖြစ်ပါတယ်။\n", "\n", "- ဖရုံဝယ်ဖို့ အချိန်ကောင်းဆုံးက ဘယ်အချိန်လဲ?\n", "\n", "- မီနီဖရုံတစ်အမှုန့်ရဲ့ စျေးနှုန်းကို ဘယ်လောက်မျှ မျှော်လင့်နိုင်မလဲ?\n", "\n", "- အဖွဲ့လိုက်ဝယ်မလား၊ 1 1/9 bushel box နဲ့ ဝယ်မလား? ဒီဒေတာကို ဆက်လက်တူးစူးကြည့်ရအောင်။\n", "\n", "ယခင်သင်ခန်းစာမှာ သင်သည် `tibble` (data frame ကို ခေတ်သစ်ပုံစံပြန်လည်ဖန်တီးထားသော ပုံစံ) တစ်ခုကို ဖန်တီးပြီး မူရင်း dataset ရဲ့ အစိတ်အပိုင်းတစ်ခုကို ထည့်သွင်းပြီး bushel အလိုက် စျေးနှုန်းကို စံပြုထားပါသည်။ ဒါပေမယ့် ဒီလိုလုပ်ခြင်းအားဖြင့် သင်သည် fall လများအတွက်သာ 400 data points လောက်သာ ရရှိနိုင်ခဲ့ပါသည်။ ဒေတာရဲ့ သဘာဝကို ပိုမိုအသေးစိတ် သိရှိနိုင်ဖို့ ဒေတာကို ပိုမိုသန့်စင်ရမလား? ကြည့်လိုက်ရအောင်... 🕵️‍♀️\n", "\n", "ဒီအလုပ်ကို လုပ်ဆောင်ဖို့ အောက်ပါ packages တွေလိုအပ်ပါမယ်-\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages](https://www.tidyverse.org/packages) များကို စုစည်းထားသော collection ဖြစ်ပြီး ဒေတာသိပ္ပံကို ပိုမိုလျင်မြန်စေပြီး ပိုမိုလွယ်ကူစေကာ ပျော်ရွှင်စေပါသည်။\n", "\n", "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework သည် [packages](https://www.tidymodels.org/packages/) များကို စုစည်းထားသော collection ဖြစ်ပြီး modeling နဲ့ machine learning အတွက် အသုံးပြုနိုင်ပါသည်။\n", "\n", "- `janitor`: [janitor package](https://github.com/sfirke/janitor) သည် ညစ်ပတ်နေသော ဒေတာများကို စစ်ဆေးပြီး သန့်စင်ရန် အလွယ်ကူဆုံး tools များကို ပေးစွမ်းပါသည်။\n", "\n", "- `corrplot`: [corrplot package](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) သည် correlation matrix ကို visual exploratory tool အဖြစ် အသုံးပြုနိုင်ပြီး variables တွေကြားမှာ hidden patterns တွေကို ရှာဖွေဖို့ automatic variable reordering ကို ပံ့ပိုးပေးပါသည်။\n", "\n", "သင်သည် packages များကို အောက်ပါအတိုင်း install လုပ်နိုင်ပါသည်-\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n", "\n", "အောက်ပါ script သည် သင်ဤ module ကို ပြီးစီးရန် လိုအပ်သော packages များ ရှိ/မရှိ စစ်ဆေးပြီး မရှိပါက install လုပ်ပေးပါမည်။\n" ], "metadata": { "id": "WqQPS1OAsg3H" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, corrplot)" ], "outputs": [], "metadata": { "id": "tA4C2WN3skCf", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0" } }, { "cell_type": "markdown", "source": [ "## 1. လိုင်းနာရီးဂရက်ရှင်းလိုင်း\n", "\n", "သင် Lesson 1 မှာ သင်ယူခဲ့သလို၊ လိုင်းနာရီးဂရက်ရှင်းလုပ်ငန်းရဲ့ ရည်ရွယ်ချက်က *အကောင်းဆုံးလိုင်း* ကို ရေးဆွဲနိုင်ဖို့ဖြစ်ပြီး၊\n", "\n", "- **အပြောင်းအလဲဆက်နွယ်မှုကို ပြသရန်**။ Variable တွေကြား ဆက်နွယ်မှုကို ပြသရန်။\n", "\n", "- **ခန့်မှန်းချက်များပြုလုပ်ရန်**။ အချက်အလက်အသစ်တစ်ခုဟာ အဲ့ဒီလိုင်းနဲ့ ဆက်နွယ်မှုမှာ ဘယ်နေရာမှာ ရောက်မလဲဆိုတာကို တိကျစွာ ခန့်မှန်းရန်။\n", "\n", "ဒီလိုလိုင်းကို ရေးဆွဲဖို့အတွက် **Least-Squares Regression** လို့ခေါ်တဲ့ စာရင်းဇယားနည်းကို အသုံးပြုပါတယ်။ `least-squares` ဆိုတဲ့အဓိပ္ပါယ်ကတော့ regression လိုင်းကို ပတ်လည်မှာရှိတဲ့ အချက်အလက်တွေကို စုစုပေါင်း စတုရန်းပုံစံနဲ့ တွက်ပြီး ထည့်ပေးတာဖြစ်ပါတယ်။ အကောင်းဆုံးရလဒ်က အမှားနည်းတဲ့နံပါတ်ကို ရရှိဖို့ဖြစ်ပြီး၊ အဲ့ဒီနောက်ဆုံးစုစုပေါင်းက အနည်းဆုံးဖြစ်ဖို့လိုပါတယ်။ ဒါကြောင့် *အကောင်းဆုံးလိုင်း* ဟာ စုစုပေါင်း စတုရန်းအမှားနံပါတ်နည်းဆုံးရတဲ့လိုင်းဖြစ်ပါတယ် - ဒီအကြောင်းကြောင့် *least squares regression* လို့ခေါ်ပါတယ်။\n", "\n", "ဒီလိုလုပ်ရတာကတော့ အချက်အလက်တွေကို အနည်းဆုံးအကွာအဝေးနဲ့ မော်ဒယ်တစ်ခုကို ဖန်တီးချင်လို့ပါ။ အချက်အလက်တွေကို စုစုပေါင်းထည့်မယ့်အခါမှာ အရေအတွက်ကိုသာ စဉ်းစားပြီး၊ ဦးတည်ချက်ကို မစဉ်းစားဖို့အတွက် စတုရန်းပုံစံနဲ့ တွက်ပါတယ်။\n", "\n", "> **🧮 သင့်ကို သင်္ချာပြပါ**\n", ">\n", "> ဒီလိုင်းကို *အကောင်းဆုံးလိုင်း* လို့ခေါ်ပြီး [အချိုးအစား](https://en.wikipedia.org/wiki/Simple_linear_regression) နဲ့ ဖော်ပြနိုင်ပါတယ်။\n", ">\n", "> Y = a + bX\n", ">\n", "> `X` က '`explanatory variable` or `predictor`' ဖြစ်ပါတယ်။ `Y` က '`dependent variable` or `outcome`' ဖြစ်ပါတယ်။ လိုင်းရဲ့ slope ကို `b` လို့ခေါ်ပြီး၊ `a` က y-intercept ဖြစ်ပါတယ်။ ဒါဟာ `X = 0` ဖြစ်တဲ့အခါမှာ `Y` ရဲ့တန်ဖိုးကို ဆိုလိုပါတယ်။\n", ">\n", "\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"slope = $y/x$\")\n", " Jen Looper ရဲ့ Infographic\n", ">\n", "> ပထမဆုံး slope `b` ကို တွက်ပါ။\n", ">\n", "> Pumpkin data ရဲ့ မူလမေးခွန်းကို ပြန်လည်သုံးသပ်ပါ။ \"တစ်လလျှင် တစ်ပုလင်း Pumpkin ရဲ့ဈေးနှုန်းကို ခန့်မှန်းပါ\" ဆိုတဲ့အခါမှာ `X` က ဈေးနှုန်းကို ဆိုလိုပြီး၊ `Y` က ရောင်းချတဲ့လကို ဆိုလိုပါတယ်။\n", ">\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/calculation.png)\n", " Jen Looper ရဲ့ Infographic\n", "> \n", "> Y ရဲ့တန်ဖိုးကို တွက်ပါ။ သင် $4 ဝန်းကျင်ပေးနေရင်၊ အဲ့ဒါက ဧပြီလဖြစ်ပါတယ်!\n", ">\n", "> လိုင်းကို တွက်တဲ့ သင်္ချာဟာ slope ကို ပြသရမယ်၊ ဒါဟာ intercept (သို့မဟုတ် `X = 0` ဖြစ်တဲ့အခါမှာ `Y` ရဲ့တည်နေရာ) ကို အခြေခံထားပါတယ်။\n", ">\n", "> ဒီတန်ဖိုးတွေကို တွက်တဲ့နည်းလမ်းကို [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ဝက်ဘ်ဆိုဒ်မှာ ကြည့်ရှုနိုင်ပါတယ်။ [ဒီ Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) ကိုလည်း သုံးပြီး နံပါတ်တွေက လိုင်းကို ဘယ်လိုသက်ရောက်မှုရှိလဲဆိုတာ ကြည့်ရှုနိုင်ပါတယ်။\n", "\n", "အတော်လေးလွယ်ကူတယ်နော် 🤓\n", "\n", "#### ဆက်နွယ်မှု\n", "\n", "နောက်ထပ်နားလည်ရမယ့် term တစ်ခုက **Correlation Coefficient** ဖြစ်ပြီး၊ X နဲ့ Y variable တွေကြားမှာရှိပါတယ်။ Scatterplot ကို အသုံးပြုပြီး ဒီ coefficient ကို အလွယ်တကူမြင်နိုင်ပါတယ်။ Datapoint တွေကို တစ်ကြိမ်တည်းလိုင်းပုံစံနဲ့ scatterplot မှာ မြင်ရရင် correlation မြင့်ပါတယ်။ Datapoint တွေကို X နဲ့ Y ကြားမှာ မတိကျစွာ scatter ဖြစ်နေရင် correlation နည်းပါတယ်။\n", "\n", "အကောင်းဆုံးလိုင်းနာရီးဂရက်ရှင်းမော်ဒယ်ကတော့ Least-Squares Regression နည်းလမ်းနဲ့ regression လိုင်းကို အသုံးပြုပြီး Correlation Coefficient မြင့်တဲ့ (1 နီးစပ်ပြီး 0 နည်းတဲ့) မော်ဒယ်ဖြစ်ရမယ်။\n" ], "metadata": { "id": "cdX5FRpvsoP5" } }, { "cell_type": "markdown", "source": [ "## **၂။ ဒေတာနှင့်အတူကခုန်ခြင်း - မော်ဒယ်ဖွဲ့စည်းရန်အသုံးပြုမည့် ဒေတာဖရိမ် ဖန်တီးခြင်း**\n", "\n", "

\n", " \n", "

@allison_horst ရဲ့ အနုပညာလက်ရာ
\n", "\n", "\n", "\n" ], "metadata": { "id": "WdUKXk7Bs8-V" } }, { "cell_type": "markdown", "source": [ "လိုအပ်သောစာကြည့်တိုက်များနှင့်ဒေတာစဉ်ကိုတင်ပါ။ ဒေတာကိုအောက်ပါအချက်အလက်များပါဝင်သောဒေတာဖရိမ်အဖြစ်ပြောင်းပါ။\n", "\n", "- သစ်တောပန်းကန်များကို bushel အလိုက်ဈေးနှုန်းထားထားသောအချက်အလက်များသာရယူပါ။\n", "\n", "- ရက်စွဲကိုလပြောင်းပါ။\n", "\n", "- အမြင့်ဈေးနှင့်အနိမ့်ဈေး၏ပျမ်းမျှကိုတွက်ချက်ပြီးဈေးနှုန်းအဖြစ်သတ်မှတ်ပါ။\n", "\n", "- ဈေးနှုန်းကို bushel အရေအတွက်အလိုက်ပြောင်းပါ။\n", "\n", "> ဒီအဆင့်များကို [ယခင်သင်ခန်းစာ](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb) မှာဖော်ပြပြီးသားဖြစ်ပါတယ်။\n" ], "metadata": { "id": "fMCtu2G2s-p8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core Tidyverse packages\n", "library(tidyverse)\n", "library(lubridate)\n", "\n", "# Import the pumpkins data\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n", "\n", "\n", "# Get a glimpse and dimensions of the data\n", "glimpse(pumpkins)\n", "\n", "\n", "# Print the first 50 rows of the data set\n", "pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "ryMVZEEPtERn" } }, { "cell_type": "markdown", "source": [ "စွန့်စားမှုစိတ်ဓာတ်ဖြင့်၊ အချက်အလက်များကို စစ်ဆေးခြင်းနှင့် သန့်ရှင်းရေးလုပ်ဆောင်ရန် ရိုးရှင်းသော လုပ်ဆောင်ချက်များပေးသော [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) ကို စူးစမ်းကြည့်ပါစို့။ ဥပမာအားဖြင့်၊ ကျွန်ုပ်တို့၏ အချက်အလက်များအတွက် ကော်လံအမည်များကို ကြည့်ရှုကြည့်ပါ:\n" ], "metadata": { "id": "xcNxM70EtJjb" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "5XtpaIigtPfW" } }, { "cell_type": "markdown", "source": [ "🤔 ကျွန်တော်တို့ ပိုမိုကောင်းမွန်စွာ ပြုလုပ်နိုင်ပါတယ်။ ဒီကော်လံအမည်တွေကို `janitor::clean_names` ကို အသုံးပြုပြီး [snake_case](https://en.wikipedia.org/wiki/Snake_case) စံနှုန်းအတိုင်း ပြောင်းလဲပြီး `friendR` အဖြစ် ပြုလုပ်ကြစို့။ ဒီဖင်ခွင့်အကြောင်း ပိုမိုသိရှိလိုပါက `?clean_names` ကို အသုံးပြုပါ။\n" ], "metadata": { "id": "IbIqrMINtSHe" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Clean names to the snake_case convention\n", "pumpkins <- pumpkins %>% \n", " clean_names(case = \"snake\")\n", "\n", "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "a2uYvclYtWvX" } }, { "cell_type": "markdown", "source": [ "အရမ်းသန့်ရှင်းတဲ့ tidyR 🧹! အခုတော့, ရှေ့က သင်ခန်းစာမှာလိုပဲ `dplyr` ကိုသုံးပြီး ဒေတာနဲ့အတူ အကပြမယ်! 💃\n" ], "metadata": { "id": "HfhnuzDDtaDd" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Select desired columns\n", "pumpkins <- pumpkins %>% \n", " select(variety, city_name, package, low_price, high_price, date)\n", "\n", "\n", "\n", "# Extract the month from the dates to a new column\n", "pumpkins <- pumpkins %>%\n", " mutate(date = mdy(date),\n", " month = month(date)) %>% \n", " select(-date)\n", "\n", "\n", "\n", "# Create a new column for average Price\n", "pumpkins <- pumpkins %>% \n", " mutate(price = (low_price + high_price)/2)\n", "\n", "\n", "# Retain only pumpkins with the string \"bushel\"\n", "new_pumpkins <- pumpkins %>% \n", " filter(str_detect(string = package, pattern = \"bushel\"))\n", "\n", "\n", "# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n", "new_pumpkins <- new_pumpkins %>% \n", " mutate(price = case_when(\n", " str_detect(package, \"1 1/9\") ~ price/(1.1),\n", " str_detect(package, \"1/2\") ~ price*2,\n", " TRUE ~ price))\n", "\n", "# Relocate column positions\n", "new_pumpkins <- new_pumpkins %>% \n", " relocate(month, .before = variety)\n", "\n", "\n", "# Display the first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "X0wU3gQvtd9f" } }, { "cell_type": "markdown", "source": [ "အရမ်းကောင်းပါတယ်!👌 အခုတော့ သင့်မှာ သန့်ရှင်းပြီး စနစ်တကျထားရှိတဲ့ ဒေတာအစုတစ်ခုရှိပြီး သင့်ရဲ့ အသစ်သော regression မော်ဒယ်ကို တည်ဆောက်နိုင်ပါပြီ!\n", "\n", "Scatter plot တစ်ခု လုပ်ကြည့်မလား?\n" ], "metadata": { "id": "UpaIwaxqth82" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Set theme\n", "theme_set(theme_light())\n", "\n", "# Make a scatter plot of month and price\n", "new_pumpkins %>% \n", " ggplot(mapping = aes(x = month, y = price)) +\n", " geom_point(size = 1.6)\n" ], "outputs": [], "metadata": { "id": "DXgU-j37tl5K" } }, { "cell_type": "markdown", "source": [ "အကြောင်းအရာများကို scatter plot ကနေကြည့်လိုက်ရင်၊ ကျွန်တော်တို့မှာ သြဂုတ်လကနေ ဒီဇင်ဘာလအထိ လများဆိုင်ရာ ဒေတာပဲ ရှိနေတယ်ဆိုတာ သတိရမိပါတယ်။ ဒေတာတွေကို လိုင်းနာပုံစံနဲ့ သုံးသပ်နိုင်ဖို့အတွက် ဒေတာပိုများအောင် လိုအပ်နိုင်ပါတယ်။\n", "\n", "အခုတော့ ကျွန်တော်တို့ရဲ့ မော်ဒယ်ဖွဲ့စည်းမှု ဒေတာကို ပြန်လည်ကြည့်လိုက်ရအောင်:\n" ], "metadata": { "id": "Ve64wVbwtobI" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Display first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "HFQX2ng1tuSJ" } }, { "cell_type": "markdown", "source": [ "ငါတို့ `city` သို့မဟုတ် `package` ကော်လံတွေ (character အမျိုးအစား) အပေါ်မူတည်ပြီး ဖရုံသီးရဲ့ `price` ကိုခန့်မှန်းချင်ရင်ရော ဘယ်လိုလုပ်မလဲ။ ဒါမှမဟုတ် ပိုရိုးရှင်းစွာပြောရရင် `package` နဲ့ `price` ကြားက ဆက်စပ်မှု (အဲဒါကိုတွက်ရန် input နှစ်ခုစလုံးက နံပါတ်ဖြစ်ရမယ်) ကိုဘယ်လိုရှာမလဲ? 🤷🤷\n", "\n", "Machine learning မော်ဒယ်တွေက စာသားတန်ဖိုးတွေထက် နံပါတ်အင်္ဂါရပ်တွေနဲ့ ပိုကောင်းစွာအလုပ်လုပ်တတ်ပါတယ်၊ ဒါကြောင့် categorical အင်္ဂါရပ်တွေကို နံပါတ်အမျိုးအစားအဖြစ် ပြောင်းဖို့လိုအပ်တတ်ပါတယ်။\n", "\n", "ဒါကတော့ မော်ဒယ်တစ်ခုအတွက် အင်္ဂါရပ်တွေကို ပိုထိရောက်စွာအသုံးချနိုင်အောင် ပြင်ဆင်ပုံစံတစ်ခုကို ရှာဖွေရမယ်ဆိုတာကို ဆိုလိုတာပါ၊ ဒီလုပ်ငန်းစဉ်ကို `feature engineering` လို့ခေါ်ပါတယ်။\n" ], "metadata": { "id": "7hsHoxsStyjJ" } }, { "cell_type": "markdown", "source": [ "## 3. မော်ဒယ်အတွက် ဒေတာကို `recipes` နဲ့ ကြိုတင်ပြင်ဆင်ခြင်း 👩‍🍳👨‍🍳\n", "\n", "မော်ဒယ်အတွက် အသုံးပြုရလွယ်ကူစေရန် `predictor values` တွေကို ပြောင်းလဲဖန်တီးတဲ့ လုပ်ငန်းစဉ်ကို `feature engineering` လို့ခေါ်ပါတယ်။\n", "\n", "မော်ဒယ်အမျိုးမျိုးမှာ `preprocessing` လိုအပ်ချက်တွေ မတူညီပါတယ်။ ဥပမာအားဖြင့်, `least squares` ကို အသုံးပြုဖို့ `categorical variables` (ဥပမာ - လ, အမျိုးအစား, မြို့နာမည်) တွေကို `encoding` လုပ်ဖို့လိုအပ်ပါတယ်။ ဒါဟာ `categorical values` ပါတဲ့ ကော်လံကို `numeric columns` အဖြစ် ပြောင်းလဲပြီး အရင်ကော်လံကို အစားထိုးပေးရုံသာဖြစ်ပါတယ်။\n", "\n", "ဥပမာအားဖြင့်, သင့်ဒေတာမှာ အောက်ပါ `categorical feature` ပါရှိတယ်ဆိုပါစို့:\n", "\n", "| city |\n", "|:-------:|\n", "| Denver |\n", "| Nairobi |\n", "| Tokyo |\n", "\n", "သင့်အနေဖြင့် *ordinal encoding* ကို အသုံးပြုပြီး category တစ်ခုစီအတွက် ထူးခြားတဲ့ `integer value` တစ်ခုစီကို အစားထိုးနိုင်ပါတယ်၊ ဥပမာ:\n", "\n", "| city |\n", "|:----:|\n", "| 0 |\n", "| 1 |\n", "| 2 |\n", "\n", "ဒါကိုပဲ ကျွန်တော်တို့ ဒေတာမှာ လုပ်သွားမှာပါ!\n", "\n", "ဒီအပိုင်းမှာ, Tidymodels ရဲ့ အံ့မခန်းတဲ့ package တစ်ခုဖြစ်တဲ့ [recipes](https://tidymodels.github.io/recipes/) ကို လေ့လာသွားမှာဖြစ်ပါတယ်။ ဒီ package ဟာ မော်ဒယ်ကို သင်ကြားမယ့်အခါ **မတိုင်မီ** ဒေတာကို ကြိုတင်ပြင်ဆင်ဖို့ အထောက်အကူပြုပါတယ်။ `recipe` ဆိုတာက အဓိကအားဖြင့် ဒေတာကို မော်ဒယ်အတွက် အသင့်ဖြစ်စေရန် ဘယ်လိုအဆင့်တွေကို အကောင်အထည်ဖော်ရမလဲဆိုတာ သတ်မှတ်ပေးတဲ့ object တစ်ခုပါ။\n", "\n", "အခုတော့, `predictor columns` မှာ observation တစ်ခုစီအတွက် ထူးခြားတဲ့ integer တစ်ခုစီကို အစားထိုးပေးပြီး မော်ဒယ်အတွက် ဒေတာကို ပြင်ဆင်ပေးမယ့် `recipe` တစ်ခုကို ဖန်တီးကြရအောင်!\n" ], "metadata": { "id": "AD5kQbcvt3Xl" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\n", "pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "# Print out the recipe\n", "pumpkins_recipe" ], "outputs": [], "metadata": { "id": "BNaFKXfRt9TU" } }, { "cell_type": "markdown", "source": [ "အံ့ဩစရာကောင်းတယ်! 👏 ကျွန်တော်တို့ ပထမဆုံး recipe ကို ဖန်တီးပြီးပြီ၊ အဲဒါကတော့ ရလဒ် (စျေးနှုန်း) နဲ့ အဲဒီရလဒ်ကို ခန့်မှန်းပေးမယ့် predictors တွေကို သတ်မှတ်ပေးပြီး၊ predictor column တွေကို integer အစုံအဖြစ် encode လုပ်ပေးဖို့ ရည်ရွယ်ထားတာပါ 🙌! အခု အပိုင်းကို အနည်းငယ် ခွဲခြမ်းစိတ်ဖြာကြည့်ရအောင်:\n", "\n", "- `recipe()` ကို formula နဲ့ ခေါ်သုံးတာက `new_pumpkins` data ကို အခြေခံပြီး variable တွေရဲ့ *roles* ကို recipe ကိုယ်တိုင်သတ်မှတ်ပေးတာပါ။ ဥပမာ `price` column ကို `outcome` role အဖြစ် သတ်မှတ်ပေးပြီး၊ အခြား column တွေကို `predictor` role အဖြစ် သတ်မှတ်ပေးထားပါတယ်။\n", "\n", "- `step_integer(all_predictors(), zero_based = TRUE)` ကတော့ predictor အားလုံးကို integer အစုံအဖြစ် ပြောင်းပေးဖို့ သတ်မှတ်ထားပြီး၊ အရေအတွက်ကို 0 ကနေ စတင်ပေးထားပါတယ်။\n", "\n", "သေချာပါတယ်၊ သင်ဟာ \"အရမ်းမိုက်တယ်!! ဒါပေမယ့် recipe တွေက ကျွန်တော် မျှော်လင့်ထားတဲ့အတိုင်း အလုပ်လုပ်နေလားဆိုတာ အတည်ပြုဖို့လိုမယ်ဆိုရင် ဘာလုပ်ရမလဲ? 🤔\" ဆိုတဲ့ အတွေးတွေ ရှိနေလောက်ပါတယ်။\n", "\n", "အဲဒါက အရမ်းကောင်းတဲ့ အတွေးပါ! သင့် recipe ကို သတ်မှတ်ပြီးတာနဲ့ data ကို preprocess လုပ်ဖို့ လိုအပ်တဲ့ parameters တွေကို ခန့်မှန်းနိုင်ပြီး၊ processed data ကို extract လုပ်နိုင်ပါတယ်။ Tidymodels ကို သုံးတဲ့အခါ (အခုလို workflow convention ကို ခဏကြည့်မယ်-\\> `workflows`) အဲဒီလိုလုပ်ဖို့ မလိုအပ်ပေမယ့်၊ recipe တွေက သင့်မျှော်လင့်ချက်နဲ့ ကိုက်ညီနေလားဆိုတာ စစ်ဆေးဖို့ အထောက်အကူဖြစ်နိုင်ပါတယ်။\n", "\n", "အဲဒီအတွက် `prep()` နဲ့ `bake()` ဆိုတဲ့ verb နှစ်ခုကို သုံးဖို့ လိုအပ်ပါတယ်။ အမြဲတမ်းလိုပဲ၊ [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) ရဲ့ R ပညာရှင်လေးတွေက သင့်ကို ပိုမိုနားလည်စေဖို့ အထောက်အကူပေးနိုင်ပါတယ်!\n", "\n", "

\n", " \n", "

Artwork by @allison_horst
\n" ], "metadata": { "id": "KEiO0v7kuC9O" } }, { "cell_type": "markdown", "source": [ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): လေ့ကျင့်မှုအချက်အလက်များမှ လိုအပ်သော parameters များကို ခန့်မှန်းပေးပြီး နောက်ပိုင်းတွင် အခြားအချက်အလက်များတွင် အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့်၊ သတ်မှတ်ထားသော predictor column တစ်ခုအတွက် integer 0, 1, 2 စသည်ဖြင့် ဘယ် observation ကို assign လုပ်မည်ဆိုတာကို ဆုံးဖြတ်ပေးသည်။\n", "\n", "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): prep လုပ်ပြီးသား recipe ကို ယူပြီး အခြားအချက်အလက်များတွင် လုပ်ဆောင်မှုများကို အကောင်အထည်ဖော်ပေးသည်။\n", "\n", "ဒါဆိုရင်တော့၊ prep လုပ်ပြီး bake လုပ်ခြင်းအားဖြင့် predictor column များကို model fit လုပ်မည့်အခါမှာ အရင်ဆုံး encode လုပ်ထားမည်ဖြစ်ကြောင်း အတည်ပြုနိုင်ရန် လုပ်ဆောင်ကြပါစို့။\n" ], "metadata": { "id": "Q1xtzebuuTCP" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep the recipe\n", "pumpkins_prep <- prep(pumpkins_recipe)\n", "\n", "# Bake the recipe to extract a preprocessed new_pumpkins data\n", "baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n", "\n", "# Print out the baked data set\n", "baked_pumpkins %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "FGBbJbP_uUUn" } }, { "cell_type": "markdown", "source": [ "ဝူး-ဟူး! 🥳 `baked_pumpkins` အချက်အလက်များကို အားလုံး encode လုပ်ပြီးပြီဖြစ်တဲ့အတွက်၊ ကျွန်ုပ်တို့သတ်မှတ်ထားတဲ့ preprocessing အဆင့်များဟာ မျှော်မှန်းထားသလို အလုပ်လုပ်မယ်ဆိုတာ အတည်ပြုနိုင်ပါပြီ။ ဒါဟာ သင့်အနေနဲ့ ဖတ်ရှုရခက်စေပြီး Tidymodels အတွက် ပိုမိုနားလည်ရလွယ်စေပါတယ်! ဘယ် observation ကို integer တစ်ခုနဲ့ mapping လုပ်ထားတယ်ဆိုတာ ရှာဖွေကြည့်ဖို့ အချိန်ယူပါ။\n", "\n", "ဒါ့အပြင် `baked_pumpkins` ဟာ computation တွေကို လုပ်ဆောင်နိုင်တဲ့ data frame တစ်ခုဖြစ်တယ်ဆိုတာလည်း သတိပြုရပါမယ်။\n", "\n", "ဥပမာအားဖြင့်၊ သင့်အချက်အလက်ထဲက အချက်အလက်နှစ်ခုအကြား correlation ကောင်းတစ်ခုကို ရှာဖွေပြီး၊ ကောင်းမွန်တဲ့ predictive model တစ်ခုတည်ဆောက်နိုင်ဖို့ ကြိုးစားကြည့်ရအောင်။ ဒီအတွက် `cor()` function ကို အသုံးပြုပါမယ်။ `?cor()` ကို ရိုက်ထည့်ပြီး function အကြောင်းပိုမိုသိရှိနိုင်ပါမယ်။\n" ], "metadata": { "id": "1dvP0LBUueAW" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Find the correlation between the city_name and the price\n", "cor(baked_pumpkins$city_name, baked_pumpkins$price)\n", "\n", "# Find the correlation between the package and the price\n", "cor(baked_pumpkins$package, baked_pumpkins$price)\n" ], "outputs": [], "metadata": { "id": "3bQzXCjFuiSV" } }, { "cell_type": "markdown", "source": [ "မြို့နဲ့ဈေးနှုန်းကြားမှာ အားနည်းတဲ့ဆက်စပ်မှုသာရှိပါတယ်။ ဒါပေမယ့် အထုပ်နဲ့ဈေးနှုန်းကြားမှာတော့ ပိုမိုကောင်းမွန်တဲ့ဆက်စပ်မှုရှိပါတယ်။ အဲဒါက အဓိပ္ပါယ်ရှိပါတယ်မဟုတ်လား? သာမန်အားဖြင့် ထုပ်ပိုးသေတ္တာကြီးလို့ဈေးနှုန်းမြင့်တတ်ပါတယ်။\n", "\n", "ဒီအချိန်မှာပဲ အတန်းအားလုံးရဲ့ ဆက်စပ်မှု matrix ကို `corrplot` package ကိုသုံးပြီး visualization လုပ်ကြည့်ရအောင်။\n" ], "metadata": { "id": "BToPWbgjuoZw" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the corrplot package\n", "library(corrplot)\n", "\n", "# Obtain correlation matrix\n", "corr_mat <- cor(baked_pumpkins %>% \n", " # Drop columns that are not really informative\n", " select(-c(low_price, high_price)))\n", "\n", "# Make a correlation plot between the variables\n", "corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")" ], "outputs": [], "metadata": { "id": "ZwAL3ksmutVR" } }, { "cell_type": "markdown", "source": [ "🤩🤩 ပိုကောင်းလာပြီ။\n", "\n", "အခုတော့ ဒီဒေတာကို သုံးပြီး '`ပန်းကန်ဖုံးအထုပ်တစ်ခုရဲ့ စျေးနှုန်းကို မျှော်လင့်နိုင်မည့်အရာက ဘာလဲ?`' ဆိုတဲ့ မေးခွန်းကို မေးဖို့ကောင်းပါတယ်။ အခုတစ်ခါမှာ အဲဒီအကြောင်းကို တိုက်ရိုက်ဆွေးနွေးကြမယ်!\n", "\n", "> Note: **`bake()`** ကို **`new_data = NULL`** နဲ့ **`pumpkins_prep`** ကို အသုံးပြုပြီး recipe ကို ပြင်ဆင်ပြီးနောက်မှာ (ဥပမာ encode လုပ်ပြီး) လေ့ကျင့်မှုဒေတာကို ထုတ်ယူနိုင်ပါတယ်။ အခြား test set တစ်ခုလိုမျိုး recipe က ဒေတာကို ဘယ်လို pre-process လုပ်မလဲဆိုတာ ကြည့်ချင်ရင် **`pumpkins_prep`** ကို **`new_data = test_set`** နဲ့ bake လုပ်ရုံပါပဲ။\n", "\n", "## 4. လိုင်းနီယာ ရှုထောင့်မော်ဒယ် တည်ဆောက်ခြင်း\n", "\n", "

\n", " \n", "

Infographic by Dasani Madipalli
\n", "\n", "\n", "\n" ], "metadata": { "id": "YqXjLuWavNxW" } }, { "cell_type": "markdown", "source": [ "အခုတော့ ကျွန်တော်တို့ recipe တစ်ခုကို တည်ဆောက်ပြီး၊ ဒေတာကို သင့်တော်စွာ ကြိုတင်လုပ်ဆောင်ပေးမယ်ဆိုတာ အတည်ပြုပြီးသားဖြစ်တဲ့အတွက်၊ အခုတော့ regression မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီး `ပုံးတစ်ခုရဲ့ စျေးနှုန်းကို မျှော်မှန်းနိုင်မလား` ဆိုတဲ့မေးခွန်းကို ဖြေရှင်းကြည့်ရအောင်။\n", "\n", "#### လေ့ကျင့်မှုအတွက် linear regression မော်ဒယ်တစ်ခုကို training set ကို အသုံးပြု၍ တည်ဆောက်ပါ\n", "\n", "သင်ဟာ အရင်ကတည်းက သိပြီးသားဖြစ်နိုင်ပါတယ်၊ *price* က `outcome` variable ဖြစ်ပြီး *package* ကတော့ `predictor` variable ဖြစ်ပါတယ်။\n", "\n", "ဒါကိုလုပ်ဖို့အတွက်၊ ပထမဦးဆုံး ဒေတာကို 80% ကို training set အဖြစ် သတ်မှတ်ပြီး 20% ကို test set အဖြစ် သတ်မှတ်ပါမယ်၊ ထို့နောက် predictor column ကို integer အစုအဖွဲ့အဖြစ် encode လုပ်ပေးမယ့် recipe တစ်ခုကို သတ်မှတ်ပြီး မော်ဒယ် specification တစ်ခုကို တည်ဆောက်ပါမယ်။ ကျွန်တော်တို့ recipe ကို prep လုပ်ပြီး bake လုပ်မည်မဟုတ်ပါဘူး၊ ဒါကြောင့် ဒေတာကို မျှော်မှန်းထားသလို ကြိုတင်လုပ်ဆောင်ပေးမယ်ဆိုတာ ကျွန်တော်တို့သိပြီးသားဖြစ်ပါတယ်။\n" ], "metadata": { "id": "Pq0bSzCevW-h" } }, { "cell_type": "code", "execution_count": null, "source": [ "set.seed(2056)\n", "# Split the data into training and test sets\n", "pumpkins_split <- new_pumpkins %>% \n", " initial_split(prop = 0.8)\n", "\n", "\n", "# Extract training and test data\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "\n", "\n", "# Create a recipe for preprocessing the data\n", "lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "\n", "# Create a linear model specification\n", "lm_spec <- linear_reg() %>% \n", " set_engine(\"lm\") %>% \n", " set_mode(\"regression\")" ], "outputs": [], "metadata": { "id": "CyoEh_wuvcLv" } }, { "cell_type": "markdown", "source": [ "အရမ်းကောင်းပါတယ်! အခုတော့ ကျွန်တော်တို့မှာ ဟင်းချက်နည်းနဲ့ မော်ဒယ်အကြောင်းအရာ ရှိပြီးသားဖြစ်တဲ့အတွက်၊ ဒေတာကို ပထမဦးဆုံး ကြိုတင်လုပ်ဆောင် (prep+bake ကို မျက်နှာပြင်နောက်ကွယ်မှာလုပ်ဆောင်)၊ ပြီးတော့ ကြိုတင်လုပ်ဆောင်ထားတဲ့ ဒေတာပေါ်မှာ မော်ဒယ်ကို အဆင်ပြေစွာ ထည့်သွင်းနိုင်ပြီး၊ နောက်ထပ် လိုအပ်နိုင်တဲ့ အလုပ်များကိုလည်း ဆောင်ရွက်နိုင်မယ့် object တစ်ခုကို ရှာဖွေဖို့ လိုအပ်ပါတယ်။ ဒါကတော့ သင့်စိတ်ချရမှုအတွက် အရမ်းကောင်းတဲ့ အရာပဲ!🤩\n", "\n", "Tidymodels မှာ ဒီအဆင်ပြေတဲ့ object ကို [`workflow`](https://workflows.tidymodels.org/) လို့ခေါ်ပြီး၊ သင့်ရဲ့ မော်ဒယ် components တွေကို အဆင်ပြေစွာ ထည့်သွင်းထားနိုင်ပါတယ်! Python မှာ *pipelines* လို့ခေါ်တဲ့ အရာကို ဒီမှာဆိုရင် ဒီလိုခေါ်ပါတယ်။\n", "\n", "အခုတော့ အားလုံးကို workflow တစ်ခုအဖြစ် စုပေါင်းလိုက်ရအောင်!📦\n" ], "metadata": { "id": "G3zF_3DqviFJ" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Hold modelling components in a workflow\n", "lm_wf <- workflow() %>% \n", " add_recipe(lm_pumpkins_recipe) %>% \n", " add_model(lm_spec)\n", "\n", "# Print out the workflow\n", "lm_wf" ], "outputs": [], "metadata": { "id": "T3olroU3v-WX" } }, { "cell_type": "markdown", "source": [ "အလုပ်လုပ်စဉ်တစ်ခုကိုလည်း မော်ဒယ်တစ်ခုလိုပဲ တူညီတဲ့နည်းလမ်းနဲ့ တပ်ဆင်နိုင်သလို/လေ့ကျင့်နိုင်ပါတယ်။\n" ], "metadata": { "id": "zd1A5tgOwEPX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Train the model\n", "lm_wf_fit <- lm_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the model coefficients learned \n", "lm_wf_fit" ], "outputs": [], "metadata": { "id": "NhJagFumwFHf" } }, { "cell_type": "markdown", "source": [ "မော်ဒယ်ကိုလေ့ကျင့်သင်ကြားစဉ်တွင် ရရှိခဲ့သော coefficient များကို output မှာတွေ့နိုင်ပါတယ်။ အဲဒီ coefficient များကတော့ အမှန်တကယ်ရှိသောအချက်အလက်များနှင့် မော်ဒယ်မှခန့်မှန်းထားသောအချက်အလက်များအကြား အမှားအယွင်းကိုအနည်းဆုံးဖြစ်အောင် လိုက်ဖက်ညီစေသော လိုင်း၏ coefficient များကို ကိုယ်စားပြုပါတယ်။\n", "\n", "#### စမ်းသပ်မှုအစုအဖွဲ့ကို အသုံးပြု၍ မော်ဒယ်၏စွမ်းဆောင်ရည်ကို အကဲဖြတ်ခြင်း\n", "\n", "အခုတော့ မော်ဒယ်ရဲ့စွမ်းဆောင်ရည်ကို စစ်ဆေးကြည့်မယ် 📏! ဒါကို ဘယ်လိုလုပ်မလဲ?\n", "\n", "မော်ဒယ်ကိုလေ့ကျင့်ပြီးပြီဆိုတော့ `parsnip::predict()` ကိုအသုံးပြုပြီး စမ်းသပ်မှုအစုအဖွဲ့ (test_set) အတွက် ခန့်မှန်းချက်များပြုလုပ်နိုင်ပါပြီ။ ထို့နောက် ဒီခန့်မှန်းချက်များကို အမှန်တကယ်ရှိသော label တန်ဖိုးများနှင့် နှိုင်းယှဉ်ပြီး မော်ဒယ်က ဘယ်လောက်ထိအောင်မြင်စွာ (သို့မဟုတ် မအောင်မြင်စွာ) လုပ်ဆောင်နေသလဲဆိုတာကို အကဲဖြတ်နိုင်ပါတယ်။\n", "\n", "စမ်းသပ်မှုအစုအဖွဲ့အတွက် ခန့်မှန်းချက်များပြုလုပ်ပြီး၊ ထို့နောက် အဲဒီ column များကို စမ်းသပ်မှုအစုအဖွဲ့နှင့် ပေါင်းစည်းခြင်းဖြင့် စတင်ကြရအောင်။\n" ], "metadata": { "id": "_4QkGtBTwItF" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make predictions for the test set\n", "predictions <- lm_wf_fit %>% \n", " predict(new_data = pumpkins_test)\n", "\n", "\n", "# Bind predictions to the test set\n", "lm_results <- pumpkins_test %>% \n", " select(c(package, price)) %>% \n", " bind_cols(predictions)\n", "\n", "\n", "# Print the first ten rows of the tibble\n", "lm_results %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "UFZzTG0gwTs9" } }, { "cell_type": "markdown", "source": [ "ဟုတ်ပါတယ်၊ သင်မော်ဒယ်တစ်ခုကိုလေ့ကျင့်ပြီး အနာဂတ်ခန့်မှန်းချက်များလုပ်နိုင်ခဲ့ပါပြီ!🔮 ဒါကကောင်းတယ်လား၊ မော်ဒယ်ရဲ့စွမ်းဆောင်ရည်ကိုအကဲဖြတ်ကြည့်ရအောင်!\n", "\n", "Tidymodels မှာတော့ `yardstick::metrics()` ကိုသုံးပြီး ဒီအရာကိုလုပ်ပါတယ်! Linear regression အတွက်တော့ အောက်ပါ metrics တွေကိုအဓိကထားပါမယ်-\n", "\n", "- `Root Mean Square Error (RMSE)`: [MSE](https://en.wikipedia.org/wiki/Mean_squared_error) ရဲ့ square root ဖြစ်ပါတယ်။ ဒါက label ရဲ့ unit (ဒီအခါမှာတော့ ဖရုံသီးရဲ့စျေးနှုန်း) နဲ့တူညီတဲ့ absolute metric ကိုရရှိစေပါတယ်။ တန်ဖိုးကငယ်လို့ရင် မော်ဒယ်ကပိုကောင်းပါတယ် (ရိုးရှင်းစွာပြောရရင်တော့ ဒီဟန်ချက်က ခန့်မှန်းချက်တွေမှားနေတဲ့ပျမ်းမျှစျေးနှုန်းကိုဖော်ပြပါတယ်!)\n", "\n", "- `Coefficient of Determination (အများအားဖြင့် R-squared သို့မဟုတ် R2 လို့ခေါ်တယ်)`: တန်ဖိုးကမြင့်လို့ရင် မော်ဒယ်ရဲ့ fit ကပိုကောင်းတယ်ဆိုတဲ့ relative metric ဖြစ်ပါတယ်။ အဓိကအားဖြင့် ဒီဟန်ချက်က ခန့်မှန်းထားတဲ့ label တန်ဖိုးနဲ့ အမှန်တကယ် label တန်ဖိုးကြားက variance ကို မော်ဒယ်ကဘယ်လောက်အောင်မြင်စွာရှင်းပြနိုင်တယ်ဆိုတာကိုဖော်ပြပါတယ်။\n" ], "metadata": { "id": "0A5MjzM7wW9M" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Evaluate performance of linear regression\n", "metrics(data = lm_results,\n", " truth = price,\n", " estimate = .pred)" ], "outputs": [], "metadata": { "id": "reJ0UIhQwcEH" } }, { "cell_type": "markdown", "source": [ "မော်ဒယ်၏လုပ်ဆောင်မှုကောင်းမှုမှာ အခုလိုပျက်သွားပါပြီ။ အခုတော့ ပက်ကေ့ချ်နဲ့ဈေးနှုန်းကို scatter plot အနေနဲ့မြင်နိုင်အောင် visualization လုပ်ပြီး၊ မော်ဒယ်ကပြုလုပ်ထားတဲ့ခန့်မှန်းချက်တွေကို အသုံးပြုပြီး အကောင်းဆုံးလိုက်ဖက်မှုလိုင်းတစ်ခုကို overlay လုပ်ကြည့်ရအောင်။\n", "\n", "ဒါဆိုရင်တော့ test set ကိုပြင်ဆင်ပြီး bake လုပ်ရမှာဖြစ်ပြီး၊ ပက်ကေ့ချ်ကောလံကို encode လုပ်ပြီးနောက် မော်ဒယ်ကပြုလုပ်ထားတဲ့ခန့်မှန်းချက်တွေနဲ့ bind လုပ်ရပါမယ်။\n" ], "metadata": { "id": "fdgjzjkBwfWt" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Encode package column\n", "package_encode <- lm_pumpkins_recipe %>% \n", " prep() %>% \n", " bake(new_data = pumpkins_test) %>% \n", " select(package)\n", "\n", "\n", "# Bind encoded package column to the results\n", "lm_results <- lm_results %>% \n", " bind_cols(package_encode %>% \n", " rename(package_integer = package)) %>% \n", " relocate(package_integer, .after = package)\n", "\n", "\n", "# Print new results data frame\n", "lm_results %>% \n", " slice_head(n = 5)\n", "\n", "\n", "# Make a scatter plot\n", "lm_results %>% \n", " ggplot(mapping = aes(x = package_integer, y = price)) +\n", " geom_point(size = 1.6) +\n", " # Overlay a line of best fit\n", " geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n", " xlab(\"package\")\n", " \n" ], "outputs": [], "metadata": { "id": "R0nw719lwkHE" } }, { "cell_type": "markdown", "source": [ "အေး! သင်မြင်နိုင်သလို၊ linear regression မော်ဒယ်က package နဲ့ အဆင့်ဆင့်ဆိုင်တဲ့ဈေးနှုန်းကြားက ဆက်စပ်မှုကို အလွန်ကောင်းစွာ generalize မလုပ်နိုင်ပါဘူး။\n", "\n", "🎃 ဂုဏ်ယူပါတယ်၊ သင်က မော်ဒယ်တစ်ခုကို ဖန်တီးပြီး ဖရဲသီးအမျိုးအစားအချို့ရဲ့ဈေးနှုန်းကိုခန့်မှန်းနိုင်ဖို့အကူအညီပေးနိုင်ပါပြီ။ သင်ရဲ့ပွဲတော်ဖရဲသီးခြံက လှပလွန်းမှာပါ။ ဒါပေမယ့် သင်ပိုကောင်းတဲ့မော်ဒယ်တစ်ခုကို ဖန်တီးနိုင်မယ်လို့ထင်ပါတယ်!\n", "\n", "## 5. Polynomial regression မော်ဒယ်တစ်ခုကို တည်ဆောက်ပါ\n", "\n", "

\n", " \n", "

Dasani Madipalli ရဲ့ Infographic
\n", "\n", "\n", "\n" ], "metadata": { "id": "HOCqJXLTwtWI" } }, { "cell_type": "markdown", "source": [ "တစ်ခါတစ်ရံ ကျွန်တော်တို့ရဲ့ ဒေတာတွေဟာ တိုက်ရိုက်ဆက်နွှယ်မှုမရှိပေမယ့်၊ ရလဒ်တစ်ခုကိုခန့်မှန်းချင်တယ်ဆိုရင် Polynomial regression က အကူအညီပေးနိုင်ပါတယ်။ ဒါဟာ ပိုမိုရှုပ်ထွေးတဲ့ မတိုက်ရိုက်ဆက်နွှယ်မှုများအတွက် ခန့်မှန်းချက်တွေကို ပိုမိုတိကျစွာလုပ်ဆောင်နိုင်စေပါတယ်။\n", "\n", "ဥပမာအားဖြင့် ကျွန်တော်တို့ရဲ့ ဖရုံသီးဒေတာအစုအတွက် package နဲ့ price အကြားရှိ ဆက်နွှယ်မှုကို ယူဆပါ။ တစ်ခါတစ်ရံမှာ variable တွေအကြား တိုက်ရိုက်ဆက်နွှယ်မှုရှိတတ်ပါတယ် - ဖရုံသီးရဲ့ အရွယ်အစား (volume) ကြီးလေ၊ ဈေးနှုန်းမြင့်တတ်တယ်။ ဒါပေမယ့် တစ်ခါတစ်ရံမှာတော့ ဒီဆက်နွှယ်မှုတွေကို တိကျတဲ့ လိုင်းတစ်ခု (plane or straight line) အနေနဲ့ ရှင်းပြလို့မရနိုင်ပါဘူး။\n", "\n", "> ✅ ဒီမှာ [အခြားဥပမာတွေ](https://online.stat.psu.edu/stat501/lesson/9/9.8) ရှိပါတယ်၊ ဒါတွေဟာ polynomial regression ကို အသုံးပြုနိုင်တဲ့ ဒေတာတွေဖြစ်ပါတယ်။\n", ">\n", "> ပြီးခဲ့တဲ့ scatterplot မှာ Variety နဲ့ Price အကြားရှိ ဆက်နွှယ်မှုကို ပြန်ကြည့်ပါ။ ဒီ scatterplot ဟာ တိုက်ရိုက်လိုင်းတစ်ခုနဲ့ ခွဲခြမ်းစိတ်ဖြာသင့်တယ်လို့ ထင်ရပါသလား။ မဟုတ်တတ်ပါဘူး။ ဒီလိုအခြေအနေမှာတော့ polynomial regression ကို စမ်းသုံးကြည့်နိုင်ပါတယ်။\n", ">\n", "> ✅ Polynomials ဆိုတာဟာ variable တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုများပြီး coefficient တွေပါဝင်တဲ့ သင်္ချာဆိုင်ရာ အဖွဲ့အစည်းတွေ ဖြစ်ပါတယ်။\n", "\n", "#### Training set ကို အသုံးပြုပြီး polynomial regression မော်ဒယ်တစ်ခုကို သင်ကြားပါ\n", "\n", "Polynomial regression က *ကွေးလိုင်း* တစ်ခုကို ဖန်တီးပြီး မတိုက်ရိုက်ဆက်နွှယ်မှုရှိတဲ့ ဒေတာတွေကို ပိုမိုတိကျစွာ ခွဲခြမ်းစိတ်ဖြာနိုင်စေပါတယ်။\n", "\n", "Polynomial မော်ဒယ်တစ်ခုက ခန့်မှန်းချက်တွေကို ပိုမိုကောင်းမွန်စွာ လုပ်ဆောင်နိုင်မလားဆိုတာ ကြည့်ကြရအောင်။ အရင်လုပ်ခဲ့သလို နည်းလမ်းတစ်ခုနဲ့ ဆက်လုပ်သွားမယ်။\n", "\n", "- ဒေတာကို မော်ဒယ်လုပ်ဖို့ အဆင်သင့်ဖြစ်အောင် ပြင်ဆင်ပေးမယ့် preprocessing လုပ်ငန်းစဉ်တွေကို ဖော်ပြထားတဲ့ recipe တစ်ခု ဖန်တီးပါ။ ဥပမာ - predictor တွေကို encode လုပ်ခြင်း၊ degree *n* ရဲ့ polynomial တွေကို တွက်ချက်ခြင်း စသဖြင့်။\n", "\n", "- မော်ဒယ် specification တစ်ခု တည်ဆောက်ပါ။\n", "\n", "- Recipe နဲ့ မော်ဒယ် specification ကို workflow တစ်ခုအဖြစ် ပေါင်းစည်းပါ။\n", "\n", "- Workflow ကို fit လုပ်ပြီး မော်ဒယ်တစ်ခု ဖန်တီးပါ။\n", "\n", "- Test data ပေါ်မှာ မော်ဒယ်ရဲ့ စွမ်းဆောင်ရည်ကို အကဲဖြတ်ပါ။\n", "\n", "အခုလိုလုပ်ဆောင်ကြည့်ရအောင်!\n" ], "metadata": { "id": "VcEIpRV9wzYr" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\r\n", "poly_pumpkins_recipe <-\r\n", " recipe(price ~ package, data = pumpkins_train) %>%\r\n", " step_integer(all_predictors(), zero_based = TRUE) %>% \r\n", " step_poly(all_predictors(), degree = 4)\r\n", "\r\n", "\r\n", "# Create a model specification\r\n", "poly_spec <- linear_reg() %>% \r\n", " set_engine(\"lm\") %>% \r\n", " set_mode(\"regression\")\r\n", "\r\n", "\r\n", "# Bundle recipe and model spec into a workflow\r\n", "poly_wf <- workflow() %>% \r\n", " add_recipe(poly_pumpkins_recipe) %>% \r\n", " add_model(poly_spec)\r\n", "\r\n", "\r\n", "# Create a model\r\n", "poly_wf_fit <- poly_wf %>% \r\n", " fit(data = pumpkins_train)\r\n", "\r\n", "\r\n", "# Print learned model coefficients\r\n", "poly_wf_fit\r\n", "\r\n", " " ], "outputs": [], "metadata": { "id": "63n_YyRXw3CC" } }, { "cell_type": "markdown", "source": [ "#### မော်ဒယ်စွမ်းဆောင်ရည်ကို အကဲဖြတ်ပါ\n", "\n", "👏👏 သင်တစ်ခုခုပုံစံမော်ဒယ်တည်ဆောက်ပြီးပြီ၊ အခုတော့ စမ်းသပ်မှုအစုအပေါ်မှာ ခန့်မှန်းချက်တွေပြုလုပ်ကြည့်ရအောင်!\n" ], "metadata": { "id": "-LHZtztSxDP0" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make price predictions on test data\r\n", "poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n", " bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n", " relocate(.pred, .after = last_col())\r\n", "\r\n", "\r\n", "# Print the results\r\n", "poly_results %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "YUFpQ_dKxJGx" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "qxdyj86bxNGZ" } }, { "cell_type": "code", "execution_count": null, "source": [ "metrics(data = poly_results, truth = price, estimate = .pred)" ], "outputs": [], "metadata": { "id": "8AW5ltkBxXDm" } }, { "cell_type": "markdown", "source": [ "🤩🤩 အလုပ်အရမ်းကောင်းတယ်။\n", "\n", "`rmse` က ၇ ခန့်ကနေ ၃ ခန့်အထိ လျှော့ကျသွားတယ်။ ဒါဟာ အမှန်တကယ်ဈေးနှင့် ခန့်မှန်းဈေးအကြား အမှားလျှော့ကျမှုကို ဖော်ပြနေပါတယ်။ ဒီကို *အနည်းငယ်* အဓိပ္ပာယ်ဖွင့်ဆိုရမယ်ဆိုရင်၊ ပျမ်းမျှအားဖြင့် မမှန်ကန်တဲ့ ခန့်မှန်းချက်တွေဟာ \\$၃ ခန့်လောက်မှားနေတယ်လို့ ဆိုနိုင်ပါတယ်။ `rsq` က ၀.၄ ခန့်ကနေ ၀.၈ အထိ တိုးလာတယ်။\n", "\n", "ဒီ metrics တွေအားလုံးက polynomial model ဟာ linear model ထက် အလုပ်ပိုကောင်းတယ်ဆိုတာကို ဖော်ပြနေပါတယ်။ အလုပ်ကောင်းတယ်!\n", "\n", "အခုတော့ ဒီကို ရုပ်ပုံနဲ့ ဖော်ပြနိုင်မလား ကြည့်ရအောင်!\n" ], "metadata": { "id": "6gLHNZDwxYaS" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Bind encoded package column to the results\r\n", "poly_results <- poly_results %>% \r\n", " bind_cols(package_encode %>% \r\n", " rename(package_integer = package)) %>% \r\n", " relocate(package_integer, .after = package)\r\n", "\r\n", "\r\n", "# Print new results data frame\r\n", "poly_results %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "\r\n", "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n", " xlab(\"package\")\r\n" ], "outputs": [], "metadata": { "id": "A83U16frxdF1" } }, { "cell_type": "markdown", "source": [ "သင့်ဒေတာကို ပိုမိုသင့်တော်စေတဲ့ အကွေးလိုင်းကို မြင်နိုင်ပါပြီ! 🤩\n", "\n", "ဒီလိုင်းကို ပိုမိုချောမွေ့စေဖို့ `geom_smooth` ကို ပေါလီနိုမီးယား ဖော်မြူလာတစ်ခုနဲ့အတူ အသုံးပြုနိုင်ပါတယ်၊ ဒီလို:\n" ], "metadata": { "id": "4U-7aHOVxlGU" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n", " xlab(\"package\")" ], "outputs": [], "metadata": { "id": "5vzNT0Uexm-w" } }, { "cell_type": "markdown", "source": [ "သိပ်ချောမောတဲ့ curves တစ်ခုလိုပဲ!🤩\n", "\n", "သင်အသစ်တစ်ခုကိုခန့်မှန်းဖို့အတွက် ဒီလိုလုပ်နိုင်ပါတယ်:\n" ], "metadata": { "id": "v9u-wwyLxq4G" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a hypothetical data frame\r\n", "hypo_tibble <- tibble(package = \"bushel baskets\")\r\n", "\r\n", "# Make predictions using linear model\r\n", "lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Make predictions using polynomial model\r\n", "poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Return predictions in a list\r\n", "list(\"linear model prediction\" = lm_pred, \r\n", " \"polynomial model prediction\" = poly_pred)\r\n" ], "outputs": [], "metadata": { "id": "jRPSyfQGxuQv" } }, { "cell_type": "markdown", "source": [ "`polynomial model` အနေနဲ့ `price` နဲ့ `package` ရဲ့ scatter plot တွေကိုကြည့်ပြီးတော့ ခန့်မှန်းချက်က make sense ဖြစ်ပါတယ်! အရင် model ထက်ပိုကောင်းတဲ့ model ဖြစ်တယ်ဆိုရင်တော့ ဒီ data တွေကိုကြည့်ပြီးတော့ ပိုဈေးကြီးတဲ့ pumpkin တွေအတွက် budget ထည့်သွင်းစဉ်းစားဖို့လိုပါတယ်။\n", "\n", "🏆 ကောင်းပါတယ်! ဒီ lesson မှာ regression model နှစ်ခုကို ဖန်တီးနိုင်ခဲ့ပါတယ်။ Regression ရဲ့ နောက်ဆုံးပိုင်းမှာ logistic regression ကိုလေ့လာပြီးတော့ category တွေကိုသတ်မှတ်ပုံကိုသင်ယူပါမယ်။\n", "\n", "## **🚀စိန်ခေါ်မှု**\n", "\n", "ဒီ notebook မှာ variable အမျိုးမျိုးကို စမ်းသပ်ပြီး correlation က model accuracy နဲ့ဘယ်လိုဆက်စပ်နေသလဲဆိုတာကိုကြည့်ပါ။\n", "\n", "## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n", "\n", "## **ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း**\n", "\n", "ဒီ lesson မှာ Linear Regression ကိုလေ့လာခဲ့ပါတယ်။ Regression ရဲ့ အရေးကြီးတဲ့အမျိုးအစားတွေရှိပါတယ်။ Stepwise, Ridge, Lasso နဲ့ Elasticnet techniques တွေကိုဖတ်ရှုပါ။ ပိုမိုလေ့လာချင်ရင် [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) ကိုလေ့လာပါ။\n", "\n", "Tidymodels framework ကိုအသုံးပြုပုံကိုပိုမိုလေ့လာချင်ရင် အောက်ပါ resources တွေကိုကြည့်ပါ:\n", "\n", "- Tidymodels website: [Get started with Tidymodels](https://www.tidymodels.org/start/)\n", "\n", "- Max Kuhn နဲ့ Julia Silge ရဲ့ [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n", "\n", "###### **ကျေးဇူးတင်စကားများ**\n", "\n", "[Allison Horst](https://twitter.com/allison_horst?lang=en) ကို R ကိုပိုပြီးရင်းနှီးစေတဲ့အလှဆင်ပုံတွေဖန်တီးပေးတဲ့အတွက် ကျေးဇူးတင်ပါတယ်။ သူမရဲ့ [gallery](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) မှာ ပိုမိုများစွာသောအလှဆင်ပုံတွေကိုရှာဖွေကြည့်နိုင်ပါတယ်။\n" ], "metadata": { "id": "8zOLOWqMxzk5" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n" ] } ] }