{ "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", "
\n",
" \n",
"
\n",
"\n",
"> `glimpse()` и `slice()` — это функции из пакета [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, являющийся частью Tidyverse, представляет собой грамматику манипуляции данными, предоставляющую набор удобных глаголов, которые помогают решать наиболее распространенные задачи обработки данных.\n",
"\n",
"
\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",
"
\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"
]
}
]
}