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/bg/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

727 lines
37 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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:49:23+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "bg"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Създайте модел за класификация: Вкусни азиатски и индийски ястия\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Въведение в класификацията: Почистете, подгответе и визуализирайте данните си\n",
"\n",
"В тези четири урока ще разгледате основен аспект на класическото машинно обучение - *класификация*. Ще преминем през използването на различни алгоритми за класификация с набор от данни за всички невероятни кухни на Азия и Индия. Надявам се, че сте гладни!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Празнувайте паназиатските кухни в тези уроци! Изображение от Джен Лупър</figcaption>\n",
"\n",
"\n",
"<!--![Празнувайте паназиатските кухни в тези уроци! Изображение от Джен Лупър](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Класификацията е форма на [контролирано обучение](https://wikipedia.org/wiki/Supervised_learning), която има много общо с техниките за регресия. При класификацията обучавате модел, за да предскаже към коя `категория` принадлежи даден елемент. Ако машинното обучение е свързано с предсказване на стойности или имена на неща чрез използване на набори от данни, тогава класификацията обикновено се разделя на две групи: *бинарна класификация* и *многокласова класификация*.\n",
"\n",
"Запомнете:\n",
"\n",
"- **Линейната регресия** ви помогна да предскажете връзките между променливите и да направите точни прогнози за това къде нова точка от данни би попаднала спрямо тази линия. Например, можете да предскажете числови стойности като *каква би била цената на тиква през септември спрямо декември*.\n",
"\n",
"- **Логистичната регресия** ви помогна да откриете \"бинарни категории\": при тази ценова точка, *оранжева ли е тиквата или не*?\n",
"\n",
"Класификацията използва различни алгоритми, за да определи други начини за определяне на етикета или класа на дадена точка от данни. Нека работим с тези данни за кухни, за да видим дали, наблюдавайки група от съставки, можем да определим произхода на кухнята.\n",
"\n",
"### [**Тест преди лекцията**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Въведение**\n",
"\n",
"Класификацията е една от основните дейности на изследователя в областта на машинното обучение и на специалиста по данни. От основна класификация на бинарна стойност (\"този имейл спам ли е или не?\") до сложна класификация на изображения и сегментация с помощта на компютърно зрение, винаги е полезно да можете да сортирате данни в класове и да задавате въпроси за тях.\n",
"\n",
"Ако трябва да опишем процеса по-научно, вашият метод за класификация създава предсказателен модел, който ви позволява да картографирате връзката между входните променливи и изходните променливи.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Бинарни срещу многокласови проблеми, които алгоритмите за класификация трябва да решат. Инфографика от Джен Лупър</figcaption>\n",
"\n",
"\n",
"\n",
"Преди да започнем процеса на почистване на данните, визуализирането им и подготовката им за нашите задачи по машинно обучение, нека научим малко за различните начини, по които машинното обучение може да се използва за класифициране на данни.\n",
"\n",
"Произлизаща от [статистиката](https://wikipedia.org/wiki/Statistical_classification), класификацията с помощта на класическо машинно обучение използва характеристики като `пушач`, `тегло` и `възраст`, за да определи *вероятността за развитие на дадено заболяване*. Като техника за контролирано обучение, подобна на упражненията за регресия, които извършихте по-рано, вашите данни са етикетирани, а алгоритмите за машинно обучение използват тези етикети, за да класифицират и предсказват класове (или 'характеристики') на набор от данни и да ги присвояват към група или резултат.\n",
"\n",
"✅ Отделете момент, за да си представите набор от данни за кухни. Какво би могъл да отговори един многокласов модел? Какво би могъл да отговори един бинарен модел? Ами ако искате да определите дали дадена кухня вероятно използва сминдух? Ами ако искате да видите дали, при наличието на торба с хранителни продукти, пълна със звезден анасон, артишок, карфиол и хрян, можете да създадете типично индийско ястие?\n",
"\n",
"### **Здравейте, 'класификатор'**\n",
"\n",
"Въпросът, който искаме да зададем на този набор от данни за кухни, всъщност е **многокласов въпрос**, тъй като имаме няколко потенциални национални кухни, с които да работим. Като се има предвид група от съставки, към кой от тези много класове ще се впишат данните?\n",
"\n",
"Tidymodels предлага няколко различни алгоритми за класифициране на данни, в зависимост от вида на проблема, който искате да решите. В следващите два урока ще научите за някои от тези алгоритми.\n",
"\n",
"#### **Предварителни изисквания**\n",
"\n",
"За този урок ще ни трябват следните пакети, за да почистим, подготвим и визуализираме данните си:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) е [колекция от пакети за R](https://www.tidyverse.org/packages), създадена да направи науката за данни по-бърза, лесна и забавна!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) е рамка, представляваща [колекция от пакети](https://www.tidymodels.org/packages/) за моделиране и машинно обучение.\n",
"\n",
"- `DataExplorer`: [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) е пакет, предназначен да опрости и автоматизира процеса на изследване на данни и генериране на отчети.\n",
"\n",
"- `themis`: [themis](https://themis.tidymodels.org/) предоставя допълнителни стъпки за рецепти за работа с небалансирани данни.\n",
"\n",
"Можете да ги инсталирате със следната команда:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Алтернативно, скриптът по-долу проверява дали имате необходимите пакети за завършване на този модул и ги инсталира, ако липсват.\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": [
"По-късно ще заредим тези страхотни пакети и ще ги направим достъпни в текущата R сесия. (Това е само за илюстрация, `pacman::p_load()` вече го направи за вас)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Упражнение - почистете и балансирайте вашите данни\n",
"\n",
"Първата задача, преди да започнете този проект, е да почистите и **балансирате** вашите данни, за да постигнете по-добри резултати.\n",
"\n",
"Нека се запознаем с данните! 🕵️\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": [
"Интересно! От изгледа на нещата, първата колона е вид `id` колона. Нека получим малко повече информация за данните.\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": [
"От резултата веднага виждаме, че имаме `2448` реда и `385` колони и `0` липсващи стойности. Също така имаме 1 дискретна колона, *cuisine*.\n",
"\n",
"## Упражнение - запознаване с кухните\n",
"\n",
"Сега работата започва да става по-интересна. Нека открием разпределението на данните по кухни.\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": [
"Има ограничен брой кухни, но разпределението на данните е неравномерно. Можете да го поправите! Преди това обаче, разгледайте малко повече.\n",
"\n",
"След това, нека разпределим всяка кухня в отделна tibble и да разберем колко данни са налични (редове, колони) за всяка кухня.\n",
"\n",
"> [tibble](https://tibble.tidyverse.org/) е модерен data frame.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Илюстрация от @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": [
"## **Упражнение - Откриване на основни съставки по кухня с помощта на dplyr**\n",
"\n",
"Сега можете да се задълбочите в данните и да разберете кои са типичните съставки за различните кухни. Трябва да премахнете повтарящи се данни, които създават объркване между кухните, така че нека разгледаме този проблем.\n",
"\n",
"Създайте функция `create_ingredient()` в R, която връща dataframe със съставки. Тази функция ще започне с премахване на ненужна колона и ще сортира съставките според тяхната честота.\n",
"\n",
"Основната структура на функция в R е:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Едно добро въведение в R функциите можете да намерите [тук](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Да се захващаме за работа! Ще използваме [глаголите на dplyr](https://dplyr.tidyverse.org/), които изучавахме в предишните уроци. Като обобщение:\n",
"\n",
"- `dplyr::select()`: помага ви да изберете кои **колони** да запазите или изключите.\n",
"\n",
"- `dplyr::pivot_longer()`: помага ви да \"удължите\" данните, увеличавайки броя на редовете и намалявайки броя на колоните.\n",
"\n",
"- `dplyr::group_by()` и `dplyr::summarise()`: помагат ви да намерите обобщени статистики за различни групи и да ги представите в удобна таблица.\n",
"\n",
"- `dplyr::filter()`: създава подмножество от данните, съдържащо само редовете, които отговарят на вашите условия.\n",
"\n",
"- `dplyr::mutate()`: помага ви да създавате или модифицирате колони.\n",
"\n",
"Разгледайте този [*арт*-пълен learnr урок](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) от Алисън Хорст, който представя някои полезни функции за обработка на данни в dplyr *(част от 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": [
"Сега можем да използваме функцията, за да получим представа за десетте най-популярни съставки според кухнята. Нека я изпробваме с `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": [
"В предишния раздел използвахме `geom_col()`, нека видим как можете да използвате и `geom_bar`, за да създавате стълбовидни диаграми. Използвайте `?geom_bar` за допълнително четене.\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": [
"Нека направим същото за японските данни\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": [
"Какво ще кажете за китайската кухня?\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": [
"Накрая начертайте корейските съставки.\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": [
"От визуализациите на данните можем сега да премахнем най-често срещаните съставки, които създават объркване между различните кухни, използвайки `dplyr::select()`.\n",
"\n",
"Всички обичат ориз, чесън и джинджифил!\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": [
"## Предварителна обработка на данни с рецепти 👩‍🍳👨‍🍳 - Работа с небалансирани данни ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Илюстрация от @allison_horst</figcaption>\n",
"\n",
"Тъй като този урок е за кухни, трябва да поставим `рецептите` в контекст.\n",
"\n",
"Tidymodels предоставя още един удобен пакет: `recipes` - пакет за предварителна обработка на данни.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Нека отново разгледаме разпределението на нашите кухни.\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": [
"Както виждате, има доста неравномерно разпределение в броя на кухните. Корейските кухни са почти три пъти повече от тайландските. Небалансираните данни често имат отрицателно въздействие върху производителността на модела. Помислете за бинарна класификация. Ако по-голямата част от вашите данни принадлежат към един клас, моделът за машинно обучение ще предсказва този клас по-често, просто защото има повече данни за него. Балансирането на данните коригира всякакви изкривявания и помага за премахването на този дисбаланс. Много модели работят най-добре, когато броят на наблюденията е равен, и следователно имат затруднения с небалансирани данни.\n",
"\n",
"Има основно два начина за справяне с небалансирани набори от данни:\n",
"\n",
"- добавяне на наблюдения към малцинствения клас: `Over-sampling`, например чрез използване на алгоритъма SMOTE\n",
"\n",
"- премахване на наблюдения от мнозинствения клас: `Under-sampling`\n",
"\n",
"Нека сега демонстрираме как да се справим с небалансирани набори от данни, използвайки `recipe`. Рецептата може да се разглежда като план, който описва какви стъпки трябва да се приложат към набора от данни, за да бъде подготвен за анализ.\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": [
"Нека разгледаме стъпките за предварителна обработка.\n",
"\n",
"- Извикването на `recipe()` с формула указва на рецептата *ролите* на променливите, използвайки данните от `df_select` като референция. Например, колоната `cuisine` е определена с роля `outcome`, докато останалите колони са определени с роля `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) създава *спецификация* на стъпка от рецептата, която синтетично генерира нови примери за малцинствената класа, използвайки най-близките съседи на тези случаи.\n",
"\n",
"Сега, ако искаме да видим предварително обработените данни, трябва да [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) и [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) нашата рецепта.\n",
"\n",
"`prep()`: изчислява необходимите параметри от тренировъчен набор, които по-късно могат да бъдат приложени към други набори от данни.\n",
"\n",
"`bake()`: взема предварително обработена рецепта и прилага операциите към всеки набор от данни.\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": [
"Нека сега проверим разпределението на нашите кухни и да ги сравним с небалансираните данни.\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": [
"Ммм! Данните са чисти, балансирани и много вкусни 😋!\n",
"\n",
"> Обикновено рецептата се използва като предварителен процесор за моделиране, където се определя какви стъпки трябва да се приложат към набора от данни, за да бъде готов за моделиране. В този случай обикновено се използва `workflow()` (както вече видяхме в предишните уроци), вместо ръчно да се изчислява рецепта.\n",
">\n",
"> Затова обикновено не е необходимо да използвате **`prep()`** и **`bake()`** за рецепти, когато работите с tidymodels, но те са полезни функции, които можете да имате в арсенала си, за да потвърдите, че рецептите работят според очакванията ви, както е в нашия случай.\n",
">\n",
"> Когато използвате **`bake()`** върху предварително подготвена рецепта с **`new_data = NULL`**, получавате обратно данните, които сте предоставили при дефинирането на рецептата, но вече преминали през стъпките на предварителната обработка.\n",
"\n",
"Нека сега запазим копие на тези данни за използване в бъдещи уроци:\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": [
"Този нов CSV файл вече може да бъде намерен в основната папка с данни.\n",
"\n",
"**🚀Предизвикателство**\n",
"\n",
"Тази учебна програма съдържа няколко интересни набора от данни. Разгледайте папките `data` и вижте дали някой от тях съдържа набори от данни, подходящи за бинарна или многокласова класификация? Какви въпроси бихте задали на този набор от данни?\n",
"\n",
"## [**Тест след лекцията**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Преглед и самостоятелно обучение**\n",
"\n",
"- Разгледайте [пакета themis](https://github.com/tidymodels/themis). Какви други техники можем да използваме за справяне с небалансирани данни?\n",
"\n",
"- Уебсайт с референции за Tidy models [тук](https://www.tidymodels.org/start/).\n",
"\n",
"- Х. Уикъм и Г. Гролемунд, [*R за анализ на данни: Визуализация, моделиране, трансформация, подреждане и импортиране на данни*](https://r4ds.had.co.nz/).\n",
"\n",
"#### БЛАГОДАРНОСТИ КЪМ:\n",
"\n",
"[`Алисън Хорст`](https://twitter.com/allison_horst/) за създаването на невероятните илюстрации, които правят R по-приветлив и ангажиращ. Намерете още илюстрации в нейния [галерия](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"[Каси Бревиу](https://www.twitter.com/cassieview) и [Джен Лупър](https://www.twitter.com/jenlooper) за създаването на оригиналната версия на този модул на Python ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Илюстрация от @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
]
}
]
}