{ "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-06T13:40:43+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "sk" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Úvod do regresie - Lekcia 1\n", "\n", "#### Uvedenie do kontextu\n", "\n", "✅ Existuje mnoho typov regresných metód a výber tej správnej závisí od odpovede, ktorú hľadáte. Ak chcete predpovedať pravdepodobnú výšku osoby v určitom veku, použijete `lineárnu regresiu`, pretože hľadáte **číselnú hodnotu**. Ak vás zaujíma, či by určitý typ kuchyne mal byť považovaný za vegánsky alebo nie, hľadáte **priradenie kategórie**, a preto by ste použili `logistickú regresiu`. O logistickej regresii sa dozviete viac neskôr. Zamyslite sa nad niektorými otázkami, ktoré môžete klásť na základe údajov, a nad tým, ktorá z týchto metód by bola vhodnejšia.\n", "\n", "V tejto časti budete pracovať s [malým datasetom o cukrovke](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Predstavte si, že by ste chceli otestovať liečbu pre pacientov s cukrovkou. Modely strojového učenia by vám mohli pomôcť určiť, ktorí pacienti by na liečbu reagovali lepšie, na základe kombinácií premenných. Dokonca aj veľmi základný regresný model, keď je vizualizovaný, môže ukázať informácie o premenných, ktoré by vám mohli pomôcť zorganizovať vaše teoretické klinické štúdie.\n", "\n", "Tak teda, poďme sa pustiť do tejto úlohy!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() a slice() sú funkcie v [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, ktorý je súčasťou Tidyverse, predstavuje gramatiku manipulácie s dátami a poskytuje konzistentnú sadu slovies, ktoré vám pomôžu riešiť najbežnejšie výzvy pri práci s dátami.\n",
"\n",
"
\n",
"\n",
"Teraz, keď máme dáta, zamerajme sa na jednu vlastnosť (`bmi`), ktorú použijeme ako cieľ pre toto cvičenie. To si bude vyžadovať výber požadovaných stĺpcov. Ako to môžeme urobiť?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nám umožňuje *vybrať* (a prípadne premenovať) stĺpce v dátovom rámci.\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. Tréningové a testovacie dáta\n",
"\n",
"V supervidovanom učení je bežnou praxou *rozdeliť* dáta na dva podmnožiny; (zvyčajne väčšiu) množinu, s ktorou sa model trénuje, a menšiu „rezervnú“ množinu, na ktorej sa overí, ako model fungoval.\n",
"\n",
"Teraz, keď máme dáta pripravené, môžeme zistiť, či nám stroj dokáže pomôcť určiť logické rozdelenie čísel v tejto dátovej sade. Môžeme použiť balík [rsample](https://tidymodels.github.io/rsample/), ktorý je súčasťou rámca Tidymodels, na vytvorenie objektu obsahujúceho informácie o *tom, ako* rozdeliť dáta, a potom ďalšie dve funkcie rsample na extrakciu vytvorených tréningových a testovacích množín:\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. Natrénujte lineárny regresný model pomocou Tidymodels\n",
"\n",
"Teraz sme pripravení natrénovať náš model!\n",
"\n",
"V Tidymodels špecifikujete modely pomocou `parsnip()` tým, že definujete tri koncepty:\n",
"\n",
"- **Typ** modelu rozlišuje medzi modelmi, ako sú lineárna regresia, logistická regresia, modely rozhodovacích stromov a podobne.\n",
"\n",
"- **Režim** modelu zahŕňa bežné možnosti, ako sú regresia a klasifikácia; niektoré typy modelov podporujú obe možnosti, zatiaľ čo iné majú iba jeden režim.\n",
"\n",
"- **Engine** modelu je výpočtový nástroj, ktorý sa použije na natrénovanie modelu. Často ide o balíky v R, ako napríklad **`\"lm\"`** alebo **`\"ranger\"`**\n",
"\n",
"Tieto informácie o modelovaní sú zachytené v špecifikácii modelu, takže si jednu vytvorme!\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": [
"Po tom, čo je model *špecifikovaný*, môže byť `odhadnutý` alebo `natrénovaný` pomocou funkcie [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), zvyčajne s použitím vzorca a nejakých údajov.\n",
"\n",
"`y ~ .` znamená, že budeme prispôsobovať `y` ako predpovedanú hodnotu/cieľ, vysvetlenú všetkými prediktormi/vlastnosťami, teda `.` (v tomto prípade máme iba jeden prediktor: `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": [
"Z modelového výstupu môžeme vidieť koeficienty naučené počas tréningu. Predstavujú koeficienty priamky najlepšieho prispôsobenia, ktorá nám poskytuje najnižšiu celkovú chybu medzi skutočnou a predpovedanou premennou.\n",
"
\n",
"\n",
"## 5. Predikcia na testovacej množine\n",
"\n",
"Teraz, keď sme natrénovali model, môžeme ho použiť na predikciu progresie ochorenia y pre testovaciu množinu dát pomocou [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Toto sa použije na vykreslenie čiary medzi skupinami dát.\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": [
"Hurá! 💃🕺 Práve sme natrénovali model a použili ho na vytváranie predpovedí!\n",
"\n",
"Pri vytváraní predpovedí je v súlade s konvenciou tidymodels vždy vytvoriť tibble/dátový rámec s výsledkami, ktoré majú štandardizované názvy stĺpcov. To umožňuje jednoducho skombinovať pôvodné dáta a predpovede do použiteľného formátu pre ďalšie operácie, ako je napríklad vizualizácia.\n",
"\n",
"`dplyr::bind_cols()` efektívne spája viacero dátových rámcov podľa stĺpcov.\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. Zobrazenie výsledkov modelovania\n",
"\n",
"Teraz je čas vidieť to vizuálne 📈. Vytvoríme bodový graf všetkých hodnôt `y` a `bmi` z testovacej množiny a potom použijeme predpovede na nakreslenie čiary na najvhodnejšom mieste medzi skupinami údajov modelu.\n",
"\n",
"R má niekoľko systémov na tvorbu grafov, ale `ggplot2` je jedným z najelegantnejších a najvšestrannejších. Umožňuje vám vytvárať grafy **kombinovaním nezávislých komponentov**.\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": [
"✅ Zamyslite sa trochu nad tým, čo sa tu deje. Priama čiara prechádza cez množstvo malých bodov údajov, ale čo presne robí? Vidíte, ako by ste mali byť schopní použiť túto čiaru na predpovedanie, kam by mal nový, nevidený údaj zapadnúť vo vzťahu k osi y grafu? Skúste slovami vyjadriť praktické využitie tohto modelu.\n",
"\n",
"Gratulujeme, vytvorili ste svoj prvý model lineárnej regresie, urobili ste s ním predpoveď a zobrazili ste ju v grafe!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie odporúčame profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
]
}
]
}