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.
728 lines
27 KiB
728 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-10-11T12:32:30+00:00",
|
|
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
|
|
"language_code": "et"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Koosta klassifikatsioonimudel: Maitsvad Aasia ja India köögid\n"
|
|
],
|
|
"metadata": {
|
|
"id": "ItETB4tSFprR"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Sissejuhatus klassifikatsiooni: Andmete puhastamine, ettevalmistamine ja visualiseerimine\n",
|
|
"\n",
|
|
"Nendes neljas õppetükis uurime klassikalise masinõppe põhivaldkonda - *klassifikatsiooni*. Vaatame, kuidas kasutada erinevaid klassifikatsioonialgoritme, kasutades andmekogumit, mis käsitleb Aasia ja India köögi imelisi roogasid. Loodetavasti olete näljased!\n",
|
|
"\n",
|
|
"<p>\n",
|
|
" <img src=\"../../../../../../translated_images/et/pinch.1b035ec9ba7e0d40.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Tähistage pan-Aasia kööke nendes õppetundides! Pilt: Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"<!---->\n",
|
|
"\n",
|
|
"Klassifikatsioon on [juhendatud õppimise](https://wikipedia.org/wiki/Supervised_learning) vorm, mis sarnaneb paljuski regressioonitehnikatega. Klassifikatsioonis treenite mudelit, et ennustada, millisesse `kategooriasse` üksus kuulub. Kui masinõpe seisneb väärtuste või nimede ennustamises andmekogumite abil, siis klassifikatsioon jaguneb üldiselt kahte rühma: *binaarne klassifikatsioon* ja *mitmeklassiline klassifikatsioon*.\n",
|
|
"\n",
|
|
"Meenutame:\n",
|
|
"\n",
|
|
"- **Lineaarne regressioon** aitas teil ennustada muutujate vahelisi seoseid ja teha täpseid prognoose selle kohta, kuhu uus andmepunkt langeb seoses selle joonega. Näiteks võisite ennustada numbrilisi väärtusi, nagu *kõrvitsa hind septembris vs. detsembris*.\n",
|
|
"\n",
|
|
"- **Logistiline regressioon** aitas teil avastada \"binaarseid kategooriaid\": selle hinnapunkti juures, *kas kõrvits on oranž või mitte-oranž*?\n",
|
|
"\n",
|
|
"Klassifikatsioon kasutab erinevaid algoritme, et määrata andmepunkti sildi või klassi. Töötame selle köögiandmetega, et näha, kas koostisosade rühma jälgides suudame määrata selle päritoluköögi.\n",
|
|
"\n",
|
|
"### [**Eel-loengu viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
|
|
"\n",
|
|
"### **Sissejuhatus**\n",
|
|
"\n",
|
|
"Klassifikatsioon on üks masinõppe teadlase ja andmeteadlase põhitegevusi. Alates lihtsast binaarse väärtuse klassifikatsioonist (\"kas see e-kiri on rämpspost või mitte?\") kuni keeruka pildiklassifikatsiooni ja segmentatsioonini arvutinägemise abil, on alati kasulik andmeid klassidesse sorteerida ja neilt küsimusi küsida.\n",
|
|
"\n",
|
|
"Teaduslikumalt öeldes loob teie klassifikatsioonimeetod ennustava mudeli, mis võimaldab teil kaardistada sisendmuutujate ja väljundmuutujate vahelist seost.\n",
|
|
"\n",
|
|
"<p>\n",
|
|
" <img src=\"../../../../../../translated_images/et/binary-multiclass.b56d0c86c81105a6.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Binaarsed vs. mitmeklassilised probleemid, mida klassifikatsioonialgoritmid lahendavad. Infograafika: Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"Enne kui alustame andmete puhastamise, visualiseerimise ja masinõppe ülesannete ettevalmistamise protsessi, õpime veidi erinevaid viise, kuidas masinõpet saab kasutada andmete klassifitseerimiseks.\n",
|
|
"\n",
|
|
"Klassifikatsioon, mis on tuletatud [statistikast](https://wikipedia.org/wiki/Statistical_classification), kasutab klassikalises masinõppes tunnuseid, nagu `suitsetaja`, `kaal` ja `vanus`, et määrata *tõenäosust X haiguse tekkeks*. Juhendatud õppimise tehnikana, mis sarnaneb varasemate regressiooniharjutustega, on teie andmed märgistatud ja masinõppe algoritmid kasutavad neid silte, et klassifitseerida ja ennustada andmekogumi klasse (või 'tunnuseid') ning määrata need rühma või tulemusse.\n",
|
|
"\n",
|
|
"✅ Võtke hetk, et ette kujutada andmekogumit köökidest. Mida suudaks vastata mitmeklassiline mudel? Mida suudaks vastata binaarne mudel? Mis siis, kui soovite määrata, kas antud köök tõenäoliselt kasutab lambaläätse? Mis siis, kui soovite näha, kas toidukotitäie tähtaniisi, artišokkide, lillkapsa ja mädarõika põhjal saaksite valmistada tüüpilise India roa?\n",
|
|
"\n",
|
|
"### **Tere tulemast 'klassifikaatorisse'**\n",
|
|
"\n",
|
|
"Küsimus, mida tahame selle köögiandmekogumi kohta küsida, on tegelikult **mitmeklassiline küsimus**, kuna meil on mitu võimalikku rahvuskööki, millega töötada. Arvestades koostisosade kogumit, millisesse neist paljudest klassidest andmed sobivad?\n",
|
|
"\n",
|
|
"Tidymodels pakub mitmeid erinevaid algoritme, mida saab kasutada andmete klassifitseerimiseks, sõltuvalt probleemist, mida soovite lahendada. Järgmistes kahes õppetükis õpite tundma mitmeid neist algoritmidest.\n",
|
|
"\n",
|
|
"#### **Eeldused**\n",
|
|
"\n",
|
|
"Selle õppetunni jaoks vajame järgmisi pakette, et andmeid puhastada, ette valmistada ja visualiseerida:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) on [R-pakettide kogum](https://www.tidyverse.org/packages), mis muudab andmeteaduse kiiremaks, lihtsamaks ja lõbusamaks!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) raamistik on [pakettide kogum](https://www.tidymodels.org/packages/) modelleerimiseks ja masinõppeks.\n",
|
|
"\n",
|
|
"- `DataExplorer`: [DataExplorer pakett](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) on mõeldud EDA protsessi ja aruannete loomise lihtsustamiseks ja automatiseerimiseks.\n",
|
|
"\n",
|
|
"- `themis`: [themis pakett](https://themis.tidymodels.org/) pakub lisaretsepte tasakaalustamata andmetega tegelemiseks.\n",
|
|
"\n",
|
|
"Saate need installida järgmiselt:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
|
|
"\n",
|
|
"Alternatiivselt kontrollib allolev skript, kas teil on selle mooduli lõpetamiseks vajalikud paketid olemas, ja installib need vajadusel.\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": [
|
|
"Laadime need suurepärased paketid hiljem ja teeme need meie praeguses R-i sessioonis kättesaadavaks. (See on lihtsalt illustratsiooniks, `pacman::p_load()` tegi seda juba teie eest)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YkKAxOJvGD4C"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Harjutus - puhasta ja tasakaalusta oma andmed\n",
|
|
"\n",
|
|
"Esimene ülesanne enne projekti alustamist on oma andmete puhastamine ja **tasakaalustamine**, et saavutada paremaid tulemusi.\n",
|
|
"\n",
|
|
"Tutvume andmetega! 🕵️\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": [
|
|
"Huvitav! Tundub, et esimene veerg on omamoodi `id` veerg. Uurime andmete kohta veidi rohkem teavet.\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": [
|
|
"Tulemustest näeme kohe, et meil on `2448` rida ja `385` veergu ning `0` puuduolevat väärtust. Samuti on meil 1 diskreetne veerg, *cuisine*.\n",
|
|
"\n",
|
|
"## Harjutus - köökide kohta õppimine\n",
|
|
"\n",
|
|
"Nüüd muutub töö huvitavamaks. Avastame andmete jaotuse köökide lõikes.\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": [
|
|
"Kööke on piiratud arv, kuid andmete jaotus on ebaühtlane. Sa saad seda parandada! Enne seda uurime veidi rohkem.\n",
|
|
"\n",
|
|
"Järgmisena määrame iga köögi eraldi tibble'isse ja selgitame välja, kui palju andmeid (read, veerud) on iga köögi kohta saadaval.\n",
|
|
"\n",
|
|
"> [Tibble](https://tibble.tidyverse.org/) on kaasaegne andmeraamistik.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/et/dplyr_filter.b480b264b03439ff.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Illustratsioon: @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": [
|
|
"Täiuslik!😋\n",
|
|
"\n",
|
|
"## **Harjutus - Avasta köökide populaarseimad koostisosad dplyr abil**\n",
|
|
"\n",
|
|
"Nüüd saad süveneda andmetesse ja õppida, millised on tüüpilised koostisosad erinevate köökide puhul. Tuleks eemaldada korduvad andmed, mis tekitavad segadust köökide vahel, nii et uurime seda probleemi.\n",
|
|
"\n",
|
|
"Loo R-is funktsioon `create_ingredient()`, mis tagastab koostisosade andmeraami. See funktsioon alustab ebaolulise veeru eemaldamisega ja sorteerib koostisosad nende esinemissageduse järgi.\n",
|
|
"\n",
|
|
"Funktsiooni põhiline struktuur R-is on:\n",
|
|
"\n",
|
|
"`myFunction <- function(arglist){`\n",
|
|
"\n",
|
|
"**`...`**\n",
|
|
"\n",
|
|
"**`return`**`(value)`\n",
|
|
"\n",
|
|
"`}`\n",
|
|
"\n",
|
|
"Korras sissejuhatuse R-i funktsioonidesse leiad [siit](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
|
|
"\n",
|
|
"Asume asja kallale! Kasutame [dplyr-i tegusõnu](https://dplyr.tidyverse.org/), mida oleme õppinud eelnevates tundides. Meeldetuletuseks:\n",
|
|
"\n",
|
|
"- `dplyr::select()`: aitab valida, millised **veerud** säilitada või välja jätta.\n",
|
|
"\n",
|
|
"- `dplyr::pivot_longer()`: aitab andmeid \"pikendada\", suurendades ridade arvu ja vähendades veergude arvu.\n",
|
|
"\n",
|
|
"- `dplyr::group_by()` ja `dplyr::summarise()`: aitavad leida erinevate gruppide kokkuvõtlikke statistilisi andmeid ja panna need kenasse tabelisse.\n",
|
|
"\n",
|
|
"- `dplyr::filter()`: loob andmete alamhulga, mis sisaldab ainult tingimustele vastavaid ridu.\n",
|
|
"\n",
|
|
"- `dplyr::mutate()`: aitab luua või muuta veerge.\n",
|
|
"\n",
|
|
"Vaata seda [*kunsti*-täis õppematerjali](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) Allison Horstilt, mis tutvustab mõningaid kasulikke andmete töötlemise funktsioone dplyr-is *(osa Tidyverse'ist)*.\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": [
|
|
"Nüüd saame funktsiooni kasutada, et saada ülevaade kümnest kõige populaarsemast koostisosast köögi järgi. Proovime seda `thai_df` abil.\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": [
|
|
"Eelmises jaotises kasutasime `geom_col()`, vaatame nüüd, kuidas saab kasutada ka `geom_bar`, et luua tulpdiagramme. Lisalugemiseks kasuta `?geom_bar`.\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": [
|
|
"Teeme sama Jaapani andmete jaoks.\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": [
|
|
"Mis saab Hiina köökidest?\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": [
|
|
"Vaatame India kööke 🌶️.\n"
|
|
],
|
|
"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": [
|
|
"Lõpuks kujuta Korea koostisosi.\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": [
|
|
"Andmete visualiseerimise põhjal saame nüüd eemaldada kõige tavalisemad koostisosad, mis tekitavad segadust erinevate köökide vahel, kasutades `dplyr::select()`.\n",
|
|
"\n",
|
|
"Kõigile meeldivad riis, küüslauk ja 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": [
|
|
"## Andmete eeltöötlus retseptide abil 👩🍳👨🍳 - Tasakaalustamata andmete käsitlemine ⚖️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/et/recipes.186acfa8ed2e8f00.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Illustratsioon: @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"Kuna see õppetund käsitleb kööke, peame `retseptid` konteksti asetama.\n",
|
|
"\n",
|
|
"Tidymodels pakub veel üht kasulikku paketti: `recipes` - pakett andmete eeltöötluseks.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kkFd-JxdIaL6"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Vaatame uuesti meie köökide jaotust.\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": [
|
|
"Nagu näha, on köökide arv jaotunud üsna ebaühtlaselt. Korea köökide arv on peaaegu kolm korda suurem kui Tai köökide arv. Tasakaalustamata andmed mõjutavad sageli mudeli jõudlust negatiivselt. Mõelge binaarsele klassifikatsioonile. Kui enamik teie andmetest kuulub ühte klassi, ennustab masinõppe mudel seda klassi sagedamini lihtsalt seetõttu, et selle kohta on rohkem andmeid. Andmete tasakaalustamine korrigeerib igasuguse kalduvuse ja aitab eemaldada selle tasakaalutuse. Paljud mudelid toimivad kõige paremini, kui vaatluste arv on võrdne, ja seetõttu kipuvad nad tasakaalustamata andmetega hätta jääma.\n",
|
|
"\n",
|
|
"Tasakaalustamata andmekogumitega tegelemiseks on peamiselt kaks viisi:\n",
|
|
"\n",
|
|
"- vähemuses oleva klassi vaatluste lisamine: `Üle-sampling`, näiteks SMOTE algoritmi kasutamine\n",
|
|
"\n",
|
|
"- enamuses oleva klassi vaatluste eemaldamine: `Alam-sampling`\n",
|
|
"\n",
|
|
"Näiteks demonstreerime nüüd, kuidas tasakaalustamata andmekogumitega toime tulla, kasutades `retsepti`. Retsepti võib mõelda kui plaani, mis kirjeldab, milliseid samme tuleks andmekogumile rakendada, et see oleks valmis andmeanalüüsiks.\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": [
|
|
"Vaatame lähemalt meie eeltöötluse samme.\n",
|
|
"\n",
|
|
"- `recipe()` funktsiooni kutsumine koos valemiga määrab retseptile muutujate *rollid*, kasutades `df_select` andmeid viitena. Näiteks on `cuisine` veerule määratud `outcome` roll, samas kui ülejäänud veerud on määratud `predictor` rolliks.\n",
|
|
"\n",
|
|
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) loob retsepti sammu *spetsifikatsiooni*, mis sünteetiliselt genereerib vähemuses oleva klassi uusi näiteid, kasutades nende juhtumite lähimaid naabreid.\n",
|
|
"\n",
|
|
"Kui soovime näha eeltöödeldud andmeid, peame oma retsepti [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) ja [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) abil ette valmistama.\n",
|
|
"\n",
|
|
"`prep()`: hindab vajalikud parameetrid treeningandmestiku põhjal, mida saab hiljem rakendada teistele andmestikele.\n",
|
|
"\n",
|
|
"`bake()`: rakendab ettevalmistatud retsepti operatsioonid mis tahes andmestikule.\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": [
|
|
"Lähme nüüd vaatama meie köökide jaotust ja võrdleme seda tasakaalustamata andmetega.\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": [
|
|
"Maitsev! Andmed on kenasti puhastatud, tasakaalus ja väga maitsvad 😋!\n",
|
|
"\n",
|
|
"> Tavaliselt kasutatakse retsepti eeltöötlusena modelleerimiseks, kus määratakse kindlaks, millised sammud tuleb andmestikule rakendada, et see modelleerimiseks valmis oleks. Sellisel juhul kasutatakse tavaliselt `workflow()` (nagu oleme näinud oma varasemates tundides) retsepti käsitsi hindamise asemel.\n",
|
|
">\n",
|
|
"> Seetõttu ei ole tavaliselt vaja **`prep()`** ja **`bake()`** retsepte kasutada, kui töötate tidymodels'iga, kuid need on kasulikud funktsioonid, et kinnitada, et retseptid teevad seda, mida ootate, nagu meie näites.\n",
|
|
">\n",
|
|
"> Kui **`bake()`** preptud retsepti koos **`new_data = NULL`**, saate tagasi andmed, mille te retsepti määratlemisel esitasite, kuid need on läbinud eeltöötluse sammud.\n",
|
|
"\n",
|
|
"Salvestame nüüd selle andmestiku koopia, et seda tulevastes tundides kasutada:\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": [
|
|
"See värske CSV-fail on nüüd leitav andmete juurkaustas.\n",
|
|
"\n",
|
|
"**🚀Väljakutse**\n",
|
|
"\n",
|
|
"See õppekava sisaldab mitmeid huvitavaid andmekogumeid. Uuri `data` kaustu ja vaata, kas mõni neist sisaldab andmekogumeid, mis sobiksid binaarseks või mitmeklassiliseks klassifitseerimiseks? Milliseid küsimusi sa selle andmekogumi kohta küsiksid?\n",
|
|
"\n",
|
|
"## [**Loengu järgne viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
|
|
"\n",
|
|
"## **Ülevaade ja iseseisev õppimine**\n",
|
|
"\n",
|
|
"- Vaata [paketti themis](https://github.com/tidymodels/themis). Milliseid muid tehnikaid võiksime kasutada tasakaalustamata andmete käsitlemiseks?\n",
|
|
"\n",
|
|
"- Tidy models [viite veebisait](https://www.tidymodels.org/start/).\n",
|
|
"\n",
|
|
"- H. Wickham ja G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
|
|
"\n",
|
|
"#### TÄNUD:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) suurepäraste illustratsioonide loomise eest, mis muudavad R-i kasutamise sõbralikumaks ja kaasahaaravamaks. Leia rohkem illustratsioone tema [galeriist](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) ja [Jen Looper](https://www.twitter.com/jenlooper) selle mooduli algse Python-versiooni loomise eest ♥️\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/et/r_learners_sm.cd14eb3581a9f28d.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Illustratsioon: @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WQs5621pMGwf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.\n"
|
|
]
|
|
}
|
|
]
|
|
} |