{ "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-03T19:41:00+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "lt" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Įvadas į regresiją - Pamoka 1\n", "\n", "#### Įdėkime į kontekstą\n", "\n", "✅ Yra daugybė regresijos metodų, ir kurį pasirinkti priklauso nuo klausimo, į kurį norite atsakyti. Jei norite prognozuoti tikėtiną žmogaus ūgį pagal jo amžių, naudotumėte `linijinę regresiją`, nes ieškote **skaitinės vertės**. Jei jus domina, ar tam tikra virtuvė turėtų būti laikoma veganiška, ieškote **kategorijos priskyrimo**, todėl naudotumėte `logistinę regresiją`. Apie logistinę regresiją sužinosite vėliau. Pagalvokite apie keletą klausimų, kuriuos galite užduoti duomenims, ir kuris iš šių metodų būtų tinkamesnis.\n", "\n", "Šioje dalyje dirbsite su [mažu duomenų rinkiniu apie diabetą](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Įsivaizduokite, kad norėtumėte išbandyti gydymą diabetu sergantiems pacientams. Mašininio mokymosi modeliai galėtų padėti nustatyti, kurie pacientai geriau reaguotų į gydymą, remiantis kintamųjų deriniais. Net ir labai paprastas regresijos modelis, vizualizuotas, galėtų parodyti informaciją apie kintamuosius, kurie padėtų jums organizuoti teorinius klinikinius tyrimus.\n", "\n", "Taigi, pradėkime šią užduotį!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> `glimpse()` ir `slice()` yra funkcijos [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, dalis Tidyverse, yra duomenų manipuliavimo gramatika, kuri suteikia nuoseklų veiksmų rinkinį, padedantį spręsti dažniausiai pasitaikančius duomenų manipuliavimo iššūkius.\n",
"\n",
"
\n",
"\n",
"Dabar, kai turime duomenis, susiaurinkime dėmesį į vieną savybę (`bmi`), kurią naudosime šiam pratimu. Tam reikės pasirinkti norimus stulpelius. Taigi, kaip tai padaryti?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) leidžia mums *pasirinkti* (ir, jei reikia, pervadinti) stulpelius duomenų rėmelyje.\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. Mokymo ir testavimo duomenys\n",
"\n",
"Supervizuoto mokymosi praktikoje įprasta *padalyti* duomenis į du poskyrius: (paprastai didesnį) rinkinį, skirtą modelio mokymui, ir mažesnį „atsarginį“ rinkinį, skirtą patikrinti, kaip modelis veikia.\n",
"\n",
"Dabar, kai turime paruoštus duomenis, galime patikrinti, ar mašina gali padėti nustatyti logišką skirstymą tarp skaičių šiame duomenų rinkinyje. Galime naudoti [rsample](https://tidymodels.github.io/rsample/) paketą, kuris yra Tidymodels sistemos dalis, kad sukurtume objektą, kuriame būtų informacija apie *kaip* padalyti duomenis, o tada dar dvi rsample funkcijas, kad išgautume sukurtus mokymo ir testavimo rinkinius:\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. Treniruokite linijinės regresijos modelį su Tidymodels\n",
"\n",
"Dabar esame pasiruošę treniruoti savo modelį!\n",
"\n",
"Tidymodels sistemoje modeliai apibrėžiami naudojant `parsnip()` ir nurodant tris pagrindinius aspektus:\n",
"\n",
"- Modelio **tipas** skiria modelius, tokius kaip linijinė regresija, logistinė regresija, sprendimų medžių modeliai ir panašiai.\n",
"\n",
"- Modelio **režimas** apima dažniausiai naudojamas parinktis, tokias kaip regresija ir klasifikacija; kai kurie modelių tipai palaiko abu režimus, o kai kurie turi tik vieną.\n",
"\n",
"- Modelio **variklis** yra skaičiavimo įrankis, kuris bus naudojamas modelio pritaikymui. Dažnai tai yra R paketai, tokie kaip **`\"lm\"`** arba **`\"ranger\"`**\n",
"\n",
"Ši modelio informacija yra užfiksuota modelio specifikacijoje, tad sukurkime ją!\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": [
"Kai modelis yra *nustatytas*, jį galima `įvertinti` arba `treniruoti` naudojant [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) funkciją, paprastai naudojant formulę ir tam tikrus duomenis.\n",
"\n",
"`y ~ .` reiškia, kad mes pritaikysime `y` kaip prognozuojamą dydį/taikinį, paaiškinamą visais prediktoriais/savybėmis, t. y. `.` (šiuo atveju turime tik vieną prediktorių: `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": [
"Iš modelio rezultatų matome koeficientus, išmoktus mokymo metu. Jie atspindi geriausiai tinkančios linijos koeficientus, kurie suteikia mažiausią bendrą klaidą tarp faktinės ir numatytos kintamojo reikšmės.\n",
"
\n",
"\n",
"## 5. Prognozių sudarymas testavimo rinkiniui\n",
"\n",
"Dabar, kai apmokėme modelį, galime jį naudoti ligos progresavimo y prognozėms testavimo duomenų rinkiniui, pasitelkdami [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Tai bus naudojama linijai tarp duomenų grupių nubrėžti.\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": [
"Oho! 💃🕺 Mes ką tik apmokėme modelį ir panaudojome jį prognozėms!\n",
"\n",
"Atliekant prognozes, tidymodels konvencija visada yra pateikti tibble/duomenų rėmelį su standartizuotais stulpelių pavadinimais. Tai leidžia lengvai sujungti pradinius duomenis ir prognozes į patogų formatą tolimesnėms operacijoms, tokioms kaip vizualizavimas.\n",
"\n",
"`dplyr::bind_cols()` efektyviai sujungia kelis duomenų rėmelius stulpeliais.\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. Modeliavimo rezultatų vizualizavimas\n",
"\n",
"Dabar metas tai pamatyti vizualiai 📈. Sukursime sklaidos diagramą, kurioje bus pateiktos visos testų rinkinio `y` ir `bmi` reikšmės, o tada naudosime prognozes, kad nubrėžtume liniją tinkamiausioje vietoje, tarp modelio duomenų grupių.\n",
"\n",
"R turi kelias sistemas grafikai kurti, tačiau `ggplot2` yra viena elegantiškiausių ir universaliausių. Ji leidžia sudaryti grafikus **derinant nepriklausomus komponentus**.\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": [
"✅ Pagalvokite, kas čia vyksta. Tiesi linija eina per daugybę mažų duomenų taškų, bet ką ji iš tikrųjų daro? Ar galite suprasti, kaip ši linija turėtų padėti numatyti, kur naujas, nematytas duomenų taškas turėtų atsidurti santykyje su grafiko y ašimi? Pabandykite žodžiais apibūdinti praktinį šio modelio panaudojimą.\n",
"\n",
"Sveikiname, jūs sukūrėte savo pirmąjį linijinės regresijos modelį, atlikote prognozę su juo ir pavaizdavote ją grafike!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius naudojant šį vertimą.\n"
]
}
]
}