Ana içeriğe geç

R'da Hiyerarşik Kümeleme

Kümeleme, etiketlenmemiş verilerden çıkarım yapmak için kullanılan bir makine öğrenmesi algoritması türü olan gözetimsiz öğrenmenin en yaygın biçimidir.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Bu eğitimde, R'de bir veri kümesi üzerinde hiyerarşik kümeleme yapmayı öğreneceksiniz. Python'da hiyerarşik kümeleme hakkında bilgi edinmek isterseniz, ayrı makalemize göz atın. 

Giriş

Adından da anlaşılacağı üzere, Kümeleme algoritmaları bir dizi veri noktasını alt kümelere veya kümelere ayırır. Algoritmaların hedefi, iç tutarlılığı yüksek, ancak birbirinden dışsal olarak belirgin biçimde farklı kümeler oluşturmaktır. Başka bir deyişle, bir küme içindeki varlıklar mümkün olduğunca benzer olmalı, farklı kümelerdeki varlıklar ise mümkün olduğunca farklı olmalıdır.

Genel olarak konuşursak, algoritmik yapı ve işleyişe bağlı olarak veri noktalarını kümelerken iki yaklaşım vardır: birleştirici (agglomerative) ve bölücü (divisive).

  • Agglomerative : Birleştirici yaklaşım, her gözlemin ayrı (tekil) bir kümede bulunduğu başlangıç noktasıyla başlar ve bir durdurma ölçütü sağlanana kadar kümeleri art arda birleştirir.
  • Divisive : Bölücü yöntem ise tüm örüntülerin tek bir kümede bulunduğu başlangıç durumuyla başlar ve bir durdurma ölçütü karşılanana kadar ayırma işlemi uygular.

Bu eğitimde, her veri noktasını kendi kümesi olarak başlatıp bir benzerlik ölçütüne göre kümeleri birleştirdiğiniz birleştirici veya aşağıdan yukarıya yaklaşımına odaklanacaksınız. Bu fikir, bölücü yöntemlere de kolayca uyarlanabilir.

Kümeler arası benzerlik genellikle iki küme arasındaki öklidyen mesafe gibi benzerliksiz (dissimilarity) ölçülerinden hesaplanır. Yani iki küme arasındaki mesafe ne kadar büyükse, o kadar iyidir.

Benzerliksizlik ölçüsünü hesaplamak için düşünebileceğiniz pek çok mesafe metriği vardır ve seçim, veri kümesindeki veri türüne bağlıdır. Örneğin, veri kümeniz sürekli sayısal değerler içeriyorsa euclidean mesafeyi kullanabilirsiniz; veriler ikili ise, (kategorik verilerde tek-seçmeli kodlama uygulandıktan sonra kümeleme için yararlı olan) Jaccard mesafesini düşünebilirsiniz. Diğer mesafe ölçüleri arasında Manhattan, Minkowski, Canberra vb. bulunur.

Kümeleme için ön işleme adımları

Başlamadan önce dikkat etmeniz gereken birkaç nokta vardır.

  • Ölçekleme

Kümeleme sürecine başlamadan önce özellik değerlerinizin ölçeğini normalize etmeniz zorunludur. Bunun nedeni, her gözlemin özellik değerlerinin n-boyutlu uzayda (n, özellik sayısıdır) koordinatlar olarak temsil edilmesi ve daha sonra bu koordinatlar arasındaki mesafelerin hesaplanmasıdır. Bu koordinatlar normalize edilmezse, hatalı sonuçlara yol açabilir.

Örneğin, üç kişinin boy ve kilo verilerine sahip olduğunuzu düşünün: A (6ft, 75kg), B (6ft,77kg), C (8ft,75kg). Bu özellikleri iki boyutlu bir koordinat sisteminde, boy ve kilo olarak temsil eder ve aralarındaki Öklidyen mesafeyi hesaplarsanız, aşağıdaki çiftler arasındaki mesafe şöyle olur:

A-B : 2 birim

A-C : 2 birim

Mesafe metriği, A-B ve A-C çiftlerinin benzer olduğunu söyler; oysa gerçekte durum böyle değildir! A-B çifti, A-C çiftinden daha benzerdir. Bu nedenle, önce bu değerleri ölçeklendirmek ve ardından mesafeyi hesaplamak önemlidir.

Özellik değerlerini normalize etmenin çeşitli yolları vardır; tüm özellik değerlerinin (x(i)) ölçeğini [0,1] aralığına (min-maks normalizasyonu olarak bilinir) standartlaştırmayı, aşağıdaki dönüşümü uygulayarak düşünebilirsiniz:

