Makine Öğrenmesi - Kümeleme Algoritmaları
Mini-Batch K-Means
Mini Batch K-Means (Mini Toplu K-Ortalama) algoritması, en popüler kümeleme algoritmalarından biridir. Rasgele olarak küçük ve aynı boyda veri yığınlarını kullanır ve her yinelemede veri kümesinden yeni bir rastgele örnek elde ederek kümeleri güncellemek için kullanılır ve bu yakınsama kadar tekrarlanır. Yineleme sayısı arttıkça, yeni verilerin etkisi azalır, bu nedenle de birkaç ardışık yineleme sonucunda kümelerde herhangi bir değişiklik meydana gelmediğinde yakınsama tespit edilebilir.
Mini Batch K-Means algoritması KMeans algoritmasından biraz daha hızlıdır ve farklı sonuçlar verir.
Kullanabilmek için "MiniBatchKMeans" algoritmasının içe aktarılması gerekmektedir.
from sklearn.cluster import MiniBatchKMeans
Söz dizimi: MiniBatchKMeans(n_clusters=8, *, init='k-means++', max_iter=100, batch_size=1024, verbose=0, compute_labels=True, random_state=None, tol=0.0, max_no_improvement=10, init_size=None, n_init=3, reassignment_ratio=0.01)
- n_clusters, oluşturulacak küme sayısını temsil etmektedir. Varsayılan olarak 8'dir.
- init, başlatma yöntemini temsil etmektedir. 2 farklı değer alabilir: "k-means++'","random". Varsayılan olarak "k-means++" dir.
- k-means++, yakınsamayı hızlandırmak için ilk küme merkezlerini seçer.
- random, rastgele olarak verilerden gözlemler seçer.
- max_iter, maksimum yineleme sayısını temsil eder.
- batch_size, mini patrilerin sayısını temsil eder.
Örnek-1: Cars veri seti üzerinden, sayısal olan sütunlara Mini Batch K-Means 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 MiniBatchKMeans
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
#MiniBatchKMeans 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.
MBKM=MiniBatchKMeans()
#Model eğitme işlemi
MBKM.fit(x)
#Tahminleme sonucu
predict_MBKM=MBKM.predict(x)
#tahmin edilen kümelemenin ilk 20 değerini yazdıralım
predict_MBKM[0:20]
Çıktı:
array([2, 2, 5, 5, 5, 0, 0, 0, 0, 0, 2, 5, 5, 3, 3, 3, 3, 0, 7, 7])
#x veri setine yeni bir sütun oluşturularak satırların hangi kümede olduğunu belirtelim
x["Cluster"]=predict_MBKM
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_MBKM)
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 Mini Batch K-Means 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
sum_of_squared_distances = [] #en yakın küme merkezine olan uzaklıklarının karesi toplamı 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=MiniBatchKMeans(n_clusters=no_of_cluster)
model.fit(x)
predict_model=model.predict(x)
sum_of_squared_distances.append(model.inertia_)
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.4501356312426696 Kümeleme sayısı: 3, silhouette_score değeri: 0.3931355263666016 Kümeleme sayısı: 4, silhouette_score değeri: 0.37213455496614123 Kümeleme sayısı: 5, silhouette_score değeri: 0.38011421835209297 Kümeleme sayısı: 6, silhouette_score değeri: 0.3506548906469681 Kümeleme sayısı: 7, silhouette_score değeri: 0.3421408889676975 Kümeleme sayısı: 8, silhouette_score değeri: 0.318501031291834 Kümeleme sayısı: 9, silhouette_score değeri: 0.34136751486657635 Kümeleme sayısı: 10, silhouette_score değeri: 0.3427160029968865
#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 5 küme sayısından sonra Silhoutte Score değerinde çok düşme meydana geldiğinden; veri seti 5 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 = MiniBatchKMeans(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ı: