{ "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:30:55+00:00", "source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb", "language_code": "tr" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "GULATlQXLXyR" }, "source": [ "## R ve Tidy veri prensiplerini kullanarak K-Means kümeleme keşfi.\n", "\n", "### [**Ders öncesi quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n", "\n", "Bu derste, Tidymodels paketi ve R ekosistemindeki diğer paketleri (onlara arkadaşlar 🧑‍🤝‍🧑 diyeceğiz) kullanarak kümeler oluşturmayı ve daha önce içe aktardığınız Nijerya müzik veri setini nasıl kullanacağınızı öğreneceksiniz. K-Means kümeleme için temel bilgileri ele alacağız. Unutmayın, önceki derste öğrendiğiniz gibi, kümelerle çalışmanın birçok yolu vardır ve kullandığınız yöntem verinize bağlıdır. En yaygın kümeleme tekniği olduğu için K-Means yöntemini deneyeceğiz. Haydi başlayalım!\n", "\n", "Öğreneceğiniz terimler:\n", "\n", "- Siluet skoru\n", "\n", "- Dirsek yöntemi\n", "\n", "- Atalet\n", "\n", "- Varyans\n", "\n", "### **Giriş**\n", "\n", "[K-Means Kümeleme](https://wikipedia.org/wiki/K-means_clustering), sinyal işleme alanından türetilmiş bir yöntemdir. Verileri özelliklerindeki benzerliklere göre `k kümeye` ayırmak ve bölmek için kullanılır.\n", "\n", "Kümeler, bir nokta (veya 'tohum') ve ona karşılık gelen bölgeyi içeren [Voronoi diyagramları](https://wikipedia.org/wiki/Voronoi_diagram) olarak görselleştirilebilir.\n", "\n", "

\n", " \n", "

Jen Looper tarafından hazırlanan infografik
\n", "\n", "K-Means kümeleme şu adımları içerir:\n", "\n", "1. Veri bilimci, oluşturulacak kümelerin istenen sayısını belirleyerek başlar.\n", "\n", "2. Daha sonra algoritma, veri setinden rastgele K gözlem seçerek kümeler için başlangıç merkezleri (yani, merkez noktalar) olarak kullanır.\n", "\n", "3. Ardından, kalan her bir gözlem en yakın merkez noktaya atanır.\n", "\n", "4. Daha sonra, her bir kümenin yeni ortalamaları hesaplanır ve merkez noktası bu ortalamaya taşınır.\n", "\n", "5. Merkezler yeniden hesaplandığına göre, her bir gözlem tekrar kontrol edilir ve farklı bir kümeye daha yakın olup olmadığına bakılır. Tüm nesneler, güncellenmiş küme ortalamalarını kullanarak yeniden atanır. Küme atama ve merkez noktası güncelleme adımları, küme atamaları değişmeyi bırakana kadar (yani, yakınsama sağlandığında) tekrarlanır. Genellikle, algoritma her yeni iterasyonda merkez noktalarının hareketi önemsiz hale geldiğinde ve kümeler statik hale geldiğinde sona erer.\n", "\n", "
\n", "\n", "> Başlangıç merkez noktaları olarak kullanılan ilk k gözlemlerin rastgele seçilmesi nedeniyle, prosedürü her uyguladığımızda biraz farklı sonuçlar alabiliriz. Bu nedenle, çoğu algoritma birkaç *rastgele başlangıç* kullanır ve en düşük WCSS'ye sahip iterasyonu seçer. Bu nedenle, K-Means'i her zaman birkaç *nstart* değeriyle çalıştırmanız ve *istenmeyen yerel optimumdan* kaçınmanız şiddetle tavsiye edilir.\n", "\n", "
\n", "\n", "Allison Horst'un [çizimleri](https://github.com/allisonhorst/stats-illustrations) kullanılarak hazırlanan bu kısa animasyon, kümeleme sürecini açıklıyor:\n", "\n", "

\n", " \n", "

@allison_horst tarafından hazırlanan çizim
\n", "\n", "Kümeleme ile ilgili temel bir soru şudur: Verilerinizi kaç kümeye ayırmanız gerektiğini nasıl bileceksiniz? K-Means kullanmanın bir dezavantajı, `k` yani `merkez noktalarının` sayısını belirlemeniz gerekmesidir. Neyse ki, `dirsek yöntemi` `k` için iyi bir başlangıç değeri tahmin etmenize yardımcı olur. Birazdan bunu deneyeceksiniz.\n", "\n", "### \n", "\n", "**Ön Koşul**\n", "\n", "[Önceki derste](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) kaldığımız yerden devam edeceğiz. Bu derste veri setini analiz ettik, birçok görselleştirme yaptık ve ilgi çekici gözlemleri filtreledik. Mutlaka göz atın!\n", "\n", "Bu modülü tamamlamak için bazı paketlere ihtiyacımız olacak. Şu şekilde yükleyebilirsiniz: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n", "\n", "Alternatif olarak, aşağıdaki script, bu modülü tamamlamak için gerekli paketlere sahip olup olmadığınızı kontrol eder ve eksik olanları sizin için yükler.\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": [ "Haydi başlayalım!\n", "\n", "## 1. Verilerle dans: En popüler 3 müzik türünü belirleyin\n", "\n", "Bu, önceki derste yaptıklarımızın bir özeti. Hadi biraz veri inceleyip analiz edelim!\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": [ "🤩 Bu harika oldu!\n", "\n", "## 2. Daha fazla veri keşfi.\n", "\n", "Bu veriler ne kadar temiz? Aykırı değerleri kutu grafikleri kullanarak kontrol edelim. Daha az aykırı değere sahip sayısal sütunlara odaklanacağız (ancak aykırı değerleri temizleyebilirsiniz). Kutu grafikleri, verilerin aralığını gösterebilir ve hangi sütunların kullanılacağına karar vermenize yardımcı olabilir. Ancak unutmayın, kutu grafikleri varyansı göstermez, bu da iyi kümeleme yapılabilir veriler için önemli bir unsurdur. Daha fazla bilgi için lütfen [bu tartışmaya](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) göz atın.\n", "\n", "[Kutu grafikleri](https://en.wikipedia.org/wiki/Box_plot), `sayısal` verilerin dağılımını görsel olarak göstermek için kullanılır, bu yüzden popüler müzik türleriyle birlikte tüm sayısal sütunları *seçerek* başlayalım.\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": [ "Seçim yardımcısı `where`'in bunu ne kadar kolaylaştırdığını görüyor musunuz 💁? Bu tür diğer fonksiyonları [burada](https://tidyselect.r-lib.org/) keşfedin.\n", "\n", "Her bir sayısal özellik için bir kutu grafiği oluşturacağımız ve döngü kullanmaktan kaçınmak istediğimiz için, verilerimizi *daha uzun* bir formata dönüştürelim. Bu, `facets`'ten - her biri verinin bir alt kümesini gösteren alt grafiklerden - faydalanmamıza olanak tanıyacak.\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": [ "Daha uzun! Şimdi biraz `ggplot` zamanı! Peki hangi `geom`'u kullanacağız?\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": [ "Kolay-gg!\n", "\n", "Şimdi bu verilerin biraz gürültülü olduğunu görebiliyoruz: Her sütunu bir kutu grafiği olarak gözlemlediğinizde, aykırı değerleri fark edebilirsiniz. Bu aykırı değerleri veri setinden çıkarabilirsiniz, ancak bu durumda veri oldukça sınırlı hale gelir.\n", "\n", "Şimdilik, kümeleme çalışmamızda kullanacağımız sütunları seçelim. Benzer aralıklara sahip sayısal sütunları seçelim. `artist_top_genre` sütununu sayısal olarak kodlayabiliriz, ancak şimdilik bunu çıkaracağız.\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. R'de k-means kümeleme hesaplama\n", "\n", "R'de yerleşik `kmeans` fonksiyonunu kullanarak k-means hesaplayabiliriz, bkz. `help(\"kmeans()\")`. `kmeans()` fonksiyonu, birincil argüman olarak tüm sütunları sayısal olan bir veri çerçevesini kabul eder.\n", "\n", "K-means kümeleme kullanırken ilk adım, nihai çözümde oluşturulacak küme sayısını (k) belirtmektir. Veri setinden çıkardığımız 3 şarkı türü olduğunu biliyoruz, o halde 3 deneyelim:\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 nesnesi, `help(\"kmeans()\")` içinde iyi bir şekilde açıklanan birkaç bilgi içerir. Şimdilik, birkaçına odaklanalım. Verilerin 65, 110, 111 boyutlarında 3 kümeye ayrıldığını görüyoruz. Çıktı ayrıca 5 değişken üzerinden 3 grup için küme merkezlerini (ortalama değerlerini) içerir.\n", "\n", "Kümeleme vektörü, her bir gözlem için küme atamasını ifade eder. Küme atamasını orijinal veri setine eklemek için `augment` fonksiyonunu kullanalım.\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": [ "Harika, veri setimizi 3 gruba ayırdık. Peki, kümelememiz ne kadar iyi 🤷? Hadi `Silhouette skoru`na bir göz atalım.\n", "\n", "### **Silhouette skoru**\n", "\n", "[Silhouette analizi](https://en.wikipedia.org/wiki/Silhouette_(clustering)), ortaya çıkan kümeler arasındaki ayrım mesafesini incelemek için kullanılabilir. Bu skor -1 ile 1 arasında değişir ve skor 1'e yakınsa, küme yoğun ve diğer kümelerden iyi bir şekilde ayrılmıştır. 0'a yakın bir değer, komşu kümelerin karar sınırına çok yakın örneklerle örtüşen kümeleri temsil eder. [kaynak](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n", "\n", "Ortalama silhouette yöntemi, farklı *k* değerleri için gözlemlerin ortalama silhouette skorunu hesaplar. Yüksek bir ortalama silhouette skoru, iyi bir kümelemeyi gösterir.\n", "\n", "`silhouette` fonksiyonu, cluster paketinde ortalama silhouette genişliğini hesaplamak için kullanılır.\n", "\n", "> Silhouette, [mesafe](https://en.wikipedia.org/wiki/Distance \"Distance\") metriği ile hesaplanabilir, örneğin [Öklid mesafesi](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") veya [Manhattan mesafesi](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") gibi. Bu metrikleri [önceki derste](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) tartışmıştık.\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": [ "Skorumuz **.549**, yani tam ortada. Bu, verilerimizin bu tür bir kümeleme için özellikle uygun olmadığını gösteriyor. Bu tahminimizi görsel olarak doğrulayıp doğrulayamayacağımıza bakalım. [factoextra paketi](https://rpkgs.datanovia.com/factoextra/index.html), kümelemeyi görselleştirmek için (`fviz_cluster()`) işlevlerini sağlar.\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": [ "Kümeler arasındaki örtüşme, verilerimizin bu tür bir kümeleme için pek uygun olmadığını gösteriyor, ancak devam edelim.\n", "\n", "## 4. Optimum küme sayısını belirleme\n", "\n", "K-Means kümeleme ile ilgili sıkça ortaya çıkan temel bir soru şudur: Bilinen sınıf etiketleri olmadan, verilerinizi kaç kümeye ayırmanız gerektiğini nasıl bilebilirsiniz?\n", "\n", "Bunu öğrenmenin bir yolu, bir veri örneği kullanarak `artan küme sayısıyla bir dizi kümeleme modeli oluşturmak` (örneğin 1'den 10'a kadar) ve **Silhouette skoru** gibi kümeleme metriklerini değerlendirmektir.\n", "\n", "Optimum küme sayısını belirlemek için farklı *k* değerleri için kümeleme algoritmasını çalıştırıp **Küme İçi Kareler Toplamı** (WCSS) değerini değerlendirelim. Toplam küme içi kareler toplamı (WCSS), kümeleme kompaktlığını ölçer ve mümkün olduğunca küçük olmasını isteriz; daha düşük değerler, veri noktalarının birbirine daha yakın olduğunu gösterir.\n", "\n", "Bu kümeleme üzerinde `k` için 1'den 10'a kadar farklı seçimlerin etkisini inceleyelim.\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": [ "Her bir kümeleme algoritması için merkez *k* ile toplam küme içi kareler toplamını (tot.withinss) elde ettikten sonra, optimal küme sayısını bulmak için [dirsek yöntemi](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) kullanılır. Bu yöntem, WCSS'yi küme sayısının bir fonksiyonu olarak çizmek ve kullanılacak küme sayısı olarak [eğrinin dirseğini](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Eğrinin dirseği\") seçmekten oluşur.\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": [ "Grafik, kümelerin sayısı birden ikiye çıkarken WCSS'de (dolayısıyla daha fazla *sıkılık*) büyük bir azalma ve iki kümeden üç kümeye geçerken daha belirgin bir azalma gösteriyor. Bundan sonra azalma daha az belirgin hale geliyor ve grafikte yaklaşık üç kümede bir `dirsek` 💪 oluşuyor. Bu, veri noktalarının iki ila üç makul şekilde ayrılmış küme oluşturduğuna dair iyi bir göstergedir.\n", "\n", "Şimdi `k = 3` olduğu durumda kümeleme modelini çıkarabiliriz:\n", "\n", "> `pull()`: tek bir sütunu çıkarmak için kullanılır\n", ">\n", "> `pluck()`: listeler gibi veri yapılarında indeksleme yapmak için kullanılır\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": [ "Harika! Hadi elde edilen kümeleri görselleştirelim. `plotly` kullanarak biraz etkileşim eklemeye ne dersiniz?\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": [ "Belki de her kümenin (farklı renklerle temsil edilen) farklı türlere (farklı şekillerle temsil edilen) sahip olmasını beklerdik.\n", "\n", "Şimdi modelin doğruluğuna bir göz atalım.\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": [ "Bu modelin doğruluğu fena değil, ama harika da değil. Bunun nedeni, verilerin K-Means Kümeleme için uygun olmaması olabilir. Bu veri seti çok dengesiz, çok az ilişkilendirilmiş ve sütun değerleri arasında çok fazla varyans var, bu da iyi bir kümeleme yapılmasını zorlaştırıyor. Aslında, oluşan kümeler muhtemelen yukarıda tanımladığımız üç tür kategorisinden büyük ölçüde etkileniyor veya çarpıtılıyor.\n", "\n", "Yine de, bu oldukça öğretici bir süreçti!\n", "\n", "Scikit-learn dokümantasyonunda, bu tür kümelerin çok iyi ayrılmadığı bir modelin 'varyans' problemi yaşadığını görebilirsiniz:\n", "\n", "

\n", " \n", "

Scikit-learn'den bir bilgi grafiği
\n", "\n", "\n", "\n", "## **Varyans**\n", "\n", "Varyans, \"ortalamanın karesel farklarının ortalaması\" olarak tanımlanır [kaynak](https://www.mathsisfun.com/data/standard-deviation.html). Bu kümeleme problemi bağlamında, veri setimizdeki sayıların ortalamadan biraz fazla sapma eğiliminde olduğunu ifade eder.\n", "\n", "✅ Bu sorunu düzeltmek için düşünebileceğiniz tüm yolları değerlendirmek için harika bir an. Verileri biraz daha düzenlemek mi? Farklı sütunlar kullanmak mı? Farklı bir algoritma mı denemek? İpucu: Verilerinizi normalize etmek için [verilerinizi ölçeklendirmeyi deneyin](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) ve diğer sütunları test edin.\n", "\n", "> Bu '[varyans hesaplayıcıyı](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' kullanarak kavramı biraz daha iyi anlayabilirsiniz.\n", "\n", "------------------------------------------------------------------------\n", "\n", "## **🚀Meydan Okuma**\n", "\n", "Bu not defteriyle biraz zaman geçirin ve parametreleri değiştirin. Verileri daha fazla temizleyerek (örneğin, aykırı değerleri kaldırarak) modelin doğruluğunu artırabilir misiniz? Belirli veri örneklerine daha fazla ağırlık vermek için ağırlıklar kullanabilirsiniz. Daha iyi kümeler oluşturmak için başka neler yapabilirsiniz?\n", "\n", "İpucu: Verilerinizi ölçeklendirmeyi deneyin. Not defterinde, veri sütunlarının aralık açısından birbirine daha çok benzemesini sağlamak için standart ölçeklendirme ekleyen yorumlanmış kodlar var. Verilerin ölçeklendirilmemiş haliyle bırakılması, daha az varyansa sahip verilerin daha fazla ağırlık taşımasına izin verdiği için, silüet puanı düşse de dirsek grafiğindeki 'kırılma' yumuşar. Bu sorun hakkında biraz daha fazla bilgi edinmek için [burayı okuyun](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n", "\n", "## [**Ders Sonrası Testi**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n", "\n", "## **Gözden Geçirme ve Kendi Kendine Çalışma**\n", "\n", "- Bir K-Means Simülatörüne göz atın [örneğin bu](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Bu aracı kullanarak örnek veri noktalarını görselleştirebilir ve merkezlerini belirleyebilirsiniz. Verinin rastgeleliğini, küme sayılarını ve merkez sayılarını düzenleyebilirsiniz. Bu, verilerin nasıl gruplanabileceği hakkında bir fikir edinmenize yardımcı oluyor mu?\n", "\n", "- Ayrıca, Stanford'dan [bu K-Means el kitabına](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) göz atın.\n", "\n", "Yeni edindiğiniz kümeleme becerilerinizi K-Means kümeleme için uygun veri setlerinde denemek ister misiniz? Şunlara göz atabilirsiniz:\n", "\n", "- [Kümeleme Modellerini Eğit ve Değerlendir](https://rpubs.com/eR_ic/clustering) Tidymodels ve arkadaşlarıyla\n", "\n", "- [K-means Kümeleme Analizi](https://uc-r.github.io/kmeans_clustering), UC İş Analitiği R Programlama Rehberi\n", "\n", "- [Tidy veri ilkeleriyle K-means kümeleme](https://www.tidymodels.org/learn/statistics/k-means/)\n", "\n", "## **Ödev**\n", "\n", "[Farklı kümeleme yöntemlerini deneyin](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n", "\n", "## TEŞEKKÜRLER:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) bu modülün orijinal Python versiyonunu oluşturduğu için ♥️\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) R'ı daha sıcak ve çekici hale getiren harika illüstrasyonları için. Daha fazla illüstrasyonu [galerisinde](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) bulabilirsiniz.\n", "\n", "Keyifli Öğrenmeler,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Öğrenci Elçisi.\n", "\n", "

\n", " \n", "

@allison_horst tarafından yapılmış bir çalışma
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.\n" ] } ] }