$ x(s) = x(i) - min(x)/(max(x) - min (x)) $

Bunun için R'ın normalize() fonksiyonunu kullanabilir veya şu şekilde kendi fonksiyonunuzu yazabilirsiniz:

standardize <- function(x){(x-min(x))/(max(x)-min(x))}

Diğer bir ölçekleme türü aşağıdaki dönüşümle elde edilebilir:

$ x(s) = x(i)-mean(x) / sd(x) $

Burada sd(x), özellik değerlerinin standart sapmasıdır. Bu, özellik değerlerinizin dağılımının ortalamasını 0 ve standart sapmasını 1 yapacaktır. Bunu R'da scale() fonksiyonu ile sağlayabilirsiniz.

  • Eksik Değer Ataması

Ayrıca, veri kümenizdeki eksik/null/inf değerlerle önceden ilgilenmek de önemlidir. Bu tür değerlerle başa çıkmanın birçok yolu vardır; bunları ya kaldırabilir ya da ortalama, medyan, mod ile atayabilir veya bazı gelişmiş regresyon tekniklerini kullanabilirsiniz. R, eksik değer atamaları için impute(), Amelia, Mice, Hmisc gibi birçok paket ve fonksiyona sahiptir. Amelia hakkında bu eğitimde okuyabilirsiniz.

Hiyerarşik Kümeleme Algoritması

Hiyerarşik birleştirici kümelemedeki temel işlem, en yakın iki kümeyi tekrarlayarak daha büyük bir kümede birleştirmektir. Önce yanıtlanması gereken üç kritik soru vardır:

  • Birden fazla noktadan oluşan bir kümeyi nasıl temsil edersiniz?
  • Kümelerin "yakınlığını" nasıl belirlersiniz?
  • Kümeleri birleştirmeyi ne zaman bırakırsınız?

Umarız bu eğitimin sonunda bu soruların hepsini yanıtlayabileceksiniz. Hiyerarşik kümelemeyi uygulamadan önce nasıl çalıştığına bakalım:

  1. Önce her gözlem çifti arasındaki mesafeyi hesaplayıp bir mesafe matrisinde saklar.
  2. Sonra her noktayı kendi kümesine yerleştirir.
  3. Ardından, mesafe matrisindeki mesafelere göre en yakın nokta çiftlerini birleştirmeye başlar ve bunun sonucunda küme sayısı 1 azalır.
  4. Daha sonra yeni küme ile eski kümeler arasındaki mesafeyi yeniden hesaplar ve yeni bir mesafe matrisinde saklar.
  5. Son olarak tüm kümeler tek bir kümede birleşene kadar 2 ve 3. adımları tekrarlar.

Kümeler arasındaki mesafeyi ölçmenin ve kümeleme kurallarını belirlemenin çeşitli yolları vardır ve bunlara genellikle Bağlantı (Linkage) Yöntemleri denir. Yaygın bağlantı yöntemlerinden bazıları şunlardır:

  • Complete-linkage: Birleştirmeden önce kümeler arasındaki maksimum mesafeyi hesaplar.

Tam Bağlantı

  • Single-linkage: Birleştirmeden önce kümeler arasındaki minimum mesafeyi hesaplar. Bu bağlantı, uç değer olabilecek yüksek değerleri tespit etmek için kullanılabilir; çünkü bunlar en sonda birleştirilecektir.

Tekli Bağlantı

  • Average-linkage: Birleştirmeden önce kümeler arasındaki ortalama mesafeyi hesaplar.

Ortalama Bağlantı

  • Centroid-linkage: 1. kümenin ve 2. kümenin kütle merkezini bulur ve birleştirmeden önce ikisi arasındaki mesafeyi hesaplar.

Kütle Merkezi Bağlantısı

Bağlantı yöntemi seçimi tamamen size bağlıdır ve her zaman iyi sonuç verecek kesin bir yöntem yoktur. Farklı bağlantı yöntemleri farklı kümelere yol açar.

Dendrogramlar

Hiyerarşik kümelemede, nesneleri dendrogram adı verilen ağaç benzeri bir diyagrama benzer bir hiyerarşi içinde kategorize edersiniz. Aşağıdaki dendrogramda bölünme veya birleştirme mesafesi (yükseklik olarak adlandırılır) y ekseninde gösterilir.

Dendrogram

