Makine Öğrenmesi - Kümeleme Algoritmaları
Spectral Clustering
Spectral Clustering (spektral kümeleme), veri setindeki her veri noktasını bir grafik düğümü olarak ele alarak kümeleme işlemini grafik bölümleme işlemine dönüştürür. Spektral kümelemenin üç ana adımı şunlardır:
- Benzerlik grafiği oluşturmak.
- Verileri daha düşük boyutlu bir alana yansıtmak.
- Verileri kümelemek.
Son yıllarda spektral kümeleme, en popüler kümeleme algoritmalarından biri haline gelmiştir.
Kullanabilmek için "SpectralClustering" algoritmasının içe aktarılması gerekmektedir.
from sklearn.cluster import SpectralClustering
Söz dizimi: SpectralClustering(n_clusters=8, *, eigen_solver=None, n_components=None, random_state=None, n_init=10, gamma=1.0, affinity='rbf', n_neighbors=10, eigen_tol=0.0, assign_labels='kmeans', degree=3, coef0=1, kernel_params=None, n_jobs=None, verbose=False)
- n_clusters, oluşturulacak küme sayısını temsil etmektedir. Varsayılan olarak 8'dir.
- n_components, kullanılacak özvektörlerin sayısını temsil etmektedir.
- n_neighbors, matrisini oluştururken kullanılacak komşu sayısını temsil etmektedir.
Örnek-1: Cars veri seti üzerinden, sayısal olan sütunlara SpectralClustering 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 SpectralClustering
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ı
df.describe()
Çıktı:
Model Oluşturma İşlemleri
#SpectralClustering ataması yapılır
#n_clusters sayısı varsayılan olarak(8) bıraklıdığından 8 farklı kümeleme işlemi yapılacaktır.
model=SpectralClustering()
#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([4, 7, 7, 4, 4, 6, 4, 4, 6, 6, 7, 7, 7, 6, 4, 4, 6, 7, 7, 7])
#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 SpectralClustering kümeleme algoritması kullanılarak 8 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 8'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=SpectralClustering(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 n_clusters değerlerine göre(2-10 aralığında) silhouette score değerleri listesi
cluster(x,11)
Çıktı:
Kümeleme sayısı: 2, silhouette_score değeri: -0.29742728942530233 Kümeleme sayısı: 3, silhouette_score değeri: -0.29742728942530233 Kümeleme sayısı: 4, silhouette_score değeri: -0.29742728942530233 Kümeleme sayısı: 5, silhouette_score değeri: -0.3004455577008639 Kümeleme sayısı: 6, silhouette_score değeri: -0.3185270552509987 Kümeleme sayısı: 7, silhouette_score değeri: -0.3234027990050099 Kümeleme sayısı: 8, silhouette_score değeri: -0.34618464024092627 Kümeleme sayısı: 9, silhouette_score değeri: -0.3812864819077109 Kümeleme sayısı: 10, silhouette_score değeri: -0.5511287706683161 Kümeleme sayısı: 11, silhouette_score değeri: -0.4595336453128456
#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 Silhoutte Score değeri negatif sonuçlar verdi, negatif sonuçlar kümeleme işleminin düzgün yapılmadığını belirtmektedir. Bu veri seti için SpectralClustering algoritması uygun değildir denebilir.
#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 = SpectralClustering(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ı: