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
16 KiB
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-04T07:08:02+00:00",
|
|
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
|
|
"language_code": "hr"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "YJUHCXqK57yz"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Uvod u regresiju - Lekcija 1\n",
|
|
"\n",
|
|
"#### Stavljanje u perspektivu\n",
|
|
"\n",
|
|
"✅ Postoji mnogo vrsta regresijskih metoda, a koju ćete odabrati ovisi o odgovoru koji tražite. Ako želite predvidjeti vjerojatnu visinu osobe određene dobi, koristili biste `linearnu regresiju`, jer tražite **numeričku vrijednost**. Ako vas zanima otkrivanje treba li određena vrsta kuhinje biti smatrana veganskom ili ne, tražite **dodjelu kategorije**, pa biste koristili `logističku regresiju`. O logističkoj regresiji ćete više naučiti kasnije. Razmislite malo o pitanjima koja možete postaviti podacima i koja bi od ovih metoda bila prikladnija.\n",
|
|
"\n",
|
|
"U ovom dijelu radit ćete s [malim skupom podataka o dijabetesu](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Zamislite da želite testirati tretman za pacijente s dijabetesom. Modeli strojnog učenja mogli bi vam pomoći odrediti koji bi pacijenti bolje reagirali na tretman, na temelju kombinacija varijabli. Čak i vrlo osnovni regresijski model, kada se vizualizira, mogao bi pokazati informacije o varijablama koje bi vam pomogle organizirati vaše teorijske kliničke studije.\n",
|
|
"\n",
|
|
"S tim rečenim, krenimo na ovaj zadatak!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Umjetničko djelo @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Umjetničko djelo @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Učitavanje našeg alata\n",
|
|
"\n",
|
|
"Za ovaj zadatak trebat će nam sljedeći paketi:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka R paketa](https://www.tidyverse.org/packages) osmišljena kako bi znanost o podacima učinila bržom, jednostavnijom i zabavnijom!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) okvir je [zbirka paketa](https://www.tidymodels.org/packages/) za modeliranje i strojno učenje.\n",
|
|
"\n",
|
|
"Možete ih instalirati pomoću:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Skripta ispod provjerava imate li potrebne pakete za dovršetak ovog modula i instalira ih za vas ako neki nedostaju.\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": [
|
|
"Sada učitajmo ove sjajne pakete i učinimo ih dostupnima u našoj trenutnoj R sesiji. (Ovo je samo za ilustraciju, `pacman::p_load()` je to već učinio za 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. Skup podataka o dijabetesu\n",
|
|
"\n",
|
|
"U ovom zadatku pokazat ćemo svoje vještine regresije predviđanjem na skupu podataka o dijabetesu. [Skup podataka o dijabetesu](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) uključuje `442 uzorka` podataka vezanih uz dijabetes, s 10 prediktorskih značajki: `dob`, `spol`, `indeks tjelesne mase`, `prosječni krvni tlak` i `šest mjerenja krvnog seruma`, kao i izlaznu varijablu `y`: kvantitativnu mjeru napredovanja bolesti godinu dana nakon početne točke.\n",
|
|
"\n",
|
|
"|Broj opažanja|442|\n",
|
|
"|----------------------|:---|\n",
|
|
"|Broj prediktora|Prvih 10 stupaca su numerički prediktori|\n",
|
|
"|Izlaz/Cilj|Stupac 11 je kvantitativna mjera napredovanja bolesti godinu dana nakon početne točke|\n",
|
|
"|Informacije o prediktorima|- dob u godinama\n",
|
|
"||- spol\n",
|
|
"||- bmi indeks tjelesne mase\n",
|
|
"||- bp prosječni krvni tlak\n",
|
|
"||- s1 tc, ukupni serum kolesterol\n",
|
|
"||- s2 ldl, lipoproteini niske gustoće\n",
|
|
"||- s3 hdl, lipoproteini visoke gustoće\n",
|
|
"||- s4 tch, ukupni kolesterol / HDL\n",
|
|
"||- s5 ltg, vjerojatno logaritamska vrijednost razine triglicerida u serumu\n",
|
|
"||- s6 glu, razina šećera u krvi|\n",
|
|
"\n",
|
|
"> 🎓 Zapamtite, ovo je nadzirano učenje, i trebamo ciljani 'y'.\n",
|
|
"\n",
|
|
"Prije nego što možete manipulirati podacima u R-u, morate učitati podatke u memoriju R-a ili uspostaviti vezu s podacima koju R može koristiti za daljinski pristup podacima.\n",
|
|
"\n",
|
|
"> Paket [readr](https://readr.tidyverse.org/), koji je dio Tidyverse-a, pruža brz i jednostavan način za učitavanje pravokutnih podataka u R.\n",
|
|
"\n",
|
|
"Sada ćemo učitati skup podataka o dijabetesu s ove izvorne URL adrese: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Također ćemo provesti provjeru podataka pomoću `glimpse()` i prikazati prvih 5 redaka pomoću `slice()`.\n",
|
|
"\n",
|
|
"Prije nego što nastavimo dalje, predstavit ćemo nešto što ćete često susretati u R kodu 🥁🥁: operator cijevi `%>%`\n",
|
|
"\n",
|
|
"Operator cijevi (`%>%`) omogućuje izvođenje operacija u logičnom slijedu tako što prosljeđuje objekt funkciji ili izrazu poziva. Možete razmišljati o operatoru cijevi kao da u kodu kaže \"i onda\".\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 pokazuje da ovaj skup podataka ima 442 retka i 11 stupaca, pri čemu su svi stupci tipa podataka `double`.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> glimpse() i slice() su funkcije u [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, dio Tidyverse-a, je gramatika manipulacije podacima koja pruža dosljedan skup glagola koji vam pomažu riješiti najčešće izazove manipulacije podacima.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"Sada kada imamo podatke, usmjerit ćemo se na jednu značajku (`bmi`) koju ćemo koristiti za ovu vježbu. To će zahtijevati odabir željenih stupaca. Dakle, kako to možemo učiniti?\n",
|
|
"\n",
|
|
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nam omogućuje *odabir* (i opcionalno preimenovanje) stupaca u podatkovnom 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. Podaci za treniranje i testiranje\n",
|
|
"\n",
|
|
"U nadziranom učenju uobičajena je praksa *podijeliti* podatke u dva podskupa; (obično veći) skup za treniranje modela i manji \"rezervni\" skup za provjeru kako se model ponašao.\n",
|
|
"\n",
|
|
"Sada kada imamo pripremljene podatke, možemo vidjeti može li nam stroj pomoći odrediti logičnu podjelu između brojeva u ovom skupu podataka. Možemo koristiti paket [rsample](https://tidymodels.github.io/rsample/), koji je dio Tidymodels okvira, za stvaranje objekta koji sadrži informacije o *načinu* podjele podataka, a zatim još dvije rsample funkcije za izdvajanje kreiranih skupova za treniranje i testiranje:\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. Treniranje modela linearne regresije s Tidymodels\n",
|
|
"\n",
|
|
"Sada smo spremni za treniranje našeg modela!\n",
|
|
"\n",
|
|
"U Tidymodels-u, modeli se specificiraju pomoću `parsnip()` tako da se definiraju tri koncepta:\n",
|
|
"\n",
|
|
"- **Tip** modela razlikuje modele poput linearne regresije, logističke regresije, modela stabla odluke i slično.\n",
|
|
"\n",
|
|
"- **Način rada** modela uključuje uobičajene opcije poput regresije i klasifikacije; neki tipovi modela podržavaju obje opcije, dok neki imaju samo jedan način rada.\n",
|
|
"\n",
|
|
"- **Pogon** modela je računalni alat koji će se koristiti za prilagodbu modela. Često su to R paketi, poput **`\"lm\"`** ili **`\"ranger\"`**.\n",
|
|
"\n",
|
|
"Ove informacije o modeliranju pohranjuju se u specifikaciji modela, pa krenimo izraditi jednu!\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": [
|
|
"Nakon što je model *definiran*, model se može `procijeniti` ili `trenirati` pomoću funkcije [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), obično koristeći formulu i neke podatke.\n",
|
|
"\n",
|
|
"`y ~ .` znači da ćemo prilagoditi `y` kao predviđenu vrijednost/cilj, objašnjen svim prediktorima/značajkama, tj. `.` (u ovom slučaju imamo samo jedan 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": [
|
|
"Iz modela izlaznih podataka možemo vidjeti koeficijente naučene tijekom treninga. Oni predstavljaju koeficijente pravca najbolje prilagodbe koji nam daje najmanju ukupnu pogrešku između stvarne i predviđene varijable.\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"## 5. Predviđanje na testnom skupu\n",
|
|
"\n",
|
|
"Sada kada smo istrenirali model, možemo ga koristiti za predviđanje progresije bolesti y za testni skup podataka koristeći [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Ovo će se koristiti za povlačenje linije između skupina podataka.\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": [
|
|
"Jupi! 💃🕺 Upravo smo istrenirali model i koristili ga za predviđanja!\n",
|
|
"\n",
|
|
"Kod izrade predviđanja, konvencija tidymodels-a je uvijek proizvesti tibble/data frame s rezultatima koji imaju standardizirana imena stupaca. To olakšava kombiniranje originalnih podataka i predviđanja u korisnom formatu za daljnje operacije poput grafičkog prikaza.\n",
|
|
"\n",
|
|
"`dplyr::bind_cols()` učinkovito spaja više data frame-ova po stupcima.\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 rezultata modeliranja\n",
|
|
"\n",
|
|
"Sada je vrijeme da to vidimo vizualno 📈. Napravit ćemo scatter plot svih vrijednosti `y` i `bmi` iz testnog skupa, a zatim ćemo koristiti predikcije za crtanje linije na najprikladnijem mjestu, između grupiranja podataka modela.\n",
|
|
"\n",
|
|
"R ima nekoliko sustava za izradu grafova, ali `ggplot2` je jedan od najelegantnijih i najsvestranijih. Omogućuje vam sastavljanje grafova **kombiniranjem neovisnih komponenti**.\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": [
|
|
"✅ Razmislite malo o tome što se ovdje događa. Ravna linija prolazi kroz mnogo malih točaka podataka, ali što točno radi? Možete li vidjeti kako biste trebali moći koristiti ovu liniju za predviđanje gdje bi nova, neviđena točka podataka trebala odgovarati u odnosu na y os grafikona? Pokušajte riječima opisati praktičnu primjenu ovog modela.\n",
|
|
"\n",
|
|
"Čestitamo, izgradili ste svoj prvi model linearne regresije, napravili predviđanje s njim i prikazali ga na grafikonu!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zrPtHIxx_tNI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda.\n"
|
|
]
|
|
}
|
|
]
|
|
} |