Yukarıdaki şekilde, önce 4 ve 6, aralarındaki mesafe en yakın olduğu için bir kümeye, örneğin küme 1'e birleştirilir; bunu 1 ve 2 noktaları, yani küme 2 izler. Sonrasında 5, aynı küme 1'e; ardından 3 birleştirilir ve iki küme elde edilir. En sonunda iki küme tek bir kümede birleştirilir ve kümeleme süreci burada durur.

Şu ana kadar sizi meraklandırmış olabilecek bir soru, kümeleri birleştirmeyi ne zaman durduracağınıza nasıl karar verdiğinizdir. Bu, veriler hakkındaki alan bilginize bağlıdır. Örneğin, sahadaki konumlarına göre futbolcuları kümeliyorsanız (mesafe hesabı için koordinatlarını temsil eder), bir futbol maçında yalnızca iki takım olabileceğini zaten bildiğiniz için yalnızca 2 küme ile bitirmeniz gerektiğini bilirsiniz.

Ancak bazen bu bilgiye de sahip olmazsınız. Böyle durumlarda, küme sayısını yaklaşık olarak belirlemek için dendrogram sonuçlarından yararlanabilirsiniz. Dendrogramı, yatay bir çizgiyle, çizginin aşağı ve yukarı en fazla mesafeyi kat edebileceği ve birleştirme noktasını kesmeyeceği bir yükseklikten kesersiniz. Yukarıdaki durumda bu, 1.5 ile 2.5 yükseklikleri arasında olur:

Dendrogram kesimi

Gösterildiği gibi bir kesim yaparsanız yalnızca iki küme elde edersiniz.

Not yalnızca bu tür yerlerde kesim yapmak zorunda değilsiniz; kaç küme istediğinize bağlı olarak kesim noktasını dilediğiniz gibi seçebilirsiniz. Örneğin, 1.5'in altında ve 1'in üstünde bir kesim size 3 küme verir.

Not bu, küme sayısını belirlemek için katı bir kural değildir. Silhouette grafiği, dirsek grafiği gibi görselleri veya Dunn indeksi, Hubert gamma vb. gibi, hata ile küme sayısı (k) arasındaki değişimi gösteren sayısal ölçüleri de düşünebilirsiniz ve hatanın en küçük olduğu k değerini seçersiniz.

Kümelerin başarımını ölçme

Belki de herhangi bir gözetimsiz öğrenme görevindeki en önemli kısım, sonuçların analizidir. Herhangi bir algoritma ve herhangi bir parametre setiyle kümelemeyi yaptıktan sonra, bunu doğru yaptığınızdan emin olmanız gerekir. Peki bunu nasıl belirlersiniz?

Bunu yapmak için birçok ölçüt vardır; en popüler olanlardan biri Dunn's Index'tir. Dunn indeksi, minimum küme-dışı (inter-cluster) mesafenin, maksimum küme-içi (intra-cluster) çapına oranıdır. Bir kümenin çapı, en uzak iki noktası arasındaki mesafedir. İyi ayrışmış ve kompakt kümelere sahip olmak için daha yüksek bir Dunn indeksi hedeflemelisiniz.

Hiyerarşik Kümeleme Uygulaması

Şimdi edindiğiniz bilgileri gerçek bir sorunu çözmek için uygulayacaksınız.

seeds veri kümesi üzerinde hiyerarşik kümeleme uygulayacaksınız. Bu veri kümesi, üç farklı buğday çeşidine (Kama, Rosa ve Canadian) ait tanelerin geometrik özelliklerine ilişkin ölçümleri içerir. Alan, çevre, asimetri katsayısı vb. tohum özelliklerini tanımlayan değişkenler vardır. Her buğday çeşidi için 70 gözlem bulunmaktadır. Veri kümesiyle ilgili ayrıntıları burada bulabilirsiniz.

read.csv() fonksiyonu ile veri kümesini bir veri çerçevesine aktararak başlayın.

Not dosyada başlık yoktur ve sekmeyle ayrılmıştır. Sonuçların yeniden üretilebilirliğini korumak için set.seed() fonksiyonunu kullanmanız gerekir.

set.seed(786)
file_loc <- 'seeds.txt'
seeds_df <- read.csv(file_loc,sep = '\t',header = FALSE)

Veri kümesinde sütun adları olmadığı için, sütunlara veri açıklamasından hareketle siz ad vereceksiniz.

feature_name <- c('area','perimeter','compactness','length.of.kernel','width.of.kernal','asymmetry.coefficient','length.of.kernel.groove','type.of.seed')
colnames(seeds_df) <- feature_name

