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

718 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-08-29T23:57:05+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "ru"
}
},
"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",
"Классификация — это форма [обучения с учителем](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",
"Происходя из [статистики](https://wikipedia.org/wiki/Statistical_classification), классификация с использованием классического машинного обучения использует признаки, такие как `курильщик`, `вес` и `возраст`, чтобы определить *вероятность развития X заболевания*. Как техника обучения с учителем, похожая на выполненные ранее упражнения по регрессии, ваши данные имеют метки, и алгоритмы машинного обучения используют эти метки для классификации и прогнозирования классов (или 'признаков') набора данных и их присвоения группе или результату.\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/) — это современный формат датафрейма.\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, которая возвращает датафрейм с ингредиентами. Эта функция начнет с удаления ненужного столбца и сортировки ингредиентов по их количеству.\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": [],
"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": [],
"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": [
"## Предобработка данных с помощью recipes 👩‍🍳👨‍🍳 - Работа с несбалансированными данными ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Иллюстрация от @allison_horst</figcaption>\n",
"\n",
"Поскольку этот урок посвящен кухням, нам нужно рассмотреть `recipes` в контексте.\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Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.\n"
]
}
]
}