BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies - Hiyerarşileri Kullanarak Dengeli Yinelemeli İndirgeme ve Kümeleme), özellikle büyük veri setlerinin küçük birer özetini çıkararak kümeleme yapan algoritmadır.
Kullanabilmek için "BIRCH" algoritmasının içe aktarılması gerekmektedir.
from sklearn.cluster import Birch
Söz dizimi: Birch(*, threshold=0.5, branching_factor=50, n_clusters=3, compute_labels=True, copy=True)
- n_clusters, oluşturulacak küme sayısını temsil etmektedir. Varsayılan olarak 3'dür.
Örnek-1: Cars veri seti üzerinden, sayısal olan sütunlara BIRCH 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 Birch
from sklearn.preprocessing import StandardScaler
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
#StandardScaler işlemi yaplılabilir.
X=StandardScaler().fit_transform(x)
#OPTICS ataması yapılır
model=Birch(n_clusters=3)
#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)
#Veri seti değerlerinin kümeleme öncesi dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(X[:,0],X[:,1])
plt.title("Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği")
plt.colorbar()
plt.show()
Çıktı:
#Veri seti değerlerinin kümeleme sonrası dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(X[:,0],X[:,1],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 BIRCH kümeleme algoritması kullanılarak 3 farklı renk ile belirtilen kümeleme işlemi yapılmış oldu.
silhouette_score değerine bakılırsa;
silhouette_score(X,predict_model)
Çıktı:
0.2343285191520108
En optimum bölünme sayısı kaç olmalıdır?
Örneğimizde küme sayısı(n_clusters) varsayılan olarak 3'tü. 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=Birch(n_clusters=no_of_cluster)
model.fit(x)
predict_model=model.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.3035507043052043 Kümeleme sayısı: 3, silhouette_score değeri: 0.2343285191520108 Kümeleme sayısı: 4, silhouette_score değeri: 0.16632062415463275 Kümeleme sayısı: 5, silhouette_score değeri: 0.18186441711294268 Kümeleme sayısı: 6, silhouette_score değeri: 0.1851949707085739 Kümeleme sayısı: 7, silhouette_score değeri: 0.19525347292782733 Kümeleme sayısı: 8, silhouette_score değeri: 0.19348673435316102 Kümeleme sayısı: 9, silhouette_score değeri: 0.21825937950841717 Kümeleme sayısı: 10, silhouette_score değeri: 0.22660187126627523
#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 3 küme sayısından sonra Silhoutte Score değerinde çok düşme meydana geldiğinden; veri seti 3 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 = Birch(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ı: