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.
720 lines
28 KiB
720 lines
28 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-03T20:36:51+00:00",
|
|
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
|
|
"language_code": "lt"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Sukurkite klasifikavimo modelį: Skanūs Azijos ir Indijos patiekalai\n"
|
|
],
|
|
"metadata": {
|
|
"id": "ItETB4tSFprR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Įvadas į klasifikaciją: Duomenų valymas, paruošimas ir vizualizacija\n",
|
|
"\n",
|
|
"Šiose keturiose pamokose tyrinėsime vieną iš pagrindinių klasikinio mašininio mokymosi aspektų - *klasifikaciją*. Naudosime įvairius klasifikacijos algoritmus su duomenų rinkiniu apie visus nuostabius Azijos ir Indijos virtuvių patiekalus. Tikimės, kad esate alkani!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/pinch.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Švęskite pan-Azijos virtuves šiose pamokose! Vaizdas sukurtas Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"<!---->\n",
|
|
"\n",
|
|
"Klasifikacija yra [prižiūrimo mokymosi](https://wikipedia.org/wiki/Supervised_learning) forma, kuri turi daug bendro su regresijos technikomis. Klasifikacijoje modelis yra mokomas numatyti, kuriai `kategorijai` objektas priklauso. Jei mašininis mokymasis yra apie vertybių ar pavadinimų numatymą naudojant duomenų rinkinius, tuomet klasifikacija paprastai skirstoma į dvi grupes: *dvejetainė klasifikacija* ir *daugiaklasė klasifikacija*.\n",
|
|
"\n",
|
|
"Prisiminkite:\n",
|
|
"\n",
|
|
"- **Linijinė regresija** padėjo numatyti ryšius tarp kintamųjų ir tiksliai prognozuoti, kur naujas duomenų taškas atsidurs santykyje su ta linija. Pavyzdžiui, galėjote numatyti skaitines vertes, tokias kaip *kokia bus moliūgo kaina rugsėjį, palyginti su gruodžiu*.\n",
|
|
"\n",
|
|
"- **Logistinė regresija** padėjo atrasti \"dvejetaines kategorijas\": esant tam tikrai kainai, *ar šis moliūgas yra oranžinis, ar neoranžinis*?\n",
|
|
"\n",
|
|
"Klasifikacija naudoja įvairius algoritmus, kad nustatytų kitus būdus, kaip priskirti duomenų tašką tam tikrai klasei ar kategorijai. Dirbkime su šiais virtuvės duomenimis, kad pamatytume, ar stebėdami ingredientų grupę galime nustatyti jos kilmės virtuvę.\n",
|
|
"\n",
|
|
"### [**Prieš paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
|
|
"\n",
|
|
"### **Įvadas**\n",
|
|
"\n",
|
|
"Klasifikacija yra viena iš pagrindinių mašininio mokymosi tyrėjo ir duomenų mokslininko veiklų. Nuo paprastos dvejetainės vertės klasifikacijos (\"ar šis el. laiškas yra šlamštas, ar ne?\") iki sudėtingos vaizdų klasifikacijos ir segmentavimo naudojant kompiuterinį matymą, visada naudinga sugebėti suskirstyti duomenis į klases ir užduoti jiems klausimus.\n",
|
|
"\n",
|
|
"Moksliniu požiūriu, jūsų klasifikacijos metodas sukuria prognozavimo modelį, kuris leidžia susieti įvesties kintamuosius su išvesties kintamaisiais.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/binary-multiclass.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Dvejetainės ir daugiaklasės problemos, kurias sprendžia klasifikacijos algoritmai. Infografika sukūrė Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"Prieš pradėdami duomenų valymo, vizualizavimo ir paruošimo ML užduotims procesą, sužinokime šiek tiek apie įvairius būdus, kaip mašininis mokymasis gali būti naudojamas duomenims klasifikuoti.\n",
|
|
"\n",
|
|
"Klasifikacija, kilusi iš [statistikos](https://wikipedia.org/wiki/Statistical_classification), naudojant klasikinį mašininį mokymąsi naudoja tokias savybes kaip `rūkalius`, `svoris` ir `amžius`, kad nustatytų *tikimybę susirgti X liga*. Kaip prižiūrimo mokymosi technika, panaši į anksčiau atliktus regresijos pratimus, jūsų duomenys yra pažymėti, o ML algoritmai naudoja tuos žymenis, kad klasifikuotų ir prognozuotų duomenų rinkinio klases (arba 'savybes') ir priskirtų jas grupei ar rezultatui.\n",
|
|
"\n",
|
|
"✅ Skirkite akimirką įsivaizduoti duomenų rinkinį apie virtuves. Ką galėtų atsakyti daugiaklasis modelis? Ką galėtų atsakyti dvejetainis modelis? O jei norėtumėte nustatyti, ar tam tikra virtuvė greičiausiai naudoja ožragę? O jei norėtumėte sužinoti, ar, gavę maišą su žvaigždiniu anyžiumi, artišokais, žiediniais kopūstais ir krienais, galėtumėte sukurti tipišką indišką patiekalą?\n",
|
|
"\n",
|
|
"### **Sveiki, 'klasifikatoriau'**\n",
|
|
"\n",
|
|
"Klausimas, kurį norime užduoti šiam virtuvės duomenų rinkiniui, iš tikrųjų yra **daugiaklasis klausimas**, nes turime keletą galimų nacionalinių virtuvių, su kuriomis galime dirbti. Atsižvelgiant į ingredientų partiją, kuriai iš šių daugelio klasių duomenys tiks?\n",
|
|
"\n",
|
|
"Tidymodels siūlo keletą skirtingų algoritmų, skirtų duomenų klasifikavimui, priklausomai nuo problemos, kurią norite išspręsti. Kitose dviejose pamokose sužinosite apie keletą šių algoritmų.\n",
|
|
"\n",
|
|
"#### **Būtinos sąlygos**\n",
|
|
"\n",
|
|
"Šiai pamokai mums reikės šių paketų, kad galėtume išvalyti, paruošti ir vizualizuoti savo duomenis:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) yra [R paketų kolekcija](https://www.tidyverse.org/packages), skirta padaryti duomenų mokslą greitesnį, lengvesnį ir smagesnį!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) sistema yra [paketų kolekcija](https://www.tidymodels.org/packages/) modeliavimui ir mašininiam mokymuisi.\n",
|
|
"\n",
|
|
"- `DataExplorer`: [DataExplorer paketas](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) skirtas supaprastinti ir automatizuoti EDA procesą bei ataskaitų generavimą.\n",
|
|
"\n",
|
|
"- `themis`: [themis paketas](https://themis.tidymodels.org/) suteikia papildomus receptus, skirtus spręsti nesubalansuotų duomenų problemas.\n",
|
|
"\n",
|
|
"Galite juos įdiegti taip:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
|
|
"\n",
|
|
"Arba, žemiau pateiktas scenarijus patikrina, ar turite reikalingus paketus šiam moduliui užbaigti, ir įdiegia juos, jei jų trūksta.\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": [
|
|
"Vėliau įkelsime šiuos nuostabius paketus ir padarysime juos prieinamus dabartinėje R sesijoje. (Tai tik iliustracija, `pacman::p_load()` jau tai padarė už jus)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YkKAxOJvGD4C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Užduotis - išvalykite ir subalansuokite savo duomenis\n",
|
|
"\n",
|
|
"Pirmoji užduotis prieš pradedant šį projektą yra išvalyti ir **subalansuoti** savo duomenis, kad gautumėte geresnius rezultatus.\n",
|
|
"\n",
|
|
"Susipažinkime su duomenimis!🕵️\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": [
|
|
"Įdomu! Iš pirmo žvilgsnio atrodo, kad pirmoji stulpelis yra tam tikras `id` stulpelis. Pabandykime sužinoti šiek tiek daugiau informacijos apie duomenis.\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": [
|
|
"Iš rezultato matome, kad turime `2448` eilutes ir `385` stulpelius, o trūkstamų reikšmių nėra. Taip pat turime 1 diskretų stulpelį, *cuisine*.\n",
|
|
"\n",
|
|
"## Užduotis - susipažinimas su virtuvėmis\n",
|
|
"\n",
|
|
"Dabar darbas tampa įdomesnis. Atraskime duomenų pasiskirstymą pagal virtuvę.\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": [
|
|
"Yra ribotas skaičius virtuvių, tačiau duomenų pasiskirstymas yra netolygus. Jūs galite tai ištaisyti! Prieš tai padarydami, šiek tiek daugiau pasidomėkite.\n",
|
|
"\n",
|
|
"Toliau priskirkime kiekvieną virtuvę atskiram tibble ir sužinokime, kiek duomenų (eilutės, stulpeliai) yra prieinama kiekvienai virtuvei.\n",
|
|
"\n",
|
|
"> [Tibble](https://tibble.tidyverse.org/) yra modernus duomenų rėmelis.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/dplyr_filter.jpg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Kūrinys @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": [
|
|
"## **Pratimas - Atrasti populiariausius ingredientus pagal virtuvę naudojant dplyr**\n",
|
|
"\n",
|
|
"Dabar galite giliau pasinerti į duomenis ir sužinoti, kokie yra tipiški ingredientai pagal virtuvę. Turėtumėte pašalinti pasikartojančius duomenis, kurie sukelia painiavą tarp virtuvių, tad išsiaiškinkime šią problemą.\n",
|
|
"\n",
|
|
"Sukurkite funkciją `create_ingredient()` R kalba, kuri grąžina ingredientų duomenų rėmelį. Ši funkcija pradės nuo nereikalingos stulpelio pašalinimo ir rūšiuos ingredientus pagal jų dažnumą.\n",
|
|
"\n",
|
|
"Pagrindinė funkcijos struktūra R kalboje yra tokia:\n",
|
|
"\n",
|
|
"`myFunction <- function(arglist){`\n",
|
|
"\n",
|
|
"**`...`**\n",
|
|
"\n",
|
|
"**`return`**`(value)`\n",
|
|
"\n",
|
|
"`}`\n",
|
|
"\n",
|
|
"Tvarkingą įvadą į R funkcijas galite rasti [čia](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
|
|
"\n",
|
|
"Pradėkime! Naudosimės [dplyr veiksmažodžiais](https://dplyr.tidyverse.org/), kuriuos mokėmės ankstesnėse pamokose. Primename:\n",
|
|
"\n",
|
|
"- `dplyr::select()`: padeda pasirinkti, kuriuos **stulpelius** išlaikyti ar pašalinti.\n",
|
|
"\n",
|
|
"- `dplyr::pivot_longer()`: padeda \"ištempti\" duomenis, padidinant eilučių skaičių ir sumažinant stulpelių skaičių.\n",
|
|
"\n",
|
|
"- `dplyr::group_by()` ir `dplyr::summarise()`: padeda rasti santraukos statistiką skirtingoms grupėms ir pateikti ją tvarkingoje lentelėje.\n",
|
|
"\n",
|
|
"- `dplyr::filter()`: sukuria duomenų pogrupį, kuriame yra tik tos eilutės, kurios atitinka jūsų sąlygas.\n",
|
|
"\n",
|
|
"- `dplyr::mutate()`: padeda sukurti arba modifikuoti stulpelius.\n",
|
|
"\n",
|
|
"Peržiūrėkite šį [*meno*-kupiną learnr vadovėlį](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome), kurį sukūrė Allison Horst. Jame pristatomos naudingos duomenų tvarkymo funkcijos iš dplyr *(Tidyverse dalis)*.\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": [
|
|
"Dabar galime naudoti funkciją, kad sužinotume dešimt populiariausių ingredientų pagal virtuvę. Išbandykime ją su `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": [
|
|
"Ankstesniame skyriuje naudojome `geom_col()`, pažiūrėkime, kaip galite naudoti `geom_bar`, norėdami sukurti stulpelines diagramas. Naudokite `?geom_bar` norėdami sužinoti daugiau.\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": [
|
|
"Ką manote apie kinų virtuvę?\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": [
|
|
"Iš duomenų vizualizacijų dabar galime pašalinti dažniausiai pasitaikančius ingredientus, kurie sukelia painiavą tarp skirtingų virtuvių, naudojant `dplyr::select()`.\n",
|
|
"\n",
|
|
"Visi mėgsta ryžius, česnaką ir imbierą!\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": [
|
|
"## Duomenų apdorojimas naudojant receptus 👩🍳👨🍳 - Darbas su nesubalansuotais duomenimis ⚖️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Piešinys sukurtas @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"Kadangi ši pamoka yra apie virtuves, turime įdėti `receptus` į kontekstą.\n",
|
|
"\n",
|
|
"Tidymodels siūlo dar vieną puikų paketą: `recipes` - paketą, skirtą duomenų apdorojimui.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kkFd-JxdIaL6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Pažvelkime dar kartą į mūsų virtuvių pasiskirstymą.\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": [
|
|
"Kaip matote, virtuvių skaičius pasiskirstęs gana netolygiai. Korėjiečių virtuvės beveik tris kartus viršija tailandiečių virtuves. Nesubalansuoti duomenys dažnai neigiamai veikia modelio veikimą. Pagalvokite apie dvejetainę klasifikaciją. Jei dauguma jūsų duomenų priklauso vienai klasei, ML modelis dažniau prognozuos tą klasę, tiesiog todėl, kad tam yra daugiau duomenų. Duomenų balansavimas padeda pašalinti šį disbalansą, koreguojant iškreiptus duomenis. Daugelis modelių geriausiai veikia, kai stebėjimų skaičius yra vienodas, todėl jiems dažnai sunku dirbti su nesubalansuotais duomenimis.\n",
|
|
"\n",
|
|
"Yra du pagrindiniai būdai, kaip spręsti nesubalansuotų duomenų rinkinių problemą:\n",
|
|
"\n",
|
|
"- pridėti stebėjimų prie mažumos klasės: `Per-sampling`, pvz., naudojant SMOTE algoritmą\n",
|
|
"\n",
|
|
"- pašalinti stebėjimus iš daugumos klasės: `Under-sampling`\n",
|
|
"\n",
|
|
"Dabar pademonstruokime, kaip spręsti nesubalansuotų duomenų rinkinių problemą naudojant `receptą`. Receptą galima laikyti planu, kuris aprašo, kokius veiksmus reikia taikyti duomenų rinkiniui, kad jis būtų paruoštas duomenų analizei.\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": [
|
|
"Suskaidykime mūsų išankstinio apdorojimo veiksmus.\n",
|
|
"\n",
|
|
"- Kvietimas `recipe()` su formule nurodo receptui *kintamųjų roles*, naudojant `df_select` duomenis kaip atskaitos tašką. Pavyzdžiui, `cuisine` stulpelis buvo priskirtas `outcome` rolei, o likę stulpeliai priskirti `predictor` rolei.\n",
|
|
"\n",
|
|
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) sukuria *specifikaciją* recepto žingsniui, kuris sintetiškai generuoja naujus mažumos klasės pavyzdžius, naudodamas artimiausius kaimynus šių atvejų.\n",
|
|
"\n",
|
|
"Dabar, jei norėtume pamatyti iš anksto apdorotus duomenis, turėtume [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) ir [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) savo receptą.\n",
|
|
"\n",
|
|
"`prep()`: apskaičiuoja reikalingus parametrus iš mokymo rinkinio, kurie vėliau gali būti taikomi kitiems duomenų rinkiniams.\n",
|
|
"\n",
|
|
"`bake()`: paima paruoštą receptą ir pritaiko operacijas bet kuriam duomenų rinkiniui.\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": [
|
|
"Dabar patikrinkime mūsų virtuvių pasiskirstymą ir palyginkime juos su nesubalansuotais duomenimis.\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! Duomenys yra švarūs, subalansuoti ir labai skanūs 😋!\n",
|
|
"\n",
|
|
"> Paprastai receptas dažniausiai naudojamas kaip išankstinis apdorojimo įrankis modeliavimui, kuriame nurodoma, kokius veiksmus reikia atlikti su duomenų rinkiniu, kad jis būtų paruoštas modeliavimui. Tokiu atveju dažniausiai naudojamas `workflow()` (kaip jau matėme ankstesnėse pamokose), o ne rankiniu būdu vertinamas receptas.\n",
|
|
">\n",
|
|
"> Todėl, naudojant tidymodels, paprastai nereikia naudoti funkcijų **`prep()`** ir **`bake()`**, tačiau jos yra naudingos įrankių rinkinyje, kad patvirtintumėte, jog receptai veikia taip, kaip tikitės, kaip ir mūsų atveju.\n",
|
|
">\n",
|
|
"> Kai naudojate **`bake()`** su paruoštu receptu ir **`new_data = NULL`**, gaunate duomenis, kuriuos pateikėte apibrėždami receptą, tačiau jie jau bus praėję išankstinio apdorojimo veiksmus.\n",
|
|
"\n",
|
|
"Dabar išsaugokime šių duomenų kopiją, kad galėtume naudoti ją ateities pamokose:\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": [
|
|
"Šis naujas CSV dabar yra pagrindiniame duomenų aplanke.\n",
|
|
"\n",
|
|
"**🚀Iššūkis**\n",
|
|
"\n",
|
|
"Ši mokymo programa apima keletą įdomių duomenų rinkinių. Peržiūrėkite `data` aplankus ir pažiūrėkite, ar juose yra duomenų rinkiniai, tinkami dvejetainiam arba daugiaklasiam klasifikavimui? Kokius klausimus galėtumėte užduoti apie šį duomenų rinkinį?\n",
|
|
"\n",
|
|
"## [**Po paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
|
|
"\n",
|
|
"## **Apžvalga ir savarankiškas mokymasis**\n",
|
|
"\n",
|
|
"- Peržiūrėkite [themis paketą](https://github.com/tidymodels/themis). Kokius kitus metodus galėtume naudoti, kad susidorotume su nesubalansuotais duomenimis?\n",
|
|
"\n",
|
|
"- Tidy models [nuorodų svetainė](https://www.tidymodels.org/start/).\n",
|
|
"\n",
|
|
"- H. Wickham ir G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
|
|
"\n",
|
|
"#### DĖKOJAME:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) už nuostabias iliustracijas, kurios padaro R labiau prieinamą ir įdomų. Daugiau iliustracijų rasite jos [galerijoje](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) ir [Jen Looper](https://www.twitter.com/jenlooper) už originalios šio modulio Python versijos sukūrimą ♥️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Piešinys @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WQs5621pMGwf"
|
|
}
|
|
},
|
|
{
|
|
"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 naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, atsiradusius dėl šio vertimo naudojimo.\n"
|
|
]
|
|
}
|
|
]
|
|
} |