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
27 KiB
721 lines
27 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-09-06T14:54:24+00:00",
|
|
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
|
|
"language_code": "sk"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "ItETB4tSFprR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Úvod do klasifikácie: Čistenie, príprava a vizualizácia dát\n",
|
|
"\n",
|
|
"V týchto štyroch lekciách sa zameriame na základný aspekt klasického strojového učenia - *klasifikáciu*. Prejdeme si používanie rôznych klasifikačných algoritmov na dátovom súbore o všetkých úžasných kuchyniach Ázie a Indie. Dúfame, že máte chuť na jedlo!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/pinch.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Oslávte panázijské kuchyne v týchto lekciách! Obrázok od Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!---->\n",
|
|
"\n",
|
|
"Klasifikácia je forma [supervised learning](https://wikipedia.org/wiki/Supervised_learning), ktorá má veľa spoločného s regresnými technikami. Pri klasifikácii trénujete model, aby predpovedal, do akej `kategórie` položka patrí. Ak je strojové učenie o predpovedaní hodnôt alebo názvov vecí pomocou dátových súborov, potom klasifikácia všeobecne spadá do dvoch skupín: *binárna klasifikácia* a *multiklasová klasifikácia*.\n",
|
|
"\n",
|
|
"Pamätajte:\n",
|
|
"\n",
|
|
"- **Lineárna regresia** vám pomohla predpovedať vzťahy medzi premennými a presne určiť, kde by nový dátový bod spadal vo vzťahu k tejto línii. Napríklad ste mohli predpovedať číselné hodnoty, ako *aká bude cena tekvice v septembri vs. decembri*.\n",
|
|
"\n",
|
|
"- **Logistická regresia** vám pomohla objaviť \"binárne kategórie\": pri tejto cenovej úrovni, *je táto tekvica oranžová alebo nie-oranžová*?\n",
|
|
"\n",
|
|
"Klasifikácia používa rôzne algoritmy na určenie ďalších spôsobov, ako priradiť dátovému bodu štítok alebo triedu. Poďme pracovať s týmito dátami o kuchyniach, aby sme zistili, či na základe skupiny ingrediencií dokážeme určiť jej pôvodnú kuchyňu.\n",
|
|
"\n",
|
|
"### [**Kvíz pred prednáškou**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
|
|
"\n",
|
|
"### **Úvod**\n",
|
|
"\n",
|
|
"Klasifikácia je jednou zo základných aktivít výskumníka strojového učenia a dátového vedca. Od základnej klasifikácie binárnej hodnoty (\"je tento e-mail spam alebo nie?\") až po komplexnú klasifikáciu a segmentáciu obrázkov pomocou počítačového videnia, je vždy užitočné vedieť triediť dáta do tried a klásť im otázky.\n",
|
|
"\n",
|
|
"Ak to vyjadríme vedeckejšie, vaša klasifikačná metóda vytvára prediktívny model, ktorý vám umožňuje mapovať vzťah medzi vstupnými premennými a výstupnými premennými.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/binary-multiclass.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Binárne vs. multiklasové problémy, ktoré klasifikačné algoritmy riešia. Infografika od Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Predtým, než začneme proces čistenia našich dát, ich vizualizácie a prípravy na úlohy strojového učenia, poďme sa naučiť niečo o rôznych spôsoboch, ako môže byť strojové učenie využité na klasifikáciu dát.\n",
|
|
"\n",
|
|
"Odvodené zo [štatistiky](https://wikipedia.org/wiki/Statistical_classification), klasifikácia pomocou klasického strojového učenia používa vlastnosti, ako `fajčiar`, `hmotnosť` a `vek`, na určenie *pravdepodobnosti vývoja X choroby*. Ako technika supervised learning podobná regresným cvičeniam, ktoré ste vykonávali skôr, vaše dáta sú označené a algoritmy strojového učenia používajú tieto označenia na klasifikáciu a predpovedanie tried (alebo 'vlastností') dátového súboru a ich priradenie do skupiny alebo výsledku.\n",
|
|
"\n",
|
|
"✅ Predstavte si na chvíľu dátový súbor o kuchyniach. Na čo by mohol odpovedať multiklasový model? Na čo by mohol odpovedať binárny model? Čo ak by ste chceli určiť, či daná kuchyňa pravdepodobne používa senovku grécku? Čo ak by ste chceli zistiť, či by ste na základe daru tašky s potravinami plnej badiánu, artičokov, karfiolu a chrenu mohli vytvoriť typické indické jedlo?\n",
|
|
"\n",
|
|
"### **Ahoj 'klasifikátor'**\n",
|
|
"\n",
|
|
"Otázka, ktorú chceme položiť tomuto dátovému súboru o kuchyniach, je vlastne **multiklasová otázka**, pretože máme niekoľko potenciálnych národných kuchýň, s ktorými môžeme pracovať. Na základe dávky ingrediencií, do ktorej z týchto mnohých tried budú dáta patriť?\n",
|
|
"\n",
|
|
"Tidymodels ponúka niekoľko rôznych algoritmov na klasifikáciu dát, v závislosti od typu problému, ktorý chcete vyriešiť. V nasledujúcich dvoch lekciách sa naučíte o niekoľkých z týchto algoritmov.\n",
|
|
"\n",
|
|
"#### **Predpoklad**\n",
|
|
"\n",
|
|
"Pre túto lekciu budeme potrebovať nasledujúce balíky na čistenie, prípravu a vizualizáciu našich dát:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [kolekcia balíkov pre R](https://www.tidyverse.org/packages), ktorá robí dátovú vedu rýchlejšou, jednoduchšou a zábavnejšou!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je rámec [kolekcie balíkov](https://www.tidymodels.org/packages/) na modelovanie a strojové učenie.\n",
|
|
"\n",
|
|
"- `DataExplorer`: Balík [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) je určený na zjednodušenie a automatizáciu procesu EDA a generovania správ.\n",
|
|
"\n",
|
|
"- `themis`: Balík [themis](https://themis.tidymodels.org/) poskytuje extra kroky receptov na riešenie nevyvážených dát.\n",
|
|
"\n",
|
|
"Môžete ich nainštalovať pomocou:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
|
|
"\n",
|
|
"Alternatívne, skript nižšie skontroluje, či máte balíky potrebné na dokončenie tohto modulu, a nainštaluje ich za vás, ak chýbajú.\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": [
|
|
"Neskôr načítame tieto úžasné balíky a sprístupníme ich v našej aktuálnej R relácii. (Toto je len na ilustráciu, `pacman::p_load()` to už za vás urobil)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YkKAxOJvGD4C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Cvičenie - vyčistite a vyvážte svoje dáta\n",
|
|
"\n",
|
|
"Prvým krokom pred začatím tohto projektu je vyčistiť a **vyvážiť** svoje dáta, aby ste dosiahli lepšie výsledky.\n",
|
|
"\n",
|
|
"Zoznámme sa s dátami! 🕵️\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": [
|
|
"Zaujímavé! Podľa vzhľadu to vyzerá, že prvý stĺpec je akýsi stĺpec `id`. Poďme získať trochu viac informácií o údajoch.\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": [
|
|
"Z výstupu môžeme okamžite vidieť, že máme `2448` riadkov a `385` stĺpcov a `0` chýbajúcich hodnôt. Máme tiež 1 diskrétny stĺpec, *cuisine*.\n",
|
|
"\n",
|
|
"## Cvičenie - učenie sa o kuchyniach\n",
|
|
"\n",
|
|
"Teraz sa práca začína stávať zaujímavejšou. Poďme objaviť rozdelenie údajov podľa kuchyne.\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": [
|
|
"Existuje konečný počet kuchýň, ale rozloženie údajov je nerovnomerné. Môžete to napraviť! Predtým však preskúmajte trochu viac.\n",
|
|
"\n",
|
|
"Ďalej priraďme každú kuchyňu do jej vlastného tibble a zistime, koľko údajov je k dispozícii (riadky, stĺpce) na jednu kuchyňu.\n",
|
|
"\n",
|
|
"> [Tibble](https://tibble.tidyverse.org/) je moderný dátový rámec.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/dplyr_filter.jpg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Ilustrácia od @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": [
|
|
"## **Cvičenie - Objavovanie hlavných ingrediencií podľa kuchyne pomocou dplyr**\n",
|
|
"\n",
|
|
"Teraz sa môžete hlbšie ponoriť do údajov a zistiť, aké sú typické ingrediencie pre jednotlivé kuchyne. Mali by ste odstrániť opakujúce sa údaje, ktoré spôsobujú zmätok medzi kuchyňami, takže sa poďme pozrieť na tento problém.\n",
|
|
"\n",
|
|
"Vytvorte funkciu `create_ingredient()` v R, ktorá vráti dataframe s ingredienciami. Táto funkcia začne odstránením nepotrebného stĺpca a zoradí ingrediencie podľa ich počtu.\n",
|
|
"\n",
|
|
"Základná štruktúra funkcie v R je:\n",
|
|
"\n",
|
|
"`myFunction <- function(arglist){`\n",
|
|
"\n",
|
|
"**`...`**\n",
|
|
"\n",
|
|
"**`return`**`(value)`\n",
|
|
"\n",
|
|
"`}`\n",
|
|
"\n",
|
|
"Úhľadný úvod do funkcií v R nájdete [tu](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
|
|
"\n",
|
|
"Poďme na to! Využijeme [dplyr slovesá](https://dplyr.tidyverse.org/), ktoré sme sa učili v predchádzajúcich lekciách. Na zopakovanie:\n",
|
|
"\n",
|
|
"- `dplyr::select()`: pomáha vám vybrať, ktoré **stĺpce** chcete ponechať alebo vylúčiť.\n",
|
|
"\n",
|
|
"- `dplyr::pivot_longer()`: pomáha \"predĺžiť\" údaje, čím sa zvýši počet riadkov a zníži počet stĺpcov.\n",
|
|
"\n",
|
|
"- `dplyr::group_by()` a `dplyr::summarise()`: pomáha nájsť štatistické súhrny pre rôzne skupiny a usporiadať ich do prehľadnej tabuľky.\n",
|
|
"\n",
|
|
"- `dplyr::filter()`: vytvára podmnožinu údajov obsahujúcu iba riadky, ktoré spĺňajú vaše podmienky.\n",
|
|
"\n",
|
|
"- `dplyr::mutate()`: pomáha vytvárať alebo upravovať stĺpce.\n",
|
|
"\n",
|
|
"Pozrite si tento [*umelecky* ladený learnr tutoriál](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) od Allison Horst, ktorý predstavuje niektoré užitočné funkcie na spracovanie údajov v dplyr *(súčasť 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": [
|
|
"Teraz môžeme použiť funkciu na získanie predstavy o desiatich najpopulárnejších ingredienciách podľa kuchyne. Poďme si to vyskúšať s `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": [
|
|
"V predchádzajúcej časti sme použili `geom_col()`, pozrime sa, ako môžete použiť aj `geom_bar` na vytvorenie stĺpcových grafov. Použite `?geom_bar` na ďalšie čítanie.\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": [
|
|
"Čo tak čínska kuchyňa?\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": [
|
|
"Z vizualizácií dát môžeme teraz vynechať najbežnejšie ingrediencie, ktoré spôsobujú zmätok medzi odlišnými kuchyňami, pomocou `dplyr::select()`.\n",
|
|
"\n",
|
|
"Každý miluje ryžu, cesnak a zázvor!\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": [
|
|
"## Predspracovanie údajov pomocou receptov 👩🍳👨🍳 - Riešenie nevyvážených údajov ⚖️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Ilustrácia od @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"Keďže táto lekcia je o kuchyniach, musíme dať `recepty` do kontextu.\n",
|
|
"\n",
|
|
"Tidymodels poskytuje ďalší šikovný balík: `recipes` - balík na predspracovanie údajov.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kkFd-JxdIaL6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Pozrime sa znova na rozdelenie našich kuchýň.\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": [
|
|
"Ako vidíte, počet kuchýň je dosť nerovnomerne rozdelený. Kórejské kuchyne sú takmer 3-krát početnejšie ako thajské kuchyne. Nevyvážené údaje často negatívne ovplyvňujú výkon modelu. Zamyslite sa nad binárnou klasifikáciou. Ak väčšina vašich údajov patrí do jednej triedy, model strojového učenia bude túto triedu predpovedať častejšie, jednoducho preto, že má k dispozícii viac údajov. Vyváženie údajov odstraňuje akúkoľvek skreslenosť a pomáha eliminovať túto nerovnováhu. Mnohé modely dosahujú najlepšie výsledky, keď je počet pozorovaní rovnaký, a preto majú tendenciu zápasiť s nevyváženými údajmi.\n",
|
|
"\n",
|
|
"Existujú dva hlavné spôsoby, ako sa vysporiadať s nevyváženými dátovými súbormi:\n",
|
|
"\n",
|
|
"- pridanie pozorovaní do minoritnej triedy: `Over-sampling`, napr. pomocou algoritmu SMOTE\n",
|
|
"\n",
|
|
"- odstránenie pozorovaní z majoritnej triedy: `Under-sampling`\n",
|
|
"\n",
|
|
"Teraz si ukážeme, ako pracovať s nevyváženými dátovými súbormi pomocou `receptu`. Recept si môžete predstaviť ako plán, ktorý popisuje, aké kroky by sa mali aplikovať na dátový súbor, aby bol pripravený na analýzu údajov.\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": [
|
|
"Poďme si rozobrať naše kroky predspracovania.\n",
|
|
"\n",
|
|
"- Volanie funkcie `recipe()` s formulou určuje *úlohy* premenných pomocou údajov `df_select` ako referencie. Napríklad stĺpec `cuisine` bol priradený úlohe `outcome`, zatiaľ čo ostatné stĺpce boli priradené úlohe `predictor`.\n",
|
|
"\n",
|
|
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) vytvára *špecifikáciu* kroku receptu, ktorý synteticky generuje nové príklady minoritnej triedy pomocou najbližších susedov týchto prípadov.\n",
|
|
"\n",
|
|
"Ak by sme teraz chceli vidieť predspracované údaje, museli by sme [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) a [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) náš recept.\n",
|
|
"\n",
|
|
"`prep()`: odhaduje potrebné parametre z tréningovej množiny, ktoré môžu byť neskôr aplikované na iné množiny údajov.\n",
|
|
"\n",
|
|
"`bake()`: vezme pripravený recept a aplikuje operácie na akúkoľvek množinu údajov.\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": [
|
|
"Poďme teraz skontrolovať rozdelenie našich kuchýň a porovnať ich s nevyváženými údajmi.\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": [
|
|
"Mňam! Dáta sú pekné, čisté, vyvážené a veľmi chutné 😋!\n",
|
|
"\n",
|
|
"> Zvyčajne sa recept používa ako predspracovateľ pre modelovanie, kde definuje, aké kroky by sa mali aplikovať na dátovú sadu, aby bola pripravená na modelovanie. V takom prípade sa typicky používa `workflow()` (ako sme už videli v našich predchádzajúcich lekciách) namiesto manuálneho odhadovania receptu.\n",
|
|
">\n",
|
|
"> Preto zvyčajne nepotrebujete **`prep()`** a **`bake()`** recepty, keď používate tidymodels, ale sú to užitočné funkcie, ktoré môžete mať vo svojej výbave na potvrdenie, že recepty robia to, čo očakávate, ako v našom prípade.\n",
|
|
">\n",
|
|
"> Keď **`bake()`** predspracovaný recept s **`new_data = NULL`**, dostanete späť dáta, ktoré ste poskytli pri definovaní receptu, ale už prešli krokmi predspracovania.\n",
|
|
"\n",
|
|
"Teraz si uložíme kópiu týchto dát na použitie v budúcich lekciách:\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": [
|
|
"Tento nový CSV súbor sa teraz nachádza v hlavnom priečinku s dátami.\n",
|
|
"\n",
|
|
"**🚀Výzva**\n",
|
|
"\n",
|
|
"Tento učebný plán obsahuje niekoľko zaujímavých datasetov. Prezrite si priečinky `data` a zistite, či niektoré obsahujú datasety vhodné na binárnu alebo viactriednu klasifikáciu. Aké otázky by ste mohli položiť tomuto datasetu?\n",
|
|
"\n",
|
|
"## [**Kvíz po prednáške**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
|
|
"\n",
|
|
"## **Prehľad a samostatné štúdium**\n",
|
|
"\n",
|
|
"- Pozrite si [balík themis](https://github.com/tidymodels/themis). Aké ďalšie techniky by sme mohli použiť na riešenie nevyvážených dát?\n",
|
|
"\n",
|
|
"- Referenčná stránka [Tidy models](https://www.tidymodels.org/start/).\n",
|
|
"\n",
|
|
"- H. Wickham a G. Grolemund, [*R for Data Science: Vizualizácia, modelovanie, transformácia, úprava a import dát*](https://r4ds.had.co.nz/).\n",
|
|
"\n",
|
|
"#### ĎAKUJEME:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) za vytvorenie úžasných ilustrácií, ktoré robia R prístupnejším a zábavnejším. Viac ilustrácií nájdete v jej [galérii](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) a [Jen Looper](https://www.twitter.com/jenlooper) za vytvorenie pôvodnej verzie tohto modulu v Pythone ♥️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Ilustrácia od @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WQs5621pMGwf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
|
|
]
|
|
}
|
|
]
|
|
} |