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/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

447 lines
24 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_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
"translation_date": "2025-08-29T23:08:12+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "ru"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Введение в регрессию - Урок 1\n",
"\n",
"#### Понимание в контексте\n",
"\n",
"✅ Существует множество методов регрессии, и выбор подходящего зависит от того, какой ответ вы ищете. Если вы хотите предсказать вероятный рост человека определенного возраста, вам подойдет `линейная регрессия`, так как вы ищете **числовое значение**. Если вас интересует, следует ли считать определенный тип кухни веганским или нет, вы ищете **категориальное назначение**, и тогда вам подойдет `логистическая регрессия`. Позже вы узнаете больше о логистической регрессии. Подумайте немного о вопросах, которые можно задать данным, и о том, какой из этих методов будет наиболее подходящим.\n",
"\n",
"В этом разделе вы будете работать с [небольшим набором данных о диабете](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Представьте, что вы хотите протестировать лечение для пациентов с диабетом. Модели машинного обучения могут помочь определить, какие пациенты лучше отреагируют на лечение, основываясь на комбинациях переменных. Даже очень простая модель регрессии, визуализированная, может показать информацию о переменных, которая поможет вам организовать теоретические клинические испытания.\n",
"\n",
"Итак, приступим к выполнению этой задачи!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Иллюстрация @allison_horst</figcaption>\n",
"\n",
"<!--![Иллюстрация \\@allison_horst](../../../../../../translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.ru.jpg)<br>Иллюстрация @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Загружаем наш набор инструментов\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",
"Вы можете установить их с помощью следующей команды:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Скрипт ниже проверяет, установлены ли у вас необходимые для выполнения этого модуля пакеты, и автоматически устанавливает их, если каких-то не хватает.\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"Теперь давайте загрузим эти потрясающие пакеты и сделаем их доступными в нашей текущей R-сессии. (Это просто для иллюстрации, `pacman::p_load()` уже сделал это за вас)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Набор данных о диабете\n",
"\n",
"В этом упражнении мы продемонстрируем наши навыки регрессии, делая прогнозы на основе набора данных о диабете. [Набор данных о диабете](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) включает `442 образца` данных, связанных с диабетом, с 10 предикторными переменными: `возраст`, `пол`, `индекс массы тела`, `среднее артериальное давление` и `шесть измерений сыворотки крови`, а также переменную результата `y`: количественную меру прогрессирования заболевания через год после исходного уровня.\n",
"\n",
"|Количество наблюдений|442|\n",
"|----------------------|:---|\n",
"|Количество предикторов|Первые 10 столбцов являются числовыми предикторами|\n",
"|Результат/Цель|11-й столбец — это количественная мера прогрессирования заболевания через год после исходного уровня|\n",
"|Информация о предикторах|- возраст в годах\n",
"||- пол\n",
"||- bmi индекс массы тела\n",
"||- bp среднее артериальное давление\n",
"||- s1 tc, общий уровень холестерина в сыворотке\n",
"||- s2 ldl, липопротеины низкой плотности\n",
"||- s3 hdl, липопротеины высокой плотности\n",
"||- s4 tch, общий холестерин / HDL\n",
"||- s5 ltg, возможно, логарифм уровня триглицеридов в сыворотке\n",
"||- s6 glu, уровень сахара в крови|\n",
"\n",
"> 🎓 Помните, это обучение с учителем, и нам нужна целевая переменная с именем 'y'.\n",
"\n",
"Прежде чем вы сможете работать с данными в R, необходимо импортировать данные в память R или установить соединение с данными, чтобы R мог получить к ним удаленный доступ.\n",
"\n",
"> Пакет [readr](https://readr.tidyverse.org/), который является частью Tidyverse, предоставляет быстрый и удобный способ чтения прямоугольных данных в R.\n",
"\n",
"Теперь давайте загрузим набор данных о диабете, предоставленный по следующему URL-адресу: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Также мы проведем проверку данных с помощью `glimpse()` и отобразим первые 5 строк с помощью `slice()`.\n",
"\n",
"Прежде чем двигаться дальше, давайте познакомимся с чем-то, что вы будете часто встречать в коде R 🥁🥁: оператор pipe `%>%`\n",
"\n",
"Оператор pipe (`%>%`) выполняет операции в логической последовательности, передавая объект в функцию или выражение вызова. Вы можете представить оператор pipe как выражение \"а затем\" в вашем коде.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` показывает, что этот набор данных содержит 442 строки и 11 столбцов, причем все столбцы имеют тип данных `double`.\n",
"\n",
"<br>\n",
"\n",
"> `glimpse()` и `slice()` — это функции из пакета [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, являющийся частью Tidyverse, представляет собой грамматику манипуляции данными, предоставляющую набор удобных глаголов, которые помогают решать наиболее распространенные задачи обработки данных.\n",
"\n",
"<br>\n",
"\n",
"Теперь, когда у нас есть данные, давайте сосредоточимся на одной характеристике (`bmi`) для выполнения этого упражнения. Для этого нам нужно выбрать нужные столбцы. Как это сделать?\n",
"\n",
"Функция [`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) позволяет *выбирать* (и при необходимости переименовывать) столбцы в датафрейме.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Обучающие и тестовые данные\n",
"\n",
"В задачах с учителем обычно принято *разделять* данные на два подмножества: (как правило, большее) множество для обучения модели и меньшее \"резервное\" множество, чтобы оценить, как модель справилась с задачей.\n",
"\n",
"Теперь, когда у нас есть подготовленные данные, мы можем проверить, сможет ли машина помочь определить логическое разделение чисел в этом наборе данных. Мы можем использовать пакет [rsample](https://tidymodels.github.io/rsample/), который является частью фреймворка Tidymodels, чтобы создать объект, содержащий информацию о том, *как* разделить данные, а затем две дополнительные функции rsample, чтобы извлечь созданные обучающие и тестовые наборы:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Обучение модели линейной регрессии с помощью Tidymodels\n",
"\n",
"Теперь мы готовы обучить нашу модель!\n",
"\n",
"В Tidymodels модели задаются с помощью `parsnip()`, где указываются три ключевых аспекта:\n",
"\n",
"- **Тип модели** различает такие модели, как линейная регрессия, логистическая регрессия, модели деревьев решений и другие.\n",
"\n",
"- **Режим модели** включает общие варианты, такие как регрессия и классификация; некоторые типы моделей поддерживают оба режима, а некоторые только один.\n",
"\n",
"- **Движок модели** — это вычислительный инструмент, который будет использоваться для подгонки модели. Часто это R-пакеты, такие как **`\"lm\"`** или **`\"ranger\"`**.\n",
"\n",
"Эта информация о модели фиксируется в спецификации модели, так что давайте создадим её!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"После того как модель *определена*, её можно `оценить` или `обучить` с помощью функции [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), обычно используя формулу и некоторые данные.\n",
"\n",
"`y ~ .` означает, что мы будем подбирать `y` как предсказываемую величину/цель, объясняемую всеми предикторами/признаками, то есть `.` (в данном случае у нас есть только один предиктор: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"Из вывода модели мы можем увидеть коэффициенты, полученные в процессе обучения. Они представляют собой коэффициенты линии наилучшего соответствия, которая обеспечивает минимальную общую ошибку между фактической и предсказанной переменной.\n",
"<br>\n",
"\n",
"## 5. Сделайте прогнозы на тестовом наборе данных\n",
"\n",
"Теперь, когда мы обучили модель, мы можем использовать её для предсказания прогрессирования заболевания y на тестовом наборе данных с помощью [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Это будет использовано для проведения линии между группами данных.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Ура! 💃🕺 Мы только что обучили модель и использовали её для предсказаний!\n",
"\n",
"При выполнении предсказаний принято в tidymodels всегда создавать tibble/таблицу данных с результатами, где используются стандартизированные названия столбцов. Это упрощает объединение исходных данных и предсказаний в удобный формат для последующих операций, таких как построение графиков.\n",
"\n",
"`dplyr::bind_cols()` эффективно объединяет несколько таблиц данных по столбцам.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Построение результатов моделирования\n",
"\n",
"Теперь пришло время увидеть это визуально 📈. Мы создадим диаграмму рассеяния для всех значений `y` и `bmi` из тестового набора, а затем используем предсказания, чтобы провести линию в наиболее подходящем месте между группировками данных модели.\n",
"\n",
"R предлагает несколько систем для построения графиков, но `ggplot2` является одной из самых элегантных и универсальных. Этот инструмент позволяет создавать графики, **комбинируя независимые компоненты**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Подумайте, что здесь происходит. Прямая линия проходит через множество маленьких точек данных, но что именно она делает? Можете ли вы понять, как эта линия может помочь предсказать, где новый, ранее не виденный, точка данных должна находиться относительно оси y графика? Попробуйте описать практическое применение этой модели словами.\n",
"\n",
"Поздравляем, вы создали свою первую модель линейной регрессии, сделали предсказание с её помощью и отобразили его на графике!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
]
}
]
}