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/hr/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

722 lines
27 KiB

{
"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-04T08:57:20+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "hr"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Izgradite model za klasifikaciju: Ukusne azijske i indijske kuhinje\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Uvod u klasifikaciju: Očistite, pripremite i vizualizirajte svoje podatke\n",
"\n",
"U ovim četirima lekcijama istražit ćete temeljni fokus klasičnog strojnog učenja - *klasifikaciju*. Proći ćemo kroz korištenje raznih algoritama za klasifikaciju s pomoću skupa podataka o svim briljantnim kuhinjama Azije i Indije. Nadamo se da ste gladni!\n",
"\n",
"<p>\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Proslavite pan-azijske kuhinje u ovim lekcijama! Slika: Jen Looper</figcaption>\n",
"\n",
"Klasifikacija je oblik [nadziranog učenja](https://wikipedia.org/wiki/Supervised_learning) koji ima mnogo zajedničkog s tehnikama regresije. U klasifikaciji trenirate model kako biste predvidjeli kojoj `kategoriji` neki element pripada. Ako je strojno učenje usmjereno na predviđanje vrijednosti ili naziva stvari pomoću skupova podataka, tada klasifikacija općenito spada u dvije skupine: *binarna klasifikacija* i *višeklasna klasifikacija*.\n",
"\n",
"Zapamtite:\n",
"\n",
"- **Linearna regresija** pomogla vam je predvidjeti odnose između varijabli i napraviti točna predviđanja o tome gdje će novi podatak pasti u odnosu na tu liniju. Na primjer, mogli ste predvidjeti numeričke vrijednosti poput *koja će cijena bundeve biti u rujnu u usporedbi s prosincem*.\n",
"\n",
"- **Logistička regresija** pomogla vam je otkriti \"binarne kategorije\": pri ovoj cijeni, *je li bundeva narančasta ili nije narančasta*?\n",
"\n",
"Klasifikacija koristi razne algoritme za određivanje drugih načina dodjeljivanja oznake ili klase podatkovnoj točki. Radit ćemo s ovim podacima o kuhinjama kako bismo vidjeli možemo li, promatrajući skup sastojaka, odrediti izvor kuhinje.\n",
"\n",
"### [**Kviz prije predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Uvod**\n",
"\n",
"Klasifikacija je jedna od temeljnih aktivnosti istraživača strojnog učenja i podatkovnih znanstvenika. Od osnovne klasifikacije binarne vrijednosti (\"je li ovaj e-mail spam ili nije?\") do složene klasifikacije i segmentacije slika pomoću računalnog vida, uvijek je korisno moći razvrstati podatke u klase i postavljati pitanja o njima.\n",
"\n",
"Da bismo proces izrazili na znanstveniji način, vaša metoda klasifikacije stvara prediktivni model koji vam omogućuje mapiranje odnosa između ulaznih varijabli i izlaznih varijabli.\n",
"\n",
"<p>\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binarni vs. višeklasni problemi za algoritme klasifikacije. Infografika: Jen Looper</figcaption>\n",
"\n",
"Prije nego što započnemo proces čišćenja podataka, njihove vizualizacije i pripreme za zadatke strojnog učenja, naučimo malo o raznim načinima na koje se strojno učenje može koristiti za klasifikaciju podataka.\n",
"\n",
"Izvedena iz [statistike](https://wikipedia.org/wiki/Statistical_classification), klasifikacija pomoću klasičnog strojnog učenja koristi značajke poput `pušač`, `težina` i `dob` kako bi odredila *vjerojatnost razvoja određene bolesti*. Kao tehnika nadziranog učenja slična regresijskim vježbama koje ste ranije izvodili, vaši podaci su označeni, a algoritmi strojnog učenja koriste te oznake za klasifikaciju i predviđanje klasa (ili 'značajki') skupa podataka te njihovo dodjeljivanje grupi ili ishodu.\n",
"\n",
"✅ Zastanite na trenutak i zamislite skup podataka o kuhinjama. Na što bi višeklasni model mogao odgovoriti? Na što bi binarni model mogao odgovoriti? Što ako želite odrediti koristi li određena kuhinja vjerojatno piskavicu? Što ako želite vidjeti možete li, s obzirom na vrećicu namirnica punu zvjezdastog anisa, artičoka, cvjetače i hrena, stvoriti tipično indijsko jelo?\n",
"\n",
"### **Pozdrav 'klasifikatoru'**\n",
"\n",
"Pitanje koje želimo postaviti ovom skupu podataka o kuhinjama zapravo je **višeklasno pitanje**, jer imamo nekoliko potencijalnih nacionalnih kuhinja s kojima radimo. S obzirom na skup sastojaka, kojoj od ovih mnogih klasa će podaci pripadati?\n",
"\n",
"Tidymodels nudi nekoliko različitih algoritama za klasifikaciju podataka, ovisno o vrsti problema koji želite riješiti. U sljedeće dvije lekcije naučit ćete o nekoliko tih algoritama.\n",
"\n",
"#### **Preduvjet**\n",
"\n",
"Za ovu lekciju trebat će nam sljedeći paketi za čišćenje, pripremu i vizualizaciju podataka:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka R paketa](https://www.tidyverse.org/packages) osmišljena kako bi znanost o podacima bila brža, lakša i zabavnija!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) okvir je [zbirka paketa](https://www.tidymodels.org/packages/) za modeliranje i strojno učenje.\n",
"\n",
"- `DataExplorer`: [DataExplorer paket](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) namijenjen je pojednostavljivanju i automatizaciji procesa istraživačke analize podataka (EDA) i generiranja izvještaja.\n",
"\n",
"- `themis`: [themis paket](https://themis.tidymodels.org/) pruža dodatne korake za recepte za rad s neuravnoteženim podacima.\n",
"\n",
"Možete ih instalirati pomoću:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativno, skripta ispod provjerava imate li potrebne pakete za dovršetak ovog modula i instalira ih za vas ako nedostaju.\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": [
"Kasnije ćemo učitati ove sjajne pakete i učiniti ih dostupnima u našoj trenutnoj R sesiji. (Ovo je samo za ilustraciju, `pacman::p_load()` je to već učinio za vas)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Vježba - očistite i uravnotežite svoje podatke\n",
"\n",
"Prvi zadatak prije početka ovog projekta je očistiti i **uravnotežiti** svoje podatke kako biste postigli bolje rezultate.\n",
"\n",
"Upoznajmo podatke!🕵️\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": [
"Zanimljivo! Čini se da je prvi stupac neka vrsta `id` stupca. Hajdemo dobiti malo više informacija o podacima.\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": [
"Iz rezultata možemo odmah vidjeti da imamo `2448` redaka i `385` stupaca te `0` nedostajućih vrijednosti. Također imamo 1 diskretni stupac, *cuisine*.\n",
"\n",
"## Vježba - upoznavanje s kuhinjama\n",
"\n",
"Sada posao postaje zanimljiviji. Otkrijmo raspodjelu podataka po kuhinji.\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": [
"Postoji ograničen broj kuhinja, ali raspodjela podataka je neujednačena. Možete to popraviti! Prije nego što krenete, istražite malo više.\n",
"\n",
"Zatim, dodijelite svaku kuhinju u njezin vlastiti tibble i saznajte koliko je podataka dostupno (redaka, stupaca) po kuhinji.\n",
"\n",
"> [Tibble](https://tibble.tidyverse.org/) je moderni podatkovni okvir.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustracija: @allison_horst</figcaption>\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": [
"## **Vježba - Otkrivanje glavnih sastojaka po kuhinji koristeći dplyr**\n",
"\n",
"Sada možete dublje istražiti podatke i saznati koji su tipični sastojci za svaku kuhinju. Trebali biste očistiti ponavljajuće podatke koji stvaraju zbrku između kuhinja, pa hajdemo naučiti više o ovom problemu.\n",
"\n",
"Napravite funkciju `create_ingredient()` u R-u koja vraća dataframe sastojaka. Ova funkcija će započeti uklanjanjem nekorisnog stupca i razvrstavanjem sastojaka prema njihovom broju.\n",
"\n",
"Osnovna struktura funkcije u R-u je:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Uvod u funkcije u R-u možete pronaći [ovdje](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Krenimo odmah! Koristit ćemo [dplyr glagole](https://dplyr.tidyverse.org/) koje smo učili u prethodnim lekcijama. Kao podsjetnik:\n",
"\n",
"- `dplyr::select()`: pomaže vam odabrati koje **stupce** želite zadržati ili isključiti.\n",
"\n",
"- `dplyr::pivot_longer()`: pomaže vam \"produžiti\" podatke, povećavajući broj redaka i smanjujući broj stupaca.\n",
"\n",
"- `dplyr::group_by()` i `dplyr::summarise()`: pomažu vam pronaći sažetke statistike za različite grupe i staviti ih u preglednu tablicu.\n",
"\n",
"- `dplyr::filter()`: stvara podskup podataka koji sadrži samo retke koji zadovoljavaju vaše uvjete.\n",
"\n",
"- `dplyr::mutate()`: pomaže vam stvoriti ili izmijeniti stupce.\n",
"\n",
"Pogledajte ovaj [*umjetnički*-ispunjen learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) od Allison Horst, koji uvodi neke korisne funkcije za obradu podataka u dplyr *(dio Tidyverse-a)*.\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": [
"Sada možemo koristiti funkciju kako bismo dobili uvid u deset najpopularnijih sastojaka po kuhinji. Isprobajmo je s `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": [
"U prethodnom odjeljku koristili smo `geom_col()`, pogledajmo kako možete koristiti i `geom_bar` za izradu stupčastih grafikona. Koristite `?geom_bar` za dodatno čitanje.\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": [
"Hajdemo učiniti isto za japanske podatke\n"
],
"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": [
"Što je s kineskom kuhinjom?\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": [
"Napokon, prikažite korejske sastojke.\n"
],
"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": [
"Iz vizualizacija podataka, sada možemo izostaviti najčešće sastojke koji stvaraju zabunu između različitih kuhinja koristeći `dplyr::select()`.\n",
"\n",
"Svi vole rižu, češnjak i đumbir!\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": [
"## Predobrada podataka pomoću recepata 👩‍🍳👨‍🍳 - Rješavanje problema neuravnoteženih podataka ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustracija: @allison_horst</figcaption>\n",
"\n",
"S obzirom na to da je ova lekcija o kuhinjama, moramo staviti `recepte` u kontekst.\n",
"\n",
"Tidymodels nudi još jedan praktičan paket: `recipes` - paket za predobradu podataka.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Hajdemo ponovno pogledati raspodjelu naših kuhinja.\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": [
"Kao što možete vidjeti, postoji prilično nejednaka raspodjela u broju kuhinja. Korejske kuhinje su gotovo tri puta brojnije od tajlandskih. Neuravnoteženi podaci često negativno utječu na performanse modela. Razmislite o binarnoj klasifikaciji. Ako većina vaših podataka pripada jednoj klasi, ML model će češće predviđati tu klasu, jednostavno zato što za nju ima više podataka. Uravnoteženje podataka uklanja bilo kakvu pristranost i pomaže eliminirati ovu neravnotežu. Mnogi modeli najbolje funkcioniraju kada je broj opažanja jednak i, stoga, imaju poteškoća s neuravnoteženim podacima.\n",
"\n",
"Postoje uglavnom dva načina za rješavanje neuravnoteženih skupova podataka:\n",
"\n",
"- dodavanje opažanja manjinskoj klasi: `Over-sampling`, npr. korištenjem SMOTE algoritma\n",
"\n",
"- uklanjanje opažanja iz većinske klase: `Under-sampling`\n",
"\n",
"Sada ćemo demonstrirati kako se nositi s neuravnoteženim skupovima podataka koristeći `recipe`. Recipe se može smatrati nacrtom koji opisuje koje korake treba primijeniti na skup podataka kako bi bio spreman za analizu podataka.\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": [
"Razmotrimo korake predobrade.\n",
"\n",
"- Poziv funkcije `recipe()` s formulom govori receptu *uloge* varijabli koristeći podatke iz `df_select` kao referencu. Na primjer, stupac `cuisine` dodijeljen je ulozi `outcome`, dok su ostali stupci dodijeljeni ulozi `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) stvara *specifikaciju* koraka recepta koji sintetički generira nove primjere manjinske klase koristeći najbliže susjede tih slučajeva.\n",
"\n",
"Sada, ako želimo vidjeti predobrađene podatke, moramo [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) i [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) naš recept.\n",
"\n",
"`prep()`: procjenjuje potrebne parametre iz skupa za treniranje koji se kasnije mogu primijeniti na druge skupove podataka.\n",
"\n",
"`bake()`: primjenjuje pripremljeni recept na bilo koji skup podataka.\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": [
"Hajdemo sada provjeriti distribuciju naših kuhinja i usporediti ih s neuravnoteženim podacima.\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! Podaci su lijepi i čisti, uravnoteženi i vrlo ukusni 😋!\n",
"\n",
"> Obično se recept koristi kao preprocesor za modeliranje, gdje definira koje korake treba primijeniti na skup podataka kako bi ga se pripremilo za modeliranje. U tom slučaju se obično koristi `workflow()` (kao što smo već vidjeli u prethodnim lekcijama) umjesto ručnog procjenjivanja recepta.\n",
">\n",
"> Stoga, obično ne trebate koristiti **`prep()`** i **`bake()`** recepte kada koristite tidymodels, ali to su korisne funkcije koje možete imati u svom alatu za potvrdu da recepti rade ono što očekujete, kao u našem slučaju.\n",
">\n",
"> Kada **`bake()`** koristite pripremljeni recept s **`new_data = NULL`**, dobijete podatke koje ste dali prilikom definiranja recepta, ali koji su prošli korake predobrade.\n",
"\n",
"Sada ćemo spremiti kopiju ovih podataka za korištenje u budućim lekcijama:\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": [
"Ovaj svježi CSV sada se nalazi u glavnoj mapi podataka.\n",
"\n",
"**🚀Izazov**\n",
"\n",
"Ovaj kurikulum sadrži nekoliko zanimljivih skupova podataka. Pregledajte mape `data` i provjerite sadrži li neki od njih skupove podataka koji bi bili prikladni za binarnu ili višeklasnu klasifikaciju? Koja pitanja biste postavili o ovom skupu podataka?\n",
"\n",
"## [**Kviz nakon predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Pregled i samostalno učenje**\n",
"\n",
"- Pogledajte [paket themis](https://github.com/tidymodels/themis). Koje druge tehnike možemo koristiti za rješavanje problema neuravnoteženih podataka?\n",
"\n",
"- Referentna stranica za Tidy models [web stranica](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham i G. Grolemund, [*R za Data Science: Vizualiziraj, Modeliraj, Transformiraj, Uredi i Uvezi Podatke*](https://r4ds.had.co.nz/).\n",
"\n",
"#### HVALA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za stvaranje nevjerojatnih ilustracija koje čine R pristupačnijim i zanimljivijim. Pronađite više ilustracija u njezinoj [galeriji](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) za stvaranje originalne Python verzije ovog modula ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Ilustracija od @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.\n"
]
}
]
}