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

727 lines
29 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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:58:42+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "hu"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Készíts egy osztályozási modellt: Finom ázsiai és indiai konyhák\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Bevezetés a klasszifikációba: Tisztítsd, készítsd elő és vizualizáld az adataidat\n",
"\n",
"Ebben a négy leckében a klasszikus gépi tanulás egyik alapvető területét, a *klasszifikációt* fogod felfedezni. Különböző klasszifikációs algoritmusokat fogunk alkalmazni egy adatállományon, amely Ázsia és India csodálatos konyháiról szól. Reméljük, éhes vagy!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Ünnepeld a pán-ázsiai konyhákat ezekben a leckékben! Kép: Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Ünnepeld a pán-ázsiai konyhákat ezekben a leckékben! Kép: Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"A klasszifikáció a [felügyelt tanulás](https://wikipedia.org/wiki/Supervised_learning) egyik formája, amely sok hasonlóságot mutat a regressziós technikákkal. A klasszifikáció során egy modellt tanítasz arra, hogy megjósolja, melyik `kategóriába` tartozik egy elem. Ha a gépi tanulás lényege az, hogy adatállományok segítségével értékeket vagy neveket jósoljunk meg, akkor a klasszifikáció általában két csoportba sorolható: *bináris klasszifikáció* és *többosztályos klasszifikáció*.\n",
"\n",
"Emlékezz:\n",
"\n",
"- **Lineáris regresszió** segített megjósolni a változók közötti kapcsolatokat, és pontos előrejelzéseket készíteni arról, hogy egy új adatpont hol helyezkedik el a vonalhoz viszonyítva. Például meg tudtad jósolni egy numerikus értéket, mint *mennyibe kerül egy tök szeptemberben vs. decemberben*.\n",
"\n",
"- **Logisztikus regresszió** segített felfedezni \"bináris kategóriákat\": ezen az áron *narancssárga-e a tök vagy nem narancssárga*?\n",
"\n",
"A klasszifikáció különböző algoritmusokat használ annak meghatározására, hogy egy adatpont milyen címkét vagy osztályt kapjon. Dolgozzunk ezzel a konyhai adatállománnyal, hogy megállapítsuk, egy összetevőcsoport alapján milyen eredetű konyháról van szó.\n",
"\n",
"### [**Előadás előtti kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Bevezetés**\n",
"\n",
"A klasszifikáció a gépi tanulás kutatójának és adatkutatójának egyik alapvető tevékenysége. Az egyszerű bináris értékek klasszifikációjától (\"ez az email spam vagy nem?\") a komplex képosztályozásig és szegmentálásig számítógépes látás segítségével, mindig hasznos az adatokat osztályokba rendezni és kérdéseket feltenni róla.\n",
"\n",
"Tudományosabban megfogalmazva, a klasszifikációs módszered egy prediktív modellt hoz létre, amely lehetővé teszi, hogy feltérképezd a bemeneti változók és a kimeneti változók közötti kapcsolatot.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Bináris vs. többosztályos problémák, amelyeket a klasszifikációs algoritmusok kezelnek. Infografika: Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Mielőtt elkezdenénk az adatok tisztítását, vizualizálását és előkészítését a gépi tanulási feladatainkhoz, tanuljunk egy kicsit arról, hogy a gépi tanulás hogyan használható az adatok osztályozására.\n",
"\n",
"A [statisztikából](https://wikipedia.org/wiki/Statistical_classification) származó klasszifikáció a klasszikus gépi tanulásban olyan jellemzőket használ, mint például `dohányos`, `súly` és `életkor`, hogy meghatározza *X betegség kialakulásának valószínűségét*. A korábban végzett regressziós gyakorlatokhoz hasonló felügyelt tanulási technikaként az adataid címkézettek, és a gépi tanulási algoritmusok ezeket a címkéket használják az adatállomány osztályainak (vagy 'jellemzőinek') osztályozására és csoporthoz vagy eredményhez rendelésére.\n",
"\n",
"✅ Képzeld el egy pillanatra, hogy van egy adatállomány a konyhákról. Mit tudna megválaszolni egy többosztályos modell? Mit tudna megválaszolni egy bináris modell? Mi lenne, ha meg akarnád határozni, hogy egy adott konyha valószínűleg használ-e görögszénát? Mi lenne, ha azt akarnád látni, hogy egy élelmiszeres zacskónyi csillagánizs, articsóka, karfiol és torma alapján tudsz-e készíteni egy tipikus indiai ételt?\n",
"\n",
"### **Helló, 'klasszifikátor'**\n",
"\n",
"Az a kérdés, amit fel akarunk tenni ennek a konyhai adatállománynak, valójában egy **többosztályos kérdés**, mivel több lehetséges nemzeti konyhával dolgozunk. Egy adag összetevő alapján, melyik osztályba illik az adat?\n",
"\n",
"A Tidymodels több különböző algoritmust kínál az adatok osztályozására, attól függően, hogy milyen problémát szeretnél megoldani. A következő két leckében több ilyen algoritmusról fogsz tanulni.\n",
"\n",
"#### **Előfeltétel**\n",
"\n",
"Ehhez a leckéhez a következő csomagokra lesz szükségünk az adatok tisztításához, előkészítéséhez és vizualizálásához:\n",
"\n",
"- `tidyverse`: A [tidyverse](https://www.tidyverse.org/) egy [R csomaggyűjtemény](https://www.tidyverse.org/packages), amely gyorsabbá, könnyebbé és szórakoztatóbbá teszi az adatkutatást!\n",
"\n",
"- `tidymodels`: A [tidymodels](https://www.tidymodels.org/) keretrendszer egy [csomaggyűjtemény](https://www.tidymodels.org/packages/) modellezéshez és gépi tanuláshoz.\n",
"\n",
"- `DataExplorer`: A [DataExplorer csomag](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) célja az EDA folyamat és jelentéskészítés egyszerűsítése és automatizálása.\n",
"\n",
"- `themis`: A [themis csomag](https://themis.tidymodels.org/) extra receptlépéseket biztosít az egyensúlyhiányos adatok kezeléséhez.\n",
"\n",
"Telepítheted őket az alábbi módon:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternatívaként az alábbi szkript ellenőrzi, hogy megvannak-e a szükséges csomagok a modul elvégzéséhez, és telepíti őket, ha hiányoznak.\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": [
"Később betöltjük ezeket a nagyszerű csomagokat, és elérhetővé tesszük őket a jelenlegi R munkamenetünkben. (Ez csak szemléltetés céljából van, a `pacman::p_load()` ezt már megtette helyetted)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Gyakorlat - tisztítsd meg és egyensúlyozd ki az adataidat\n",
"\n",
"Az első feladat, mielőtt belekezdenél ebbe a projektbe, az adataid **tisztítása** és **kiegyensúlyozása**, hogy jobb eredményeket érj el.\n",
"\n",
"Ismerjük meg az adatokat! 🕵️\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": [
"Érdekes! Úgy tűnik, az első oszlop egyfajta `id` oszlop. Nézzünk meg egy kicsit több információt az adatról.\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": [
"Az eredményből azonnal láthatjuk, hogy `2448` sorunk és `385` oszlopunk van, valamint `0` hiányzó érték. Emellett van 1 diszkrét oszlopunk, *cuisine*.\n",
"\n",
"## Gyakorlat - ismerkedés a konyhákkal\n",
"\n",
"Most kezd igazán érdekessé válni a munka. Fedezzük fel az adatok eloszlását konyhánként.\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": [
"Van egy véges számú konyha, de az adatok eloszlása egyenetlen. Ezen változtathatsz! Mielőtt nekilátsz, fedezd fel egy kicsit jobban.\n",
"\n",
"Ezután rendeljük hozzá az egyes konyhákat a saját tibble-jükhöz, és derítsük ki, mennyi adat áll rendelkezésre (sorok, oszlopok) konyhánként.\n",
"\n",
"> A [tibble](https://tibble.tidyverse.org/) egy modern adatkeret.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Illusztráció: @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": [
"## **Gyakorlat - Felfedezd a legnépszerűbb hozzávalókat konyhánként a dplyr segítségével**\n",
"\n",
"Most mélyebben belemerülhetsz az adatokba, és megtudhatod, melyek a tipikus hozzávalók konyhánként. Tisztítsd meg az ismétlődő adatokat, amelyek zavart okozhatnak a konyhák között, így megismerheted ezt a problémát.\n",
"\n",
"Hozz létre egy `create_ingredient()` nevű függvényt R-ben, amely egy hozzávaló adatkeretet ad vissza. Ez a függvény egy haszontalan oszlop elhagyásával kezdődik, majd a hozzávalókat azok előfordulási száma alapján rendezi.\n",
"\n",
"Az R-ben egy függvény alapvető szerkezete a következő:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Egy átlátható bevezetőt az R függvényekhez [itt](https://skirmer.github.io/presentations/functions_with_r.html#1) találhatsz.\n",
"\n",
"Vágjunk bele! Használni fogjuk a [dplyr igéket](https://dplyr.tidyverse.org/), amelyeket az előző leckékben tanultunk. Összefoglalásként:\n",
"\n",
"- `dplyr::select()`: segít kiválasztani, hogy mely **oszlopokat** tartsd meg vagy zárj ki.\n",
"\n",
"- `dplyr::pivot_longer()`: segít \"meghosszabbítani\" az adatokat, növelve a sorok számát és csökkentve az oszlopok számát.\n",
"\n",
"- `dplyr::group_by()` és `dplyr::summarise()`: segít megtalálni az összefoglaló statisztikákat különböző csoportok számára, és egy szép táblázatba rendezni őket.\n",
"\n",
"- `dplyr::filter()`: létrehoz egy adat-alhalmazt, amely csak azokat a sorokat tartalmazza, amelyek megfelelnek a feltételeidnek.\n",
"\n",
"- `dplyr::mutate()`: segít új oszlopokat létrehozni vagy meglévőket módosítani.\n",
"\n",
"Nézd meg Allison Horst [*művészet*-tel teli learnr oktatóanyagát](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome), amely bemutat néhány hasznos adatkezelési függvényt a dplyr-ben *(a Tidyverse része)*.\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": [
"Most nézzük meg a funkciót, hogy képet kapjunk a tíz legnépszerűbb hozzávalóról konyhák szerint. Próbáljuk ki a `thai_df` adathalmazzal.\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": [
"Az előző részben a `geom_col()`-t használtuk, nézzük meg, hogyan használhatod a `geom_bar`-t is oszlopdiagramok készítéséhez. Használd a `?geom_bar` parancsot további olvasáshoz.\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": [
"Csináljuk ugyanezt a japán adatokkal.\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": [
"Mi a helyzet a kínai konyhával?\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": [
"Végül ábrázolja a koreai hozzávalókat.\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": [
"A vizualizációk alapján most elhagyhatjuk azokat a leggyakoribb hozzávalókat, amelyek zavart keltenek a különböző konyhák megkülönböztetése során, a `dplyr::select()` használatával.\n",
"\n",
"Mindenki szereti a rizst, a fokhagymát és a gyömbért!\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": [
"## Adatok előfeldolgozása receptek segítségével 👩‍🍳👨‍🍳 - Kiegyensúlyozatlan adatok kezelése ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Illusztráció: @allison_horst</figcaption>\n",
"\n",
"Mivel ez a lecke a konyhákról szól, a `recepteket` kontextusba kell helyeznünk.\n",
"\n",
"A Tidymodels egy újabb remek csomagot kínál: `recipes` - egy csomag az adatok előfeldolgozásához.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Nézzük meg újra a konyháink eloszlását.\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": [
"Amint látható, a konyhák számának eloszlása meglehetősen egyenlőtlen. A koreai konyhák majdnem háromszor annyian vannak, mint a thai konyhák. Az egyensúlyhiányos adatok gyakran negatívan befolyásolják a modell teljesítményét. Gondoljunk csak egy bináris osztályozásra. Ha az adatok többsége egy osztályhoz tartozik, a gépi tanulási modell gyakrabban fogja azt az osztályt előre jelezni, egyszerűen azért, mert több adat áll rendelkezésre róla. Az adatok kiegyensúlyozása segít eltávolítani ezt az egyensúlyhiányt az eltorzult adatokból. Sok modell akkor teljesít a legjobban, ha a megfigyelések száma egyenlő, és ezért nehézségeik vannak az egyensúlyhiányos adatokkal.\n",
"\n",
"Az egyensúlyhiányos adathalmazok kezelésére alapvetően két módszer létezik:\n",
"\n",
"- megfigyelések hozzáadása a kisebbségi osztályhoz: `Túlmintavételezés`, például SMOTE algoritmus használatával\n",
"\n",
"- megfigyelések eltávolítása a többségi osztályból: `Alulminta-vételezés`\n",
"\n",
"Most bemutatjuk, hogyan lehet egyensúlyhiányos adathalmazokat kezelni egy `recept` segítségével. A receptet úgy lehet elképzelni, mint egy tervrajzot, amely leírja, milyen lépéseket kell alkalmazni egy adathalmazon ahhoz, hogy készen álljon az adatelemzésre.\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": [
"Vizsgáljuk meg az előfeldolgozási lépéseinket.\n",
"\n",
"- A `recipe()` függvény hívása egy formulával megadja a receptnek a változók *szerepeit*, a `df_select` adatok alapján. Például a `cuisine` oszlopnak az `outcome` szerepet adtuk, míg a többi oszlopnak a `predictor` szerepet.\n",
"\n",
"- A [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) egy receptlépés *specifikációját* hozza létre, amely szintetikusan generál új példákat a kisebbségi osztályból, ezeknek az eseteknek a legközelebbi szomszédai alapján.\n",
"\n",
"Most, ha meg szeretnénk nézni az előfeldolgozott adatokat, először [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) és [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) függvényeket kell használnunk a receptünkhöz.\n",
"\n",
"`prep()`: becsléseket végez a szükséges paraméterekre egy tanuló adathalmazon, amelyeket később más adathalmazokra is alkalmazhatunk.\n",
"\n",
"`bake()`: egy előkészített receptet vesz, és az abban meghatározott műveleteket alkalmazza bármely adathalmazra.\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": [
"Most nézzük meg a konyhák eloszlását, és hasonlítsuk össze azokat a kiegyensúlyozatlan adatokkal.\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": [
"Nyam! Az adatok szépek, tiszták, kiegyensúlyozottak, és nagyon finomak 😋!\n",
"\n",
"> Általában egy receptet előfeldolgozóként használnak a modellezéshez, ahol meghatározza, hogy milyen lépéseket kell alkalmazni egy adathalmazon annak érdekében, hogy az készen álljon a modellezésre. Ebben az esetben általában egy `workflow()`-t használnak (ahogy azt már korábbi leckéinkben láttuk) ahelyett, hogy manuálisan becsülnénk meg egy receptet.\n",
">\n",
"> Emiatt általában nincs szükség arra, hogy **`prep()`** és **`bake()`** függvényeket használj, amikor a tidymodels-t alkalmazod, de ezek hasznos funkciók lehetnek az eszköztáradban, hogy megerősítsd, hogy a receptek azt csinálják, amit elvársz mint a mi esetünkben.\n",
">\n",
"> Amikor egy előkészített receptet **`bake()`**-elsz **`new_data = NULL`** beállítással, akkor visszakapod azokat az adatokat, amelyeket a recept meghatározásakor megadtál, de már átestek az előfeldolgozási lépéseken.\n",
"\n",
"Most mentsünk el egy másolatot ezekről az adatokról, hogy a későbbi leckékben is használhassuk őket:\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": [
"Ez a friss CSV mostantól a gyökéradatok mappájában található.\n",
"\n",
"**🚀Kihívás**\n",
"\n",
"Ez a tananyag számos érdekes adatállományt tartalmaz. Nézd át a `data` mappákat, és nézd meg, hogy van-e köztük olyan adatállomány, amely alkalmas lehet bináris vagy többosztályos osztályozásra! Milyen kérdéseket tennél fel ezzel az adatállománnyal kapcsolatban?\n",
"\n",
"## [**Előadás utáni kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Áttekintés és önálló tanulás**\n",
"\n",
"- Nézd meg a [themis csomagot](https://github.com/tidymodels/themis). Milyen egyéb technikákat használhatnánk az egyensúlytalan adatok kezelésére?\n",
"\n",
"- Tidy models [referencia weboldal](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham és G. Grolemund, [*R for Data Science: Vizualizálás, modellezés, átalakítás, rendezés és adatimportálás*](https://r4ds.had.co.nz/).\n",
"\n",
"#### KÖSZÖNET ILLETI:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) az elképesztő illusztrációkért, amelyek barátságosabbá és vonzóbbá teszik az R-t. További illusztrációkat találhatsz a [galériájában](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) és [Jen Looper](https://www.twitter.com/jenlooper) az eredeti Python verzió elkészítéséért ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Illusztráció: @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Felelősségkizárás**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével készült. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt a professzionális, emberi fordítás igénybevétele. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
]
}
]
}