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

724 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-06T14:55:33+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "sl"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Zgradite klasifikacijski model: Slastne azijske in indijske kuhinje\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Uvod v klasifikacijo: Čiščenje, priprava in vizualizacija podatkov\n",
"\n",
"V teh štirih lekcijah boste raziskovali temeljni vidik klasičnega strojnega učenja - *klasifikacijo*. Preučili bomo uporabo različnih algoritmov za klasifikacijo na podatkovnem naboru o vseh čudovitih kuhinjah Azije in Indije. Upam, da ste lačni!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Proslavite panazijske kuhinje v teh lekcijah! Slika: Jen Looper</figcaption>\n",
"\n",
"<!--![Proslavite panazijske kuhinje v teh lekcijah! Slika: Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klasifikacija je oblika [nadzorovanega učenja](https://wikipedia.org/wiki/Supervised_learning), ki ima veliko skupnega s tehnikami regresije. Pri klasifikaciji trenirate model, da napove, v katero `kategorijo` spada določen element. Če je strojno učenje namenjeno napovedovanju vrednosti ali imen stvari z uporabo podatkovnih nizov, potem klasifikacija običajno spada v dve skupini: *binarna klasifikacija* in *večrazredna klasifikacija*.\n",
"\n",
"Zapomnite si:\n",
"\n",
"- **Linearna regresija** vam je pomagala napovedati odnose med spremenljivkami in narediti natančne napovedi, kje bi nov podatkovni element padel v odnosu do te črte. Na primer, lahko bi napovedali numerične vrednosti, kot je *kakšna bo cena buče septembra v primerjavi z decembrom*.\n",
"\n",
"- **Logistična regresija** vam je pomagala odkriti \"binarne kategorije\": pri tej cenovni točki, *ali je buča oranžna ali ne-oranžna*?\n",
"\n",
"Klasifikacija uporablja različne algoritme za določanje drugih načinov določanja oznake ali razreda podatkovne točke. Delajmo s temi podatki o kuhinjah, da vidimo, ali lahko z opazovanjem skupine sestavin določimo izvorno kuhinjo.\n",
"\n",
"### [**Predlekcijski kviz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Uvod**\n",
"\n",
"Klasifikacija je ena temeljnih dejavnosti raziskovalca strojnega učenja in podatkovnega znanstvenika. Od osnovne klasifikacije binarne vrednosti (\"ali je ta e-pošta spam ali ne?\") do kompleksne klasifikacije slik in segmentacije z uporabo računalniškega vida, je vedno koristno, da lahko podatke razvrstimo v razrede in zastavimo vprašanja o njih.\n",
"\n",
"Če proces opišemo na bolj znanstven način, vaša metoda klasifikacije ustvari napovedni model, ki vam omogoča mapiranje odnosa med vhodnimi spremenljivkami in izhodnimi spremenljivkami.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binarni vs. večrazredni problemi, ki jih algoritmi za klasifikacijo obravnavajo. Infografika: Jen Looper</figcaption>\n",
"\n",
"Preden začnemo s procesom čiščenja podatkov, njihove vizualizacije in priprave za naloge strojnega učenja, se naučimo nekaj o različnih načinih, kako lahko strojno učenje uporabimo za klasifikacijo podatkov.\n",
"\n",
"Izpeljana iz [statistike](https://wikipedia.org/wiki/Statistical_classification), klasifikacija z uporabo klasičnega strojnega učenja uporablja značilnosti, kot so `kadilec`, `teža` in `starost`, za določanje *verjetnosti razvoja X bolezni*. Kot tehnika nadzorovanega učenja, podobna regresijskim vajam, ki ste jih izvajali prej, so vaši podatki označeni, algoritmi strojnega učenja pa te oznake uporabljajo za klasifikacijo in napovedovanje razredov (ali 'značilnosti') podatkovnega niza ter njihovo dodelitev skupini ali izidu.\n",
"\n",
"✅ Vzemite trenutek in si zamislite podatkovni niz o kuhinjah. Kaj bi lahko odgovoril večrazredni model? Kaj bi lahko odgovoril binarni model? Kaj če bi želeli ugotoviti, ali določena kuhinja verjetno uporablja piskavico? Kaj če bi želeli videti, ali bi lahko iz vrečke zvezdastega janeža, artičok, cvetače in hrena pripravili tipično indijsko jed?\n",
"\n",
"### **Pozdravljeni 'klasifikator'**\n",
"\n",
"Vprašanje, ki ga želimo zastaviti o tem podatkovnem naboru kuhinj, je pravzaprav **večrazredno vprašanje**, saj imamo na voljo več potencialnih nacionalnih kuhinj. Glede na skupino sestavin, v katerega od teh razredov bodo podatki ustrezali?\n",
"\n",
"Tidymodels ponuja več različnih algoritmov za klasifikacijo podatkov, odvisno od vrste problema, ki ga želite rešiti. V naslednjih dveh lekcijah se boste naučili o nekaterih od teh algoritmov.\n",
"\n",
"#### **Predpogoj**\n",
"\n",
"Za to lekcijo bomo potrebovali naslednje pakete za čiščenje, pripravo in vizualizacijo naših podatkov:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka paketov za R](https://www.tidyverse.org/packages), zasnovana za hitrejše, lažje in bolj zabavno podatkovno znanost!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je okvir [zbirke paketov](https://www.tidymodels.org/packages/) za modeliranje in strojno učenje.\n",
"\n",
"- `DataExplorer`: Paket [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) je namenjen poenostavitvi in avtomatizaciji procesa EDA ter generiranju poročil.\n",
"\n",
"- `themis`: Paket [themis](https://themis.tidymodels.org/) ponuja dodatne korake receptov za obravnavo neuravnoteženih podatkov.\n",
"\n",
"Namestite jih lahko z:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativno, spodnji skript preveri, ali imate pakete, potrebne za dokončanje tega modula, in jih namesti, če manjkajo.\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": [
"Kasneje bomo naložili te odlične pakete in jih naredili dostopne v naši trenutni R seji. (To je zgolj za ponazoritev, `pacman::p_load()` je to že naredil namesto vas)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Vaja - očistite in uravnotežite svoje podatke\n",
"\n",
"Prva naloga, preden začnete s tem projektom, je očistiti in **uravnotežiti** svoje podatke za boljše rezultate.\n",
"\n",
"Spoznajmo 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": [
"Zanimivo! Po videzu sodeč je prvi stolpec nekakšen stolpec `id`. Poglejmo si malo več informacij o podatkih.\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 izpisa lahko takoj vidimo, da imamo `2448` vrstic in `385` stolpcev ter `0` manjkajočih vrednosti. Imamo tudi 1 diskretni stolpec, *cuisine*.\n",
"\n",
"## Naloga - spoznavanje kuhinj\n",
"\n",
"Zdaj delo postaja bolj zanimivo. Odkrijmo porazdelitev podatkov glede na kuhinjo.\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": [
"Obstaja končno število kuhinj, vendar je porazdelitev podatkov neenakomerna. To lahko popravite! Preden to storite, raziščite še malo več.\n",
"\n",
"Nato dodelimo vsako kuhinjo v njen lasten tibble in ugotovimo, koliko podatkov je na voljo (vrstice, stolpci) za posamezno kuhinjo.\n",
"\n",
"> [Tibble](https://tibble.tidyverse.org/) je sodoben podatkovni okvir.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Umetniško delo @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": [
"## **Vaja - Odkrijte glavne sestavine po kuhinji z uporabo dplyr**\n",
"\n",
"Zdaj lahko podrobneje raziščete podatke in ugotovite, katere so značilne sestavine za posamezno kuhinjo. Odstraniti morate ponavljajoče se podatke, ki povzročajo zmedo med kuhinjami, zato se lotimo tega problema.\n",
"\n",
"Ustvarite funkcijo `create_ingredient()` v R, ki vrne podatkovni okvir sestavin. Ta funkcija bo začela z odstranitvijo neuporabnega stolpca in razvrstila sestavine glede na njihovo število.\n",
"\n",
"Osnovna struktura funkcije v R je:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Uvod v funkcije v R najdete [tukaj](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Pojdimo naravnost k stvari! Uporabili bomo [dplyr glagole](https://dplyr.tidyverse.org/), ki smo jih spoznali v prejšnjih lekcijah. Za osvežitev spomina:\n",
"\n",
"- `dplyr::select()`: vam pomaga izbrati, katere **stolpce** obdržati ali izključiti.\n",
"\n",
"- `dplyr::pivot_longer()`: vam pomaga \"podaljšati\" podatke, s čimer povečate število vrstic in zmanjšate število stolpcev.\n",
"\n",
"- `dplyr::group_by()` in `dplyr::summarise()`: vam pomagata najti povzetke statistike za različne skupine in jih predstaviti v pregledni tabeli.\n",
"\n",
"- `dplyr::filter()`: ustvari podmnožico podatkov, ki vsebuje samo vrstice, ki ustrezajo vašim pogojem.\n",
"\n",
"- `dplyr::mutate()`: vam pomaga ustvariti ali spremeniti stolpce.\n",
"\n",
"Oglejte si ta [*umetniško* obarvan učni vodič](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) avtorice Allison Horst, ki predstavlja nekaj uporabnih funkcij za obdelavo podatkov v dplyr *(del 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": [
"Zdaj lahko uporabimo funkcijo, da dobimo vpogled v deset najbolj priljubljenih sestavin po kuhinji. Preizkusimo jo 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": [
"V prejšnjem razdelku smo uporabili `geom_col()`, poglejmo, kako lahko uporabite tudi `geom_bar` za ustvarjanje stolpčnih grafikonov. Uporabite `?geom_bar` za nadaljnje branje.\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": [
"Naredimo enako za japonske 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": [
"Kaj pa kitajska kuhinja?\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": [
"Na koncu narišite korejske sestavine.\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 vizualizacij podatkov lahko zdaj odstranimo najpogostejše sestavine, ki povzročajo zmedo med različnimi kuhinjami, z uporabo `dplyr::select()`.\n",
"\n",
"Vsi obožujemo riž, česen in ingver!\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": [
"## Predobdelava podatkov z recepti 👩‍🍳👨‍🍳 - Obvladovanje neuravnoteženih podatkov ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Umetniško delo @allison_horst</figcaption>\n",
"\n",
"Ker je ta lekcija o kulinariki, moramo postaviti `recepte` v kontekst.\n",
"\n",
"Tidymodels ponuja še en odličen paket: `recipes` - paket za predobdelavo podatkov.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Poglejmo si ponovno porazdelitev naših kuhinj.\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": [
"Kot lahko vidite, je število kuhinj precej neenakomerno porazdeljeno. Korejske kuhinje so skoraj trikrat bolj številčne kot tajske kuhinje. Neuravnoteženi podatki pogosto negativno vplivajo na delovanje modela. Pomislite na binarno klasifikacijo. Če večina vaših podatkov pripada enemu razredu, bo model strojnega učenja pogosteje napovedoval ta razred, preprosto zato, ker je zanj na voljo več podatkov. Uravnoteženje podatkov odpravlja to neuravnoteženost in pomaga odstraniti pristranskost. Veliko modelov najbolje deluje, ko je število opazovanj enako, zato se pogosto soočajo s težavami pri delu z neuravnoteženimi podatki.\n",
"\n",
"Obstajata dva glavna načina za obravnavo neuravnoteženih podatkovnih nizov:\n",
"\n",
"- dodajanje opazovanj v manjšinski razred: `Over-sampling`, npr. uporaba algoritma SMOTE\n",
"\n",
"- odstranjevanje opazovanj iz večinskega razreda: `Under-sampling`\n",
"\n",
"Zdaj bomo prikazali, kako obravnavati neuravnotežene podatkovne nize z uporabo `recipe`. Recipe lahko razumemo kot načrt, ki opisuje, katere korake je treba uporabiti na podatkovnem nizu, da ga pripravimo za analizo podatkov.\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": [
"Razčlenimo naše korake predobdelave.\n",
"\n",
"- Klic funkcije `recipe()` s formulo pove receptu *vloge* spremenljivk, pri čemer uporablja podatke `df_select` kot referenco. Na primer, stolpec `cuisine` je bil dodeljen vlogi `outcome`, medtem ko so ostali stolpci dodeljeni vlogi `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) ustvari *specifikacijo* koraka recepta, ki sintetično generira nove primere manjšinske skupine z uporabo najbližjih sosedov teh primerov.\n",
"\n",
"Če bi želeli videti predobdelane podatke, bi morali [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) in [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) uporabiti na našem receptu.\n",
"\n",
"`prep()`: oceni potrebne parametre iz učnega nabora, ki jih je mogoče kasneje uporabiti na drugih podatkovnih nizih.\n",
"\n",
"`bake()`: uporabi pripravljen recept in operacije na katerem koli podatkovnem nizu.\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": [
"Zdaj preverimo porazdelitev naših kuhinj in jih primerjajmo z neuravnoteženimi podatki.\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! Podatki so lepi in čisti, uravnoteženi in zelo okusni 😋!\n",
"\n",
"> Običajno se recept uporablja kot predprocesor za modeliranje, kjer določa, katere korake je treba uporabiti na podatkovnem naboru, da ga pripravimo za modeliranje. V tem primeru se običajno uporablja `workflow()` (kot smo že videli v prejšnjih lekcijah) namesto ročnega ocenjevanja recepta.\n",
">\n",
"> Zato običajno ni treba uporabljati **`prep()`** in **`bake()`** receptov, ko uporabljate tidymodels, vendar so to koristne funkcije, ki jih imate v svojem orodju za preverjanje, ali recepti delujejo, kot pričakujete, kot v našem primeru.\n",
">\n",
"> Ko z **`new_data = NULL`** **`bake()`** pripravljen recept, dobite nazaj podatke, ki ste jih podali pri definiranju recepta, vendar so že prestali korake predprocesiranja.\n",
"\n",
"Zdaj shranimo kopijo teh podatkov za uporabo v prihodnjih lekcijah:\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": [
"Ta svež CSV je zdaj na voljo v korenski mapi podatkov.\n",
"\n",
"**🚀Izziv**\n",
"\n",
"Ta učni načrt vsebuje več zanimivih podatkovnih zbirk. Prebrskajte mape `data` in preverite, ali katera vsebuje podatkovne zbirke, ki bi bile primerne za binarno ali večrazredno klasifikacijo? Kakšna vprašanja bi zastavili tej podatkovni zbirki?\n",
"\n",
"## [**Kvizi po predavanju**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Pregled & Samostojno učenje**\n",
"\n",
"- Oglejte si [paket themis](https://github.com/tidymodels/themis). Katere druge tehnike bi lahko uporabili za obravnavo neuravnoteženih podatkov?\n",
"\n",
"- Referenčna spletna stran za Tidy models [tukaj](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham in G. Grolemund, [*R za podatkovno znanost: Vizualizacija, modeliranje, transformacija, urejanje in uvoz podatkov*](https://r4ds.had.co.nz/).\n",
"\n",
"#### HVALA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za ustvarjanje čudovitih ilustracij, ki naredijo R bolj prijazen in privlačen. Več ilustracij najdete v njeni [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) in [Jen Looper](https://www.twitter.com/jenlooper) za ustvarjanje izvirne Python različice tega modula ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Umetniško delo @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
]
}
]
}