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
17 KiB
447 lines
17 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-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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Piešinys @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Piešinys @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Įrankių rinkinio paruošimas\n",
|
|
"\n",
|
|
"Šiai užduočiai mums reikės šių paketų:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) yra [R paketų rinkinys](https://www.tidyverse.org/packages), sukurtas tam, kad duomenų mokslas būtų greitesnis, paprastesnis ir įdomesnis!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) sistema yra [paketų rinkinys](https://www.tidymodels.org/packages/) modeliavimui ir mašininio mokymosi užduotims.\n",
|
|
"\n",
|
|
"Juos galite įdiegti naudodami šią komandą:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Žemiau pateiktas skriptas patikrina, ar turite visus reikalingus paketus šiam moduliui atlikti, ir, jei kai kurių trūksta, juos įdiegia.\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": [
|
|
"Dabar įkelkime šiuos nuostabius paketus ir padarykime juos prieinamus dabartinėje R sesijoje. (Tai tik iliustracija, `pacman::p_load()` jau tai padarė už jus)\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. Diabeto duomenų rinkinys\n",
|
|
"\n",
|
|
"Šiame pratime pademonstruosime savo regresijos įgūdžius, prognozuodami diabeto duomenų rinkinio pagrindu. [Diabeto duomenų rinkinys](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) apima `442 pavyzdžius` duomenų apie diabetą, su 10 prognozuojamųjų kintamųjų: `amžius`, `lytis`, `kūno masės indeksas`, `vidutinis kraujo spaudimas` ir `šeši kraujo serumo matavimai`, taip pat rezultato kintamąjį `y`: kiekybinį ligos progresavimo matą praėjus vieneriems metams po pradinio taško.\n",
|
|
"\n",
|
|
"|Stebėjimų skaičius|442|\n",
|
|
"|------------------|:---|\n",
|
|
"|Prognozuojamųjų kintamųjų skaičius|Pirmos 10 skiltelių yra skaitiniai prognozuojamieji|\n",
|
|
"|Rezultatas/Tikslas|11-oji skiltis yra kiekybinis ligos progresavimo matas praėjus vieneriems metams po pradinio taško|\n",
|
|
"|Prognozuojamųjų kintamųjų informacija|- amžius metais\n",
|
|
"||- lytis\n",
|
|
"||- kūno masės indeksas (bmi)\n",
|
|
"||- vidutinis kraujo spaudimas (bp)\n",
|
|
"||- s1 tc, bendras serumo cholesterolis\n",
|
|
"||- s2 ldl, mažo tankio lipoproteinai\n",
|
|
"||- s3 hdl, didelio tankio lipoproteinai\n",
|
|
"||- s4 tch, bendras cholesterolis / HDL\n",
|
|
"||- s5 ltg, galbūt serumo trigliceridų lygio logaritmas\n",
|
|
"||- s6 glu, kraujo cukraus lygis|\n",
|
|
"\n",
|
|
"> 🎓 Atminkite, tai yra prižiūrimas mokymasis, todėl mums reikia pavadinto 'y' tikslo.\n",
|
|
"\n",
|
|
"Prieš manipuliuodami duomenimis su R, turite importuoti duomenis į R atmintį arba sukurti ryšį su duomenimis, kad R galėtų pasiekti duomenis nuotoliniu būdu.\n",
|
|
"\n",
|
|
"> [readr](https://readr.tidyverse.org/) paketas, kuris yra Tidyverse dalis, suteikia greitą ir patogų būdą skaityti stačiakampius duomenis į R.\n",
|
|
"\n",
|
|
"Dabar įkelsime diabeto duomenų rinkinį iš šio šaltinio URL: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Taip pat atliksime duomenų patikrinimą naudodami `glimpse()` ir parodysime pirmas 5 eilutes naudodami `slice()`.\n",
|
|
"\n",
|
|
"Prieš tęsdami, pristatykime dar vieną dalyką, kurį dažnai sutiksite R kode 🥁🥁: vamzdžio operatorių `%>%`\n",
|
|
"\n",
|
|
"Vamzdžio operatorius (`%>%`) atlieka operacijas logine seka, perduodamas objektą į priekį į funkciją arba iškvietimo išraišką. Galite galvoti apie vamzdžio operatorių kaip sakantį \"ir tada\" jūsų kode.\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()` parodo, kad šie duomenys turi 442 eilutes ir 11 stulpelių, kurių visi stulpeliai yra duomenų tipo `double`.\n",
|
|
"\n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<br>\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"
|
|
]
|
|
}
|
|
]
|
|
} |