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

640 lines
27 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:25:26+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "sl"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Raziskovanje gručenja K-Means z uporabo R in načel urejenih podatkov.\n",
"\n",
"### [**Predhodni kviz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"V tej lekciji se boste naučili, kako ustvariti gruče z uporabo paketa Tidymodels in drugih paketov v ekosistemu R (imenovali jih bomo prijatelji 🧑‍🤝‍🧑) ter nigerijskega glasbenega nabora podatkov, ki ste ga uvozili prej. Pokrili bomo osnove K-Means za gručenje. Upoštevajte, da, kot ste se naučili v prejšnji lekciji, obstaja veliko načinov za delo z gručenjem, metoda, ki jo uporabite, pa je odvisna od vaših podatkov. Poskusili bomo K-Means, saj je to najpogostejša tehnika gručenja. Začnimo!\n",
"\n",
"Pojmi, o katerih se boste učili:\n",
"\n",
"- Silhuetno ocenjevanje\n",
"\n",
"- Metoda komolca\n",
"\n",
"- Inercija\n",
"\n",
"- Varianca\n",
"\n",
"### **Uvod**\n",
"\n",
"[K-Means gručenje](https://wikipedia.org/wiki/K-means_clustering) je metoda, ki izhaja iz področja obdelave signalov. Uporablja se za razdelitev in razvrščanje skupin podatkov v `k gruče` na podlagi podobnosti njihovih značilnosti.\n",
"\n",
"Gruče je mogoče vizualizirati kot [Voronoijeve diagrame](https://wikipedia.org/wiki/Voronoi_diagram), ki vključujejo točko (ali 'seme') in njeno ustrezno regijo.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika avtorice Jen Looper</figcaption>\n",
"\n",
"\n",
"Postopek K-Means gručenja vključuje naslednje korake:\n",
"\n",
"1. Podatkovni znanstvenik najprej določi želeno število gruč, ki jih želi ustvariti.\n",
"\n",
"2. Nato algoritem naključno izbere K opazovanj iz nabora podatkov, ki služijo kot začetna središča gruč (tj. centroidi).\n",
"\n",
"3. Nato se vsako preostalo opazovanje dodeli najbližjemu centroidu.\n",
"\n",
"4. Nato se izračunajo nove povprečne vrednosti vsake grupe, centroid pa se premakne na povprečje.\n",
"\n",
"5. Ko so središča ponovno izračunana, se vsako opazovanje ponovno preveri, ali bi lahko bilo bližje drugi gruč. Vsa opazovanja se ponovno prerazporedijo z uporabo posodobljenih povprečnih vrednosti gruč. Koraki dodeljevanja gruč in posodabljanja centroidov se ponavljajo, dokler se dodelitve gruč ne prenehajo spreminjati (tj. ko je dosežena konvergenca). Algoritem se običajno ustavi, ko vsaka nova iteracija povzroči zanemarljivo premikanje centroidov in gruče postanejo statične.\n",
"\n",
"<div>\n",
"\n",
"> Upoštevajte, da zaradi naključnosti začetnih k opazovanj, ki se uporabljajo kot začetni centroidi, lahko dobimo nekoliko različne rezultate vsakič, ko uporabimo postopek. Zaradi tega večina algoritmov uporablja več *naključnih začetkov* in izbere iteracijo z najnižjim WCSS. Zato je močno priporočljivo, da K-Means vedno izvajate z več vrednostmi *nstart*, da se izognete *nezaželenemu lokalnemu optimumu.*\n",
"\n",
"</div>\n",
"\n",
"Ta kratka animacija z uporabo [ilustracij](https://github.com/allisonhorst/stats-illustrations) Allison Horst pojasnjuje postopek gručenja:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Ilustracija avtorice @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Osnovno vprašanje, ki se pojavi pri gručenju, je naslednje: kako veste, na koliko gruč razdeliti svoje podatke? Ena od pomanjkljivosti uporabe K-Means je dejstvo, da morate določiti `k`, torej število `centroidov`. Na srečo metoda `komolca` pomaga oceniti dobro začetno vrednost za `k`. Kmalu jo boste preizkusili.\n",
"\n",
"### \n",
"\n",
"**Predpogoj**\n",
"\n",
"Nadaljevali bomo tam, kjer smo končali v [prejšnji lekciji](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), kjer smo analizirali nabor podatkov, ustvarili veliko vizualizacij in filtrirali nabor podatkov na zanimiva opazovanja. Prepričajte se, da si jo ogledate!\n",
"\n",
"Za dokončanje tega modula bomo potrebovali nekaj paketov. Namestite jih lahko z ukazom: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Alternativno spodnji skript preveri, ali imate potrebne pakete za dokončanje tega modula, in jih namesti, če manjkajo.\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": [
"Začnimo!\n",
"\n",
"## 1. Ples s podatki: Omejimo se na 3 najbolj priljubljene glasbene zvrsti\n",
"\n",
"To je povzetek tega, kar smo naredili v prejšnji lekciji. Razčlenimo in analizirajmo nekaj podatkov!\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 je šlo odlično!\n",
"\n",
"## 2. Več raziskovanja podatkov.\n",
"\n",
"Kako čisti so ti podatki? Preverimo izstopajoče vrednosti z uporabo škatelnih diagramov. Osredotočili se bomo na številske stolpce z manj izstopajočimi vrednostmi (čeprav bi lahko odstranili izstopajoče vrednosti). Škatelni diagrami lahko pokažejo razpon podatkov in pomagajo pri izbiri, katere stolpce uporabiti. Upoštevajte, da škatelni diagrami ne prikazujejo variance, kar je pomemben element za dobro združljive podatke. Za več informacij si oglejte [to razpravo](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"[Škatelni diagrami](https://en.wikipedia.org/wiki/Box_plot) se uporabljajo za grafično prikazovanje porazdelitve `številskih` podatkov, zato začnimo z *izbiro* vseh številskih stolpcev skupaj s priljubljenimi glasbenimi žanri.\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": [
"Opazite, kako funkcija za izbiro `where` to olajša 💁? Raziščite še druge podobne funkcije [tukaj](https://tidyselect.r-lib.org/).\n",
"\n",
"Ker bomo izdelali škatlaste diagrame za vsako številsko značilnost in se želimo izogniti uporabi zank, bomo preoblikovali naše podatke v *daljšo* obliko, ki nam bo omogočila uporabo `facets` - podgrafov, ki vsak prikazujejo en podnabor podatkov.\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": [
"Zdaj pa nekaj daljšega! Čas je za nekaj `ggplotov`! Kateri `geom` bomo uporabili?\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": [
"Zdaj lahko vidimo, da so ti podatki nekoliko hrupni: če opazujemo vsak stolpec kot škatelni diagram, lahko vidimo odstopajoče vrednosti. Lahko bi pregledali podatkovni niz in odstranili te odstopajoče vrednosti, vendar bi to podatke precej zmanjšalo.\n",
"\n",
"Zaenkrat izberimo, katere stolpce bomo uporabili za našo nalogo gručenja. Izberimo številske stolpce s podobnimi razponi. Stolpec `artist_top_genre` bi lahko kodirali kot številskega, vendar ga bomo za zdaj izpustili.\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. Izračun k-means gručenja v R\n",
"\n",
"K-means lahko izračunamo v R z vgrajeno funkcijo `kmeans`, glejte `help(\"kmeans()\")`. Funkcija `kmeans()` sprejme podatkovni okvir z vsemi številsko izraženimi stolpci kot svoj primarni argument.\n",
"\n",
"Prvi korak pri uporabi k-means gručenja je določitev števila gručenj (k), ki bodo ustvarjene v končni rešitvi. Vemo, da obstajajo 3 glasbeni žanri, ki smo jih izluščili iz nabora podatkov, zato poskusimo s 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": [
"Kmeans objekt vsebuje več informacij, ki so dobro razložene v `help(\"kmeans()\")`. Za zdaj se osredotočimo na nekaj ključnih točk. Vidimo, da so podatki razdeljeni v 3 skupine velikosti 65, 110, 111. Rezultat prav tako vsebuje središča skupin (povprečja) za 3 skupine glede na 5 spremenljivk.\n",
"\n",
"Vektor razvrščanja predstavlja dodelitev skupine za vsako opazovanje. Uporabimo funkcijo `augment`, da dodamo dodelitev skupine v originalni nabor podatkov.\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": [
"Odlično, pravkar smo razdelili naš nabor podatkov v 3 skupine. Kako dobra je torej naša razvrstitev 🤷? Poglejmo si `Silhouette score`.\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette analiza](https://en.wikipedia.org/wiki/Silhouette_(clustering)) se lahko uporabi za preučevanje razdalje med nastalimi grozdi. Ta ocena se giblje od -1 do 1, pri čemer vrednost blizu 1 pomeni, da je grozd gost in dobro ločen od drugih grozdov. Vrednost blizu 0 predstavlja prekrivajoče se grozde, kjer so vzorci zelo blizu odločitveni meji sosednjih grozdov. [vir](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Metoda povprečnega silhouette izračuna povprečno silhouette opazovanj za različne vrednosti *k*. Visoka povprečna silhouette ocena kaže na dobro razvrstitev.\n",
"\n",
"Funkcija `silhouette` v paketu za razvrščanje omogoča izračun povprečne širine silhouette.\n",
"\n",
"> Silhouette se lahko izračuna z uporabo katere koli [razdalje](https://en.wikipedia.org/wiki/Distance \"Distance\"), kot sta [Evklidska razdalja](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") ali [Manhattanska razdalja](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), ki smo ju obravnavali v [prejšnji lekciji](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": [
"Naš rezultat je **.549**, kar pomeni, da smo nekje na sredini. To kaže, da naši podatki niso posebej primerni za tovrstno razvrščanje v skupine. Poglejmo, ali lahko to domnevo vizualno potrdimo. Paket [factoextra](https://rpkgs.datanovia.com/factoextra/index.html) ponuja funkcije (`fviz_cluster()`), ki omogočajo vizualizacijo razvrščanja v skupine.\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": [
"Prekrivanje med grozdi kaže, da naši podatki niso posebej primerni za to vrsto grozdenja, vendar nadaljujmo.\n",
"\n",
"## 4. Določanje optimalnega števila grozdov\n",
"\n",
"Osnovno vprašanje, ki se pogosto pojavi pri K-Means grozdenju, je naslednje - brez znanih oznak razredov, kako veste, na koliko grozdov razdeliti svoje podatke?\n",
"\n",
"Eden od načinov, kako to ugotoviti, je uporaba vzorca podatkov za `ustvarjanje serije modelov grozdenja` z naraščajočim številom grozdov (npr. od 1 do 10) in ocenjevanje metrik grozdenja, kot je **Silhouette score.**\n",
"\n",
"Določimo optimalno število grozdov tako, da izvedemo algoritem grozdenja za različne vrednosti *k* in ocenimo **vsoto kvadratov znotraj grozda** (WCSS). Skupna vsota kvadratov znotraj grozda (WCSS) meri kompaktnost grozdenja, pri čemer želimo, da je čim manjša, saj nižje vrednosti pomenijo, da so podatkovne točke bližje skupaj.\n",
"\n",
"Raziskujmo učinek različnih izbir `k`, od 1 do 10, na to grozdenje.\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": [
"Zdaj, ko imamo skupno vsoto kvadratov znotraj grozdov (tot.withinss) za vsak algoritem grozdenja s središčem *k*, uporabimo [metodo komolca](https://en.wikipedia.org/wiki/Elbow_method_(clustering)), da najdemo optimalno število grozdov. Metoda vključuje risanje WCSS kot funkcije števila grozdov in izbiro [komolca krivulje](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") kot števila grozdov, ki jih uporabimo.\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 prikazuje veliko zmanjšanje WCSS (torej večjo *kompaktnost*), ko se število grozdov poveča z enega na dva, in nadaljnje opazno zmanjšanje z dveh na tri grozde. Po tem je zmanjšanje manj izrazito, kar povzroči `komolec` 💪 na grafu pri približno treh grozdih. To je dober pokazatelj, da obstajata dva do trije razmeroma dobro ločeni grozdi podatkovnih točk.\n",
"\n",
"Zdaj lahko nadaljujemo in izluščimo model grozdenja, kjer je `k = 3`:\n",
"\n",
"> `pull()`: uporablja se za izvlečenje ene same kolone\n",
">\n",
"> `pluck()`: uporablja se za indeksiranje podatkovnih struktur, kot so seznami\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": [
"Odlično! Poglejmo si pridobljene grozde. Vas zanima nekaj interaktivnosti z uporabo `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": [
"Morda bi pričakovali, da bo imel vsak grozd (predstavljen z različnimi barvami) različne žanre (predstavljene z različnimi oblikami).\n",
"\n",
"Poglejmo natančnost modela.\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": [
"Točnost tega modela ni slaba, vendar ni odlična. Morda podatki niso primerni za K-Means razvrščanje. Ti podatki so preveč neuravnoteženi, premalo povezani in med vrednostmi stolpcev je preveč variance, da bi jih lahko dobro razvrstili. Pravzaprav so skupine, ki se oblikujejo, verjetno močno vplivane ali izkrivljene zaradi treh kategorij žanrov, ki smo jih opredelili zgoraj.\n",
"\n",
"Kljub temu je bil to precej poučen proces!\n",
"\n",
"V dokumentaciji Scikit-learn lahko vidite, da ima model, kot je ta, pri katerem skupine niso dobro opredeljene, težavo z 'varianco':\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika iz Scikit-learn</figcaption>\n",
"\n",
"\n",
"\n",
"## **Varianca**\n",
"\n",
"Varianca je opredeljena kot \"povprečje kvadratov razlik od povprečja\" [vir](https://www.mathsisfun.com/data/standard-deviation.html). V kontekstu te težave z razvrščanjem se nanaša na podatke, pri katerih se vrednosti našega nabora podatkov preveč oddaljujejo od povprečja.\n",
"\n",
"✅ To je odličen trenutek, da razmislite o vseh načinih, kako bi lahko odpravili to težavo. Bi lahko podatke še malo prilagodili? Uporabili različne stolpce? Uporabili drugačen algoritem? Namig: Poskusite [normalizirati podatke](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) in preizkusiti druge stolpce.\n",
"\n",
"> Poskusite '[kalkulator variance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', da bolje razumete koncept.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Izziv**\n",
"\n",
"Preživite nekaj časa s tem zvezkom in prilagodite parametre. Ali lahko izboljšate natančnost modela z dodatnim čiščenjem podatkov (na primer odstranjevanjem odstopanj)? Lahko uporabite uteži, da nekaterim vzorcem podatkov dodelite večjo težo. Kaj še lahko storite, da ustvarite boljše skupine?\n",
"\n",
"Namig: Poskusite normalizirati podatke. V zvezku je komentirana koda, ki dodaja standardno normalizacijo, da se stolpci podatkov bolj približajo drug drugemu glede na obseg. Ugotovili boste, da se medtem ko se silhuetni rezultat zniža, 'pregib' na grafu komolca zgladi. To je zato, ker nenormalizirani podatki omogočajo, da podatki z manjšo varianco nosijo večjo težo. Preberite več o tej težavi [tukaj](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Kvizi po predavanju**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Pregled in samostojno učenje**\n",
"\n",
"- Oglejte si simulator K-Means [kot je ta](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). S tem orodjem lahko vizualizirate vzorčne podatkovne točke in določite njihove centroidne točke. Lahko urejate naključnost podatkov, število skupin in število centroidov. Ali vam to pomaga pridobiti idejo, kako se podatki lahko razvrstijo?\n",
"\n",
"- Prav tako si oglejte [ta priročnik o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) iz Stanforda.\n",
"\n",
"Želite preizkusiti svoje novo pridobljene veščine razvrščanja na naborih podatkov, ki so primerni za K-Means razvrščanje? Oglejte si:\n",
"\n",
"- [Usposabljanje in ocenjevanje modelov razvrščanja](https://rpubs.com/eR_ic/clustering) z uporabo Tidymodels in podobnih orodij\n",
"\n",
"- [Analiza skupin K-Means](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-Means razvrščanje z načeli urejenih podatkov](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Naloga**\n",
"\n",
"[Preizkusite različne metode razvrščanja](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## HVALA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za ustvarjanje izvirne Python različice tega modula ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za ustvarjanje čudovitih ilustracij, ki naredijo R bolj prijazen in privlačen. Več ilustracij najdete v njeni [galeriji](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"Veselo učenje,\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>Umetniško delo @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
]
}
]
}