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

642 lines
28 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-06T14:24:20+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "sk"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Preskúmajte K-Means zhlukovanie pomocou R a princípov Tidy dát.\n",
"\n",
"### [**Kvíz pred prednáškou**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"V tejto lekcii sa naučíte, ako vytvárať zhluky pomocou balíka Tidymodels a ďalších balíkov v ekosystéme R (nazveme ich priatelia 🧑‍🤝‍🧑) a datasetu nigérijskej hudby, ktorý ste importovali skôr. Pokryjeme základy K-Means pre zhlukovanie. Majte na pamäti, že ako ste sa naučili v predchádzajúcej lekcii, existuje mnoho spôsobov, ako pracovať so zhlukmi, a metóda, ktorú použijete, závisí od vašich dát. Skúsime K-Means, pretože je to najbežnejšia technika zhlukovania. Poďme na to!\n",
"\n",
"Pojmy, o ktorých sa dozviete:\n",
"\n",
"- Silhouette skórovanie\n",
"\n",
"- Metóda lakťa\n",
"\n",
"- Inercia\n",
"\n",
"- Variancia\n",
"\n",
"### **Úvod**\n",
"\n",
"[K-Means zhlukovanie](https://wikipedia.org/wiki/K-means_clustering) je metóda odvodená z oblasti spracovania signálov. Používa sa na rozdelenie a rozčlenenie skupín dát do `k zhlukov` na základe podobností ich vlastností.\n",
"\n",
"Zhluky môžu byť vizualizované ako [Voronoi diagramy](https://wikipedia.org/wiki/Voronoi_diagram), ktoré zahŕňajú bod (alebo 'semienko') a jeho zodpovedajúcu oblasť.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika od Jen Looper</figcaption>\n",
"\n",
"\n",
"K-Means zhlukovanie má nasledujúce kroky:\n",
"\n",
"1. Data scientist začne tým, že špecifikuje požadovaný počet zhlukov, ktoré sa majú vytvoriť.\n",
"\n",
"2. Následne algoritmus náhodne vyberie K pozorovaní z datasetu, ktoré budú slúžiť ako počiatočné centrá zhlukov (t.j. centroidy).\n",
"\n",
"3. Potom sa každé zvyšné pozorovanie priradí k najbližšiemu centroidu.\n",
"\n",
"4. Následne sa vypočíta nový priemer každého zhluku a centroid sa presunie na tento priemer.\n",
"\n",
"5. Teraz, keď boli centrá prepočítané, každé pozorovanie sa opäť skontroluje, či by nemohlo byť bližšie k inému zhluku. Všetky objekty sa znovu priradia pomocou aktualizovaných priemerov zhlukov. Kroky priraďovania zhlukov a aktualizácie centroidov sa iteratívne opakujú, kým sa priradenia zhlukov prestanú meniť (t.j. keď sa dosiahne konvergencia). Typicky algoritmus končí, keď každá nová iterácia vedie k zanedbateľnému pohybu centroidov a zhluky sa stanú statickými.\n",
"\n",
"<div>\n",
"\n",
"> Upozorňujeme, že kvôli náhodnosti počiatočných k pozorovaní použitých ako východiskové centroidy môžeme získať mierne odlišné výsledky pri každom použití postupu. Z tohto dôvodu väčšina algoritmov používa niekoľko *náhodných začiatkov* a vyberie iteráciu s najnižším WCSS. Preto sa dôrazne odporúča vždy spustiť K-Means s viacerými hodnotami *nstart*, aby sa predišlo *nežiaducemu lokálnemu optimu.*\n",
"\n",
"</div>\n",
"\n",
"Táto krátka animácia využívajúca [ilustrácie](https://github.com/allisonhorst/stats-illustrations) od Allison Horst vysvetľuje proces zhlukovania:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Ilustrácia od @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Základná otázka, ktorá pri zhlukovaní vyvstáva, je táto: ako viete, na koľko zhlukov rozdeliť vaše dáta? Jednou z nevýhod použitia K-Means je skutočnosť, že budete musieť určiť `k`, teda počet `centroidov`. Našťastie `metóda lakťa` pomáha odhadnúť dobrú východiskovú hodnotu pre `k`. Vyskúšate si to o chvíľu.\n",
"\n",
"### \n",
"\n",
"**Predpoklady**\n",
"\n",
"Nadviažeme presne tam, kde sme skončili v [predchádzajúcej lekcii](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), kde sme analyzovali dataset, vytvorili množstvo vizualizácií a filtrovali dataset na pozorovania, ktoré nás zaujímajú. Určite si ju pozrite!\n",
"\n",
"Budeme potrebovať niekoľko balíkov na dokončenie tohto modulu. Môžete si ich nainštalovať pomocou: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Alternatívne, nasledujúci skript skontroluje, či máte balíky potrebné na dokončenie tohto modulu, a nainštaluje ich za vás, ak niektoré chýbajú.\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": [
"Poďme na to!\n",
"\n",
"## 1. Tanec s dátami: Zúžme to na 3 najpopulárnejšie hudobné žánre\n",
"\n",
"Toto je zhrnutie toho, čo sme robili v predchádzajúcej lekcii. Poďme si trochu pohrať s dátami!\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": [
"🤩 To išlo skvele!\n",
"\n",
"## 2. Viac prieskumu údajov.\n",
"\n",
"Aké čisté sú tieto údaje? Poďme skontrolovať odľahlé hodnoty pomocou boxplotov. Zameriame sa na číselné stĺpce s menším počtom odľahlých hodnôt (aj keď by ste mohli odľahlé hodnoty vyčistiť). Boxploty môžu ukázať rozsah údajov a pomôžu pri výbere stĺpcov na použitie. Upozorňujeme, že boxploty neukazujú rozptyl, čo je dôležitý prvok pre dobré zoskupiteľné údaje. Pre ďalšie čítanie si pozrite [túto diskusiu](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"[Boxploty](https://en.wikipedia.org/wiki/Box_plot) sa používajú na grafické znázornenie distribúcie `číselných` údajov, takže začnime *výberom* všetkých číselných stĺpcov spolu s populárnymi hudobnými žánrami.\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": [
"Pozrite sa, ako výberový pomocník `where` uľahčuje tento proces 💁. Preskúmajte ďalšie podobné funkcie [tu](https://tidyselect.r-lib.org/).\n",
"\n",
"Keďže budeme vytvárať boxplot pre každú číselnú vlastnosť a chceme sa vyhnúť používaniu slučiek, preformátujme naše údaje do *dlhšieho* formátu, ktorý nám umožní využiť `facets` - podgrafy, z ktorých každý zobrazuje jednu podmnožinu údajov.\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": [
"Oveľa dlhšie! Teraz je čas na nejaké `ggplots`! Aký `geom` použijeme?\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": [
"Jednoduché-gg!\n",
"\n",
"Teraz môžeme vidieť, že tieto údaje sú trochu šumivé: pri pozorovaní jednotlivých stĺpcov ako boxplotov môžete vidieť odľahlé hodnoty. Mohli by ste prejsť dataset a odstrániť tieto odľahlé hodnoty, ale to by údaje dosť zredukovalo.\n",
"\n",
"Zatiaľ si vyberme, ktoré stĺpce použijeme na náš klastrovací cvičenie. Vyberme si číselné stĺpce s podobnými rozsahmi. Mohli by sme zakódovať `artist_top_genre` ako číselnú hodnotu, ale zatiaľ ho vynecháme.\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. Výpočet k-means zoskupovania v R\n",
"\n",
"K-means môžeme vypočítať v R pomocou zabudovanej funkcie `kmeans`, pozrite si `help(\"kmeans()\")`. Funkcia `kmeans()` prijíma dátový rámec so všetkými číselnými stĺpcami ako svoj hlavný argument.\n",
"\n",
"Prvým krokom pri používaní k-means zoskupovania je určiť počet klastrov (k), ktoré budú vytvorené vo finálnom riešení. Vieme, že v dátovom súbore sme identifikovali 3 hudobné žánre, takže skúsme 3:\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": [
"Objekt kmeans obsahuje niekoľko informácií, ktoré sú dobre vysvetlené v `help(\"kmeans()\")`. Momentálne sa zamerajme na niekoľko z nich. Vidíme, že údaje boli rozdelené do 3 klastrov s veľkosťami 65, 110, 111. Výstup tiež obsahuje centrá klastrov (priemery) pre 3 skupiny naprieč 5 premennými.\n",
"\n",
"Vektor klastrovania je priradenie klastrov pre každé pozorovanie. Použime funkciu `augment`, aby sme pridali priradenie klastrov do pôvodného súboru údajov.\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": [
"Perfektné, práve sme rozdelili náš dátový súbor do 3 skupín. Takže, aké dobré je naše zhlukovanie 🤷? Pozrime sa na `Silhouette skóre`.\n",
"\n",
"### **Silhouette skóre**\n",
"\n",
"[Silhouette analýza](https://en.wikipedia.org/wiki/Silhouette_(clustering)) môže byť použitá na štúdium vzdialenosti medzi výslednými zhlukmi. Toto skóre sa pohybuje od -1 do 1, pričom skóre blízke 1 znamená, že zhluk je hustý a dobre oddelený od ostatných zhlukov. Hodnota blízka 0 predstavuje prekrývajúce sa zhluky so vzorkami veľmi blízko rozhodovacej hranice susedných zhlukov. [zdroj](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Metóda priemerného silhouette skóre vypočíta priemerné silhouette skóre pozorovaní pre rôzne hodnoty *k*. Vysoké priemerné silhouette skóre naznačuje dobré zhlukovanie.\n",
"\n",
"Funkcia `silhouette` v balíku cluster sa používa na výpočet priemernej šírky silhouette.\n",
"\n",
"> Silhouette môže byť vypočítané s akoukoľvek [vzdialenosťou](https://en.wikipedia.org/wiki/Distance \"Distance\"), ako napríklad [Euklidovská vzdialenosť](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") alebo [Manhattanská vzdialenosť](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), o ktorých sme hovorili v [predchádzajúcej lekcii](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb).\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": [
"Náš skóre je **0,549**, teda presne v strede. To naznačuje, že naše údaje nie sú obzvlášť vhodné pre tento typ zoskupovania. Pozrime sa, či môžeme tento predpoklad vizuálne potvrdiť. Balík [factoextra](https://rpkgs.datanovia.com/factoextra/index.html) poskytuje funkcie (`fviz_cluster()`) na vizualizáciu zoskupovania.\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": [
"Prekrývanie klastrov naznačuje, že naše údaje nie sú obzvlášť vhodné pre tento typ klastrovania, ale poďme pokračovať.\n",
"\n",
"## 4. Určenie optimálneho počtu klastrov\n",
"\n",
"Základná otázka, ktorá často vyvstáva pri K-Means klastrovaní, je táto - bez známych triednych označení, ako zistíte, na koľko klastrov rozdeliť vaše údaje?\n",
"\n",
"Jedným zo spôsobov, ako to môžeme zistiť, je použiť vzorku údajov na `vytvorenie série modelov klastrovania` s narastajúcim počtom klastrov (napr. od 1 do 10) a vyhodnotiť metriky klastrovania, ako je **Silhouette skóre.**\n",
"\n",
"Určme optimálny počet klastrov výpočtom algoritmu klastrovania pre rôzne hodnoty *k* a vyhodnotením **Súčtu štvorcov v rámci klastrov** (WCSS). Celkový súčet štvorcov v rámci klastrov (WCSS) meria kompaktnosť klastrovania a chceme, aby bol čo najmenší, pričom nižšie hodnoty znamenajú, že dátové body sú bližšie.\n",
"\n",
"Preskúmajme vplyv rôznych volieb `k`, od 1 do 10, na toto klastrovanie.\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": [
"Teraz, keď máme celkový súčet štvorcov v rámci klastrov (tot.withinss) pre každý algoritmus zhlukovania s centrom *k*, použijeme [metódu lakťa](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) na nájdenie optimálneho počtu klastrov. Táto metóda spočíva v zobrazení WCSS ako funkcie počtu klastrov a výbere [lakťa krivky](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") ako počtu klastrov, ktoré sa majú použiť.\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": [
"Graf ukazuje výrazné zníženie WCSS (teda väčšiu *súdržnosť*) pri zvýšení počtu klastrov z jedného na dva, a ďalšie výrazné zníženie z dvoch na tri klastre. Potom je zníženie menej výrazné, čo vedie k vytvoreniu `laktu` 💪 na grafe približne pri troch klastroch. Toto je dobrý indikátor, že existujú dva až tri rozumne dobre oddelené klastre dátových bodov.\n",
"\n",
"Teraz môžeme pokračovať a extrahovať model klastrovania, kde `k = 3`:\n",
"\n",
"> `pull()`: používa sa na extrakciu jedného stĺpca\n",
">\n",
"> `pluck()`: používa sa na indexovanie dátových štruktúr, ako sú zoznamy\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": [
"Skvelé! Poďme si vizualizovať získané klastre. Máte záujem o interaktivitu pomocou `plotly`?\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": [
"Možno by sme očakávali, že každý klaster (reprezentovaný rôznymi farbami) bude mať odlišné žánre (reprezentované rôznymi tvarmi).\n",
"\n",
"Pozrime sa na presnosť modelu.\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": [
"Presnosť tohto modelu nie je zlá, ale ani výborná. Môže to byť spôsobené tým, že dáta nie sú vhodné pre K-Means Clustering. Tieto dáta sú príliš nevyvážené, málo korelované a medzi hodnotami stĺpcov je príliš veľká variabilita na to, aby sa dali dobre zoskupiť. V skutočnosti sú vytvorené klastre pravdepodobne silne ovplyvnené alebo skreslené tromi kategóriami žánrov, ktoré sme definovali vyššie.\n",
"\n",
"Napriek tomu to bol celkom poučný proces!\n",
"\n",
"V dokumentácii Scikit-learn môžete vidieť, že model ako tento, s klastrami, ktoré nie sú veľmi dobre ohraničené, má problém s „variabilitou“:\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika zo Scikit-learn</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variabilita**\n",
"\n",
"Variabilita je definovaná ako „priemer štvorcových rozdielov od priemeru“ [zdroj](https://www.mathsisfun.com/data/standard-deviation.html). V kontexte tohto problému zoskupovania sa vzťahuje na dáta, pri ktorých hodnoty v našej dátovej sade majú tendenciu odchýliť sa príliš od priemeru.\n",
"\n",
"✅ Toto je skvelý moment na zamyslenie sa nad všetkými spôsobmi, ako by ste mohli tento problém napraviť. Upraviť dáta trochu viac? Použiť iné stĺpce? Použiť iný algoritmus? Tip: Skúste [škálovať svoje dáta](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) na ich normalizáciu a otestujte iné stĺpce.\n",
"\n",
"> Skúste tento '[kalkulátor variability](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', aby ste lepšie pochopili tento koncept.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Výzva**\n",
"\n",
"Strávte nejaký čas s týmto notebookom a upravujte parametre. Dokážete zlepšiť presnosť modelu tým, že dáta viac vyčistíte (napríklad odstránením odľahlých hodnôt)? Môžete použiť váhy na pridanie väčšej váhy určitým vzorkám dát. Čo ešte môžete urobiť, aby ste vytvorili lepšie klastre?\n",
"\n",
"Tip: Skúste škálovať svoje dáta. V notebooku je komentovaný kód, ktorý pridáva štandardné škálovanie, aby sa stĺpce dát viac podobali z hľadiska rozsahu. Zistíte, že zatiaľ čo skóre siluety klesá, „zlom“ v grafe lakťa sa vyhladzuje. Je to preto, že ponechanie dát neškálovaných umožňuje dátam s menšou variabilitou niesť väčšiu váhu. Prečítajte si o tomto probléme viac [tu](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Kvíz po prednáške**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Recenzia a samostatné štúdium**\n",
"\n",
"- Pozrite si simulátor K-Means [ako tento](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Tento nástroj môžete použiť na vizualizáciu vzorových dátových bodov a určenie ich centroidov. Môžete upraviť náhodnosť dát, počet klastrov a počet centroidov. Pomáha vám to získať predstavu o tom, ako sa dáta môžu zoskupovať?\n",
"\n",
"- Pozrite si tiež [tento materiál o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) zo Stanfordu.\n",
"\n",
"Chcete si vyskúšať svoje novo nadobudnuté zručnosti zoskupovania na dátových sadách, ktoré sa dobre hodia pre K-Means clustering? Pozrite si:\n",
"\n",
"- [Trénovanie a hodnotenie modelov zoskupovania](https://rpubs.com/eR_ic/clustering) pomocou Tidymodels a priateľov\n",
"\n",
"- [Analýza klastrov K-Means](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-Means clustering s princípmi upravených dát](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Úloha**\n",
"\n",
"[Skúste rôzne metódy zoskupovania](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## ĎAKUJEME:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za vytvorenie pôvodnej verzie tohto modulu v Pythone ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za vytvorenie úžasných ilustrácií, ktoré robia R prístupnejším a zábavnejším. Viac ilustrácií nájdete v jej [galérii](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"Šťastné učenie,\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>Ilustrácia od @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
]
}
]
}