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

449 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-10-11T12:20:00+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "et"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Koosta regressioonimudel: Alusta R-i ja Tidymodelsiga regressioonimudelite jaoks\n"
],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Sissejuhatus regressiooni - Õppetund 1\n",
"\n",
"#### Paneme selle perspektiivi\n",
"\n",
"✅ Regressioonimeetodeid on mitut tüüpi ja millise valite, sõltub vastusest, mida otsite. Kui soovite ennustada tõenäolist pikkust teatud vanuses inimese jaoks, kasutaksite `lineaarset regressiooni`, kuna otsite **arvväärtust**. Kui olete huvitatud avastamast, kas teatud köögitüüp peaks olema vegan või mitte, otsite **kategooria määramist**, seega kasutaksite `logistilist regressiooni`. Logistilisest regressioonist õpite hiljem rohkem. Mõelge veidi küsimustele, mida saate andmetelt küsida, ja milline neist meetoditest oleks sobivam.\n",
"\n",
"Selles osas töötate [väikese diabeedi andmestikuga](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Kujutage ette, et soovite testida ravi diabeediga patsientide jaoks. Masinõppe mudelid võivad aidata teil kindlaks teha, millised patsiendid reageeriksid ravile paremini, tuginedes muutujate kombinatsioonidele. Isegi väga lihtne regressioonimudel, kui seda visualiseerida, võib näidata teavet muutujate kohta, mis aitaksid teil korraldada teoreetilisi kliinilisi katseid.\n",
"\n",
"Sellega öeldes, alustame selle ülesandega!\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/encouRage.e75d5fe0367fb913.webp\"\n",
" width=\"630\"/>\n",
" <figcaption>Kunstiteos: @allison_horst</figcaption>\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Tööriistakomplekti laadimine\n",
"\n",
"Selle ülesande jaoks vajame järgmisi pakette:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) on [R-pakettide kogum](https://www.tidyverse.org/packages), mis on loodud andmeteaduse kiiremaks, lihtsamaks ja lõbusamaks muutmiseks!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) raamistik on [pakettide kogum](https://www.tidymodels.org/packages/), mis on mõeldud modelleerimiseks ja masinõppeks.\n",
"\n",
"Saate need paigaldada järgmiselt:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Allolev skript kontrollib, kas teil on selle mooduli täitmiseks vajalikud paketid olemas, ja paigaldab need, kui mõni neist puudub.\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": [
"Nüüd laadime need suurepärased paketid ja teeme need meie praeguses R-i sessioonis kättesaadavaks. (See on lihtsalt illustratsiooniks, `pacman::p_load()` tegi seda juba teie eest)\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. Diabeedi andmestik\n",
"\n",
"Selles harjutuses rakendame oma regressioonioskusi, tehes ennustusi diabeedi andmestiku põhjal. [Diabeedi andmestik](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) sisaldab `442 näidist` diabeediga seotud andmeid, kus on 10 ennustavat tunnust, nagu `vanus`, `sugu`, `kehamassiindeks`, `keskmine vererõhk` ja `kuus vere seerumi mõõtmist`, ning tulemuse muutuja `y`: kvantitatiivne näitaja haiguse progresseerumisest üks aasta pärast algtaset.\n",
"\n",
"|Vaatluste arv|442|\n",
"|----------------------|:---|\n",
"|Ennustavate tunnuste arv|Esimesed 10 veergu on numbrilised ennustavad tunnused|\n",
"|Tulemus/Sihtmärk|11. veerg on kvantitatiivne näitaja haiguse progresseerumisest üks aasta pärast algtaset|\n",
"|Ennustavate tunnuste info|- vanus aastates\n",
"||- sugu\n",
"||- bmi kehamassiindeks\n",
"||- bp keskmine vererõhk\n",
"||- s1 tc, kogu seerumi kolesterool\n",
"||- s2 ldl, madala tihedusega lipoproteiinid\n",
"||- s3 hdl, kõrge tihedusega lipoproteiinid\n",
"||- s4 tch, kogu kolesterool / HDL\n",
"||- s5 ltg, tõenäoliselt seerumi triglütseriidide taseme logaritm\n",
"||- s6 glu, veresuhkru tase|\n",
"\n",
"\n",
"\n",
"> 🎓 Pea meeles, et see on juhendatud õpe ja meil on vaja nimetatud sihtmärki 'y'.\n",
"\n",
"Enne kui saad R-is andmeid manipuleerida, pead andmed importima R-i mällu või looma ühenduse andmetega, mida R saab kasutada andmete kaugjuurdepääsuks.\n",
"\n",
"> [readr](https://readr.tidyverse.org/) pakett, mis on osa Tidyverse'ist, pakub kiiret ja kasutajasõbralikku viisi ristkülikukujuliste andmete lugemiseks R-i.\n",
"\n",
"Nüüd laadime diabeedi andmestiku, mis on saadaval sellel URL-il: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Samuti teeme andmetele kontrolli `glimpse()` abil ja kuvame esimesed 5 rida `slice()` abil.\n",
"\n",
"Enne kui edasi liigume, tutvustame midagi, mida kohtad R-i koodis sageli 🥁🥁: toruoperaatorit `%>%`\n",
"\n",
"Toruoperaator (`%>%`) teostab toiminguid loogilises järjestuses, edastades objekti edasi funktsiooni või väljendisse. Toruoperaatorit võib mõelda kui \"ja siis\" sinu koodis.\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äitab meile, et andmetes on 442 rida ja 11 veergu, kus kõik veerud on andmetüüpi `double`.\n",
"\n",
"<br>\n",
"\n",
"> glimpse() ja slice() on funktsioonid [`dplyr`](https://dplyr.tidyverse.org/) paketis. Dplyr, mis on osa Tidyverse'ist, on andmete manipuleerimise grammatika, mis pakub ühtset komplekti tegusõnu, mis aitavad lahendada kõige tavalisemaid andmete manipuleerimise väljakutseid.\n",
"\n",
"<br>\n",
"\n",
"Nüüd, kui meil on andmed olemas, keskendume ühele tunnusele (`bmi`), mida sihtida selles harjutuses. Selleks peame valima soovitud veerud. Kuidas seda teha?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) võimaldab meil *valida* (ja soovi korral ümber nimetada) veerge andmeraamis.\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. Treening- ja testimisandmed\n",
"\n",
"Juhendatud õppimises on tavaks *jagada* andmed kaheks alamhulgaks: (tavaliselt suurem) komplekt, millega mudelit treenitakse, ja väiksem \"tagasihoitud\" komplekt, millega hinnatakse, kuidas mudel toimis.\n",
"\n",
"Nüüd, kui andmed on valmis, saame vaadata, kas masin suudab aidata määrata loogilise jaotuse selle andmestiku numbrite vahel. Selleks saame kasutada [rsample](https://tidymodels.github.io/rsample/) paketti, mis on osa Tidymodels raamistikust, et luua objekt, mis sisaldab teavet selle kohta, *kuidas* andmed jagada, ning seejärel kasutada kahte rsample funktsiooni, et eraldada loodud treening- ja testimiskomplektid:\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. Treeni lineaarse regressiooni mudel Tidymodelsiga\n",
"\n",
"Nüüd oleme valmis oma mudelit treenima!\n",
"\n",
"Tidymodelsis määratakse mudelid `parsnip()` abil, määratledes kolm kontseptsiooni:\n",
"\n",
"- Mudeli **tüüp** eristab mudeleid, nagu lineaarne regressioon, logistiline regressioon, otsustuspuu mudelid ja nii edasi.\n",
"\n",
"- Mudeli **režiim** sisaldab tavalisi valikuid, nagu regressioon ja klassifikatsioon; mõned mudelitüübid toetavad mõlemat, samas kui mõned ainult ühte režiimi.\n",
"\n",
"- Mudeli **mootor** on arvutuslik tööriist, mida kasutatakse mudeli sobitamiseks. Sageli on need R-i paketid, nagu **`\"lm\"`** või **`\"ranger\"`**\n",
"\n",
"See modelleerimisteave salvestatakse mudeli spetsifikatsioonis, nii et loome selle!\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": [
"Pärast seda, kui mudel on *määratletud*, saab mudelit `hinnata` või `treenida` funktsiooni [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) abil, tavaliselt kasutades valemit ja mõningaid andmeid.\n",
"\n",
"`y ~ .` tähendab, et me sobitame `y` ennustatava suuruse/eesmärgina, mida selgitavad kõik ennustajad/tunnused ehk `.` (antud juhul on meil ainult üks ennustaja: `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": [
"Mudeli väljundist näeme treeningu käigus õpitud koefitsiente. Need esindavad parima sobivusega joone koefitsiente, mis annavad meile tegeliku ja prognoositud muutuja vahelise väikseima üldise vea.\n",
"<br>\n",
"\n",
"## 5. Ennustuste tegemine testandmestikul\n",
"\n",
"Nüüd, kui oleme mudeli treeninud, saame seda kasutada haiguse progresseerumise y ennustamiseks testandmestiku põhjal, kasutades [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Seda kasutatakse andmegruppide vahelise joone joonistamiseks.\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": [
"Jee! 💃🕺 Me just treenisime mudelit ja kasutasime seda ennustuste tegemiseks!\n",
"\n",
"Ennustuste tegemisel on tidymodels'i tava alati luua tulemuste tibble/andmeraamistik standardiseeritud veerunimedega. See muudab algandmete ja ennustuste kombineerimise lihtsaks kasutatavasse formaati edasisteks toiminguteks, nagu näiteks graafikute loomine.\n",
"\n",
"`dplyr::bind_cols()` ühendab tõhusalt mitu andmeraamistikku veergude kaupa.\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. Modelleerimistulemuste visualiseerimine\n",
"\n",
"Nüüd on aeg seda visuaalselt näha 📈. Loome hajuvusdiagrammi kõigist testkomplekti `y` ja `bmi` väärtustest ning kasutame ennustusi, et joonistada joon kõige sobivamasse kohta mudeli andmegruppide vahel.\n",
"\n",
"R-il on mitu süsteemi graafikute loomiseks, kuid `ggplot2` on üks elegantsemaid ja mitmekülgsemaid. See võimaldab graafikuid koostada, **ühendades sõltumatuid komponente**.\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": [
"> ✅ Mõtle veidi, mis siin toimub. Sirgjoon läbib paljusid väikeseid andmepunkte, aga mida see täpselt teeb? Kas sa näed, kuidas saaksid seda joont kasutada, et ennustada, kuhu uus, seni nägemata andmepunkt peaks graafiku y-telje suhtes sobituma? Proovi sõnastada selle mudeli praktiline kasutus.\n",
"\n",
"Palju õnne, sa ehitasid oma esimese lineaarse regressioonimudeli, tegid sellega ennustuse ja kuvad selle graafikul!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.\n"
]
}
]
}