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.
447 lines
17 KiB
447 lines
17 KiB
{
|
|
"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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Ilustrácia od @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Ilustrácia od @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Načítanie našej sady nástrojov\n",
|
|
"\n",
|
|
"Pre túto úlohu budeme potrebovať nasledujúce balíky:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [kolekcia balíkov v R](https://www.tidyverse.org/packages), ktorá je navrhnutá tak, aby robila dátovú vedu rýchlejšou, jednoduchšou a zábavnejšou!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je [rámec balíkov](https://www.tidymodels.org/packages/) určený na modelovanie a strojové učenie.\n",
|
|
"\n",
|
|
"Môžete ich nainštalovať pomocou:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Nasledujúci skript skontroluje, či máte nainštalované balíky potrebné na dokončenie tohto modulu, a v prípade, že niektoré chýbajú, ich pre vás nainštaluje.\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": [
|
|
"Teraz načítajme tieto úžasné balíky a sprístupnime ich v našej aktuálnej R relácii. (Toto je len na ilustráciu, `pacman::p_load()` to už za vás urobil)\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. Dataset o cukrovke\n",
|
|
"\n",
|
|
"V tomto cvičení si precvičíme naše schopnosti regresie tým, že budeme robiť predpovede na datasete o cukrovke. [Dataset o cukrovke](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) obsahuje `442 vzoriek` údajov týkajúcich sa cukrovky, s 10 prediktívnymi premennými: `vek`, `pohlavie`, `index telesnej hmotnosti`, `priemerný krvný tlak` a `šesť meraní krvného séra`, ako aj výstupnú premennú `y`: kvantitatívne meranie progresie ochorenia jeden rok po základnom vyšetrení.\n",
|
|
"\n",
|
|
"|Počet pozorovaní|442|\n",
|
|
"|----------------|:---|\n",
|
|
"|Počet prediktorov|Prvých 10 stĺpcov sú číselné prediktívne premenné|\n",
|
|
"|Výstup/Cieľ|Stĺpec 11 je kvantitatívne meranie progresie ochorenia jeden rok po základnom vyšetrení|\n",
|
|
"|Informácie o prediktoroch|- vek v rokoch\n",
|
|
"||- pohlavie\n",
|
|
"||- bmi index telesnej hmotnosti\n",
|
|
"||- bp priemerný krvný tlak\n",
|
|
"||- s1 tc, celkový cholesterol v sére\n",
|
|
"||- s2 ldl, lipoproteíny s nízkou hustotou\n",
|
|
"||- s3 hdl, lipoproteíny s vysokou hustotou\n",
|
|
"||- s4 tch, celkový cholesterol / HDL\n",
|
|
"||- s5 ltg, pravdepodobne logaritmus hladiny triglyceridov v sére\n",
|
|
"||- s6 glu, hladina cukru v krvi|\n",
|
|
"\n",
|
|
"> 🎓 Pamätajte, že ide o učenie s učiteľom (supervised learning), a potrebujeme cieľovú premennú nazvanú 'y'.\n",
|
|
"\n",
|
|
"Predtým, než budete môcť manipulovať s údajmi v R, musíte údaje importovať do pamäte R alebo vytvoriť spojenie s údajmi, ktoré R môže použiť na vzdialený prístup k údajom.\n",
|
|
"\n",
|
|
"> Balík [readr](https://readr.tidyverse.org/), ktorý je súčasťou Tidyverse, poskytuje rýchly a priateľský spôsob, ako načítať obdĺžnikové údaje do R.\n",
|
|
"\n",
|
|
"Teraz načítajme dataset o cukrovke z poskytnutého zdrojového URL: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Tiež vykonáme kontrolu údajov pomocou `glimpse()` a zobrazíme prvých 5 riadkov pomocou `slice()`.\n",
|
|
"\n",
|
|
"Predtým, než budeme pokračovať ďalej, predstavme si niečo, s čím sa často stretnete v kóde R 🥁🥁: operátor pipe `%>%`\n",
|
|
"\n",
|
|
"Operátor pipe (`%>%`) vykonáva operácie v logickej postupnosti tým, že posúva objekt ďalej do funkcie alebo výrazu. Môžete si operátor pipe predstaviť ako \"a potom\" vo vašom kóde.\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()` nám ukazuje, že tieto dáta obsahujú 442 riadkov a 11 stĺpcov, pričom všetky stĺpce majú dátový typ `double`.\n",
|
|
"\n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<br>\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"
|
|
]
|
|
}
|
|
]
|
|
} |