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

450 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-04T07:03:52+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "cs"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Úvod do regrese - Lekce 1\n",
"\n",
"#### Uvedení do kontextu\n",
"\n",
"✅ Existuje mnoho typů regresních metod a výběr té správné závisí na tom, jakou odpověď hledáte. Pokud chcete předpovědět pravděpodobnou výšku osoby určitého věku, použijete `lineární regresi`, protože hledáte **číselnou hodnotu**. Pokud vás zajímá, zda by určitý typ kuchyně měl být považován za veganský nebo ne, hledáte **přiřazení kategorie**, a proto byste použili `logistickou regresi`. O logistické regresi se dozvíte více později. Zamyslete se nad některými otázkami, které byste mohli klást datům, a nad tím, která z těchto metod by byla vhodnější.\n",
"\n",
"V této části budete pracovat s [malou datovou sadou o cukrovce](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Představte si, že byste chtěli otestovat léčbu pro pacienty s cukrovkou. Modely strojového učení by vám mohly pomoci určit, kteří pacienti by na léčbu reagovali lépe, na základě kombinací proměnných. I velmi základní regresní model, pokud je vizualizován, by mohl ukázat informace o proměnných, které by vám pomohly uspořádat vaše teoretické klinické studie.\n",
"\n",
"Tak tedy, pojďme se pustit do tohoto úkolu!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Ilustrace od @allison_horst</figcaption>\n",
"\n",
"<!--![Ilustrace od \\@allison_horst](../../../../../../2-Regression/1-Tools/images/encouRage.jpg)<br>Ilustrace od @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Načtení našeho nástrojového setu\n",
"\n",
"Pro tento úkol budeme potřebovat následující balíčky:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [kolekce balíčků pro R](https://www.tidyverse.org/packages), která je navržena tak, aby byla práce s daty rychlejší, jednodušší a zábavnější!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je [kolekce balíčků](https://www.tidymodels.org/packages/) určená pro modelování a strojové učení.\n",
"\n",
"Můžete je nainstalovat pomocí:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Níže uvedený skript zkontroluje, zda máte balíčky potřebné k dokončení tohoto modulu, a v případě, že některé chybí, je pro vás nainstaluje.\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": [
"Nyní načtěme tyto skvělé balíčky a zpřístupněme je v naší aktuální relaci R. (Toto je pouze pro ilustraci, `pacman::p_load()` to již udělal za vás)\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. Datová sada o cukrovce\n",
"\n",
"V tomto cvičení si procvičíme naše dovednosti v regresi tím, že budeme provádět predikce na datové sadě o cukrovce. [Datová sada o cukrovce](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) obsahuje `442 vzorků` dat týkajících se cukrovky, s 10 prediktivními proměnnými, jako jsou `věk`, `pohlaví`, `index tělesné hmotnosti`, `průměrný krevní tlak` a `šest měření krevního séra`, a také výstupní proměnnou `y`: kvantitativní míru progrese onemocnění jeden rok po výchozím stavu.\n",
"\n",
"|Počet pozorování|442|\n",
"|----------------|:---|\n",
"|Počet prediktorů|Prvních 10 sloupců jsou číselné prediktivní proměnné|\n",
"|Výstup/Cíl|Sloupec 11 je kvantitativní míra progrese onemocnění jeden rok po výchozím stavu|\n",
"|Informace o prediktorech|- věk v letech\n",
"||- pohlaví\n",
"||- bmi index tělesné hmotnosti\n",
"||- bp průměrný krevní tlak\n",
"||- s1 tc, celkový cholesterol v séru\n",
"||- s2 ldl, lipoproteiny s nízkou hustotou\n",
"||- s3 hdl, lipoproteiny s vysokou hustotou\n",
"||- s4 tch, poměr celkového cholesterolu k HDL\n",
"||- s5 ltg, pravděpodobně logaritmus hladiny triglyceridů v séru\n",
"||- s6 glu, hladina cukru v krvi|\n",
"\n",
"\n",
"\n",
"\n",
"> 🎓 Pamatujte, že se jedná o učení s učitelem (supervised learning), a potřebujeme cílovou proměnnou 'y'.\n",
"\n",
"Než budete moci manipulovat s daty v R, musíte data načíst do paměti R nebo vytvořit připojení k datům, které R umožní přístup k datům vzdáleně.\n",
"\n",
"> Balíček [readr](https://readr.tidyverse.org/), který je součástí Tidyverse, poskytuje rychlý a uživatelsky přívětivý způsob, jak načíst obdélníková data do R.\n",
"\n",
"Nyní načtěme datovou sadu o cukrovce z tohoto zdrojového URL: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Také provedeme kontrolu našich dat pomocí funkce `glimpse()` a zobrazíme prvních 5 řádků pomocí funkce `slice()`.\n",
"\n",
"Než budeme pokračovat, představme si ještě něco, s čím se v kódu R často setkáte 🥁🥁: operátor pipe `%>%`\n",
"\n",
"Operátor pipe (`%>%`) provádí operace v logickém sledu tím, že předává objekt dál do funkce nebo výrazu. Můžete si operátor pipe představit jako výraz \"a pak\" ve vašem kódu.\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 tato data obsahují 442 řádků a 11 sloupců, přičemž všechny sloupce mají datový typ `double`.\n",
"\n",
"<br>\n",
"\n",
"> glimpse() a slice() jsou funkce v [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, součást Tidyverse, je gramatika pro manipulaci s daty, která poskytuje konzistentní sadu sloves, jež vám pomohou vyřešit nejběžnější výzvy při práci s daty.\n",
"\n",
"<br>\n",
"\n",
"Teď, když máme data, zaměříme se na jednu vlastnost (`bmi`) jako cíl tohoto cvičení. To bude vyžadovat, abychom vybrali požadované sloupce. Jak to uděláme?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nám umožňuje *vybrat* (a případně přejmenovat) sloupce v datovém 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énovací a testovací data\n",
"\n",
"V řízeném učení je běžnou praxí *rozdělit* data na dvě podmnožiny; (obvykle větší) sadu, která slouží k trénování modelu, a menší „záložní“ sadu, která slouží k ověření, jak si model vedl.\n",
"\n",
"Nyní, když máme data připravena, můžeme zjistit, zda nám stroj dokáže pomoci určit logické rozdělení čísel v tomto datasetu. Můžeme použít balíček [rsample](https://tidymodels.github.io/rsample/), který je součástí frameworku Tidymodels, k vytvoření objektu, který obsahuje informace o *tom*, jak data rozdělit, a poté dvě další funkce rsample k extrakci vytvořených trénovacích a testovacích sad:\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. Trénování lineárního regresního modelu pomocí Tidymodels\n",
"\n",
"Teď jsme připraveni trénovat náš model!\n",
"\n",
"V Tidymodels specifikujete modely pomocí `parsnip()` tím, že určíte tři koncepty:\n",
"\n",
"- **Typ modelu** rozlišuje mezi modely, jako je lineární regrese, logistická regrese, modely rozhodovacích stromů a podobně.\n",
"\n",
"- **Režim modelu** zahrnuje běžné možnosti, jako je regrese a klasifikace; některé typy modelů podporují obě možnosti, zatímco jiné mají pouze jeden režim.\n",
"\n",
"- **Engine modelu** je výpočetní nástroj, který bude použit k nastavení modelu. Často se jedná o balíčky v R, jako například **`\"lm\"`** nebo **`\"ranger\"`**.\n",
"\n",
"Tyto informace o modelování jsou zachyceny ve specifikaci modelu, tak si jednu vytvořme!\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": [
"Poté, co byl model *specifikován*, může být model `odhadnut` nebo `natrénován` pomocí funkce [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), obvykle za použití vzorce a nějakých dat.\n",
"\n",
"`y ~ .` znamená, že budeme přizpůsobovat `y` jako předpovídanou hodnotu/cíl, vysvětlenou všemi prediktory/vlastnostmi, tj. `.` (v tomto případě máme pouze 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 výstupu modelu můžeme vidět koeficienty naučené během trénování. Tyto koeficienty představují parametry přímky nejlepšího přizpůsobení, která nám poskytuje nejnižší celkovou chybu mezi skutečnou a předpovězenou proměnnou.\n",
"<br>\n",
"\n",
"## 5. Vytvoření předpovědí na testovací sadě\n",
"\n",
"Nyní, když jsme model natrénovali, můžeme jej použít k předpovědi vývoje onemocnění y pro testovací dataset pomocí [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). To bude použito k vykreslení čáry mezi skupinami dat.\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ávě jsme natrénovali model a použili ho k vytvoření předpovědí!\n",
"\n",
"Při vytváření předpovědí je konvencí v tidymodels vždy vytvořit tibble/datový rámec s výsledky, který má standardizované názvy sloupců. To usnadňuje kombinaci původních dat a předpovědí do použitelného formátu pro následné operace, jako je například vytváření grafů.\n",
"\n",
"`dplyr::bind_cols()` efektivně spojuje více datových rámců podle sloupců.\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. Zobrazení výsledků modelování\n",
"\n",
"Teď je čas podívat se na to vizuálně 📈. Vytvoříme bodový graf všech hodnot `y` a `bmi` z testovací sady a poté použijeme predikce k nakreslení čáry na nejvhodnějším místě mezi skupinami dat modelu.\n",
"\n",
"R má několik systémů pro vytváření grafů, ale `ggplot2` je jedním z nejpůsobivějších a nejvšestrannějších. Umožňuje vám skládat grafy **kombinováním nezávislých komponent**.\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": [
"✅ Zamyslete se nad tím, co se zde děje. Přímka prochází mnoha malými body dat, ale co přesně dělá? Vidíte, jak byste měli být schopni použít tuto přímku k předpovědi, kam by měl nový, neviděný datový bod zapadnout ve vztahu k ose y grafu? Zkuste slovy popsat praktické využití tohoto modelu.\n",
"\n",
"Gratulujeme, vytvořili jste svůj první model lineární regrese, provedli předpověď a zobrazili ji v grafu!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). Ačkoli se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Nenese odpovědnost za žádné nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
]
}
]
}