{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_10-R.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "2621e24705e8100893c9bf84e0fc8aef", "translation_date": "2025-09-06T12:40:48+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "ro" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## Introducere în clasificare: Curăță, pregătește și vizualizează datele tale\n", "\n", "În aceste patru lecții, vei explora un aspect fundamental al învățării automate clasice - *clasificarea*. Vom parcurge utilizarea diferitelor algoritmi de clasificare cu un set de date despre toate bucătăriile geniale din Asia și India. Sperăm că ți-e foame!\n", "\n", "

\n", " \n", "

Celebrăm bucătăriile pan-asiatice în aceste lecții! Imagine de Jen Looper
\n", "\n", "\n", "\n", "\n", "Clasificarea este o formă de [învățare supravegheată](https://wikipedia.org/wiki/Supervised_learning) care are multe în comun cu tehnicile de regresie. În clasificare, antrenezi un model pentru a prezice în ce `categorie` se încadrează un element. Dacă învățarea automată se referă la prezicerea valorilor sau denumirilor pentru lucruri folosind seturi de date, atunci clasificarea se împarte, în general, în două grupuri: *clasificare binară* și *clasificare multiclasă*.\n", "\n", "Amintește-ți:\n", "\n", "- **Regresia liniară** te-a ajutat să prezici relațiile dintre variabile și să faci predicții precise despre unde ar putea să se încadreze un nou punct de date în raport cu acea linie. De exemplu, ai putea prezice valori numerice precum *ce preț ar avea un dovleac în septembrie vs. decembrie*.\n", "\n", "- **Regresia logistică** te-a ajutat să descoperi \"categorii binare\": la acest punct de preț, *este acest dovleac portocaliu sau nu-portocaliu*?\n", "\n", "Clasificarea folosește diferiți algoritmi pentru a determina alte moduri de a stabili eticheta sau clasa unui punct de date. Hai să lucrăm cu aceste date despre bucătării pentru a vedea dacă, observând un grup de ingrediente, putem determina originea bucătăriei.\n", "\n", "### [**Chestionar înainte de lecție**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n", "\n", "### **Introducere**\n", "\n", "Clasificarea este una dintre activitățile fundamentale ale cercetătorului în învățare automată și ale specialistului în date. De la clasificarea de bază a unei valori binare (\"este acest email spam sau nu?\"), până la clasificarea și segmentarea complexă a imaginilor folosind viziunea computerizată, este întotdeauna util să poți sorta datele în clase și să pui întrebări despre ele.\n", "\n", "Pentru a exprima procesul într-un mod mai științific, metoda ta de clasificare creează un model predictiv care îți permite să mapezi relația dintre variabilele de intrare și variabilele de ieșire.\n", "\n", "

\n", " \n", "

Probleme binare vs. multiclasă pentru algoritmii de clasificare. Infografic de Jen Looper
\n", "\n", "\n", "\n", "Înainte de a începe procesul de curățare a datelor, vizualizarea lor și pregătirea pentru sarcinile de învățare automată, să învățăm puțin despre diferitele moduri în care învățarea automată poate fi utilizată pentru a clasifica datele.\n", "\n", "Derivată din [statistică](https://wikipedia.org/wiki/Statistical_classification), clasificarea folosind învățarea automată clasică utilizează caracteristici precum `fumător`, `greutate` și `vârstă` pentru a determina *probabilitatea de a dezvolta boala X*. Ca o tehnică de învățare supravegheată similară cu exercițiile de regresie pe care le-ai realizat anterior, datele tale sunt etichetate, iar algoritmii de învățare automată folosesc aceste etichete pentru a clasifica și prezice clasele (sau 'caracteristicile') unui set de date și pentru a le atribui unui grup sau rezultat.\n", "\n", "✅ Ia un moment să îți imaginezi un set de date despre bucătării. Ce ar putea răspunde un model multiclasă? Ce ar putea răspunde un model binar? Ce-ar fi dacă ai vrea să determini dacă o anumită bucătărie este probabil să folosească schinduf? Ce-ar fi dacă ai vrea să vezi dacă, având un cadou constând într-o pungă de cumpărături plină cu anason stelat, anghinare, conopidă și hrean, ai putea crea un fel de mâncare tipic indian?\n", "\n", "### **Salut 'clasificator'**\n", "\n", "Întrebarea pe care vrem să o adresăm acestui set de date despre bucătării este, de fapt, o întrebare **multiclasă**, deoarece avem mai multe bucătării naționale potențiale cu care să lucrăm. Având un lot de ingrediente, în care dintre aceste multe clase se va încadra datele?\n", "\n", "Tidymodels oferă mai mulți algoritmi diferiți pentru a clasifica datele, în funcție de tipul de problemă pe care vrei să o rezolvi. În următoarele două lecții, vei învăța despre câțiva dintre acești algoritmi.\n", "\n", "#### **Prerechizite**\n", "\n", "Pentru această lecție, vom avea nevoie de următoarele pachete pentru a curăța, pregăti și vizualiza datele:\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 [colecție de pachete](https://www.tidymodels.org/packages/) pentru modelare și învățare automată.\n", "\n", "- `DataExplorer`: Pachetul [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) este destinat simplificării și automatizării procesului de explorare a datelor și generării de rapoarte.\n", "\n", "- `themis`: Pachetul [themis](https://themis.tidymodels.org/) oferă pași suplimentari pentru rețete pentru a gestiona datele dezechilibrate.\n", "\n", "Le poți instala astfel:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n", "\n", "Alternativ, 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": "ri5bQxZ-Fz_0" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n", "\r\n", "pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)" ], "outputs": [], "metadata": { "id": "KIPxa4elGAPI" } }, { "cell_type": "markdown", "source": [ "Vom încărca mai târziu aceste pachete grozave și le vom face 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": "YkKAxOJvGD4C" } }, { "cell_type": "markdown", "source": [ "## Exercițiu - curăță și echilibrează datele tale\n", "\n", "Prima sarcină, înainte de a începe acest proiect, este să cureți și să **echilibrezi** datele pentru a obține rezultate mai bune.\n", "\n", "Să facem cunoștință cu datele! 🕵️\n" ], "metadata": { "id": "PFkQDlk0GN5O" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Import data\r\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n", "\r\n", "# View the first 5 rows\r\n", "df %>% \r\n", " slice_head(n = 5)\r\n" ], "outputs": [], "metadata": { "id": "Qccw7okxGT0S" } }, { "cell_type": "markdown", "source": [ "Interesant! Din câte se pare, prima coloană este un fel de coloană `id`. Să obținem puțin mai multe informații despre date.\n" ], "metadata": { "id": "XrWnlgSrGVmR" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Basic information about the data\r\n", "df %>%\r\n", " introduce()\r\n", "\r\n", "# Visualize basic information above\r\n", "df %>% \r\n", " plot_intro(ggtheme = theme_light())" ], "outputs": [], "metadata": { "id": "4UcGmxRxGieA" } }, { "cell_type": "markdown", "source": [ "Din rezultat, putem vedea imediat că avem `2448` rânduri și `385` coloane și `0` valori lipsă. De asemenea, avem 1 coloană discretă, *cuisine*.\n", "\n", "## Exercițiu - învățăm despre tipurile de bucătărie\n", "\n", "Acum începe partea mai interesantă. Haideți să descoperim distribuția datelor, pe tipuri de bucătărie.\n" ], "metadata": { "id": "AaPubl__GmH5" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Count observations per cuisine\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(n)\r\n", "\r\n", "# Plot the distribution\r\n", "theme_set(theme_light())\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n", " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n", " ylab(\"cuisine\")" ], "outputs": [], "metadata": { "id": "FRsBVy5eGrrv" } }, { "cell_type": "markdown", "source": [ "Există un număr finit de bucătării, dar distribuția datelor este inegală. Poți remedia acest lucru! Înainte de a face asta, explorează puțin mai mult.\n", "\n", "În continuare, să atribuim fiecare bucătărie unui tibble individual și să aflăm cât de multe date sunt disponibile (rânduri, coloane) pentru fiecare bucătărie.\n", "\n", "> Un [tibble](https://tibble.tidyverse.org/) este un cadru de date modern.\n", "\n", "

\n", " \n", "

Ilustrație de @allison_horst
\n" ], "metadata": { "id": "vVvyDb1kG2in" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Create individual tibble for the cuisines\r\n", "thai_df <- df %>% \r\n", " filter(cuisine == \"thai\")\r\n", "japanese_df <- df %>% \r\n", " filter(cuisine == \"japanese\")\r\n", "chinese_df <- df %>% \r\n", " filter(cuisine == \"chinese\")\r\n", "indian_df <- df %>% \r\n", " filter(cuisine == \"indian\")\r\n", "korean_df <- df %>% \r\n", " filter(cuisine == \"korean\")\r\n", "\r\n", "\r\n", "# Find out how much data is available per cuisine\r\n", "cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n", " \"japanese df:\", dim(japanese_df), \"\\n\",\r\n", " \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n", " \"indian_df:\", dim(indian_df), \"\\n\",\r\n", " \"korean_df:\", dim(korean_df))" ], "outputs": [], "metadata": { "id": "0TvXUxD3G8Bk" } }, { "cell_type": "markdown", "source": [ "## **Exercițiu - Descoperirea ingredientelor principale pe bucătărie folosind dplyr**\n", "\n", "Acum poți analiza mai profund datele și să afli care sunt ingredientele tipice pentru fiecare bucătărie. Ar trebui să elimini datele recurente care creează confuzie între bucătării, așa că hai să învățăm despre această problemă.\n", "\n", "Creează o funcție `create_ingredient()` în R care returnează un dataframe de ingrediente. Această funcție va începe prin eliminarea unei coloane inutile și va sorta ingredientele în funcție de frecvența lor.\n", "\n", "Structura de bază a unei funcții în R este:\n", "\n", "`myFunction <- function(arglist){`\n", "\n", "**`...`**\n", "\n", "**`return`**`(value)`\n", "\n", "`}`\n", "\n", "O introducere simplă în funcțiile R poate fi găsită [aici](https://skirmer.github.io/presentations/functions_with_r.html#1).\n", "\n", "Să trecem direct la treabă! Vom folosi [verbele dplyr](https://dplyr.tidyverse.org/) pe care le-am învățat în lecțiile anterioare. Ca recapitulare:\n", "\n", "- `dplyr::select()`: te ajută să alegi ce **coloane** să păstrezi sau să excluzi.\n", "\n", "- `dplyr::pivot_longer()`: te ajută să \"extinzi\" datele, crescând numărul de rânduri și reducând numărul de coloane.\n", "\n", "- `dplyr::group_by()` și `dplyr::summarise()`: te ajută să găsești statistici sumare pentru diferite grupuri și să le pui într-un tabel organizat.\n", "\n", "- `dplyr::filter()`: creează un subset de date care conține doar rândurile ce îndeplinesc condițiile tale.\n", "\n", "- `dplyr::mutate()`: te ajută să creezi sau să modifici coloane.\n", "\n", "Aruncă o privire la acest tutorial [*plin de artă*](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) realizat de Allison Horst, care introduce câteva funcții utile pentru manipularea datelor în dplyr *(parte din Tidyverse)*.\n" ], "metadata": { "id": "K3RF5bSCHC76" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Creates a functions that returns the top ingredients by class\r\n", "\r\n", "create_ingredient <- function(df){\r\n", " \r\n", " # Drop the id column which is the first colum\r\n", " ingredient_df = df %>% select(-1) %>% \r\n", " # Transpose data to a long format\r\n", " pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n", " # Find the top most ingredients for a particular cuisine\r\n", " group_by(ingredients) %>% \r\n", " summarise(n_instances = sum(count)) %>% \r\n", " filter(n_instances != 0) %>% \r\n", " # Arrange by descending order\r\n", " arrange(desc(n_instances)) %>% \r\n", " mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n", " \r\n", " \r\n", " return(ingredient_df)\r\n", "} # End of function" ], "outputs": [], "metadata": { "id": "uB_0JR82HTPa" } }, { "cell_type": "markdown", "source": [ "Acum putem folosi funcția pentru a obține o idee despre cele mai populare zece ingrediente în funcție de bucătărie. Hai să o testăm cu `thai_df`.\n" ], "metadata": { "id": "h9794WF8HWmc" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Call create_ingredient and display popular ingredients\r\n", "thai_ingredient_df <- create_ingredient(df = thai_df)\r\n", "\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "agQ-1HrcHaEA" } }, { "cell_type": "markdown", "source": [ "În secțiunea anterioară, am folosit `geom_col()`, să vedem cum poți folosi și `geom_bar` pentru a crea diagrame cu bare. Folosește `?geom_bar` pentru lecturi suplimentare.\n" ], "metadata": { "id": "kHu9ffGjHdcX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a bar chart for popular thai cuisines\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10) %>% \r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "fb3Bx_3DHj6e" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "RHP_xgdkHnvM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Japanese cuisines and make bar chart\r\n", "create_ingredient(df = japanese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")\r\n" ], "outputs": [], "metadata": { "id": "019v8F0XHrRU" } }, { "cell_type": "markdown", "source": [ "Ce părere ai despre bucătăriile chinezești?\n" ], "metadata": { "id": "iIGM7vO8Hu3v" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Chinese cuisines and make bar chart\r\n", "create_ingredient(df = chinese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lHd9_gd2HyzU" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "ir8qyQbNH1c7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Indian cuisines and make bar chart\r\n", "create_ingredient(df = indian_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "ApukQtKjH5FO" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "qv30cwY1H-FM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Korean cuisines and make bar chart\r\n", "create_ingredient(df = korean_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lumgk9cHIBie" } }, { "cell_type": "markdown", "source": [ "Din vizualizările de date, putem acum elimina cele mai comune ingrediente care creează confuzie între bucătării distincte, folosind `dplyr::select()`.\n", "\n", "Toată lumea iubește orezul, usturoiul și ghimbirul!\n" ], "metadata": { "id": "iO4veMXuIEta" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Drop id column, rice, garlic and ginger from our original data set\r\n", "df_select <- df %>% \r\n", " select(-c(1, rice, garlic, ginger))\r\n", "\r\n", "# Display new data set\r\n", "df_select %>% \r\n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "iHJPiG6rIUcK" } }, { "cell_type": "markdown", "source": [ "## Preprocesarea datelor folosind rețete 👩‍🍳👨‍🍳 - Gestionarea datelor dezechilibrate ⚖️\n", "\n", "

\n", " \n", "

Ilustrație de @allison_horst
\n", "\n", "Având în vedere că această lecție este despre bucătării, trebuie să punem `rețetele` în context.\n", "\n", "Tidymodels oferă încă un pachet grozav: `recipes` - un pachet pentru preprocesarea datelor.\n" ], "metadata": { "id": "kkFd-JxdIaL6" } }, { "cell_type": "markdown", "source": [ "Să aruncăm din nou o privire asupra distribuției bucătăriilor noastre.\n" ], "metadata": { "id": "6l2ubtTPJAhY" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "old_label_count <- df_select %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "old_label_count" ], "outputs": [], "metadata": { "id": "1e-E9cb7JDVi" } }, { "cell_type": "markdown", "source": [ "După cum se poate observa, există o distribuție destul de inegală în numărul de bucătării. Bucătăriile coreene sunt aproape de trei ori mai numeroase decât cele thailandeze. Datele dezechilibrate au adesea efecte negative asupra performanței modelului. Gândiți-vă la o clasificare binară. Dacă majoritatea datelor aparțin unei singure clase, un model de învățare automată va prezice acea clasă mai frecvent, doar pentru că există mai multe date pentru aceasta. Echilibrarea datelor ia orice distribuție dezechilibrată și ajută la eliminarea acestui dezechilibru. Multe modele funcționează cel mai bine atunci când numărul de observații este egal și, prin urmare, tind să întâmpine dificultăți cu datele dezechilibrate.\n", "\n", "Există în principal două modalități de a gestiona seturile de date dezechilibrate:\n", "\n", "- adăugarea de observații la clasa minoritară: `Over-sampling`, de exemplu, utilizând un algoritm SMOTE\n", "\n", "- eliminarea observațiilor din clasa majoritară: `Under-sampling`\n", "\n", "Haideți să demonstrăm acum cum să gestionăm seturile de date dezechilibrate folosind un `recipe`. Un recipe poate fi considerat ca un plan care descrie ce pași ar trebui aplicați unui set de date pentru a-l pregăti pentru analiza datelor.\n" ], "metadata": { "id": "soAw6826JKx9" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load themis package for dealing with imbalanced data\r\n", "library(themis)\r\n", "\r\n", "# Create a recipe for preprocessing data\r\n", "cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n", " step_smote(cuisine)\r\n", "\r\n", "cuisines_recipe" ], "outputs": [], "metadata": { "id": "HS41brUIJVJy" } }, { "cell_type": "markdown", "source": [ "Să analizăm pașii noștri de preprocesare.\n", "\n", "- Apelul către `recipe()` cu o formulă indică rețetei *rolurile* variabilelor folosind datele din `df_select` ca referință. De exemplu, coloana `cuisine` a fost atribuită rolul de `outcome`, în timp ce restul coloanelor au fost atribuite rolul de `predictor`.\n", "\n", "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) creează o *specificație* a unui pas din rețetă care generează sintetic noi exemple ale clasei minoritare utilizând cei mai apropiați vecini ai acestor cazuri.\n", "\n", "Acum, dacă am dori să vedem datele preprocesate, ar trebui să [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) și [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) rețeta noastră.\n", "\n", "`prep()`: estimează parametrii necesari dintr-un set de antrenament care pot fi aplicați ulterior altor seturi de date.\n", "\n", "`bake()`: ia o rețetă pregătită și aplică operațiile asupra oricărui set de date.\n" ], "metadata": { "id": "Yb-7t7XcJaC8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep and bake the recipe\r\n", "preprocessed_df <- cuisines_recipe %>% \r\n", " prep() %>% \r\n", " bake(new_data = NULL) %>% \r\n", " relocate(cuisine)\r\n", "\r\n", "# Display data\r\n", "preprocessed_df %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "# Quick summary stats\r\n", "preprocessed_df %>% \r\n", " introduce()" ], "outputs": [], "metadata": { "id": "9QhSgdpxJl44" } }, { "cell_type": "markdown", "source": [ "Să verificăm acum distribuția bucătăriilor noastre și să le comparăm cu datele dezechilibrate.\n" ], "metadata": { "id": "dmidELh_LdV7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "new_label_count <- preprocessed_df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "list(new_label_count = new_label_count,\r\n", " old_label_count = old_label_count)" ], "outputs": [], "metadata": { "id": "aSh23klBLwDz" } }, { "cell_type": "markdown", "source": [ "Mmm! Datele sunt curate, echilibrate și foarte delicioase 😋!\n", "\n", "> De obicei, o rețetă este folosită ca un preprocesor pentru modelare, unde definește ce pași ar trebui aplicați unui set de date pentru a-l pregăti pentru modelare. În acest caz, un `workflow()` este utilizat în mod tipic (așa cum am văzut deja în lecțiile anterioare) în loc să estimăm manual o rețetă.\n", ">\n", "> Astfel, de regulă nu este necesar să folosești **`prep()`** și **`bake()`** pentru rețete atunci când utilizezi tidymodels, dar acestea sunt funcții utile de avut în trusa ta de instrumente pentru a confirma că rețetele funcționează așa cum te aștepți, cum este cazul nostru.\n", ">\n", "> Când folosești **`bake()`** pe o rețetă pregătită cu **`new_data = NULL`**, obții înapoi datele pe care le-ai furnizat atunci când ai definit rețeta, dar care au trecut prin pașii de preprocesare.\n", "\n", "Să salvăm acum o copie a acestor date pentru a le folosi în lecțiile viitoare:\n" ], "metadata": { "id": "HEu80HZ8L7ae" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Save preprocessed data\r\n", "write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")" ], "outputs": [], "metadata": { "id": "cBmCbIgrMOI6" } }, { "cell_type": "markdown", "source": [ "Acest fișier CSV nou poate fi găsit acum în folderul principal de date.\n", "\n", "**🚀Provocare**\n", "\n", "Acest curriculum conține mai multe seturi de date interesante. Răsfoiește folderele `data` și vezi dacă vreunul conține seturi de date potrivite pentru clasificare binară sau multi-clasă. Ce întrebări ai pune despre acest set de date?\n", "\n", "## [**Chestionar post-lectură**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n", "\n", "## **Recapitulare & Studiu individual**\n", "\n", "- Consultă [pachetul themis](https://github.com/tidymodels/themis). Ce alte tehnici am putea folosi pentru a gestiona datele dezechilibrate?\n", "\n", "- Site-ul de referință pentru Tidy models: [reference website](https://www.tidymodels.org/start/).\n", "\n", "- H. Wickham și G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n", "\n", "#### MULȚUMIRI SPECIALE:\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) pentru crearea ilustrațiilor uimitoare care fac R mai accesibil și captivant. Găsește mai multe ilustrații în [galeria ei](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n", "\n", "[Cassie Breviu](https://www.twitter.com/cassieview) și [Jen Looper](https://www.twitter.com/jenlooper) pentru crearea versiunii originale în Python a acestui modul ♥️\n", "\n", "

\n", " \n", "

Ilustrație de @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Declinarea responsabilității**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși depunem eforturi pentru a asigura acuratețea, vă rugăm să aveți în vedere că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm răspunderea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" ] } ] }