Veri kümesi hakkında boyutları, veri türleri ve dağılımı, NA sayısı gibi bazı temel ve yararlı bilgileri toplamak faydalıdır. Bunu R'da str(), summary() ve is.na() fonksiyonlarını kullanarak yapacaksınız.

str(seeds_df)
summary(seeds_df)
any(is.na(seeds_df))

Bu veri kümesindeki tüm sütunların sayısal değerlerden oluştuğunu unutmayın. Kümeleme öncesinde temizlemeniz gereken eksik değer yoktur. Ancak özelliklerin ölçekleri farklıdır ve bunları normalize etmeniz gerekir. Ayrıca veriler etiketlidir ve hangi gözlemin hangi buğday çeşidine ait olduğunu zaten biliyorsunuz.

Şimdi etiketleri ayrı bir değişkende saklayacak ve kümeleme yapmak için veri kümenizden type.of.seed sütununu hariç tutacaksınız. Daha sonra, kümelemenizin ne kadar iyi olduğunu kontrol etmek için gerçek etiketleri kullanacaksınız.

seeds_label <- seeds_df$type.of.seed
seeds_df$type.of.seed <- NULL
str(seeds_df)

Görüleceği üzere, veri kümenizden gerçek etiket sütununu çıkardınız.

Şimdi tüm sütun değerlerinizi ölçeklemek için R'ın scale() fonksiyonunu kullanacaksınız.

seeds_df_sc <- as.data.frame(scale(seeds_df))
summary(seeds_df_sc)

Tüm sütunların ortalamasının 0 ve standart sapmasının 1 olduğuna dikkat edin. Verilerinizi ön işlediğinize göre artık mesafe matrisini oluşturma zamanı. Buradaki tüm değerler sürekli sayısal olduğundan euclidean mesafe yöntemini kullanacaksınız.

dist_mat <- dist(seeds_df_sc, method = 'euclidean')

Bu noktada hangi bağlantı yöntemini kullanmak istediğinize karar verip hiyerarşik kümelemede ilerlemeniz gerekir. Tüm bağlantı yöntemlerini deneyebilir ve hangisinin daha iyi performans gösterdiğine daha sonra karar verebilirsiniz. Burada average bağlantı yöntemiyle ilerleyeceksiniz.

hclust() ile oluşturacağınız hiyerarşik kümeleme nesnesini çizerek dendrogramınızı inşa edeceksiniz. Bağlantı yöntemini method argümanı ile belirtebilirsiniz.

hclust_avg <- hclust(dist_mat, method = 'average')
plot(hclust_avg)

Küme Dendrogramı

Dikkat edin dendrogramın nasıl kurulduğuna ve her veri noktasının sonunda y ekseninde gösterilen yükseklik (mesafe) ile tek bir kümede birleştiğine.

Sonraki adımda, istenen sayıda küme oluşturmak için dendrogramı kesebilirsiniz. Bu durumda zaten yalnızca üç tür buğday olabileceğini bildiğinizden küme sayısını k = 3 olarak seçersiniz veya dendrogramda görüldüğü üzere h = 3 ile üç küme elde edersiniz. Ağacı kesmek için R'ın cutree() fonksiyonunu, bir parametre olarak hclust_avg ve diğer parametre olarak h = 3 veya k = 3 ile kullanacaksınız.

cut_avg <- cutree(hclust_avg, k = 3)

Kümeleri dendrogram üzerinde görsel olarak görmek isterseniz, aşağıdaki kodda gösterildiği gibi kesim çizgisini çizmek için R'ın abline() fonksiyonunu ve her küme için ağaca dikdörtgen bölmeler bindirmek için rect.hclust() fonksiyonunu kullanabilirsiniz:

plot(hclust_avg)
rect.hclust(hclust_avg , k = 3, border = 2:6)
abline(h = 3, col = 'red')

Dikdörtgen Dendrogram

Artık üç farklı renkte kutu içine alınmış üç kümeyi görebilirsiniz. Ayrıca ağacınızı farklı renkte dallarla görselleştirmek için dendextend kütüphanesindeki color_branches() fonksiyonunu kullanabilirsiniz.

Unutmayın R'da bir paketi install.packages('package_name', dependencies = TRUE) komutuyla kurabilirsiniz.

suppressPackageStartupMessages(library(dendextend))
avg_dend_obj <- as.dendrogram(hclust_avg)
avg_col_dend <- color_branches(avg_dend_obj, h = 3)
plot(avg_col_dend)

Renkli Dendrogram

Şimdi, dplyr paketinden mutate() ile, elde edilen kümeleme sonuçlarını orijinal veri çerçevesine cluster sütun adı altında ekleyip, count() fonksiyonuyla her kümeye kaç gözlem atandığını sayacaksınız.

