{ "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-09-04T07:10:41+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "uk" } }, "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"
]
}
]
}