Makine Öğrenmesi - Kümeleme Algoritmaları

Agglomerative Clustering

Yayın tarihi :21-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Agglomerative Clustering (Aglomeratif kümeleme), verileri benzerliklerine göre kümelemek için kullanılan en yaygın hiyerarşik kümeleme türüdür.  Algoritma, her veriyi tek bir küme olarak ele alır ve daha sonra, küçük kümeler tüm verileri içeren büyük bir kümede birleştirilene kadar küme çiftleri art arda birleştirilir. Bu küme hiyerarşisi bir ağaç olarak temsil edilir. Ağacın kökü, tüm örnekleri toplayan benzersiz kümedir, yapraklar yalnızca bir örnek içeren kümelerdir

Kullanabilmek için "AgglomerativeClustering" algoritmasının içe aktarılması gerekmektedir.

from sklearn.cluster import AgglomerativeClustering

Söz dizimi: AgglomerativeClustering(n_clusters=2, affinity='euclidean', memory=Memory(cachedir=None), connectivity=None, n_components=None, compute_full_tree='auto', linkage='ward', pooling_func=<function mean at 0x2b3eef778320>)

  • n_clusters, oluşturulacak küme sayısını temsil etmektedir. Varsayılan olarak 2'dir.
  • linkage, bağlantı kriterini temsil etmektedir. 3 farklı değer alabilir: "ward", "complete", "average". Varsayılan olarak "ward" dır.
    • ward, birleştirilen kümelerin varyansını en aza indirir.
    • complete, iki kümenin tüm gözlemleri arasındaki maksimum mesafeleri kullanır.
    • average, iki kümenin her bir gözleminin uzaklıklarının ortalamasını kullanır.

Örnek-1: Cars veri seti üzerinden, sayısal olan sütunlara AgglomerativeClustering kümeleme algoritmasını uygulayalım.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score

Keşifsel Veri Analizi EDA 

#Veri seti okunur
df=pd.read_excel("cars.xls")
df.head()

Çıktı:

#Veri setinde sayısal olan değişkenleri x olarak atayalım
x=df.select_dtypes("number")
x.head()

Çıktı:

# Veri seti hakkında bilgi 
x.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 804 entries, 0 to 803
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Price     804 non-null    float64
 1   Mileage   804 non-null    int64  
 2   Cylinder  804 non-null    int64  
 3   Liter     804 non-null    float64
 4   Doors     804 non-null    int64  
 5   Cruise    804 non-null    int64  
 6   Sound     804 non-null    int64  
 7   Leather   804 non-null    int64  
 8   Cluster   804 non-null    int32  
dtypes: float64(2), int32(1), int64(6)
memory usage: 53.5 KB
#Veri seti açıklamaları
x.describe()

Çıktı:

Model Oluşturma İşlemleri

#AgglomerativeClustering ataması yapılır
#n_clusters sayısı varsayılan olarak(2) bıraklıdığından 2 farklı kümeleme işlemi yapılacaktır.
model=AgglomerativeClustering()

#Model eğitme ve Tahminleme işlemi
predict_model=model.fit_predict(x)

#tahmin edilen kümelemenin ilk 20 değerini yazdıralım
predict_model[0:20]

Çıktı:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
      dtype=int64)
#x veri setine yeni bir sütun oluşturularak satırların hangi kümede olduğunu belirtelim
x["Cluster"]=predict_model
x.sample(5)

Çıktı:

#Veri seti değerlerinin kümeleme öncesi dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(x.Mileage,x.Price)
plt.title("Veri seti değerlerinin kümeleme öncesi dağılım grafiği")
plt.show()

Çıktı:

#Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(x.Mileage,x.Price,c=predict_model)
plt.title("Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği")
plt.colorbar()
plt.show()

Çıktı:

Veri setindeki değerleri AgglomerativeClustering kümeleme algoritması kullanılarak 2 farklı renk ile belirtilen kümeleme işlemi yapılmış oldu.

En optimum bölünme sayısı kaç olmalıdır?

Örneğimizde küme sayısı(n_clusters) varsayılan olarak 2'di. silhouette_score değeri incelenerek en iyi bölünmesi gereken değeri gözlemleyelim.

allscore=[] #skor listesi
allclusters=[] #kümeleme sayısı(n_clusters) listesi
#cluster_count'a kadar her kümeleme sayısı sonucunda elde edilen değerleri listelendiren fonksiyon
#x: veri seti
#cluster_count: kümeleme sayısı
def cluster(x,cluster_count):
    for no_of_cluster in np.arange(1,cluster_count):
        no_of_cluster+=1
        model=AgglomerativeClustering(n_clusters=no_of_cluster)
        predict_model=model.fit_predict(x) 
        score=silhouette_score(X=x,labels=predict_model)
        print ("Kümeleme sayısı: {}, silhouette_score değeri: {}".format(no_of_cluster,score))
        allscore.append(score)
        allclusters.append(no_of_cluster)
#x veri setini 10 taneye kadar kümeye ayır
cluster(x,10)

Çıktı:

Kümeleme sayısı: 2, silhouette_score değeri: 0.44244915218417663
Kümeleme sayısı: 3, silhouette_score değeri: 0.3751415405528485
Kümeleme sayısı: 4, silhouette_score değeri: 0.3734729283102143
Kümeleme sayısı: 5, silhouette_score değeri: 0.337841632264332
Kümeleme sayısı: 6, silhouette_score değeri: 0.31995071492589794
Kümeleme sayısı: 7, silhouette_score değeri: 0.3241685970478335
Kümeleme sayısı: 8, silhouette_score değeri: 0.31515980142896205
Kümeleme sayısı: 9, silhouette_score değeri: 0.3023537915699612
Kümeleme sayısı: 10, silhouette_score değeri: 0.32359874546562795
#Silhoutte_Score grafiklemesi
plt.plot(allclusters,allscore,marker="x")
plt.xlabel('Kümeleme sayısı')
plt.ylabel('Silhoutte_Score')
plt.title('Silhouette Metotu')
plt.show()

Çıktı:

Grafikte de görüldüğü gibi 4 küme sayısından sonra Silhoutte Score değerinde çok düşme meydana geldiğinden; veri seti 4 kümeye ayrılmalıdır diyebiliriz.

#n_clusters değerlerine göre(2-10 aralığında) kümeleme grafiklemeleri
fig = plt.figure(figsize=(15, 12))
for i in range(2, 11):
    sc = AgglomerativeClustering(n_clusters=i).fit(x)
    fig.add_subplot(3, 3, i-1)
    plt.scatter(x.Mileage,x.Price, s=5, c=sc.labels_, label="n_cluster-"+str(i))
    plt.colorbar()
    plt.legend()
plt.show() 

Çıktı:

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.