{ "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-06T11:52:53+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "ro" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Introducere în Regresie - Lecția 1\n", "\n", "#### Punând lucrurile în perspectivă\n", "\n", "✅ Există multe tipuri de metode de regresie, iar pe care o alegi depinde de răspunsul pe care îl cauți. Dacă vrei să prezici înălțimea probabilă a unei persoane de o anumită vârstă, ai folosi `regresia liniară`, deoarece cauți o **valoare numerică**. Dacă ești interesat să descoperi dacă un anumit tip de bucătărie ar trebui considerat vegan sau nu, cauți o **încadrare în categorie**, așa că ai folosi `regresia logistică`. Vei învăța mai multe despre regresia logistică mai târziu. Gândește-te puțin la câteva întrebări pe care le poți adresa datelor și care dintre aceste metode ar fi mai potrivită.\n", "\n", "În această secțiune, vei lucra cu un [set mic de date despre diabet](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imaginează-ți că vrei să testezi un tratament pentru pacienții diabetici. Modelele de Machine Learning te-ar putea ajuta să determini care pacienți ar răspunde mai bine la tratament, pe baza combinațiilor de variabile. Chiar și un model de regresie foarte simplu, atunci când este vizualizat, ar putea dezvălui informații despre variabile care te-ar ajuta să îți organizezi studiile clinice teoretice.\n", "\n", "Așadar, să începem această sarcină!\n", "\n", "

\n", " \n", "

Lucrare artistică de @allison_horst
\n", "\n", "\n" ], "metadata": { "id": "LWNNzfqd6feZ" } }, { "cell_type": "markdown", "source": [ "## 1. Încărcarea setului nostru de instrumente\n", "\n", "Pentru această sarcină, vom avea nevoie de următoarele pachete:\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) este o [colecție de pachete R](https://www.tidyverse.org/packages) concepută pentru a face știința datelor mai rapidă, mai ușoară și mai distractivă!\n", "\n", "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) este un cadru format dintr-o [colecție de pachete](https://www.tidymodels.org/packages/) pentru modelare și învățare automată.\n", "\n", "Le poți instala folosind comanda:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n", "\n", "Scriptul de mai jos verifică dacă ai pachetele necesare pentru a finaliza acest modul și le instalează pentru tine în cazul în care lipsesc.\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": [ "Acum, să încărcăm aceste pachete grozave și să le facem disponibile în sesiunea noastră curentă de R. (Aceasta este doar pentru ilustrare, `pacman::p_load()` a făcut deja asta pentru tine)\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. Setul de date despre diabet\n", "\n", "În acest exercițiu, ne vom demonstra abilitățile de regresie prin realizarea de predicții pe un set de date despre diabet. [Setul de date despre diabet](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) include `442 de eșantioane` de date legate de diabet, cu 10 variabile predictive, `vârsta`, `sexul`, `indicele de masă corporală`, `tensiunea arterială medie` și `șase măsurători ale serului sanguin`, precum și o variabilă de rezultat `y`: o măsură cantitativă a progresiei bolii la un an după momentul de referință.\n", "\n", "|Număr de observații|442|\n", "|-------------------|:---|\n", "|Număr de predictori|Primele 10 coloane sunt predictive numerice|\n", "|Rezultat/Țintă|Coloana 11 este o măsură cantitativă a progresiei bolii la un an după momentul de referință|\n", "|Informații despre predictori|- vârsta în ani\n", "||- sexul\n", "||- bmi indicele de masă corporală\n", "||- bp tensiunea arterială medie\n", "||- s1 tc, colesterol seric total\n", "||- s2 ldl, lipoproteine cu densitate mică\n", "||- s3 hdl, lipoproteine cu densitate mare\n", "||- s4 tch, colesterol total / HDL\n", "||- s5 ltg, posibil logaritmul nivelului de trigliceride serice\n", "||- s6 glu, nivelul zahărului din sânge|\n", "\n", "> 🎓 Amintește-ți, acesta este un proces de învățare supravegheată, și avem nevoie de o țintă numită 'y'.\n", "\n", "Înainte de a putea manipula datele cu R, trebuie să importăm datele în memoria R sau să construim o conexiune către datele pe care R le poate folosi pentru a accesa datele de la distanță.\n", "\n", "> Pachetul [readr](https://readr.tidyverse.org/), care face parte din Tidyverse, oferă o modalitate rapidă și prietenoasă de a citi datele în format rectangular în R.\n", "\n", "Acum, să încărcăm setul de date despre diabet furnizat la acest URL sursă: \n", "\n", "De asemenea, vom efectua o verificare de bază a datelor noastre folosind `glimpse()` și vom afișa primele 5 rânduri folosind `slice()`.\n", "\n", "Înainte de a merge mai departe, să introducem ceva ce vei întâlni frecvent în codul R 🥁🥁: operatorul pipe `%>%`\n", "\n", "Operatorul pipe (`%>%`) efectuează operațiuni într-o secvență logică, trecând un obiect mai departe într-o funcție sau expresie de apel. Poți considera operatorul pipe ca echivalentul expresiei \"și apoi\" în codul tău.\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()` ne arată că acest set de date are 442 rânduri și 11 coloane, toate fiind de tipul de date `double`.\n", "\n", "
\n", "\n", "> glimpse() și slice() sunt funcții din [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, parte din Tidyverse, este o gramatică pentru manipularea datelor care oferă un set consistent de verbe ce te ajută să rezolvi cele mai comune provocări legate de manipularea datelor.\n", "\n", "
\n", "\n", "Acum că avem datele, să ne concentrăm pe o singură caracteristică (`bmi`) pentru acest exercițiu. Acest lucru va necesita să selectăm coloanele dorite. Deci, cum facem acest lucru?\n", "\n", "[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ne permite să *selectăm* (și opțional să redenumim) coloanele dintr-un cadru de date.\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. Date de antrenament și testare\n", "\n", "Este o practică obișnuită în învățarea supravegheată să *împărțim* datele în două subseturi: un set (de obicei mai mare) cu care să antrenăm modelul și un set mai mic „de rezervă” cu care să vedem cum s-a comportat modelul.\n", "\n", "Acum că avem datele pregătite, putem verifica dacă o mașinărie poate ajuta la determinarea unei împărțiri logice între numerele din acest set de date. Putem folosi pachetul [rsample](https://tidymodels.github.io/rsample/), care face parte din cadrul Tidymodels, pentru a crea un obiect care conține informații despre *cum* să împărțim datele, și apoi două funcții rsample suplimentare pentru a extrage seturile de antrenament și testare create:\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. Antrenează un model de regresie liniară cu Tidymodels\n", "\n", "Acum suntem pregătiți să ne antrenăm modelul!\n", "\n", "În Tidymodels, modelele sunt specificate folosind `parsnip()` prin definirea a trei concepte:\n", "\n", "- **Tipul** modelului diferențiază între modele precum regresia liniară, regresia logistică, modelele de arbori de decizie și altele.\n", "\n", "- **Modul** modelului include opțiuni comune precum regresia și clasificarea; unele tipuri de modele suportă ambele moduri, în timp ce altele au doar un singur mod.\n", "\n", "- **Motorul** modelului este instrumentul computațional care va fi utilizat pentru ajustarea modelului. Adesea, acestea sunt pachete R, cum ar fi **`\"lm\"`** sau **`\"ranger\"`**.\n", "\n", "Aceste informații despre model sunt capturate într-o specificație de model, așa că hai să construim una!\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": [ "După ce un model a fost *specificat*, acesta poate fi `estimat` sau `antrenat` folosind funcția [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), de obicei utilizând o formulă și niște date.\n", "\n", "`y ~ .` înseamnă că vom ajusta `y` ca fiind cantitatea/ținta prezisă, explicată de toți predictorii/caracteristicile, adică `.` (în acest caz, avem doar un predictor: `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": [ "Din rezultatele modelului, putem observa coeficienții învățați în timpul antrenării. Aceștia reprezintă coeficienții liniei de ajustare optimă care ne oferă cea mai mică eroare totală între variabila reală și cea prezisă.\n", "
\n", "\n", "## 5. Realizați predicții pe setul de testare\n", "\n", "Acum că am antrenat un model, îl putem folosi pentru a prezice progresia bolii y pentru setul de date de testare utilizând [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Acesta va fi folosit pentru a trasa linia între grupurile de date.\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": [ "Ura! 💃🕺 Tocmai am antrenat un model și l-am folosit pentru a face predicții!\n", "\n", "Când facem predicții, convenția tidymodels este să producem întotdeauna un tibble/data frame de rezultate cu nume de coloane standardizate. Acest lucru face ușoară combinarea datelor originale cu predicțiile într-un format utilizabil pentru operațiuni ulterioare, cum ar fi realizarea de grafice.\n", "\n", "`dplyr::bind_cols()` leagă eficient mai multe cadre de date pe coloane.\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. Vizualizarea rezultatelor modelului\n", "\n", "Acum este momentul să vedem acest lucru vizual 📈. Vom crea un grafic scatter cu toate valorile `y` și `bmi` din setul de testare, apoi vom folosi predicțiile pentru a trasa o linie în locul cel mai potrivit, între grupările de date ale modelului.\n", "\n", "R are mai multe sisteme pentru realizarea graficelor, dar `ggplot2` este unul dintre cele mai elegante și mai versatile. Acesta îți permite să compui grafice prin **combinarea componentelor independente**.\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": [ "> ✅ Gândește-te puțin la ce se întâmplă aici. O linie dreaptă trece prin multe puncte mici de date, dar ce face exact? Poți observa cum ar trebui să poți folosi această linie pentru a prezice unde ar trebui să se încadreze un nou punct de date nevăzut în raport cu axa y a graficului? Încearcă să exprimi în cuvinte utilizarea practică a acestui model.\n", "\n", "Felicitări, ai construit primul tău model de regresie liniară, ai realizat o predicție cu acesta și ai afișat-o într-un grafic!\n" ], "metadata": { "id": "zrPtHIxx_tNI" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" ] } ] }