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

639 lines
28 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-09-03T20:14:06+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "lt"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Išnagrinėkite K-Means klasterizavimą naudodami R ir Tidy duomenų principus.\n",
"\n",
"### [**Klausimynas prieš paskaitą**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"Šioje pamokoje sužinosite, kaip kurti klasterius naudojant Tidymodels paketą ir kitus R ekosistemos paketus (juos vadinsime draugais 🧑‍🤝‍🧑), taip pat Nigerijos muzikos duomenų rinkinį, kurį importavote anksčiau. Aptarsime K-Means klasterizavimo pagrindus. Atminkite, kad, kaip sužinojote ankstesnėje pamokoje, yra daug būdų dirbti su klasteriais, o pasirinktas metodas priklauso nuo jūsų duomenų. Išbandysime K-Means, nes tai yra dažniausiai naudojama klasterizavimo technika. Pradėkime!\n",
"\n",
"Sąvokos, apie kurias sužinosite:\n",
"\n",
"- Silueto įvertinimas\n",
"\n",
"- Alkūnės metodas\n",
"\n",
"- Inercija\n",
"\n",
"- Dispersija\n",
"\n",
"### **Įvadas**\n",
"\n",
"[K-Means klasterizavimas](https://wikipedia.org/wiki/K-means_clustering) yra metodas, kilęs iš signalų apdorojimo srities. Jis naudojamas duomenų grupėms padalyti ir suskirstyti į `k klasterius`, remiantis jų savybių panašumais.\n",
"\n",
"Klasteriai gali būti vizualizuojami kaip [Voronoi diagramos](https://wikipedia.org/wiki/Voronoi_diagram), kurios apima tašką (arba „sėklą“) ir atitinkamą regioną.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika, sukurta Jen Looper</figcaption>\n",
"\n",
"K-Means klasterizavimas vyksta šiais etapais:\n",
"\n",
"1. Duomenų analitikas pradeda nurodydamas norimą klasterių skaičių.\n",
"\n",
"2. Tada algoritmas atsitiktinai pasirenka K stebėjimus iš duomenų rinkinio, kurie bus naudojami kaip pradiniai klasterių centrai (t. y. centroidai).\n",
"\n",
"3. Kiekvienas likęs stebėjimas priskiriamas artimiausiam centroidui.\n",
"\n",
"4. Tada apskaičiuojami nauji kiekvieno klasterio vidurkiai, o centroidas perkeliamas į vidurkį.\n",
"\n",
"5. Kai centrai perskaičiuoti, kiekvienas stebėjimas vėl patikrinamas, ar jis nėra arčiau kito klasterio. Visi objektai vėl priskiriami, naudojant atnaujintus klasterių vidurkius. Klasterių priskyrimo ir centroidų atnaujinimo žingsniai kartojami iteratyviai, kol klasterių priskyrimai nustoja keistis (t. y. pasiekiama konvergencija). Paprastai algoritmas baigiasi, kai kiekviena nauja iteracija sukelia nereikšmingą centroidų judėjimą, o klasteriai tampa statiški.\n",
"\n",
"<div>\n",
"\n",
"> Atkreipkite dėmesį, kad dėl pradinio k stebėjimų atsitiktinumo, naudojamų kaip pradiniai centroidai, kiekvieną kartą taikant procedūrą galime gauti šiek tiek skirtingus rezultatus. Dėl šios priežasties dauguma algoritmų naudoja kelis *atsitiktinius pradėjimus* ir pasirenka iteraciją su mažiausiu WCSS. Todėl primygtinai rekomenduojama visada vykdyti K-Means su keliais *nstart* reikšmėmis, kad būtų išvengta *nepageidaujamo lokalaus optimumo.*\n",
"\n",
"</div>\n",
"\n",
"Ši trumpa animacija, naudojant Allison Horst [iliustracijas](https://github.com/allisonhorst/stats-illustrations), paaiškina klasterizavimo procesą:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Iliustracija, sukurta @allison_horst</figcaption>\n",
"\n",
"Pagrindinis klausimas, kylantis klasterizavimo metu, yra toks: kaip žinoti, į kiek klasterių reikia suskirstyti duomenis? Vienas iš K-Means trūkumų yra tas, kad reikia nustatyti `k`, tai yra `centroidų` skaičių. Laimei, `alkūnės metodas` padeda įvertinti gerą pradinę `k` reikšmę. Netrukus tai išbandysite.\n",
"\n",
"### \n",
"\n",
"**Būtinos sąlygos**\n",
"\n",
"Pradėsime nuo to, kur baigėme [ankstesnėje pamokoje](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), kur analizavome duomenų rinkinį, sukūrėme daug vizualizacijų ir filtravome duomenų rinkinį pagal dominančius stebėjimus. Būtinai peržiūrėkite!\n",
"\n",
"Šiam moduliui atlikti reikės kelių paketų. Juos galite įdiegti naudodami: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Arba žemiau pateiktas scenarijus patikrina, ar turite reikalingus paketus šiam moduliui atlikti, ir, jei trūksta, juos įdiegia.\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": [
"Pradėkime!\n",
"\n",
"## 1. Šokis su duomenimis: Susiaurinkime iki 3 populiariausių muzikos žanrų\n",
"\n",
"Tai yra apžvalga to, ką darėme ankstesnėje pamokoje. Pasinerkime į duomenis!\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": [
"🤩 Tai pavyko puikiai!\n",
"\n",
"## 2. Daugiau duomenų tyrinėjimo.\n",
"\n",
"Kaip švarūs yra šie duomenys? Patikrinkime išskirtis naudodami dėžutės diagramas. Susitelksime į skaitines stulpelius su mažiau išskirčių (nors galėtumėte pašalinti išskirtis). Dėžutės diagramos gali parodyti duomenų diapazoną ir padėti pasirinkti, kuriuos stulpelius naudoti. Atkreipkite dėmesį, kad dėžutės diagramos nerodo dispersijos, kuri yra svarbus gero klasterizuojamo duomenų elemento aspektas. Daugiau informacijos rasite [šiame aptarime](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"[Dėžutės diagramos](https://en.wikipedia.org/wiki/Box_plot) naudojamos grafiškai pavaizduoti `skaitinių` duomenų pasiskirstymą, todėl pradėkime nuo *visų skaitinių stulpelių pasirinkimo* kartu su populiariais muzikos žanrais.\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": [
"Ar matote, kaip pasirinkimo pagalbinė funkcija `where` palengvina darbą 💁? Daugiau tokių funkcijų galite rasti [čia](https://tidyselect.r-lib.org/).\n",
"\n",
"Kadangi ruošiamės kurti dėžutės diagramą kiekvienam skaitiniam požymiui ir norime išvengti ciklų naudojimo, pertvarkykime savo duomenis į *ilgesnį* formatą, kuris leis mums pasinaudoti `facets` - subsiužetais, kurie kiekvienas rodo vieną duomenų pogrupį.\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": [
"Daug ilgesnis! Dabar metas šiek tiek `ggplots`! Taigi, kokį `geom` naudosime?\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": [
"Lengvai-gg!\n",
"\n",
"Dabar matome, kad šie duomenys yra šiek tiek triukšmingi: stebėdami kiekvieną stulpelį kaip dėžės diagramą, galite pastebėti išskirtis. Galėtumėte peržiūrėti duomenų rinkinį ir pašalinti šias išskirtis, tačiau tai padarytų duomenis gana minimaliais.\n",
"\n",
"Kol kas pasirinkime, kuriuos stulpelius naudosime klasterizavimo užduočiai. Pasirinkime skaitinius stulpelius su panašiais diapazonais. Galėtume užkoduoti `artist_top_genre` kaip skaitinį, bet šiuo metu jį praleisime.\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 klasterizacijos skaičiavimas R\n",
"\n",
"K-means klasterizaciją R galima apskaičiuoti naudojant įmontuotą funkciją `kmeans`, žr. `help(\"kmeans()\")`. Funkcija `kmeans()` kaip pagrindinį argumentą priima duomenų rėmelį su visomis skaitinėmis stulpeliais.\n",
"\n",
"Pirmasis žingsnis naudojant k-means klasterizaciją yra nurodyti klasterių skaičių (k), kuris bus sukurtas galutiniame sprendime. Žinome, kad iš duomenų rinkinio išskyrėme 3 muzikos žanrus, todėl pabandykime 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 objektas turi kelis informacijos elementus, kurie gerai paaiškinti `help(\"kmeans()\")`. Šiuo metu susitelkime į kelis iš jų. Matome, kad duomenys buvo suskirstyti į 3 klasterius, kurių dydžiai yra 65, 110, 111. Rezultate taip pat pateikiami klasterių centrai (vidurkiai) 3 grupėms pagal 5 kintamuosius.\n",
"\n",
"Klasterizavimo vektorius yra klasterio priskyrimas kiekvienam stebėjimui. Naudokime funkciją `augment`, kad pridėtume klasterio priskyrimą prie pradinio duomenų rinkinio.\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": [
"Puiku, mes ką tik suskirstėme savo duomenų rinkinį į 3 grupes. Taigi, kaip gerai veikia mūsų klasterizacija 🤷? Pažvelkime į `Silhouette score`.\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette analizė](https://en.wikipedia.org/wiki/Silhouette_(clustering)) gali būti naudojama tirti atstumą tarp susidariusių klasterių. Šis rodiklis svyruoja nuo -1 iki 1, ir jei rezultatas yra arti 1, klasteris yra tankus ir gerai atskirtas nuo kitų klasterių. Vertė, artima 0, rodo persidengiančius klasterius, kurių pavyzdžiai yra labai arti kaimyninių klasterių sprendimo ribos. [šaltinis](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Vidutinio silueto metodas apskaičiuoja vidutinį stebėjimų siluetą skirtingoms *k* reikšmėms. Aukštas vidutinio silueto rodiklis rodo gerą klasterizaciją.\n",
"\n",
"`silhouette` funkcija iš klasterių paketo naudojama vidutiniam silueto pločiui apskaičiuoti.\n",
"\n",
"> Siluetas gali būti apskaičiuotas naudojant bet kokį [atstumą](https://en.wikipedia.org/wiki/Distance \"Distance\"), pavyzdžiui, [Euklido atstumą](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") arba [Manhatano atstumą](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), apie kuriuos kalbėjome [ankstesnėje pamokoje](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": [
"Mūsų rezultatas yra **.549**, taigi ties viduriu. Tai rodo, kad mūsų duomenys nėra ypač tinkami tokio tipo klasterizavimui. Pažiūrėkime, ar galime vizualiai patvirtinti šią prielaidą. [factoextra paketas](https://rpkgs.datanovia.com/factoextra/index.html) suteikia funkcijas (`fviz_cluster()`) klasterizavimo vizualizavimui.\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": [
"Klasterių persidengimas rodo, kad mūsų duomenys nėra ypač tinkami tokio tipo klasterizavimui, tačiau tęskime.\n",
"\n",
"## 4. Optimalus klasterių skaičiaus nustatymas\n",
"\n",
"Pagrindinis klausimas, kuris dažnai kyla naudojant K-Means klasterizavimą, yra toks neturint žinomų klasių etikečių, kaip sužinoti, į kiek klasterių reikia suskirstyti duomenis?\n",
"\n",
"Vienas iš būdų tai išsiaiškinti yra naudoti duomenų pavyzdį, kad `sukurtume seriją klasterizavimo modelių` su didėjančiu klasterių skaičiumi (pvz., nuo 1 iki 10) ir įvertintume klasterizavimo metrikas, tokias kaip **Silhouette rodiklis.**\n",
"\n",
"Nustatykime optimalų klasterių skaičių, apskaičiuodami klasterizavimo algoritmą skirtingoms *k* reikšmėms ir įvertindami **klasterių vidinę kvadratų sumą** (WCSS). Bendroji vidinė klasterių kvadratų suma (WCSS) matuoja klasterizavimo kompaktiškumą, ir mes norime, kad ji būtų kuo mažesnė mažesnės reikšmės reiškia, kad duomenų taškai yra arčiau vienas kito.\n",
"\n",
"Pažvelkime, kaip skirtingos `k` reikšmės nuo 1 iki 10 veikia šį klasterizavimą.\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": [
"Dabar, kai turime bendrą klasterio vidinę kvadratų sumą (tot.withinss) kiekvienam klasterizavimo algoritmui su centru *k*, naudojame [alkūnės metodą](https://en.wikipedia.org/wiki/Elbow_method_(clustering)), kad rastume optimalų klasterių skaičių. Šis metodas apima WCSS vaizdavimą kaip klasterių skaičiaus funkciją ir [kreivės alkūnės taško](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") pasirinkimą kaip klasterių skaičių, kurį reikia naudoti.\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": [
"Grafikas rodo didelį WCSS sumažėjimą (didesnį *suglaudimą*), kai klasterių skaičius padidėja nuo vieno iki dviejų, ir dar pastebimą sumažėjimą nuo dviejų iki trijų klasterių. Po to sumažėjimas tampa mažiau ryškus, sukuriant `alkūnę` 💪 grafike ties maždaug trimis klasteriais. Tai yra geras ženklas, kad du ar trys klasteriai yra pakankamai gerai atskirti duomenų taškai.\n",
"\n",
"Dabar galime pereiti prie klasterizavimo modelio, kur `k = 3`:\n",
"\n",
"> `pull()`: naudojamas ištraukti vieną stulpelį\n",
">\n",
"> `pluck()`: naudojamas indeksuoti duomenų struktūras, tokias kaip sąrašai\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": [
"Puiku! Pažiūrėkime į gautus klasterius. Norėtumėte šiek tiek interaktyvumo naudojant `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": [
"Galbūt būtume tikėjęsi, kad kiekvienas klasteris (vaizduojamas skirtingomis spalvomis) turės aiškiai atskirtus žanrus (vaizduojamus skirtingomis formomis).\n",
"\n",
"Pažvelkime į modelio tikslumą.\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": [
"Šio modelio tikslumas nėra blogas, tačiau nėra ir puikus. Gali būti, kad duomenys nėra tinkami K-Means klasterizacijai. Šie duomenys yra per daug nesubalansuoti, per mažai koreliuoti, o stulpelių reikšmės turi per didelę variaciją, kad būtų galima efektyviai sukurti klasterius. Iš tiesų, susiformavę klasteriai greičiausiai yra stipriai paveikti arba iškreipti trijų aukščiau apibrėžtų žanrų kategorijų.\n",
"\n",
"Nepaisant to, tai buvo puikus mokymosi procesas!\n",
"\n",
"Scikit-learn dokumentacijoje galite pamatyti, kad modelis, kurio klasteriai nėra gerai apibrėžti, turi „variacijos“ problemą:\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika iš Scikit-learn</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variacija**\n",
"\n",
"Variacija apibrėžiama kaip „vidutinė kvadratinių skirtumų nuo vidurkio reikšmė“ [šaltinis](https://www.mathsisfun.com/data/standard-deviation.html). Šio klasterizacijos problemos kontekste tai reiškia, kad mūsų duomenų rinkinio skaičiai linkę per daug nukrypti nuo vidurkio.\n",
"\n",
"✅ Tai puikus momentas pagalvoti apie visus būdus, kaip galėtumėte išspręsti šią problemą. Gal šiek tiek pakoreguoti duomenis? Naudoti kitus stulpelius? Pasirinkti kitą algoritmą? Užuomina: Pabandykite [normalizuoti savo duomenis](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) ir išbandyti kitus stulpelius.\n",
"\n",
"> Pabandykite šį '[variacijos skaičiuoklę](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', kad geriau suprastumėte šią sąvoką.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Iššūkis**\n",
"\n",
"Praleiskite šiek tiek laiko su šiuo užrašų knygeliu, koreguodami parametrus. Ar galite pagerinti modelio tikslumą, dar labiau išvalydami duomenis (pavyzdžiui, pašalindami anomalijas)? Galite naudoti svorius, kad tam tikriems duomenų pavyzdžiams suteiktumėte daugiau reikšmės. Ką dar galite padaryti, kad sukurtumėte geresnius klasterius?\n",
"\n",
"Užuomina: Pabandykite normalizuoti savo duomenis. Užrašų knygelėje yra komentaruose pateiktas kodas, kuris prideda standartinį mastelio keitimą, kad duomenų stulpeliai būtų panašesni pagal diapazoną. Pastebėsite, kad nors silueto balas sumažėja, „kinkas“ alkūnės grafike išsilygina. Taip yra todėl, kad palikus duomenis nenormalizuotus, mažesnės variacijos duomenys turi didesnę įtaką. Daugiau apie šią problemą skaitykite [čia](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Po paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Apžvalga ir savarankiškas mokymasis**\n",
"\n",
"- Pažvelkite į K-Means simuliatorių [tokį kaip šis](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Galite naudoti šį įrankį, kad vizualizuotumėte pavyzdinius duomenų taškus ir nustatytumėte jų centroidus. Galite redaguoti duomenų atsitiktinumą, klasterių skaičių ir centroidų skaičių. Ar tai padeda jums geriau suprasti, kaip duomenys gali būti grupuojami?\n",
"\n",
"- Taip pat peržiūrėkite [šį K-Means vadovą](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) iš Stanfordo.\n",
"\n",
"Norite išbandyti savo naujai įgytus klasterizacijos įgūdžius su duomenų rinkiniais, kurie gerai tinka K-Means klasterizacijai? Peržiūrėkite:\n",
"\n",
"- [Mokykite ir vertinkite klasterizacijos modelius](https://rpubs.com/eR_ic/clustering) naudodami Tidymodels ir kitus įrankius\n",
"\n",
"- [K-Means klasterizacijos analizė](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R programavimo vadovas\n",
"\n",
"- [K-Means klasterizacija su tvarkingų duomenų principais](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Užduotis**\n",
"\n",
"[Bandykite skirtingus klasterizacijos metodus](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## DĖKOJAME:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) už originalios šio modulio Python versijos sukūrimą ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) už nuostabių iliustracijų kūrimą, kurios padaro R labiau patrauklų ir įdomų. Daugiau iliustracijų rasite jos [galerijoje](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"Sėkmingo mokymosi,\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>Kūrinys @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.\n"
]
}
]
}