CodeBlanks Logo Icon CodeBlanks

KMeans eğitimi

KMeans modelini eğitirsin.

k seçimi ve eğitim

k için 2-6 arası değerleri siluet skoruyla karşılaştıracağız. İş açısından da makul bir sayı aranır: 2 segment pazarlama için fazla kaba, 8 segment ise yönetilemez.

for k in range(2, 7):
    km = KMeans(n_clusters=k, n_init=10, random_state=0).fit(Xs)
    print(k, round(silhouette_score(Xs, km.labels_), 3))

Teknik ölçüt ile iş ihtiyacı çeliştiğinde ikisini birlikte değerlendirmek gerekir; segmentler kullanılamıyorsa en yüksek siluet bir şey ifade etmez.

Kararlılık kontrolü

Seçilen k'nın kararlı olduğunu farklı tohumlarla ARI karşılaştırması doğrular. Ayrıca segment boyutlarına bakılır: tek müşterili ya da müşterilerin %90'ını içeren bir segment kullanışsızdır.

km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(Xs)
print(np.bincount(km.labels_))   # segment boyutları

Dengeli ve kararlı segmentler, kampanyaların anlamlı gruplara gitmesini sağlar.

Uygulama k'yı seç

k = 2-5 için ölçekli veride KMeans (n_init=10, random_state=0) eğit. Her satırda k'yı, siluet skorunu round(..., 3) ile ve en küçük segmentin boyutunu (np.bincount(km.labels_).min()) yazdır. Siluet ile segment boyutunu birlikte değerlendir.

Başlangıç kodu

model.py
import numpy as np

rng = np.random.default_rng(5)
n = 400
grup = rng.integers(0, 3, n)
harcama = np.array([300, 1500, 800])[grup] + rng.normal(0, 120, n)
ziyaret = np.array([2, 4, 12])[grup] + rng.normal(0, 1.2, n)
sepet = harcama / np.maximum(ziyaret, 1)
X = np.column_stack([harcama, ziyaret, sepet])
from sklearn.preprocessing import StandardScaler
Xs = StandardScaler().fit_transform(X)
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# buraya yaz

Örnek çözüm

model.py
import numpy as np

rng = np.random.default_rng(5)
n = 400
grup = rng.integers(0, 3, n)
harcama = np.array([300, 1500, 800])[grup] + rng.normal(0, 120, n)
ziyaret = np.array([2, 4, 12])[grup] + rng.normal(0, 1.2, n)
sepet = harcama / np.maximum(ziyaret, 1)
X = np.column_stack([harcama, ziyaret, sepet])
from sklearn.preprocessing import StandardScaler
Xs = StandardScaler().fit_transform(X)
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

for k in range(2, 6):
    km = KMeans(n_clusters=k, n_init=10, random_state=0).fit(Xs)
    print(k, round(silhouette_score(Xs, km.labels_), 3), np.bincount(km.labels_).min())

Beklenen çıktı

2 0.501 141
3 0.699 128
4 0.711 12
5 0.659 12

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Siluet k=3 ve k=4 için neredeyse eşitse hangisi tercih edilir?

  • İkisi de reddedilir
  • İş açısından daha yorumlanabilir olan, genellikle daha az küme Doğru cevap
  • Her zaman büyük olan
  • Rastgele seçim

Açıklama: Daha az segment daha kolay anlatılır ve uygulanır.

2 Segment boyutlarını say.

Soru
print(np.____(km.labels_))
Cevap
print(np.bincount(km.labels_))

Açıklama: bincount her küme numarasının kaç kez geçtiğini verir.

3 Kontrolleri eşleştir.

Kavram Anlamı
siluet Ayrılma kalitesi
ARI tohumlar arası Kararlılık
bincount Segment boyutları
iş ihtiyacı Yorumlanabilirlik

Orta seviye bölümündeki tüm dersler