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

447 lines
16 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:41:25+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "sl"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Uvod v regresijo - Lekcija 1\n",
"\n",
"#### Postavljanje v perspektivo\n",
"\n",
"✅ Obstaja veliko vrst regresijskih metod, izbira pa je odvisna od odgovora, ki ga iščete. Če želite napovedati verjetno višino osebe glede na njeno starost, bi uporabili `linearno regresijo`, saj iščete **številčno vrednost**. Če vas zanima, ali naj se določena vrsta kuhinje šteje za vegansko ali ne, iščete **dodelitev kategorije**, zato bi uporabili `logistično regresijo`. Več o logistični regresiji boste izvedeli kasneje. Razmislite o nekaterih vprašanjih, ki jih lahko zastavite podatkom, in o tem, katera od teh metod bi bila bolj primerna.\n",
"\n",
"V tem razdelku boste delali z [majhnim naborom podatkov o diabetesu](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Predstavljajte si, da želite preizkusiti zdravljenje za diabetične bolnike. Modeli strojnega učenja vam lahko pomagajo določiti, kateri bolniki bi se na zdravljenje bolje odzvali, glede na kombinacije spremenljivk. Tudi zelo osnovni regresijski model, ko je vizualiziran, lahko pokaže informacije o spremenljivkah, ki bi vam pomagale organizirati teoretične klinične preizkuse.\n",
"\n",
"Pa začnimo s to nalogo!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Umetniško delo @allison_horst</figcaption>\n",
"\n",
"<!--![Umetniško delo \\@allison_horst](../../../../../../2-Regression/1-Tools/images/encouRage.jpg)<br>Umetniško delo @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Nalaganje našega nabora orodij\n",
"\n",
"Za to nalogo bomo potrebovali naslednje pakete:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka paketov za R](https://www.tidyverse.org/packages), zasnovana za hitrejše, enostavnejše in bolj zabavno podatkovno znanost!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je [zbirka paketov](https://www.tidymodels.org/packages/) za modeliranje in strojno učenje.\n",
"\n",
"Namestite jih lahko z ukazom:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Spodnji skript preveri, ali imate nameščene pakete, potrebne za dokončanje tega modula, in jih po potrebi namesti.\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": [
"Zdaj naložimo te odlične pakete in jih naredimo dostopne v naši trenutni R seji. (To je zgolj za ponazoritev, `pacman::p_load()` je to že naredil namesto vas)\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 diabetesu\n",
"\n",
"V tej vaji bomo uporabili svoje regresijske veščine za napovedovanje na podlagi podatkov o diabetesu. [Dataset o diabetesu](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) vključuje `442 vzorce` podatkov o diabetesu, z 10 spremenljivkami napovedovalnih značilnosti: `starost`, `spol`, `indeks telesne mase`, `povprečni krvni tlak` in `šest meritev krvnega seruma`, ter izhodno spremenljivko `y`: kvantitativno merilo napredovanja bolezni eno leto po začetnem stanju.\n",
"\n",
"|Število opazovanj|442|\n",
"|-----------------|:---|\n",
"|Število napovedovalcev|Prvih 10 stolpcev je numeričnih napovedovalnih|\n",
"|Izhodna tarča|Stolpec 11 je kvantitativno merilo napredovanja bolezni eno leto po začetnem stanju|\n",
"|Informacije o napovedovalcih|- starost v letih\n",
"||- spol\n",
"||- bmi indeks telesne mase\n",
"||- bp povprečni krvni tlak\n",
"||- s1 tc, skupni serumski holesterol\n",
"||- s2 ldl, lipoproteini nizke gostote\n",
"||- s3 hdl, lipoproteini visoke gostote\n",
"||- s4 tch, skupni holesterol / HDL\n",
"||- s5 ltg, verjetno logaritem ravni serumskih trigliceridov\n",
"||- s6 glu, raven krvnega sladkorja|\n",
"\n",
"> 🎓 Zapomnite si, to je nadzorovano učenje, zato potrebujemo ciljno spremenljivko 'y'.\n",
"\n",
"Preden lahko manipulirate s podatki v R-ju, jih morate uvoziti v pomnilnik R-ja ali vzpostaviti povezavo do podatkov, ki jih R lahko uporablja za dostop do podatkov na daljavo.\n",
"\n",
"> Paket [readr](https://readr.tidyverse.org/), ki je del Tidyverse, ponuja hiter in prijazen način za branje pravokotnih podatkov v R.\n",
"\n",
"Zdaj naložimo dataset o diabetesu, ki je na voljo na tem URL-ju: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Prav tako bomo izvedli osnovni pregled podatkov z uporabo `glimpse()` in prikazali prvih 5 vrstic z uporabo `slice()`.\n",
"\n",
"Preden nadaljujemo, naj predstavimo nekaj, kar boste pogosto srečali v kodi R 🥁🥁: operator cevi `%>%`\n",
"\n",
"Operator cevi (`%>%`) izvaja operacije v logičnem zaporedju tako, da objekt posreduje naprej v funkcijo ali izraz klica. Operator cevi si lahko predstavljate kot \"in nato\" v vaši kodi.\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()` nam pokaže, da ima ta podatkovni niz 442 vrstic in 11 stolpcev, pri čemer so vsi stolpci tipa podatkov `double`.\n",
"\n",
"<br>\n",
"\n",
"> `glimpse()` in `slice()` sta funkciji v knjižnici [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, ki je del Tidyverse, je slovnica za manipulacijo podatkov, ki ponuja dosleden nabor glagolov za reševanje najpogostejših izzivov pri obdelavi podatkov.\n",
"\n",
"<br>\n",
"\n",
"Zdaj, ko imamo podatke, se osredotočimo na eno značilnost (`bmi`), ki jo bomo uporabili za to vajo. To zahteva, da izberemo želene stolpce. Kako to storimo?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nam omogoča, da *izberemo* (in po želji preimenujemo) stolpce v podatkovnem okviru.\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. Podatki za učenje in testiranje\n",
"\n",
"Pri nadzorovanem učenju je običajna praksa, da podatke *razdelimo* na dva podsklopa; (običajno večji) sklop, s katerim treniramo model, in manjši \"rezervni\" sklop, s katerim preverimo, kako se je model odrezal.\n",
"\n",
"Zdaj, ko imamo podatke pripravljene, lahko preverimo, ali nam stroj lahko pomaga določiti logično razdelitev med številkami v tem naboru podatkov. Uporabimo lahko paket [rsample](https://tidymodels.github.io/rsample/), ki je del okvira Tidymodels, za ustvarjanje objekta, ki vsebuje informacije o *načinu* razdelitve podatkov, nato pa še dve funkciji rsample za pridobitev ustvarjenih učnih in testnih sklopov:\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. Učite model linearne regresije s Tidymodels\n",
"\n",
"Zdaj smo pripravljeni, da naučimo naš model!\n",
"\n",
"V Tidymodels modele določite z uporabo `parsnip()` tako, da določite tri koncepte:\n",
"\n",
"- **Tip** modela razlikuje med modeli, kot so linearna regresija, logistična regresija, modeli odločitvenih dreves in podobno.\n",
"\n",
"- **Način** modela vključuje pogoste možnosti, kot sta regresija in klasifikacija; nekateri tipi modelov podpirajo oba načina, medtem ko imajo drugi le en način.\n",
"\n",
"- **Pogon** modela je računsko orodje, ki bo uporabljeno za prilagoditev modela. Pogosto so to R paketi, kot sta **`\"lm\"`** ali **`\"ranger\"`**.\n",
"\n",
"Te informacije o modeliranju so zajete v specifikaciji modela, zato jo ustvarimo!\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": [
"Ko je model *določen*, ga je mogoče `oceniti` ali `usposobiti` z uporabo funkcije [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), običajno z uporabo formule in nekaterih podatkov.\n",
"\n",
"`y ~ .` pomeni, da bomo prilagodili `y` kot napovedano količino/cilj, ki ga pojasnjujejo vsi napovedniki/lastnosti, tj. `.` (v tem primeru imamo samo en napovednik: `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": [
"Iz modelnega izhoda lahko vidimo koeficiente, pridobljene med učenjem. Ti predstavljajo koeficiente premice najboljše prileganja, ki nam daje najnižjo skupno napako med dejansko in napovedano spremenljivko.\n",
"<br>\n",
"\n",
"## 5. Napovedovanje na testnem naboru\n",
"\n",
"Zdaj, ko smo izurili model, ga lahko uporabimo za napovedovanje napredovanja bolezni y za testni nabor podatkov z uporabo [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). To bo uporabljeno za risanje premice med skupinami podatkov.\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": [
"Juhu! 💃🕺 Pravkar smo izurili model in ga uporabili za napovedovanje!\n",
"\n",
"Pri napovedovanju je konvencija tidymodels vedno ustvariti tibble/podatkovni okvir z rezultati in standardiziranimi imeni stolpcev. To omogoča enostavno združevanje izvirnih podatkov in napovedi v uporabni obliki za nadaljnje operacije, kot je risanje grafov.\n",
"\n",
"`dplyr::bind_cols()` učinkovito združi več podatkovnih okvirjev po stolpcih.\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. Prikaz rezultatov modeliranja\n",
"\n",
"Zdaj je čas, da to vidimo vizualno 📈. Ustvarili bomo razpršen diagram vseh vrednosti `y` in `bmi` iz testnega nabora, nato pa uporabili napovedi za risanje črte na najbolj ustreznem mestu med skupinami podatkov modela.\n",
"\n",
"R ima več sistemov za izdelavo grafov, vendar je `ggplot2` eden najbolj elegantnih in najbolj vsestranskih. Omogoča vam sestavljanje grafov z **združevanjem neodvisnih 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": [
"✅ Malo razmislite, kaj se tukaj dogaja. Ravna črta poteka skozi številne majhne točke podatkov, vendar kaj točno počne? Ali vidite, kako bi morali biti sposobni uporabiti to črto za napovedovanje, kje bi se nova, nevidena podatkovna točka morala uvrstiti glede na y-os grafa? Poskusite z besedami opisati praktično uporabo tega modela.\n",
"\n",
"Čestitke, zgradili ste svoj prvi model linearne regresije, z njim ustvarili napoved in jo prikazali na grafu!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
]
}
]
}