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

642 lines
27 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": 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-10-11T12:44:59+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "et"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Uurime K-Means klasterdamist R-i ja Tidy andmete põhimõtete abil.\n",
"\n",
"### [**Eelloengu viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"Selles õppetükis õpid, kuidas luua klastreid, kasutades Tidymodels paketti ja teisi R-i ökosüsteemi pakette (nimetame neid sõpradeks 🧑‍🤝‍🧑) ning varem imporditud Nigeeria muusika andmestikku. Käsitleme K-Meansi klasterdamise põhialuseid. Pea meeles, et nagu sa eelmises õppetükis õppisid, on klastritega töötamiseks palju erinevaid viise ja meetod sõltub sinu andmetest. Proovime K-Meansi, kuna see on kõige levinum klasterdamise tehnika. Alustame!\n",
"\n",
"Mõisted, mida sa õpid:\n",
"\n",
"- Silueti skoorimine\n",
"\n",
"- Küünarnuki meetod\n",
"\n",
"- Inerts\n",
"\n",
"- Variantsus\n",
"\n",
"### **Sissejuhatus**\n",
"\n",
"[K-Meansi klasterdamine](https://wikipedia.org/wiki/K-means_clustering) on meetod, mis pärineb signaalitöötluse valdkonnast. Seda kasutatakse andmete rühmade jagamiseks ja jaotamiseks `k klastrisse`, lähtudes nende omaduste sarnasustest.\n",
"\n",
"Klastreid saab visualiseerida [Voronoi diagrammidena](https://wikipedia.org/wiki/Voronoi_diagram), mis sisaldavad punkti (või 'seemet') ja selle vastavat piirkonda.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/voronoi.1dc1613fb0439b95.webp\"\n",
" width=\"500\"/>\n",
" <figcaption>Infograafik: Jen Looper</figcaption>\n",
"\n",
"\n",
"K-Meansi klasterdamisel on järgmised sammud:\n",
"\n",
"1. Andmeteadlane määrab esmalt soovitud klastrite arvu, mida luua.\n",
"\n",
"2. Seejärel valib algoritm juhuslikult K vaatlust andmestikust, et need saaksid olla klastrite esialgseteks keskusteks (st tsentroidideks).\n",
"\n",
"3. Seejärel määratakse iga ülejäänud vaatlus lähimale tsentroidile.\n",
"\n",
"4. Seejärel arvutatakse iga klastri uus keskmine ja tsentroid nihutatakse keskmise asukohta.\n",
"\n",
"5. Kui keskused on ümber arvutatud, kontrollitakse iga vaatlust uuesti, et näha, kas see võiks olla lähemal mõnele teisele klastrile. Kõik objektid määratakse uuesti, kasutades uuendatud klastri keskmisi. Klastri määramise ja tsentroidi uuendamise samme korratakse iteratiivselt, kuni klastri määramised enam ei muutu (st kui saavutatakse konvergents). Tavaliselt lõpetab algoritm töö, kui iga uus iteratsioon põhjustab tsentroidide tühise liikumise ja klastrid muutuvad staatiliseks.\n",
"\n",
"<div>\n",
"\n",
"> Pange tähele, et kuna algsete k vaatlustega tsentroidide valik on juhuslik, võivad tulemused iga kord veidi erineda. Seetõttu kasutavad enamik algoritme mitut *juhuslikku algust* ja valivad iteratsiooni, millel on madalaim WCSS. Seetõttu on tungivalt soovitatav alati käivitada K-Means mitme *nstart* väärtusega, et vältida *ebasoovitavat lokaalset optimaalset lahendust.*\n",
"\n",
"</div>\n",
"\n",
"See lühike animatsioon, mis kasutab Allison Horsti [illustratsioone](https://github.com/allisonhorst/stats-illustrations), selgitab klasterdamise protsessi:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Illustratsioon: @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Põhiküsimus, mis klasterdamisel tekib, on järgmine: kuidas teada, mitmeks klastriks oma andmed jagada? Üks K-Meansi puudusi on see, et pead määrama `k`, st `tsentroidide` arvu. Õnneks aitab `küünarnuki meetod` hinnata head algväärtust `k` jaoks. Sa proovid seda kohe.\n",
"\n",
"### \n",
"\n",
"**Eeltingimus**\n",
"\n",
"Jätkame täpselt sealt, kus eelmises [õppetükis](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) pooleli jäime, kus analüüsisime andmestikku, tegime palju visualiseeringuid ja filtreerisime andmestikku huvipakkuvateks vaatlusteks. Kindlasti vaata see üle!\n",
"\n",
"Selle mooduli läbimiseks vajame mõningaid pakette. Sa saad need installida käsuga: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Teise võimalusena kontrollib allolev skript, kas sul on selle mooduli läbimiseks vajalikud paketid olemas, ja installib need, kui mõni neist puudub.\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": [
"Lähme kohe asja kallale!\n",
"\n",
"## 1. Tants andmetega: Kitsenda 3 kõige populaarsema muusikastiilini\n",
"\n",
"See on kokkuvõte sellest, mida tegime eelmises tunnis. Lõikame ja sorteerime andmeid!\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": [
"🤩 See läks hästi!\n",
"\n",
"## 2. Rohkem andmete uurimist.\n",
"\n",
"Kui puhtad need andmed on? Kontrollime äärmusväärtusi kasutades kastdiagramme. Keskendume numbrilistele veergudele, kus on vähem äärmusväärtusi (kuigi äärmusväärtusi võiks ka eemaldada). Kastdiagrammid näitavad andmete ulatust ja aitavad valida, milliseid veerge kasutada. Pange tähele, et kastdiagrammid ei näita variatsiooni, mis on oluline hea klasterdatava andmestiku element. Lisalugemiseks vaadake [seda arutelu](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"[Kastdiagrammid](https://en.wikipedia.org/wiki/Box_plot) kasutatakse numbriliste andmete jaotuse graafiliseks kujutamiseks, seega alustame *valides* kõik numbrilised veerud koos populaarsete muusikastiilidega.\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": [
"Vaata, kui lihtsaks teeb valikuabiline `where` selle 💁? Uuri teisi sarnaseid funktsioone [siin](https://tidyselect.r-lib.org/).\n",
"\n",
"Kuna me loome kastdiagrammi iga numbrilise tunnuse jaoks ja tahame vältida tsüklite kasutamist, siis vormindame oma andmed *pikemasse* formaati, mis võimaldab meil kasutada `facets`-eid alagraafikuid, mis kuvavad iga andmealamkogumi eraldi.\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": [
"Palju pikem! Nüüd on aeg mõneks `ggplot`-iks! Millist `geom`-i me kasutame?\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": [
"Lihtne-gg!\n",
"\n",
"Nüüd näeme, et need andmed on veidi müra täis: vaadates iga veergu kastdiagrammina, on näha erandväärtusi. Võiksid andmestikku läbi käia ja need erandväärtused eemaldada, kuid see muudaks andmed üsna napiks.\n",
"\n",
"Praegu valime veerud, mida kasutame oma klasterdamise harjutuseks. Valime numbrilised veerud, millel on sarnased vahemikud. Me võiksime kodeerida `artist_top_genre` numbriliseks, kuid jätame selle praegu välja.\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 klasterdamise arvutamine R-is\n",
"\n",
"R-is saab k-means klasterdamist arvutada sisseehitatud funktsiooniga `kmeans`, vaata `help(\"kmeans()\")`. Funktsioon `kmeans()` võtab peamise argumendina vastu andmeraami, kus kõik veerud on numbrilised.\n",
"\n",
"Esimene samm k-means klasterdamise kasutamisel on määrata klastrite arv (k), mis lõplikus lahenduses luuakse. Me teame, et andmestikust eraldasime 3 laulužanrit, seega proovime 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 sisaldab mitmeid informatsiooniosi, mida on hästi selgitatud `help(\"kmeans()\")` abil. Praegu keskendume vaid mõnele neist. Näeme, et andmed on jaotatud 3 klastrisse suurustega 65, 110, 111. Väljund sisaldab ka klastrite keskmeid (keskmisi) 3 grupi jaoks üle 5 muutuja.\n",
"\n",
"Klastri vektor näitab iga vaatluse klastrikuuluvust. Kasutame `augment` funktsiooni, et lisada klastrikuuluvus algsele andmestikule.\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äiuslik, me just jagasime oma andmekogumi kolmeks rühmaks. Aga kui hea on meie klasterdamine 🤷? Vaatame lähemalt `Silhouette'i skoori`.\n",
"\n",
"### **Silhouette'i skoor**\n",
"\n",
"[Silhouette'i analüüsi](https://en.wikipedia.org/wiki/Silhouette_(clustering)) saab kasutada, et uurida klastrite vahelisi eraldusvahemaid. See skoor varieerub vahemikus -1 kuni 1, kusjuures skoor, mis on lähedal 1-le, näitab tihedat ja teistest klastritest hästi eraldatud klastrit. Väärtus, mis on lähedal 0-le, viitab kattuvatele klastritele, kus proovid asuvad naaberklaastrite otsustuspiiri lähedal. [allikas](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Keskmise silhouette'i meetod arvutab vaatluste keskmise silhouette'i erinevate *k* väärtuste jaoks. Kõrge keskmine silhouette'i skoor viitab heale klasterdamisele.\n",
"\n",
"`silhouette` funktsiooni klastrite paketis saab kasutada keskmise silhouette'i laiuse arvutamiseks.\n",
"\n",
"> Silhouette'i saab arvutada mis tahes [kauguse](https://en.wikipedia.org/wiki/Distance \"Distance\") meetrika abil, näiteks [Eukleidiline kaugus](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") või [Manhattani kaugus](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), mida arutasime [eelmises õppetükis](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": [
"Meie skoor on **.549**, seega täpselt keskel. See näitab, et meie andmed ei sobi eriti hästi sellist tüüpi klasterdamiseks. Vaatame, kas saame seda oletust visuaalselt kinnitada. [factoextra pakett](https://rpkgs.datanovia.com/factoextra/index.html) pakub funktsioone (`fviz_cluster()`), et klasterdamist visualiseerida.\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": [
"Klasterite kattumine näitab, et meie andmed ei sobi eriti hästi sellist tüüpi klasterdamiseks, kuid jätkame siiski.\n",
"\n",
"## 4. Optimaalsete klastrite määramine\n",
"\n",
"K-Meansi klasterdamise puhul tekib sageli oluline küsimus - kui klassi silte pole teada, siis kuidas otsustada, mitmeks klastriks andmed jagada?\n",
"\n",
"Üks viis selle välja selgitamiseks on kasutada andmevalimit, et `luua klasterdamismudeleid` järjest suureneva klastrite arvuga (näiteks 1-10) ja hinnata klasterdamise mõõdikuid, nagu **Silhouette'i skoor.**\n",
"\n",
"Määrame optimaalsete klastrite arvu, arvutades klasterdamise algoritmi erinevate *k* väärtuste jaoks ja hinnates **klastri sisemist ruutude summat** (WCSS). Klastri sisemine ruutude summa (WCSS) mõõdab klasterdamise kompaktsust ja soovime, et see oleks võimalikult väike, kuna madalamad väärtused tähendavad, et andmepunktid on üksteisele lähemal.\n",
"\n",
"Uurime, kuidas erinevad `k` väärtused (1 kuni 10) mõjutavad seda klasterdamist.\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": [
"Nüüd, kui meil on iga klasterdamisalgoritmi jaoks keskusega *k* kogusumma klastrisisestest ruutudest (tot.withinss), kasutame [küünarnuki meetodit](https://en.wikipedia.org/wiki/Elbow_method_(clustering)), et leida optimaalne klastrite arv. Meetod seisneb WCSS-i (klastrisiseste ruutude summa) graafiku joonistamises klastrite arvu funktsioonina ja [kõvera küünarnuki](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Kõvera küünarnukk\") valimises klastrite arvuks, mida kasutada.\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": [
"Graafik näitab WCSS-i suurt vähenemist (seega suuremat *tihedust*), kui klastrite arv suureneb ühest kaheni, ning veel märgatavat vähenemist kahest kolmeni. Pärast seda on vähenemine vähem väljendunud, mis tekitab graafikus umbes kolme klastri juures `küünarnuki` 💪. See on hea viide sellele, et andmepunktid jagunevad kaheks kuni kolmeks mõistlikult hästi eraldatud klastriks.\n",
"\n",
"Nüüd saame edasi minna ja välja võtta klastrimudeli, kus `k = 3`:\n",
"\n",
"> `pull()`: kasutatakse ühe veeru eraldamiseks\n",
">\n",
"> `pluck()`: kasutatakse andmestruktuuride, nagu loendite, indekseerimiseks\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": [
"Suurepärane! Vaatame nüüd saadud klastreid. Kas soovid interaktiivsust kasutada `plotly` abil?\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": [
"Võib-olla oleksime oodanud, et iga klaster (esindatud erinevate värvidega) omaks erinevaid žanre (esindatud erinevate kujunditega).\n",
"\n",
"Vaatame mudeli täpsust.\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": [
"Selle mudeli täpsus pole halb, kuid pole ka suurepärane. Võib juhtuda, et andmed ei sobi hästi K-Means klasterdamiseks. Need andmed on liiga tasakaalust väljas, liiga vähe korreleeritud ja veergude väärtuste vahel on liiga suur varieeruvus, et klasterdamine toimiks hästi. Tegelikult on tõenäoline, et moodustuvad klastrid on tugevalt mõjutatud või kallutatud kolme žanrikategooria poolt, mille me ülalpool määratlesime.\n",
"\n",
"Sellegipoolest oli see päris õpetlik protsess!\n",
"\n",
"Scikit-learn'i dokumentatsioonis näete, et sellisel mudelil, kus klastrid pole väga selgelt eristatud, on \"varieeruvuse\" probleem:\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/problems.f7fb539ccd80608e.webp\"\n",
" width=\"500\"/>\n",
" <figcaption>Infograafik Scikit-learn'ist</figcaption>\n",
"\n",
"\n",
"\n",
"## **Varieeruvus**\n",
"\n",
"Varieeruvus on defineeritud kui \"keskmine ruutude erinevus keskmisest\" [allikas](https://www.mathsisfun.com/data/standard-deviation.html). Selle klasterdamisprobleemi kontekstis viitab see andmetele, mille väärtused kipuvad keskmisest liiga palju kõrvale kalduma.\n",
"\n",
"✅ See on suurepärane hetk mõelda kõikidele viisidele, kuidas seda probleemi lahendada. Kohandada andmeid veidi rohkem? Kasutada erinevaid veerge? Kasutada teistsugust algoritmi? Vihje: Proovige [andmeid skaleerida](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/), et neid normaliseerida ja testida teisi veerge.\n",
"\n",
"> Proovige seda '[varieeruvuse kalkulaatorit](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', et mõista kontseptsiooni veidi paremini.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Väljakutse**\n",
"\n",
"Veetke selle märkmikuga aega, kohandades parameetreid. Kas suudate mudeli täpsust parandada, puhastades andmeid rohkem (näiteks eemaldades kõrvalekaldeid)? Võite kasutada ka kaalusid, et anda teatud andmeproovidele suurem kaal. Mida veel saate teha, et luua paremaid klastreid?\n",
"\n",
"Vihje: Proovige oma andmeid skaleerida. Märkmikus on kommenteeritud kood, mis lisab standardse skaleerimise, et muuta andmeveerud vahemiku osas üksteisele sarnasemaks. Leiate, et kuigi siluett-skoor langeb, muutub \"kink\" küünarnuki graafikus sujuvamaks. See on tingitud sellest, et skaleerimata andmed võimaldavad väiksema varieeruvusega andmetel suuremat kaalu kanda. Lugege selle probleemi kohta veidi rohkem [siin](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Loengu järgne viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Ülevaade ja iseseisev õppimine**\n",
"\n",
"- Vaadake K-Means simulaatorit [näiteks seda](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Selle tööriista abil saate visualiseerida näidisandmepunkte ja määrata nende centroidid. Saate muuta andmete juhuslikkust, klastrite arvu ja centroidide arvu. Kas see aitab teil saada aimu, kuidas andmeid saab rühmitada?\n",
"\n",
"- Vaadake ka [seda K-Means'i juhendit](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) Stanfordist.\n",
"\n",
"Kas soovite proovida oma äsja omandatud klasterdamisoskusi andmekogumitel, mis sobivad hästi K-Means klasterdamiseks? Vaadake:\n",
"\n",
"- [Treeni ja hinda klasterdamismudeleid](https://rpubs.com/eR_ic/clustering) kasutades Tidymodels'i ja teisi tööriistu\n",
"\n",
"- [K-Means klasterdamise analüüs](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-Means klasterdamine koos korrastatud andmete põhimõtetega](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Ülesanne**\n",
"\n",
"[Proovige erinevaid klasterdamismeetodeid](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## TÄNUD:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) originaalse Python'i versiooni loomise eest ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) suurepäraste illustratsioonide loomise eest, mis muudavad R-i sõbralikumaks ja kaasahaaravamaks. Leidke rohkem illustratsioone tema [galeriist](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"Head õppimist,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/r_learners_sm.e4a71b113ffbedfe.webp\"\n",
" width=\"500\"/>\n",
" <figcaption>Illustratsioon @allison_horst'ilt</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta arusaamatuste või valesti tõlgenduste eest, mis võivad tekkida selle tõlke kasutamisest.\n"
]
}
]
}