You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/cs/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

727 lines
28 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-04T08:50:44+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "cs"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Vytvořte klasifikační model: Lahodné asijské a indické kuchyně\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Úvod do klasifikace: Čištění, příprava a vizualizace dat\n",
"\n",
"V těchto čtyřech lekcích se zaměříme na základní téma klasického strojového učení - *klasifikaci*. Projdeme si použití různých klasifikačních algoritmů na datasetu o všech skvělých kuchyních Asie a Indie. Doufáme, že máte hlad!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Oslavte panasijské kuchyně v těchto lekcích! Obrázek od Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Oslavte panasijské kuchyně v těchto lekcích! Obrázek od Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klasifikace je forma [učeného učení](https://wikipedia.org/wiki/Supervised_learning), která má mnoho společného s regresními technikami. Při klasifikaci trénujete model, aby předpověděl, do které `kategorie` daná položka patří. Pokud je strojové učení o předpovídání hodnot nebo názvů věcí pomocí datasetů, pak klasifikace obecně spadá do dvou skupin: *binární klasifikace* a *vícetřídová klasifikace*.\n",
"\n",
"Pamatujte:\n",
"\n",
"- **Lineární regrese** vám pomohla předpovědět vztahy mezi proměnnými a provádět přesné předpovědi, kam nový datový bod spadne ve vztahu k této linii. Například jste mohli předpovědět číselné hodnoty, jako *jaká bude cena dýně v září oproti prosinci*.\n",
"\n",
"- **Logistická regrese** vám pomohla objevit \"binární kategorie\": při této cenové hladině, *je tato dýně oranžová nebo neoranžová*?\n",
"\n",
"Klasifikace využívá různé algoritmy k určení dalších způsobů, jak určit štítek nebo třídu datového bodu. Pojďme pracovat s těmito daty o kuchyních a zjistit, zda můžeme na základě skupiny ingrediencí určit původní kuchyni.\n",
"\n",
"### [**Kvíz před lekcí**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Úvod**\n",
"\n",
"Klasifikace je jednou ze základních činností výzkumníka strojového učení a datového vědce. Od základní klasifikace binární hodnoty (\"je tento e-mail spam nebo ne?\") až po složitou klasifikaci a segmentaci obrázků pomocí počítačového vidění, je vždy užitečné být schopen třídit data do tříd a klást jim otázky.\n",
"\n",
"Řečeno vědecky, vaše klasifikační metoda vytváří prediktivní model, který vám umožňuje mapovat vztah mezi vstupními proměnnými a výstupními proměnnými.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binární vs. vícetřídové problémy, které klasifikační algoritmy řeší. Infografika od Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Než začneme s procesem čištění našich dat, jejich vizualizací a přípravou na úkoly strojového učení, pojďme se trochu seznámit s různými způsoby, jak lze strojové učení využít ke klasifikaci dat.\n",
"\n",
"Odvozeno ze [statistiky](https://wikipedia.org/wiki/Statistical_classification), klasifikace pomocí klasického strojového učení využívá vlastnosti, jako jsou `kuřák`, `váha` a `věk`, k určení *pravděpodobnosti vývoje X nemoci*. Jako technika učeného učení podobná regresním cvičením, která jste prováděli dříve, jsou vaše data označena a algoritmy strojového učení používají tyto štítky k klasifikaci a předpovědi tříd (nebo 'vlastností') datasetu a jejich přiřazení ke skupině nebo výsledku.\n",
"\n",
"✅ Udělejte si chvíli a představte si dataset o kuchyních. Na co by mohl odpovědět vícetřídový model? Na co by mohl odpovědět binární model? Co kdybyste chtěli určit, zda daná kuchyně pravděpodobně používá pískavici? Co kdybyste chtěli zjistit, zda byste mohli z tašky s potravinami plné badyánu, artyčoků, květáku a křenu vytvořit typické indické jídlo?\n",
"\n",
"### **Ahoj 'klasifikátore'**\n",
"\n",
"Otázka, kterou chceme položit tomuto datasetu o kuchyních, je vlastně **vícetřídová otázka**, protože máme několik potenciálních národních kuchyní, se kterými můžeme pracovat. Na základě dávky ingrediencí, do které z těchto mnoha tříd budou data spadat?\n",
"\n",
"Tidymodels nabízí několik různých algoritmů pro klasifikaci dat, v závislosti na typu problému, který chcete řešit. V následujících dvou lekcích se naučíte o několika z těchto algoritmů.\n",
"\n",
"#### **Předpoklady**\n",
"\n",
"Pro tuto lekci budeme potřebovat následující balíčky pro čištění, přípravu a vizualizaci našich dat:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [kolekce balíčků pro R](https://www.tidyverse.org/packages), která dělá datovou vědu rychlejší, jednodušší a zábavnější!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je [rámec balíčků](https://www.tidymodels.org/packages/) pro modelování a strojové učení.\n",
"\n",
"- `DataExplorer`: [balíček DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) je určen k zjednodušení a automatizaci procesu EDA a generování reportů.\n",
"\n",
"- `themis`: [balíček themis](https://themis.tidymodels.org/) poskytuje další kroky pro práci s nevyváženými daty.\n",
"\n",
"Můžete je nainstalovat pomocí:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativně, skript níže zkontroluje, zda máte balíčky potřebné k dokončení tohoto modulu, a nainstaluje je za vás, pokud chybí.\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": [
"Později načteme tyto skvělé balíčky a zpřístupníme je v naší aktuální relaci R. (Toto je pouze pro ilustraci, `pacman::p_load()` to již za vás udělal)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Cvičení - vyčistěte a vyvažte svá data\n",
"\n",
"Prvním úkolem, než začnete s tímto projektem, je vyčistit a **vyvážit** svá data, abyste dosáhli lepších výsledků.\n",
"\n",
"Seznamme se s daty! 🕵️\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": [
"Zajímavé! Podle všeho je první sloupec jakýsi sloupec `id`. Zjistíme si trochu více informací o těchto datech.\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žitě vidět, že máme `2448` řádků a `385` sloupců a `0` chybějících hodnot. Máme také 1 diskrétní sloupec, *cuisine*.\n",
"\n",
"## Cvičení - poznávání kuchyní\n",
"\n",
"Teď začíná práce být zajímavější. Pojďme objevit rozložení dat podle jednotlivých kuchyní.\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 kuchyní, ale rozložení dat je nerovnoměrné. To můžete napravit! Než tak učiníte, prozkoumejte to trochu více.\n",
"\n",
"Dále přiřaďme každou kuchyni do jejího vlastního tibble a zjistěme, kolik dat je k dispozici (řádky, sloupce) pro jednotlivé kuchyně.\n",
"\n",
"> [Tibble](https://tibble.tidyverse.org/) je moderní datový rámec.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustrace 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čení - Objevování nejlepších ingrediencí podle kuchyně pomocí dplyr**\n",
"\n",
"Nyní se můžete ponořit hlouběji do dat a zjistit, jaké jsou typické ingredience pro jednotlivé kuchyně. Měli byste odstranit opakující se data, která vytvářejí zmatek mezi kuchyněmi, takže se podíváme na tento problém.\n",
"\n",
"Vytvořte funkci `create_ingredient()` v R, která vrátí dataframe s ingrediencemi. Tato funkce začne odstraněním nepotřebného sloupce a seřadí ingredience podle jejich počtu.\n",
"\n",
"Základní struktura funkce v R vypadá takto:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Přehledný úvod do funkcí v R najdete [zde](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Pojďme na to! Využijeme [dplyr sloves](https://dplyr.tidyverse.org/), které jsme se učili v předchozích lekcích. Pro připomenutí:\n",
"\n",
"- `dplyr::select()`: pomáhá vám vybrat, které **sloupce** chcete ponechat nebo vyloučit.\n",
"\n",
"- `dplyr::pivot_longer()`: pomáhá \"prodloužit\" data, zvýšit počet řádků a snížit počet sloupců.\n",
"\n",
"- `dplyr::group_by()` a `dplyr::summarise()`: pomáhá najít souhrnné statistiky pro různé skupiny a uspořádat je do přehledné tabulky.\n",
"\n",
"- `dplyr::filter()`: vytváří podmnožinu dat obsahující pouze řádky, které splňují vaše podmínky.\n",
"\n",
"- `dplyr::mutate()`: pomáhá vytvořit nebo upravit sloupce.\n",
"\n",
"Podívejte se na tento [*uměním* naplněný learnr tutoriál](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) od Allison Horst, který představuje některé užitečné funkce pro zpracování dat v dplyr *(součást 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": [
"Nyní můžeme použít funkci, abychom získali představu o deseti nejoblíbenějších ingrediencích podle kuchyně. Pojďme si to vyzkoušet 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 předchozí části jsme použili `geom_col()`, podívejme se, jak můžete použít také `geom_bar` k vytvoření sloupcových grafů. Použijte `?geom_bar` pro další čtení.\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": [
"Pojďme udělat totéž pro japonská data\n"
],
"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": [
"Co třeba čínská kuchyně?\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": [
"Nakonec vykreslete korejské ingredience.\n"
],
"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 datových vizualizací nyní můžeme vyřadit nejběžnější ingredience, které způsobují záměnu mezi různými kuchyněmi, pomocí `dplyr::select()`.\n",
"\n",
"Každý miluje rýži, česnek 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": [
"## Předzpracování dat pomocí receptů 👩‍🍳👨‍🍳 - Práce s nevyváženými daty ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustrace od @allison_horst</figcaption>\n",
"\n",
"Vzhledem k tomu, že tato lekce je o kuchyních, musíme dát `recepty` do kontextu.\n",
"\n",
"Tidymodels nabízí další šikovný balíček: `recipes` - balíček pro předzpracování dat.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Pojďme se znovu podívat na rozložení našich kuchyní.\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": [
"Jak vidíte, počet kuchyní je značně nerovnoměrně rozložen. Korejské kuchyně jsou téměř třikrát početnější než thajské kuchyně. Nevyvážená data často negativně ovlivňují výkon modelu. Představte si binární klasifikaci. Pokud většina vašich dat patří do jedné třídy, model strojového učení bude tuto třídu předpovídat častěji, jednoduše proto, že pro ni má více dat. Vyvážení dat odstraňuje jakoukoli nerovnováhu v datech. Mnoho modelů dosahuje nejlepšího výkonu, když je počet pozorování stejný, a proto mají tendenci mít problémy s nevyváženými daty.\n",
"\n",
"Existují dvě hlavní metody, jak pracovat s nevyváženými datovými sadami:\n",
"\n",
"- přidání pozorování do minoritní třídy: `Over-sampling`, například použití algoritmu SMOTE\n",
"\n",
"- odstranění pozorování z majoritní třídy: `Under-sampling`\n",
"\n",
"Nyní si ukážeme, jak pracovat s nevyváženými datovými sadami pomocí `receptu`. Recept si můžete představit jako plán, který popisuje, jaké kroky by měly být aplikovány na datovou sadu, aby byla připravena pro analýzu dat.\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": [
"Pojďme si rozebrat kroky předzpracování.\n",
"\n",
"- Volání `recipe()` s formulí říká receptu *role* proměnných pomocí dat `df_select` jako referenčního bodu. Například sloupec `cuisine` byl přiřazen roli `outcome`, zatímco ostatní sloupce byly přiřazeny roli `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) vytváří *specifikaci* kroku receptu, který synteticky generuje nové příklady minoritní třídy pomocí nejbližších sousedů těchto případů.\n",
"\n",
"Pokud bychom nyní chtěli vidět předzpracovaná data, museli bychom [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) a [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) náš recept.\n",
"\n",
"`prep()`: odhaduje potřebné parametry z trénovací sady, které mohou být později aplikovány na jiné datové sady.\n",
"\n",
"`bake()`: vezme připravený recept a aplikuje operace na jakoukoli datovou sadu.\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": [
"Pojďme nyní zkontrolovat rozložení našich kuchyní a porovnat je s nevyváženými daty.\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! Data jsou pěkně čistá, vyvážená a velmi chutná 😋!\n",
"\n",
"> Obvykle se recept používá jako předzpracovatel pro modelování, kde definuje, jaké kroky by měly být aplikovány na datovou sadu, aby byla připravena pro modelování. V takovém případě se obvykle používá `workflow()` (jak jsme již viděli v našich předchozích lekcích) místo ručního odhadu receptu.\n",
">\n",
"> Proto obvykle nemusíte používat **`prep()`** a **`bake()`** recepty, když používáte tidymodels, ale jsou to užitečné funkce, které můžete mít ve své sadě nástrojů pro ověření, že recepty fungují podle vašich očekávání, jako v našem případě.\n",
">\n",
"> Když použijete **`bake()`** na připravený recept s **`new_data = NULL`**, získáte zpět data, která jste poskytli při definování receptu, ale prošla kroky předzpracování.\n",
"\n",
"Teď si uložíme kopii těchto dat pro použití v budoucích lekcí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 soubor nyní najdete v kořenové složce dat.\n",
"\n",
"**🚀Výzva**\n",
"\n",
"Tento kurz obsahuje několik zajímavých datových sad. Projděte složky `data` a zjistěte, zda některé obsahují datové sady vhodné pro binární nebo vícetřídní klasifikaci. Jaké otázky byste si k této datové sadě položili?\n",
"\n",
"## [**Kvíz po přednášce**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Opakování & Samostudium**\n",
"\n",
"- Podívejte se na [balíček themis](https://github.com/tidymodels/themis). Jaké další techniky bychom mohli použít k řešení problémů s nevyváženými daty?\n",
"\n",
"- Referenční web [Tidy models](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham a G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### DĚKUJEME:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za vytvoření úžasných ilustrací, které činí R přívětivějším a poutavějším. Další ilustrace najdete v její [galerii](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 vytvoření původní verze tohoto modulu v Pythonu ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustrace od @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornění**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o co největší přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za závazný zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.\n"
]
}
]
}