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/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb

639 lines
29 KiB

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-09-04T08:14:13+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "hu"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Fedezd fel a K-Means klaszterezést R és Tidy adatelvek segítségével.\n",
"\n",
"### [**Előadás előtti kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"Ebben a leckében megtanulod, hogyan hozz létre klasztereket a Tidymodels csomag és az R ökoszisztéma más csomagjai (hívjuk őket barátoknak 🧑‍🤝‍🧑) segítségével, valamint az előzőekben importált nigériai zenei adathalmazzal. Áttekintjük a K-Means klaszterezés alapjait. Ne feledd, ahogy az előző leckében tanultad, számos módja van a klaszterekkel való munkának, és az alkalmazott módszer az adataidtól függ. Mi a K-Means-t fogjuk kipróbálni, mivel ez a leggyakoribb klaszterezési technika. Kezdjük is!\n",
"\n",
"Fogalmak, amelyeket megismerhetsz:\n",
"\n",
"- Sziluett pontszám\n",
"\n",
"- Könyökmódszer\n",
"\n",
"- Inercia\n",
"\n",
"- Variancia\n",
"\n",
"### **Bevezetés**\n",
"\n",
"A [K-Means klaszterezés](https://wikipedia.org/wiki/K-means_clustering) a jelfeldolgozás területéből származó módszer. Arra használják, hogy az adatokat `k klaszterekre` osszák és csoportosítsák a jellemzőik hasonlósága alapján.\n",
"\n",
"A klaszterek [Voronoi diagramokként](https://wikipedia.org/wiki/Voronoi_diagram) is megjeleníthetők, amelyek tartalmaznak egy pontot (vagy 'magot') és annak megfelelő régióját.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika: Jen Looper</figcaption>\n",
"\n",
"A K-Means klaszterezés lépései a következők:\n",
"\n",
"1. Az adatelemző meghatározza a létrehozandó klaszterek kívánt számát.\n",
"\n",
"2. Ezután az algoritmus véletlenszerűen kiválaszt K megfigyelést az adathalmazból, hogy ezek szolgáljanak a klaszterek kezdeti középpontjaként (azaz centroidként).\n",
"\n",
"3. Ezután a fennmaradó megfigyeléseket hozzárendelik a legközelebbi centroidhoz.\n",
"\n",
"4. Ezután minden klaszter új átlagát kiszámítják, és a centroidot az átlaghoz mozgatják.\n",
"\n",
"5. Most, hogy a középpontokat újraszámították, minden megfigyelést újra ellenőriznek, hogy közelebb lehet-e egy másik klaszterhez. Az összes objektumot újra hozzárendelik az új klaszterátlagok alapján. A klaszter-hozzárendelési és centroid-frissítési lépéseket iteratívan ismétlik, amíg a klaszter-hozzárendelések nem változnak tovább (azaz amikor konvergencia történik). Az algoritmus általában akkor áll le, amikor minden új iteráció elhanyagolható centroid-mozgást eredményez, és a klaszterek statikussá válnak.\n",
"\n",
"<div>\n",
"\n",
"> Ne feledd, hogy a kezdeti k megfigyelések véletlenszerű kiválasztása miatt, amelyek a kezdő centroidként szolgálnak, kissé eltérő eredményeket kaphatunk minden alkalommal, amikor alkalmazzuk az eljárást. Emiatt a legtöbb algoritmus több *véletlen kezdést* használ, és azt az iterációt választja, amely a legalacsonyabb WCSS-t eredményezi. Ezért erősen ajánlott, hogy mindig több *nstart* értékkel futtasd a K-Means-t, hogy elkerüld a *nem kívánt lokális optimumot.*\n",
"\n",
"</div>\n",
"\n",
"Ez a rövid animáció Allison Horst [műalkotásával](https://github.com/allisonhorst/stats-illustrations) magyarázza a klaszterezési folyamatot:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Műalkotás: @allison_horst</figcaption>\n",
"\n",
"Egy alapvető kérdés, amely a klaszterezés során felmerül: honnan tudod, hány klaszterre kell osztanod az adataidat? A K-Means egyik hátránya, hogy meg kell határoznod `k`-t, azaz a `centroidok` számát. Szerencsére a `könyökmódszer` segít egy jó kiindulási érték becslésében `k` számára. Mindjárt ki is próbálod.\n",
"\n",
"### \n",
"\n",
"**Előfeltétel**\n",
"\n",
"Ott folytatjuk, ahol az [előző leckében](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) abbahagytuk, ahol elemeztük az adathalmazt, számos vizualizációt készítettünk, és az adathalmazt érdekes megfigyelésekre szűrtük. Mindenképpen nézd meg!\n",
"\n",
"Néhány csomagra szükségünk lesz, hogy belevágjunk ebbe a modulba. Telepítheted őket így: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Alternatívaként az alábbi szkript ellenőrzi, hogy megvannak-e a szükséges csomagok a modul befejezéséhez, és telepíti őket, ha hiányoznak.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"Kezdjünk bele!\n",
"\n",
"## 1. Egy tánc az adatokkal: Szűkítsük le a 3 legnépszerűbb zenei műfajra\n",
"\n",
"Ez egy összefoglaló arról, amit az előző leckében csináltunk. Vágjunk bele az adatok elemzésébe!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 Ez jól sikerült!\n",
"\n",
"## 2. További adatfeltárás.\n",
"\n",
"Mennyire tiszta ez az adat? Nézzük meg a szélsőséges értékeket boxplotok segítségével. Koncentráljunk azokra a numerikus oszlopokra, amelyekben kevesebb a szélsőséges érték (bár ezeket ki is lehet tisztítani). A boxplotok megmutatják az adatok tartományát, és segítenek eldönteni, mely oszlopokat érdemes használni. Fontos megjegyezni, hogy a boxplotok nem mutatják a szórást, ami a jól klaszterezhető adatok egyik fontos eleme. További információért lásd [ezt a vitát](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"A [boxplotok](https://en.wikipedia.org/wiki/Box_plot) grafikus módon ábrázolják a `numerikus` adatok eloszlását, ezért kezdjük azzal, hogy *kiválasztjuk* az összes numerikus oszlopot a népszerű zenei műfajokkal együtt.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"Látod, milyen egyszerűvé teszi a `where` kiválasztási segéd az ilyen feladatokat 💁? Fedezz fel további hasonló funkciókat [itt](https://tidyselect.r-lib.org/).\n",
"\n",
"Mivel minden numerikus jellemzőhöz boxplotot fogunk készíteni, és el szeretnénk kerülni a ciklusok használatát, alakítsuk át az adatainkat egy *hosszabb* formátumra, amely lehetővé teszi számunkra, hogy kihasználjuk a `facets` előnyeit - olyan aládiagramokat, amelyek mindegyike az adatok egy-egy részhalmazát jeleníti meg.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"Sokkal hosszabb! Most itt az ideje néhány `ggplot`-nak! Szóval, melyik `geom`-ot fogjuk használni?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"Könnyű-gg!\n",
"\n",
"Most már láthatjuk, hogy ez az adat kissé zajos: ha minden oszlopot boxplotként megfigyelünk, láthatók a szélsőértékek. Át lehetne nézni az adathalmazt, és eltávolítani ezeket a szélsőértékeket, de ez eléggé lecsökkentené az adatokat.\n",
"\n",
"Egyelőre válasszuk ki, mely oszlopokat fogjuk használni a klaszterezési gyakorlatunkhoz. Válasszuk ki a hasonló tartományú numerikus oszlopokat. Az `artist_top_genre` oszlopot numerikusként is kódolhatnánk, de most elhagyjuk.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. K-means klaszterezés számítása R-ben\n",
"\n",
"Az R-ben a beépített `kmeans` függvénnyel számíthatjuk ki a k-means klaszterezést, lásd `help(\"kmeans()\")`. A `kmeans()` függvény elsődleges argumentumként egy adatkeretet fogad el, amelynek minden oszlopa numerikus.\n",
"\n",
"A k-means klaszterezés használatakor az első lépés az, hogy megadjuk a klaszterek számát (k), amelyeket a végső megoldásban létrehozunk. Tudjuk, hogy az adatállományból 3 zenei műfajt különítettünk el, így próbáljuk meg a 3-at:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"A kmeans objektum több információt tartalmaz, amelyet jól elmagyaráz a `help(\"kmeans()\")`. Most koncentráljunk néhányra. Láthatjuk, hogy az adatokat 3 klaszterbe csoportosították, amelyek méretei: 65, 110, 111. Az eredmény tartalmazza a klaszterek középpontjait (átlagait) is a 3 csoport esetében az 5 változón keresztül.\n",
"\n",
"A klaszterezési vektor az egyes megfigyelések klaszterhez való hozzárendelését jelöli. Használjuk az `augment` függvényt, hogy hozzáadjuk a klaszterhez való hozzárendelést az eredeti adatállományhoz.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"Tökéletes, most éppen 3 csoportra osztottuk az adathalmazunkat. De mennyire jó a klaszterezésünk 🤷? Nézzük meg a `Silhouette pontszámot`.\n",
"\n",
"### **Silhouette pontszám**\n",
"\n",
"A [Silhouette elemzés](https://en.wikipedia.org/wiki/Silhouette_(clustering)) segítségével tanulmányozhatjuk az eredményül kapott klaszterek közötti távolságot. Ez a pontszám -1 és 1 között változik, és ha a pontszám közel van az 1-hez, akkor a klaszter sűrű és jól elkülönül a többi klasztertől. A 0-hoz közeli érték átfedő klasztereket jelez, ahol a minták nagyon közel vannak a szomszédos klaszterek döntési határához. [forrás](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Az átlagos silhouette módszer kiszámítja a megfigyelések átlagos silhouette értékét különböző *k* értékekre. Egy magas átlagos silhouette pontszám jó klaszterezést jelez.\n",
"\n",
"A `silhouette` függvény a cluster csomagban használható az átlagos silhouette szélesség kiszámítására.\n",
"\n",
"> A silhouette bármilyen [távolság](https://en.wikipedia.org/wiki/Distance \"Distance\") metrikával kiszámítható, például az [Euklideszi távolság](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") vagy a [Manhattani távolság](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") segítségével, amelyeket az [előző leckében](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) tárgyaltunk.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"Pontszámunk **0,549**, tehát pontosan középen van. Ez arra utal, hogy adataink nem különösebben alkalmasak az ilyen típusú klaszterezésre. Nézzük meg, hogy vizuálisan meg tudjuk-e erősíteni ezt a feltételezést. A [factoextra csomag](https://rpkgs.datanovia.com/factoextra/index.html) olyan funkciókat biztosít (`fviz_cluster()`), amelyekkel a klaszterezés vizualizálható.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"Az átfedés a klaszterek között azt jelzi, hogy adataink nem különösebben alkalmasak erre a fajta klaszterezésre, de folytassuk.\n",
"\n",
"## 4. Az optimális klaszterek meghatározása\n",
"\n",
"Egy alapvető kérdés, amely gyakran felmerül a K-Means klaszterezés során, a következő: ha nincsenek ismert osztálycímkék, honnan tudjuk, hány klaszterre kell osztani az adatokat?\n",
"\n",
"Egy lehetséges módszer az, hogy egy adatmintát használunk, és `létrehozunk egy sor klaszterezési modellt` növekvő klaszterszámmal (például 1-től 10-ig), majd kiértékeljük a klaszterezési metrikákat, mint például a **Silhouette pontszám.**\n",
"\n",
"Határozzuk meg az optimális klaszterszámot úgy, hogy különböző *k* értékekre kiszámítjuk a klaszterezési algoritmust, és kiértékeljük a **klaszteren belüli négyzetösszeget** (WCSS). A klaszteren belüli négyzetösszeg (WCSS) az összetartozóságot méri, és azt szeretnénk, hogy ez minél kisebb legyen, mivel az alacsonyabb értékek azt jelentik, hogy az adatpontok közelebb vannak egymáshoz.\n",
"\n",
"Vizsgáljuk meg, hogyan hatnak a különböző `k` választások, 1-től 10-ig, erre a klaszterezésre.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"Most, hogy megvan az összesített klaszteren belüli négyzetösszeg (tot.withinss) minden klaszterezési algoritmus esetében *k* középponttal, az [könyökmódszert](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) használjuk az optimális klaszterszám meghatározására. A módszer abból áll, hogy ábrázoljuk a WCSS-t a klaszterek számának függvényében, és kiválasztjuk a [görbe könyökét](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") a használni kívánt klaszterszámként.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"A grafikon jelentős csökkenést mutat a WCSS-ben (tehát nagyobb *szorosságot*), ahogy a klaszterek száma egytől kettőig növekszik, majd további észrevehető csökkenést két és három klaszter között. Ezt követően a csökkenés kevésbé kifejezett, ami egy `könyök` 💪-t eredményez a grafikonon körülbelül három klaszternél. Ez jó jelzés arra, hogy két-három viszonylag jól elkülönített klaszter található az adatpontok között.\n",
"\n",
"Most folytathatjuk a klaszterezési modell kinyerését, ahol `k = 3`:\n",
"\n",
"> `pull()`: egyetlen oszlop kinyerésére használható\n",
">\n",
"> `pluck()`: adatszerkezetek, például listák indexelésére használható\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"Szuper! Nézzük meg a kapott klasztereket. Mit szólnál egy kis interaktivitáshoz a `plotly` segítségével?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"Talán azt vártuk volna, hogy minden klaszter (különböző színekkel jelölve) eltérő műfajokat képviseljen (különböző alakzatokkal jelölve).\n",
"\n",
"Nézzük meg a modell pontosságát.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"Ennek a modellnek a pontossága nem rossz, de nem is kiemelkedő. Lehetséges, hogy az adatok nem igazán alkalmasak a K-Means klaszterezéshez. Az adatok túl kiegyensúlyozatlanok, kevéssé korreláltak, és túl nagy a variancia az oszlopértékek között ahhoz, hogy jól klaszterezhetők legyenek. Valójában a kialakuló klaszterek valószínűleg erősen befolyásoltak vagy torzítottak az általunk fentebb meghatározott három műfajkategória által.\n",
"\n",
"Ennek ellenére ez egy igazán tanulságos folyamat volt!\n",
"\n",
"A Scikit-learn dokumentációjában látható, hogy egy ilyen modell, ahol a klaszterek nem túl jól elkülönültek, \"variancia\" problémával küzd:\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika a Scikit-learn-től</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variancia**\n",
"\n",
"A variancia definíciója: \"az átlagtól való négyzetes eltérések átlaga\" [forrás](https://www.mathsisfun.com/data/standard-deviation.html). Ebben a klaszterezési problémában arra utal, hogy az adataink számai hajlamosak túlságosan eltérni az átlagtól.\n",
"\n",
"✅ Ez egy remek alkalom arra, hogy átgondold, milyen módokon lehetne ezt a problémát orvosolni. Finomítsd az adatokat? Használj más oszlopokat? Próbálj ki egy másik algoritmust? Tipp: Próbáld meg [normalizálni az adatokat](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) és tesztelj más oszlopokat.\n",
"\n",
"> Próbáld ki ezt a '[variancia kalkulátort](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', hogy jobban megértsd a koncepciót.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Kihívás**\n",
"\n",
"Tölts el egy kis időt ezzel a jegyzettel, és finomítsd a paramétereket. Tudod javítani a modell pontosságát az adatok tisztításával (például a kiugró értékek eltávolításával)? Használhatsz súlyokat, hogy bizonyos adatminták nagyobb súlyt kapjanak. Mit tehetsz még, hogy jobb klasztereket hozz létre?\n",
"\n",
"Tipp: Próbáld meg skálázni az adatokat. A jegyzetben van kommentált kód, amely hozzáadja a standard skálázást, hogy az adat oszlopai jobban hasonlítsanak egymásra tartományuk tekintetében. Meg fogod látni, hogy bár a sziluett pontszám csökken, az \"elbow\" grafikon görbülete kisimul. Ez azért van, mert ha az adatokat nem skálázod, akkor a kisebb varianciájú adatok nagyobb súlyt kapnak. Olvass többet erről a problémáról [itt](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Utólagos kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Áttekintés és önálló tanulás**\n",
"\n",
"- Nézz meg egy K-Means szimulátort [például ezt](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Ezzel az eszközzel vizualizálhatod a mintapontokat és meghatározhatod a centroidokat. Szerkesztheted az adatok véletlenszerűségét, a klaszterek számát és a centroidok számát. Segít ez abban, hogy jobban megértsd, hogyan csoportosíthatók az adatok?\n",
"\n",
"- Nézd meg [ezt a K-Means kézikönyvet](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) a Stanfordtól.\n",
"\n",
"Szeretnéd kipróbálni az újonnan megszerzett klaszterezési készségeidet olyan adathalmazokon, amelyek jól illeszkednek a K-Means klaszterezéshez? Nézd meg:\n",
"\n",
"- [Klaszterezési modellek tanítása és értékelése](https://rpubs.com/eR_ic/clustering) Tidymodels és társai segítségével\n",
"\n",
"- [K-means klaszterelemzés](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-means klaszterezés rendezett adatok elveivel](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Feladat**\n",
"\n",
"[Próbálj ki különböző klaszterezési módszereket](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## KÖSZÖNET:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) az eredeti Python verzió elkészítéséért ♥️\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",
"Jó tanulást kíván,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>Illusztráció @allison_horst-tól</figcaption>\n"
]
},
{
"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 lett lefordítva. 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 professzionális, emberi fordítást igénybe venni. 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"
]
}
]
}