Garfield
YZF Admin
KMeans ile kümeleme yapmak için veriyi sayısal bir diziye dönüştürüp
Dirsek yönteminde
Modeli yalnızca aynı verideki atamaya bakarak değerlendirmeyin. Her kümenin ortalama özelliklerini, gözlem sayısını ve merkezden uzak gözlemleri inceleyin. Kümeler anlamsız görünüyorsa önce özellik seçimini, ölçeklemeyi, aykırı değerleri ve
Buradaki grup ortalamaları her kümenin tipik profilini görmenizi sağlar. Sonraki adım, bu profilleri uygulamanızdaki amaca göre adlandırmaktır; örneğin etiket
KMeans modelini oluşturmanız, fit_predict() ile kümeleri hesaplamanız ve sonucu labels_ ya da doğrudan dönen etiketler üzerinden incelemeniz yeterlidir. Aşağıdaki örnekte iki özellikten oluşan varsayımsal veriler üç kümeye ayrılır; çıktıdaki her sayı, ilgili gözlemin hangi kümeye atandığını gösterir.Kurulum ve veri hazırlığı
Ön koşul olarak Python ortamınızdascikit-learn ve genellikle veri işlemleri için kullanılan numpy bulunmalıdır. KMeans sayısal uzaklıklarla çalıştığı için metin sütunlarını doğrudan modele vermeyin. Farklı ölçeklerdeki özellikler varsa modelin büyük sayısal aralığa sahip özelliğe fazla ağırlık vermemesi için ölçekleme uygulayın.
Python:
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# Varsayımsal veri: her satır bir gözlem, her sütun bir özellik
X = np.array([
[1.0, 1.2],
[1.3, 0.8],
[0.9, 1.1],
[8.0, 8.5],
[8.4, 7.9],
[7.7, 8.2],
[15.0, 1.0],
[14.5, 1.4],
[15.3, 0.7]
])
# Özelliklerin ölçeklerini dengeler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = KMeans(
n_clusters=3,
random_state=42,
n_init=10
)
labels = model.fit_predict(X_scaled)
print("Küme etiketleri:", labels)
print("Küme merkezleri:")
print(model.cluster_centers_)
Adım adım uygulama
- Veriyi satır-sütun düzenine getirin. Her satır bir gözlemi, her sütun bir özelliği temsil etsin. Örneğin bir müşteriyi yaş ve harcama tutarıyla kümeliyorsanız iki özellikli her satır tek müşteriyi göstermelidir.
- Eksik ve sayısal olmayan değerleri ele alın. KMeans metinleri ve eksik değerleri doğrudan anlamlandırmaz. Kategorik sütunları uygun biçimde sayısallaştırın, eksik değerler için de veri kümenize uygun bir doldurma yöntemi belirleyin.
- Özellikleri gerektiğinde ölçekleyin. Bir sütun binler, diğeri ondalık değerler kullanıyorsa
StandardScalergibi bir ölçekleyici kullanın. Aykırı değerler varsa ölçekleme yönteminin sonuç üzerindeki etkisini ayrıca değerlendirin. - Küme sayısını
n_clustersile belirleyin. Örnekte3kullanılmıştır; bu sayı otomatik olarak verinin gerçek sınıf sayısını kanıtlamaz. Farklı değerleri deneyip sonuçları karşılaştırmanız gerekir. - Modeli sabit bir başlangıçla çalıştırın.
random_state=42aynı veri ve ayarlarla yeniden üretilebilir sonuç almayı kolaylaştırır.n_initdeğeri, farklı başlangıç merkezleriyle birden fazla deneme yapılmasını sağlar. - Etiketleri üretin.
model.fit_predict(X_scaled)hem modeli veriye uydurur hem de her satır için küme etiketini döndürür. Etiketlerdeki0,1ve2sayıları yalnızca küme kimlikleridir; büyüklük sırası veya kalite sırası anlamına gelmez. - Merkezleri ve dağılımı inceleyin.
model.cluster_centers_ölçeklenmiş uzaydaki merkezleri verir. Gerçek özellik birimlerinde yorum yapmak istiyorsanız merkezleriscaler.inverse_transform(model.cluster_centers_)ile eski ölçeğe döndürün.
labels dokuz elemanlı bir dizi olur. Birbirine yakın ilk üç gözlemin aynı etiketi, sonraki üç gözlemin başka bir etiketi ve son üç gözlemin üçüncü etiketi alması beklenir; ancak küme numaralarının hangi sırada verileceği garanti edilmez. Örneğin ilk grubun etiketi 0 yerine 2 olabilir. Önemli olan aynı etikete sahip gözlemlerin model uzayında birbirine yakın olmasıdır.Küme sayısı nasıl seçilir?
Küme sayısı bilinmiyorsa farklık değerleri için model kurup her modelin inertia_ değerini karşılaştırabilirsiniz. Atalet (inertia_), gözlemlerin atandıkları merkezlere olan Öklid uzaklıklarının kareleri toplamıdır; örnekte ölçeklenmiş özellik uzayında hesaplanır ve düşük değer genellikle daha sıkı kümeler anlamına gelir. Ancak k arttıkça bu değer doğal olarak düşebileceği için yalnızca en düşük değeri seçmek doğru değildir.Dirsek yönteminde
k değerlerine karşı atalet çizilir ve düşüşün belirgin biçimde yavaşladığı nokta aday olarak değerlendirilir. Bunun yanında kümelerin iş anlamı, küme büyüklükleri ve farklı başlangıçlarda benzer sonuç verip vermediği de incelenmelidir. KMeans sonucu, veride kesin ve doğal sınıflar bulunduğunu kanıtlamaz; yalnızca seçtiğiniz özellikler ve uzaklık ölçüsü altında benzer gözlemleri gruplar.Ayarların sonucu nasıl değiştirdiği
Aşağıdaki ölçütler, modeli yorumlarken hangi ayarın neyi etkilediğini ayırmanıza yardımcı olur.| Ayar veya çıktı | Ne sağlar? | Neyi kanıtlamaz? |
|---|---|---|
n_clusters | Oluşturulacak küme sayısını belirler. | Verinin gerçek sınıf sayısını tek başına göstermez. |
random_state | Başlangıçların tekrarlanabilir olmasını kolaylaştırır. | Modelin doğru sonucu bulduğunu garanti etmez. |
n_init | Farklı başlangıç merkezleriyle deneme yapılmasını sağlar. | Uygun küme sayısını otomatik seçmez. |
labels_ veya fit_predict() sonucu | Her gözlemin atanmış kümesini verir. | Küme numaralarının anlamlı bir sıralaması olduğunu göstermez. |
inertia_ | Gözlemlerin merkezlere olan toplam yakınlığını ölçer. | Kümelerin iş açısından doğru veya yararlı olduğunu tek başına kanıtlamaz. |
n_clusters değerini kontrol edin. KMeans küresel biçimli ve uzaklıkla ayrılabilen kümelerde daha anlaşılır sonuç verir; karmaşık biçimli veya yoğunlukları çok farklı gruplarda başka kümeleme yöntemleri daha uygun olabilir.CSV verisiyle kullanırken
CSV dosyasındaki hedef dışı sayısal sütunları seçerek aynı akışı uygulayabilirsiniz. Örneğinveri.csv dosyanızda yas ve harcama sütunları varsa en küçük çalışan biçim şöyledir:
Python:
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
veri = pd.read_csv("veri.csv")
X = veri[["yas", "harcama"]]
X_scaled = StandardScaler().fit_transform(X)
model = KMeans(n_clusters=3, random_state=42, n_init=10)
veri["kume"] = model.fit_predict(X_scaled)
print(veri.groupby("kume")[['yas', 'harcama']].mean())
Buradaki grup ortalamaları her kümenin tipik profilini görmenizi sağlar. Sonraki adım, bu profilleri uygulamanızdaki amaca göre adlandırmaktır; örneğin etiket
0 olduğu için kümeye otomatik olarak “düşük”, “orta” veya “yüksek” anlamı vermeyin. Bu adlandırma, merkezlerin ve gerçek özellik değerlerinin incelenmesinden sonra yapılmalıdır.
Son düzenleme: