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.
721 lines
29 KiB
721 lines
29 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_10-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": []
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
|
|
"translation_date": "2025-08-29T15:34:53+00:00",
|
|
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
|
|
"language_code": "tl"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "ItETB4tSFprR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Panimula sa klasipikasyon: Linisin, ihanda, at i-visualize ang iyong data\n",
|
|
"\n",
|
|
"Sa apat na araling ito, susuriin mo ang isang mahalagang aspeto ng klasikong machine learning - *klasipikasyon*. Tatalakayin natin ang paggamit ng iba't ibang klasipikasyon na algorithm gamit ang isang dataset tungkol sa mga kahanga-hangang lutuin ng Asya at India. Sana ay gutom ka na!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/pinch.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Ipinagdiriwang ang mga pan-Asian na lutuin sa mga araling ito! Larawan ni Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!---->\n",
|
|
"\n",
|
|
"Ang klasipikasyon ay isang uri ng [supervised learning](https://wikipedia.org/wiki/Supervised_learning) na may maraming pagkakatulad sa mga regression techniques. Sa klasipikasyon, sinasanay mo ang isang modelo upang hulaan kung saang `kategorya` kabilang ang isang item. Kung ang machine learning ay tungkol sa paghula ng mga halaga o pangalan ng mga bagay gamit ang mga dataset, ang klasipikasyon ay karaniwang nahahati sa dalawang grupo: *binary classification* at *multiclass classification*.\n",
|
|
"\n",
|
|
"Tandaan:\n",
|
|
"\n",
|
|
"- **Linear regression** ay tumulong sa iyo na hulaan ang relasyon sa pagitan ng mga variable at gumawa ng tumpak na prediksyon kung saan mahuhulog ang isang bagong datapoint kaugnay ng linya. Halimbawa, maaari kang maghulaan ng numerong halaga tulad ng *ano ang presyo ng kalabasa sa Setyembre kumpara sa Disyembre*.\n",
|
|
"\n",
|
|
"- **Logistic regression** ay tumulong sa iyo na matuklasan ang \"binary categories\": sa presyong ito, *ang kalabasa ba ay orange o hindi-orange*?\n",
|
|
"\n",
|
|
"Ang klasipikasyon ay gumagamit ng iba't ibang algorithm upang matukoy ang iba pang paraan ng pagtukoy sa label o klase ng isang datapoint. Gamitin natin ang data ng lutuin upang makita kung, sa pamamagitan ng pagmamasid sa isang grupo ng mga sangkap, maaari nating matukoy ang pinagmulan ng lutuin.\n",
|
|
"\n",
|
|
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
|
|
"\n",
|
|
"### **Panimula**\n",
|
|
"\n",
|
|
"Ang klasipikasyon ay isa sa mga pangunahing gawain ng mananaliksik ng machine learning at data scientist. Mula sa simpleng klasipikasyon ng isang binary value (\"spam ba ang email na ito o hindi?\"), hanggang sa masalimuot na klasipikasyon ng imahe at segmentation gamit ang computer vision, palaging kapaki-pakinabang na maayos ang data sa mga klase at magtanong tungkol dito.\n",
|
|
"\n",
|
|
"Upang ipahayag ang proseso sa mas siyentipikong paraan, ang iyong klasipikasyon na pamamaraan ay lumilikha ng isang predictive model na nagbibigay-daan sa iyo upang i-map ang relasyon sa pagitan ng mga input variable sa mga output variable.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/binary-multiclass.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Binary vs. multiclass na mga problema para sa mga klasipikasyon na algorithm. Infographic ni Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Bago simulan ang proseso ng paglilinis ng ating data, pag-visualize nito, at paghahanda para sa ating mga ML na gawain, alamin muna natin ang iba't ibang paraan kung paano magagamit ang machine learning upang i-klasipika ang data.\n",
|
|
"\n",
|
|
"Hango mula sa [statistics](https://wikipedia.org/wiki/Statistical_classification), ang klasipikasyon gamit ang klasikong machine learning ay gumagamit ng mga features, tulad ng `smoker`, `weight`, at `age` upang matukoy ang *pagkakataon ng pagkakaroon ng X na sakit*. Bilang isang supervised learning technique na katulad ng mga regression exercises na ginawa mo dati, ang iyong data ay may label at ang mga ML algorithm ay gumagamit ng mga label na iyon upang i-klasipika at hulaan ang mga klase (o 'features') ng isang dataset at i-assign ang mga ito sa isang grupo o resulta.\n",
|
|
"\n",
|
|
"✅ Maglaan ng sandali upang mag-isip ng isang dataset tungkol sa mga lutuin. Ano ang maaaring masagot ng isang multiclass na modelo? Ano ang maaaring masagot ng isang binary na modelo? Paano kung gusto mong matukoy kung ang isang partikular na lutuin ay malamang na gumamit ng fenugreek? Paano kung gusto mong makita kung, sa isang grocery bag na puno ng star anise, artichokes, cauliflower, at horseradish, maaari kang gumawa ng isang tipikal na Indian dish?\n",
|
|
"\n",
|
|
"### **Hello 'classifier'**\n",
|
|
"\n",
|
|
"Ang tanong na nais nating itanong sa dataset ng lutuin ay talagang isang **multiclass na tanong**, dahil mayroon tayong ilang potensyal na pambansang lutuin na maaaring pagpilian. Sa isang batch ng mga sangkap, alin sa mga klase na ito ang babagay sa data?\n",
|
|
"\n",
|
|
"Ang Tidymodels ay nag-aalok ng iba't ibang algorithm na maaaring gamitin upang i-klasipika ang data, depende sa uri ng problemang nais mong lutasin. Sa susunod na dalawang aralin, matututo ka tungkol sa ilan sa mga algorithm na ito.\n",
|
|
"\n",
|
|
"#### **Paunang Kailangan**\n",
|
|
"\n",
|
|
"Para sa araling ito, kakailanganin natin ang mga sumusunod na package upang linisin, ihanda, at i-visualize ang ating data:\n",
|
|
"\n",
|
|
"- `tidyverse`: Ang [tidyverse](https://www.tidyverse.org/) ay isang [koleksyon ng mga R package](https://www.tidyverse.org/packages) na idinisenyo upang gawing mas mabilis, mas madali, at mas masaya ang data science!\n",
|
|
"\n",
|
|
"- `tidymodels`: Ang [tidymodels](https://www.tidymodels.org/) framework ay isang [koleksyon ng mga package](https://www.tidymodels.org/packages/) para sa modeling at machine learning.\n",
|
|
"\n",
|
|
"- `DataExplorer`: Ang [DataExplorer package](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) ay nilikha upang gawing mas simple at awtomatiko ang proseso ng EDA at pagbuo ng ulat.\n",
|
|
"\n",
|
|
"- `themis`: Ang [themis package](https://themis.tidymodels.org/) ay nagbibigay ng Extra Recipes Steps para sa pagharap sa hindi balanseng data.\n",
|
|
"\n",
|
|
"Maaari mo silang i-install gamit ang:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
|
|
"\n",
|
|
"Bilang alternatibo, ang script sa ibaba ay nagche-check kung mayroon ka ng mga package na kinakailangan upang makumpleto ang module na ito at ini-install ang mga ito para sa iyo kung sakaling kulang.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "ri5bQxZ-Fz_0"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
|
|
"\r\n",
|
|
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "KIPxa4elGAPI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ila-load natin ang mga kahanga-hangang package na ito at gagawing available sa kasalukuyang R session natin. (Ito ay para lamang sa ilustrasyon, `pacman::p_load()` ay ginawa na iyon para sa iyo)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YkKAxOJvGD4C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Ehersisyo - linisin at balansehin ang iyong data\n",
|
|
"\n",
|
|
"Ang unang gawain bago simulan ang proyektong ito ay linisin at **balansehin** ang iyong data upang makakuha ng mas magagandang resulta.\n",
|
|
"\n",
|
|
"Kilalanin natin ang data! 🕵️\n"
|
|
],
|
|
"metadata": {
|
|
"id": "PFkQDlk0GN5O"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Import data\r\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
|
|
"\r\n",
|
|
"# View the first 5 rows\r\n",
|
|
"df %>% \r\n",
|
|
" slice_head(n = 5)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "Qccw7okxGT0S"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kawili-wili! Sa tingin ko, ang unang kolum ay isang uri ng `id` na kolum. Alamin natin ang kaunting impormasyon tungkol sa datos.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "XrWnlgSrGVmR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Basic information about the data\r\n",
|
|
"df %>%\r\n",
|
|
" introduce()\r\n",
|
|
"\r\n",
|
|
"# Visualize basic information above\r\n",
|
|
"df %>% \r\n",
|
|
" plot_intro(ggtheme = theme_light())"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "4UcGmxRxGieA"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Mula sa output, makikita natin agad na mayroon tayong `2448` na mga hilera at `385` na mga kolum at `0` na nawawalang halaga. Mayroon din tayong 1 discrete na kolum, *cuisine*.\n",
|
|
"\n",
|
|
"## Ehersisyo - pag-aaral tungkol sa mga cuisine\n",
|
|
"\n",
|
|
"Ngayon, nagsisimula nang maging mas kawili-wili ang trabaho. Tuklasin natin ang distribusyon ng datos, bawat cuisine.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "AaPubl__GmH5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Count observations per cuisine\r\n",
|
|
"df %>% \r\n",
|
|
" count(cuisine) %>% \r\n",
|
|
" arrange(n)\r\n",
|
|
"\r\n",
|
|
"# Plot the distribution\r\n",
|
|
"theme_set(theme_light())\r\n",
|
|
"df %>% \r\n",
|
|
" count(cuisine) %>% \r\n",
|
|
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
|
|
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
|
|
" ylab(\"cuisine\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "FRsBVy5eGrrv"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"May tiyak na bilang ng mga lutuin, ngunit hindi pantay ang distribusyon ng datos. Maaari mo itong ayusin! Bago gawin iyon, mag-explore muna nang kaunti.\n",
|
|
"\n",
|
|
"Susunod, i-assign natin ang bawat lutuin sa kani-kanilang tibble at alamin kung gaano karaming datos ang mayroon (mga row, mga column) bawat lutuin.\n",
|
|
"\n",
|
|
"> Ang [tibble](https://tibble.tidyverse.org/) ay isang modernong data frame.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/dplyr_filter.jpg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Likha ni @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "vVvyDb1kG2in"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Create individual tibble for the cuisines\r\n",
|
|
"thai_df <- df %>% \r\n",
|
|
" filter(cuisine == \"thai\")\r\n",
|
|
"japanese_df <- df %>% \r\n",
|
|
" filter(cuisine == \"japanese\")\r\n",
|
|
"chinese_df <- df %>% \r\n",
|
|
" filter(cuisine == \"chinese\")\r\n",
|
|
"indian_df <- df %>% \r\n",
|
|
" filter(cuisine == \"indian\")\r\n",
|
|
"korean_df <- df %>% \r\n",
|
|
" filter(cuisine == \"korean\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Find out how much data is available per cuisine\r\n",
|
|
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
|
|
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
|
|
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
|
|
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
|
|
" \"korean_df:\", dim(korean_df))"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "0TvXUxD3G8Bk"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **Ehersisyo - Tuklasin ang mga pangunahing sangkap ayon sa lutuin gamit ang dplyr**\n",
|
|
"\n",
|
|
"Ngayon, maaari mong masusing pag-aralan ang datos at alamin kung ano ang mga karaniwang sangkap sa bawat lutuin. Dapat mong linisin ang paulit-ulit na datos na nagdudulot ng kalituhan sa pagitan ng mga lutuin, kaya't alamin natin ang problemang ito.\n",
|
|
"\n",
|
|
"Gumawa ng function na `create_ingredient()` sa R na magbabalik ng isang ingredient dataframe. Ang function na ito ay magsisimula sa pagtanggal ng isang hindi kapaki-pakinabang na column at mag-aayos ng mga sangkap batay sa kanilang bilang.\n",
|
|
"\n",
|
|
"Ang pangunahing istruktura ng isang function sa R ay:\n",
|
|
"\n",
|
|
"`myFunction <- function(arglist){`\n",
|
|
"\n",
|
|
"**`...`**\n",
|
|
"\n",
|
|
"**`return`**`(value)`\n",
|
|
"\n",
|
|
"`}`\n",
|
|
"\n",
|
|
"Isang maayos na pagpapakilala sa mga function sa R ay matatagpuan [dito](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
|
|
"\n",
|
|
"Simulan na natin! Gagamit tayo ng [mga dplyr verbs](https://dplyr.tidyverse.org/) na natutunan natin sa mga nakaraang aralin. Bilang paalala:\n",
|
|
"\n",
|
|
"- `dplyr::select()`: tumutulong sa pagpili kung aling **mga column** ang itatago o aalisin.\n",
|
|
"\n",
|
|
"- `dplyr::pivot_longer()`: tumutulong sa \"pagpapahaba\" ng datos, pinapataas ang bilang ng mga row at binabawasan ang bilang ng mga column.\n",
|
|
"\n",
|
|
"- `dplyr::group_by()` at `dplyr::summarise()`: tumutulong sa paghanap ng mga summary statistics para sa iba't ibang grupo, at inilalagay ito sa isang maayos na talahanayan.\n",
|
|
"\n",
|
|
"- `dplyr::filter()`: lumilikha ng subset ng datos na naglalaman lamang ng mga row na tumutugon sa iyong mga kondisyon.\n",
|
|
"\n",
|
|
"- `dplyr::mutate()`: tumutulong sa paglikha o pagbabago ng mga column.\n",
|
|
"\n",
|
|
"Tingnan ang [*art*-filled learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) ni Allison Horst, na nagpapakilala ng ilang kapaki-pakinabang na data wrangling functions sa dplyr *(bahagi ng Tidyverse)*.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "K3RF5bSCHC76"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Creates a functions that returns the top ingredients by class\r\n",
|
|
"\r\n",
|
|
"create_ingredient <- function(df){\r\n",
|
|
" \r\n",
|
|
" # Drop the id column which is the first colum\r\n",
|
|
" ingredient_df = df %>% select(-1) %>% \r\n",
|
|
" # Transpose data to a long format\r\n",
|
|
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
|
|
" # Find the top most ingredients for a particular cuisine\r\n",
|
|
" group_by(ingredients) %>% \r\n",
|
|
" summarise(n_instances = sum(count)) %>% \r\n",
|
|
" filter(n_instances != 0) %>% \r\n",
|
|
" # Arrange by descending order\r\n",
|
|
" arrange(desc(n_instances)) %>% \r\n",
|
|
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
|
|
" \r\n",
|
|
" \r\n",
|
|
" return(ingredient_df)\r\n",
|
|
"} # End of function"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "uB_0JR82HTPa"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ngayon, magagamit natin ang function para makakuha ng ideya sa sampung pinakapopular na sangkap ayon sa lutuin. Subukan natin ito gamit ang `thai_df`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "h9794WF8HWmc"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Call create_ingredient and display popular ingredients\r\n",
|
|
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
|
|
"\r\n",
|
|
"thai_ingredient_df %>% \r\n",
|
|
" slice_head(n = 10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "agQ-1HrcHaEA"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sa nakaraang bahagi, gumamit tayo ng `geom_col()`, tingnan natin kung paano mo rin magagamit ang `geom_bar` upang gumawa ng mga bar chart. Gamitin ang `?geom_bar` para sa karagdagang pagbabasa.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kHu9ffGjHdcX"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make a bar chart for popular thai cuisines\r\n",
|
|
"thai_ingredient_df %>% \r\n",
|
|
" slice_head(n = 10) %>% \r\n",
|
|
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
|
|
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
|
|
" xlab(\"\") + ylab(\"\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "fb3Bx_3DHj6e"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "RHP_xgdkHnvM"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
|
|
"create_ingredient(df = japanese_df) %>% \r\n",
|
|
" slice_head(n = 10) %>%\r\n",
|
|
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
|
|
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
|
|
" xlab(\"\") + ylab(\"\")\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "019v8F0XHrRU"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Paano naman ang mga pagkaing Tsino?\n"
|
|
],
|
|
"metadata": {
|
|
"id": "iIGM7vO8Hu3v"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
|
|
"create_ingredient(df = chinese_df) %>% \r\n",
|
|
" slice_head(n = 10) %>%\r\n",
|
|
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
|
|
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
|
|
" xlab(\"\") + ylab(\"\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "lHd9_gd2HyzU"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "ir8qyQbNH1c7"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
|
|
"create_ingredient(df = indian_df) %>% \r\n",
|
|
" slice_head(n = 10) %>%\r\n",
|
|
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
|
|
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
|
|
" xlab(\"\") + ylab(\"\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "ApukQtKjH5FO"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "qv30cwY1H-FM"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
|
|
"create_ingredient(df = korean_df) %>% \r\n",
|
|
" slice_head(n = 10) %>%\r\n",
|
|
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
|
|
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
|
|
" xlab(\"\") + ylab(\"\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "lumgk9cHIBie"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Mula sa mga data visualizations, maaari na nating alisin ang mga pinakakaraniwang sangkap na nagdudulot ng kalituhan sa pagitan ng magkakaibang lutuin, gamit ang `dplyr::select()`.\n",
|
|
"\n",
|
|
"Sino ba naman ang hindi mahilig sa kanin, bawang, at luya!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "iO4veMXuIEta"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
|
|
"df_select <- df %>% \r\n",
|
|
" select(-c(1, rice, garlic, ginger))\r\n",
|
|
"\r\n",
|
|
"# Display new data set\r\n",
|
|
"df_select %>% \r\n",
|
|
" slice_head(n = 5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "iHJPiG6rIUcK"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Pagproseso ng datos gamit ang recipes 👩🍳👨🍳 - Pagtugon sa hindi balanseng datos ⚖️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Likha ni @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"Dahil ang araling ito ay tungkol sa mga lutuin, kailangan nating ilagay ang `recipes` sa tamang konteksto.\n",
|
|
"\n",
|
|
"Ang Tidymodels ay nagbibigay ng isa pang kapaki-pakinabang na package: `recipes` - isang package para sa pagproseso ng datos.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kkFd-JxdIaL6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Tingnan natin muli ang distribusyon ng ating mga lutuin.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "6l2ubtTPJAhY"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Distribution of cuisines\r\n",
|
|
"old_label_count <- df_select %>% \r\n",
|
|
" count(cuisine) %>% \r\n",
|
|
" arrange(desc(n))\r\n",
|
|
"\r\n",
|
|
"old_label_count"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "1e-E9cb7JDVi"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Tulad ng nakikita mo, hindi pantay ang distribusyon ng bilang ng mga lutuin. Halos tatlong beses ang dami ng mga lutuing Koreano kumpara sa mga lutuing Thai. Ang hindi balanseng datos ay madalas na may negatibong epekto sa performance ng modelo. Isipin ang isang binary classification. Kung karamihan sa iyong datos ay mula sa isang klase, mas madalas na mahuhulaan ng isang ML model ang klaseng iyon, dahil lamang mas marami itong datos. Ang pagbabalanse ng datos ay tumutulong na alisin ang ganitong hindi pagkakapantay. Maraming modelo ang mas mahusay ang performance kapag pantay ang bilang ng mga obserbasyon, kaya't nahihirapan ang mga ito kapag hindi balansado ang datos.\n",
|
|
"\n",
|
|
"Mayroong dalawang pangunahing paraan upang harapin ang hindi balanseng mga data set:\n",
|
|
"\n",
|
|
"- magdagdag ng mga obserbasyon sa minority class: `Over-sampling` halimbawa gamit ang SMOTE algorithm\n",
|
|
"\n",
|
|
"- magtanggal ng mga obserbasyon mula sa majority class: `Under-sampling`\n",
|
|
"\n",
|
|
"Ngayon, ipapakita natin kung paano harapin ang hindi balanseng mga data set gamit ang isang `recipe`. Ang isang recipe ay maituturing na isang blueprint na naglalarawan kung anong mga hakbang ang dapat isagawa sa isang data set upang maihanda ito para sa pagsusuri ng datos.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "soAw6826JKx9"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load themis package for dealing with imbalanced data\r\n",
|
|
"library(themis)\r\n",
|
|
"\r\n",
|
|
"# Create a recipe for preprocessing data\r\n",
|
|
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
|
|
" step_smote(cuisine)\r\n",
|
|
"\r\n",
|
|
"cuisines_recipe"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "HS41brUIJVJy"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Tingnan natin ang mga hakbang sa preprocessing.\n",
|
|
"\n",
|
|
"- Ang tawag sa `recipe()` gamit ang isang formula ay nagsasabi sa recipe ng *mga papel* ng mga variable gamit ang `df_select` na data bilang reference. Halimbawa, ang kolum na `cuisine` ay naitalaga bilang isang `outcome` na papel habang ang iba pang mga kolum ay naitalaga bilang mga `predictor`.\n",
|
|
"\n",
|
|
"- Ang [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) ay lumilikha ng isang *specification* ng isang recipe step na artipisyal na bumubuo ng mga bagong halimbawa ng minority class gamit ang mga pinakamalapit na kapitbahay ng mga kasong ito.\n",
|
|
"\n",
|
|
"Ngayon, kung nais nating makita ang na-preprocess na data, kailangan nating [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) at [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) ang ating recipe.\n",
|
|
"\n",
|
|
"`prep()`: tinatantiya ang mga kinakailangang parameter mula sa isang training set na maaaring i-apply sa iba pang mga data set.\n",
|
|
"\n",
|
|
"`bake()`: kinukuha ang isang prepped recipe at ina-apply ang mga operasyon sa anumang data set.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "Yb-7t7XcJaC8"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Prep and bake the recipe\r\n",
|
|
"preprocessed_df <- cuisines_recipe %>% \r\n",
|
|
" prep() %>% \r\n",
|
|
" bake(new_data = NULL) %>% \r\n",
|
|
" relocate(cuisine)\r\n",
|
|
"\r\n",
|
|
"# Display data\r\n",
|
|
"preprocessed_df %>% \r\n",
|
|
" slice_head(n = 5)\r\n",
|
|
"\r\n",
|
|
"# Quick summary stats\r\n",
|
|
"preprocessed_df %>% \r\n",
|
|
" introduce()"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "9QhSgdpxJl44"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Tingnan natin ngayon ang distribusyon ng ating mga lutuin at ihambing ang mga ito sa hindi balanseng datos.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "dmidELh_LdV7"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Distribution of cuisines\r\n",
|
|
"new_label_count <- preprocessed_df %>% \r\n",
|
|
" count(cuisine) %>% \r\n",
|
|
" arrange(desc(n))\r\n",
|
|
"\r\n",
|
|
"list(new_label_count = new_label_count,\r\n",
|
|
" old_label_count = old_label_count)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "aSh23klBLwDz"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Yum! Ang datos ay malinis, balanse, at napakasarap 😋!\n",
|
|
"\n",
|
|
"> Karaniwan, ang isang recipe ay ginagamit bilang isang preprocessor para sa pagmomodelo kung saan tinutukoy nito kung anong mga hakbang ang dapat gawin sa isang data set upang maihanda ito para sa pagmomodelo. Sa ganitong kaso, ang `workflow()` ay karaniwang ginagamit (tulad ng nakita na natin sa mga nakaraang aralin) sa halip na manu-manong i-estimate ang isang recipe.\n",
|
|
">\n",
|
|
"> Dahil dito, hindi mo karaniwang kailangang gamitin ang **`prep()`** at **`bake()`** sa mga recipe kapag gumagamit ka ng tidymodels, ngunit ito ay mga kapaki-pakinabang na function na maaaring idagdag sa iyong toolkit upang tiyakin na ang mga recipe ay gumagana ayon sa iyong inaasahan, tulad ng sa ating halimbawa.\n",
|
|
">\n",
|
|
"> Kapag ginamit mo ang **`bake()`** sa isang prepped na recipe gamit ang **`new_data = NULL`**, makukuha mo ang datos na ibinigay mo noong dinefine ang recipe, ngunit dumaan na ito sa mga preprocessing na hakbang.\n",
|
|
"\n",
|
|
"Ngayon, mag-save tayo ng kopya ng datos na ito para magamit sa mga susunod na aralin:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "HEu80HZ8L7ae"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Save preprocessed data\r\n",
|
|
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "cBmCbIgrMOI6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Ang bagong CSV na ito ay matatagpuan na ngayon sa root data folder.\n",
|
|
"\n",
|
|
"**🚀Hamunin**\n",
|
|
"\n",
|
|
"Ang kurikulum na ito ay naglalaman ng ilang kawili-wiling datasets. Suriin ang mga `data` folders at tingnan kung mayroong mga datasets na angkop para sa binary o multi-class classification. Anong mga tanong ang maaari mong itanong sa dataset na ito?\n",
|
|
"\n",
|
|
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
|
|
"\n",
|
|
"## **Review at Pag-aaral ng Sarili**\n",
|
|
"\n",
|
|
"- Tingnan ang [package themis](https://github.com/tidymodels/themis). Anong iba pang mga teknik ang maaari nating gamitin upang harapin ang hindi balanseng data?\n",
|
|
"\n",
|
|
"- Tidy models [reference website](https://www.tidymodels.org/start/).\n",
|
|
"\n",
|
|
"- H. Wickham at G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
|
|
"\n",
|
|
"#### PASASALAMAT SA:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) para sa paglikha ng mga kamangha-manghang ilustrasyon na ginagawang mas welcoming at engaging ang R. Hanapin ang higit pang mga ilustrasyon sa kanyang [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) at [Jen Looper](https://www.twitter.com/jenlooper) para sa paglikha ng orihinal na Python na bersyon ng module na ito ♥️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Artwork ni @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WQs5621pMGwf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\n"
|
|
]
|
|
}
|
|
]
|
|
} |