suppressPackageStartupMessages(library(dplyr))
seeds_df_cl <- mutate(seeds_df, cluster = cut_avg)
count(seeds_df_cl,cluster)

Her kümeye kaç gözlem atandığını görebileceksiniz. Gerçekte, etiketli verilerde her buğday çeşidi için 70 gözlem bulunduğunu unutmayın.

Veri kümesi bazında daha yararlı içgörüler çıkarmak için, yaptığınız kümelemeden hareketle iki özellik arasındaki eğilimi değerlendirmek yaygındır. Bir alıştırma olarak, ggplot2 paketi yardımıyla buğdayın perimeter ve area özellikleri arasındaki eğilimi küme bazında analiz edebilirsiniz.

suppressPackageStartupMessages(library(ggplot2))
ggplot(seeds_df_cl, aes(x=area, y = perimeter, color = factor(cluster))) + geom_point()

Çevre vs Alan

Tüm buğday çeşitleri için çevre ile alan arasında doğrusal bir ilişki olduğu dikkat çekiyor.

Bu veri kümesi için gerçek etiketlere zaten sahip olduğunuzdan, kümeleme sonuçlarınızı table() fonksiyonunu kullanarak çapraz kontrol etmeyi de düşünebilirsiniz.

table(seeds_df_cl$cluster,seeds_label)

Oluşturulan tabloya bakarsanız, açıkça 55 veya daha fazla öğeden oluşan üç grup görürsünüz. Genel olarak, kümelerinizin farklı tohum türlerini yeterince temsil ettiğini söyleyebilirsiniz; zira başlangıçta her buğday çeşidi için 70 gözlem vardı. Daha büyük gruplar, kümeler ile gerçek türler arasındaki eşleşmeyi temsil eder.

Not çoğu durumda gerçek etiketlere sahip olmazsınız. Bu durumlarda, daha önce tartışıldığı gibi, Dunn indeksini maksimize etmek gibi başka ölçütlere yönelebilirsiniz. clValid kütüphanesindeki dunn() fonksiyonunu kullanarak dunn indeksini hesaplayabilirsiniz. Ayrıca, tıpkı diğer makine öğrenmesi algoritmalarında yaptığınız gibi, eğitim ve test setleri oluşturarak ve daha sonra gerçek etiketler varken kümeleme yaparak sonuçların çapraz doğrulamasını yapmayı düşünebilirsiniz.

K-Ortalamalar Kümeleme Algoritması ile Karşılaştırma

K-ortalamalar (k-means) kümeleme algoritmasını duymuş olabilirsiniz; duymadıysanız bu eğitime göz atın. İki algoritma arasında birçok temel fark vardır; farklı durumlarda biri diğerinden daha iyi performans gösterebilir. Farklardan bazıları şunlardır:

  • Kullanılan mesafe: Hiyerarşik kümeleme, pratikte herhangi bir mesafe metriğini ele alabilirken k-ortalamalar öklidyen mesafelere dayanır.
  • Sonuçların kararlılığı: k-ortalamalar, sürecin yeniden çalıştırılması halinde farklı sonuçlar verebilecek rastgele bir başlangıç adımı gerektirir. Hiyerarşik kümelemede bu söz konusu değildir.
  • Küme sayısı: k-ortalamalarda doğru küme sayısını bulmak için dirsek grafikleri, Silhouette grafiği vb. kullanabilirsiniz; hiyerarşik yöntem de bunların tümünü kullanabilir ve buna ek olarak dendrogramdan da yararlanma avantajına sahiptir.
  • Hesaplama Karmaşıklığı: K-ortalamalar, hiyerarşik kümelemeden daha az hesaplama maliyetine sahiptir ve büyük veri kümelerinde makul sürede çalıştırılabilir; bu da k-ortalamaların daha popüler olmasının başlıca nedenidir.

Sonuç

Tebrikler! Bu eğitimin sonuna geldiniz. Verilerinizi nasıl ön işleyeceğinizi, hiyerarşik kümelemenin temellerini, çalıştığı mesafe metriklerini ve bağlantı yöntemlerini ve bunların R'daki kullanımını öğrendiniz. Ayrıca, hiyerarşik kümelemenin k-ortalamalar algoritmasından nasıl farklılaştığını da biliyorsunuz. Aferin! Ancak öğrenilecek her zaman daha çok şey var. R'da Gözetimsiz Öğrenme kursumuza göz atmanızı öneririm.

Konular

İlgili