Scratch ile K-Nearest Neighbor (KNN)

Dipnot
KaVe
Published in
4 min readJan 9, 2021

--

Merhabalar, Scratch ile Makine Öğrenmesi serimizin üçüncü yazısı olan Scratch ile K-Nearest Neighbor yazımıza hoş geldiniz. Bu yazıda sizlerle birlikte K-Nearest Neighbor algoritmasını inceleyip, kodlayacağız.

Algoritmamızı kodlarken veri seti olarak iris veri setini kullanacağız. Iris veri seti classification problemleri için ideal bir veri setidir. Veri setine buradan ya da sklearn kütüphanesinden erişebilirsiniz. Aşağıda veri setini kodunuza nasıl aktarabileceğinizi görüyorsunuz.

from sklearn import datasets
iris = datasets.load_iris()
df.describe()

K-Nearest Neighbor

K-Nearest Neighbor algoritmasını kullanmamızdaki temel amaç, kategorik bir şekilde sınıflandırılmış verilerimizin hangi kategoriye ait olup olmadığını bulmaktır.

Algoritmamız (K-Nearest Neighbor ya da kısaca KNN) verileri, koordinat sistemindeki en yakınındaki komşularına bakarak tahmin eder.

Peki bu ne demek ?

Verileri bir koordinat sisteminde gibi düşünürsek ortadaki (yıldız) bizim tahmin edeceğimiz verinin koordinat sistemindeki yeridir. Ve ona en yakın olan K tane eleman bizim verimizin aslında hangi kategoriye yakın olduğunu bize söyler. Bu resimde K için 3 ve 6 olmak üzere 2 farklı değerin işleme konulduğunu görüyoruz. K’nın 3 olması durumunda bizim tahmin edeceğimiz değerin en yakınında 1 tane A ve 2 tane B sınıfından eleman bulunur. Bu eşitsizliğe bakarak, yıldız verimizin B sınıfına ait olduğunu söyleyebiliriz. Bu resimde K için bir de 6 değişkeninin kullanıldığını görüyoruz. K’nın 6 değeri içinse durumlar değişiyor ve verimiz 4 tane A ve 2 tane B sınıfından verilerle komşu oluyor. Bu durumda yıldız verimiz için en mantıklı kararın A sınıfı olduğu anlaşılıyor.

Bizim algoritmayı kullanırken amacımız en iyi K değerini bulup hata payını minimuma indirgemektir

Kısaca; KNN algoritmasının temelinde mesafe ve K(en yakın komşu sayısı) olmak üzere 2 farklı temel direk vardır. Metnin önceki bölümlerinde yazdığım üzere K ya biz karar veriyoruz.

Peki mesafe değişkeni olarak neleri kullanıyoruz?

Bu sorunun cevabı olarak KNN algoritmasında kullanılmak üzere birden çok mesafe ölçme formülü mevcuttur. Bunlar:

  1. Minkowski Distance
  2. Manhattan Distance
  3. Euclidean Distance
  4. Cosine Distance
  5. Jaccard Distance
  6. Hamming Distance

gibi farklı mesafe ölçüm formülleri mevcuttur. Biz kodumuzda sıklıkla kullanılan Euclidean Distance’ı kullancağız. Diğer mesafe ölçerlerin koda etkisini gözlemlemek için “Effects of Distance Measure Choice on KNN Classifier Performance — A Review” makaleyi okumanızı öneririm.

Euclidean Distance

Euclidean Distance Yani Türkçesiyle Öklid mesafesi, KNN algoritmasında en sık kullanılan mesafe çeşididir. Çalışma prensibi olarak geometrideki uzaklık bulma prensibi benimser.

Öklid Mesafesi Formülü

K değeri neden önemlidir?

Bu grafikte seçilen farklı K değerleri için Hata Oranları verilmiştir. K değerinin bire yakın ve bire eşit seçilmesi, kodumuzda Overfitting’e sebep olacaktır. Peki overfitting nedir? Overfitting kodun verileri ezberleyerek gelebilecek farklı verilere karşı güçsüz kalması durumudur. Bu durumda kodumuz, en yakındaki -tek- veriye bakacak ve veriyi analiz etmeden yanlış tahminler yapar. Bunun sonucu olarak hata oranlarımız artar.

Bizim en iyi K değerini bulabilmemiz için birden fazla K değerini kodumuzda denememiz ve en iyi olanını seçmemiz gerekiyor.

Hadi Kod Yazalım:

1. Öncelikle gerekli kütüphaneleri import edelim

2. Verilerimizi yükleyip, onları ön işlemden geçirdikten sonra da modele veriyoruz 😊

Bu kod parçasında veri setimizi yükledikten sonra onları df ve df_test olarak iki parçaya ayırıyoruz. Bundan sonra da (3,10) aralığındaki değerleri K değerini belirlemek için deniyor ve hata skorunu hesaplıyoruz.

3. Class yapımızı kodluyoruz.

Class yapımızı kodlamaya “__init__” fonksiyonundaki ön tanımlamalarla başlıyoruz. Bir sonraki aşama olarak “__distance” fonksiyonunu ekleyip classımızda kullanacağımız öklid fonksiyonunu tanımlıyoruz. Son aşama olarak da “predict” fonksiyonumuzla kodumuzu sonlandıracağız. Predict fonksiyonunda mesafeleri ölçülen mesafeleri sort lu bir şekilde sıralaması için “heapq” yapısını kullanıyoruz. Burada mesafeleri normal bir listeye alıp sort da yapabililirsiniz fakat “heapq” yapısı kodunuzu bir tık daha iyileştirecektir. Ölçülen mesafeler küçükten büyüğe sıraladıktan sonra ilk K elemanı işleme alarak verinizin hangi kategoriye ait olduğu sonucuna ulaşabilirsiniz.

Bu yazımızdan da bu kadar 😊

Kodun Tüm Halini Görmek İçin Github Sayfamı Ziyaret Ediniz: https://github.com/capogluuu/ml_scratch

TEŞEKKÜRLER

--

--