CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3

KMeans ile kümeleme yaparsın.

Meydan okuma 3: segment + sınıflandırıcı

Denetimsiz ve denetimli öğrenmeyi birleştiren bir senaryo: önce rakam verisini PCA + KMeans ile 10 kümeye ayır, sonra her kümenin gerçek etiketlerle ne kadar örtüştüğünü ölç. Kümeler etiketsiz bulunmuş olsa da yapı gerçek sınıflara ne kadar benziyor?

Z = PCA(n_components=30, random_state=0).fit_transform(StandardScaler().fit_transform(X))
kume = KMeans(n_clusters=10, n_init=10, random_state=0).fit_predict(Z)
print(adjusted_rand_score(y, kume))

Ardından her kümeye, içindeki en sık gerçek etiketi atayıp bunu bir "sınıflandırıcı" gibi değerlendirebiliriz.

Uygulama Kümeleri değerlendir

Ölçekli rakam verisini PCA(n_components=30, random_state=0) ile indir ve KMeans(n_clusters=10, n_init=10, random_state=0) ile kümele. ARI'yi round(..., 3) ile yazdır. Ardından her kümeye en sık gerçek etiketini atayıp bu eşlemeyle elde edilen doğruluğu round(..., 3) ile yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score

X, y = load_digits(return_X_y=True)

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score

X, y = load_digits(return_X_y=True)

Z = PCA(n_components=30, random_state=0).fit_transform(StandardScaler().fit_transform(X))
kume = KMeans(n_clusters=10, n_init=10, random_state=0).fit_predict(Z)
print(round(adjusted_rand_score(y, kume), 3))
eslem = np.array([np.bincount(y[kume == k]).argmax() for k in range(10)])
print(round((eslem[kume] == y).mean(), 3))

Beklenen çıktı

0.553
0.707

Uygulama Denetimli ile karşılaştır

Aynı 30 bileşenli PCA uzayında KNeighborsClassifier(n_neighbors=5)'ın 5 katlı CV doğruluğunu round(..., 3) ile yazdır. Etiket kullanmanın ne kadar fark yarattığını gör.

Başlangıç kodu

model.py
from sklearn.datasets import load_digits
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

X, y = load_digits(return_X_y=True)

# buraya yaz

Örnek çözüm

model.py
from sklearn.datasets import load_digits
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

X, y = load_digits(return_X_y=True)

pipe = make_pipeline(StandardScaler(), PCA(n_components=30, random_state=0), KNeighborsClassifier(n_neighbors=5))
print(round(cross_val_score(pipe, X, y, cv=5).mean(), 3))

Beklenen çıktı

0.94

Soru ve cevaplar

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

1 Kümeye en sık etiketi atamak neden etiketli veriye bakmak demektir?

  • Etiketleri kullanır; tam denetimsiz bir değerlendirme değildir Doğru cevap
  • Etiket kullanmaz
  • Rastgeledir
  • Hatalıdır

Açıklama: Kümeleme etiketsizdir ama küme-etiket eşlemesi etiket bilgisi gerektirir.

2 Her kümedeki en sık etiketi bul.

Soru
etiket = np.bincount(y[kume == k]).____()
Cevap
etiket = np.bincount(y[kume == k]).argmax()

Açıklama: bincount sayar, argmax en sık olanın değerini verir.

3 Adımları eşleştir.

Kavram Anlamı
PCA(30) Gürültü azaltma
KMeans(10) Etiketsiz gruplama
ARI Yapı benzerliği
en sık etiket Küme-sınıf eşlemesi

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