Meydan okuma 2
- Makine Öğrenmesi kursu
- Başlangıç
- Ders 110/112
- 8 dk
NumPy ve Pandas ile veri işlersin.
Meydan okuma 2: KNN'i sıfırdan yaz
KNN'in tüm mantığı birkaç satırdır: mesafeleri hesapla, en yakın k örneği seç, etiketlerinin çoğunluğunu al.
def knn_tahmin(X_egitim, y_egitim, q, k):
d = np.sqrt(((X_egitim - q) ** 2).sum(axis=1))
yakin = np.argsort(d)[:k]
return np.bincount(y_egitim[yakin]).argmax()Kendi uygulamanı scikit-learn'ünkiyle karşılaştırmak, algoritmayı gerçekten anladığını gösterir.
Uygulama Kendi KNN'in
knn_tahmin(X_egitim, y_egitim, q, k) fonksiyonunu yaz. Iris test kümesinin her örneği için k=5 ile tahmin üret ve doğruluğu round(..., 3) ile yazdır.
Başlangıç kodu
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
# buraya yazÖrnek çözüm
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
def knn_tahmin(X_egitim, y_egitim, q, k):
d = np.sqrt(((X_egitim - q) ** 2).sum(axis=1))
yakin = np.argsort(d)[:k]
return np.bincount(y_egitim[yakin]).argmax()
p = np.array([knn_tahmin(X_train, y_train, q, 5) for q in X_test])
print(round((p == y_test).mean(), 3))Beklenen çıktı
1.0
Uygulama scikit-learn ile karşılaştır
Aynı bölmede KNeighborsClassifier(n_neighbors=5) eğit. Kendi tahminlerin (p) ile onun tahminlerinin kaç örnekte aynı olduğunu (p == m.predict(X_test)).sum() ile ve test kümesi boyutunu aynı satırda yazdır.
Başlangıç kodu
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
d = np.sqrt(((X_train[None, :, :] - X_test[:, None, :]) ** 2).sum(axis=2))
p = np.array([np.bincount(y_train[np.argsort(r)[:5]]).argmax() for r in d])
# buraya yazÖrnek çözüm
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
d = np.sqrt(((X_train[None, :, :] - X_test[:, None, :]) ** 2).sum(axis=2))
p = np.array([np.bincount(y_train[np.argsort(r)[:5]]).argmax() for r in d])
m = KNeighborsClassifier(n_neighbors=5).fit(X_train, y_train)
print((p == m.predict(X_test)).sum(), len(X_test))Beklenen çıktı
45 45
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>np.argsort(d)[:k]</code> neyi verir?
- En küçük k mesafenin indeksleri Doğru cevap
- En büyük k mesafe
- k'ıncı mesafe
- Sıralı mesafeler
Açıklama: argsort küçükten büyüğe indeks verir; ilk k tanesi en yakın komşulardır.
2 Komşu etiketlerinin çoğunluğunu al.
sinif = np.bincount(y_egitim[yakin]).____()
sinif = np.bincount(y_egitim[yakin]).argmax()
Açıklama: bincount her sınıfın oyunu sayar; argmax en çok oy alanı verir.
3 Adımları eşleştir.
| Kavram | Anlamı |
|---|---|
((X - q) ** 2).sum(axis=1) |
Kare mesafeler |
np.argsort(d)[:k] |
En yakın k |
np.bincount |
Oy sayımı |
argmax |
Kazanan sınıf |