{ "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", "
\n",
" \n",
"
\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",
"
\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",
"
\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"
]
}
]
}