K-NN (K-Nearest Neighbors) Algoritması (Python)

Bu yazıda K-NN (K-Nearest Neighbors, K-En Yakın Komşular) algoritması kısaca tanıtılarak, Python üzerinde basit bir uygulamayla örneklenmiştir. Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz.

K-NN Algoritması nedir?

Örnek olması açısından; e-postalar için bir spam filtresi geliştiriliyor olsun. Spam e-postaları, yalnızca başlıklarını kontrol ederek ayırt edebileceğimizi varsayalım. Yeterli sayıda e-posta, spam ve spam olmayan şeklinde elle etiketlenerek basit bir veri seti oluşturulsun. Yapmamız gereken: Gelen her yeni e-postayı, veriseti üzerindeki tüm e-postalarla karşılaştırmak ve hangilerine en çok benzediğini bulmak. Gelen e-postaya komşu olan, yani ona en çok benzeyenlerden k kadarının çoğunluğu ne olarak etiketlenmişse (spam veya spam olmayan), gelen e-posta için de aynı etiket kabul edilmelidir. Bu şekilde her yeni e-postanın spam olup olmadığı belirlenir.

K-NN’nin uygulanması (kaynak)

Algoritmanın adımlarını özetlersek:

  1. k değerinin belirlenmesi,
  2. Veriseti üzerindeki komşuların belirlenmesi,
  3. En yakın k komşunun etiket değerlerinin belirlenmesi,
  4. k komşu arasından çoğunluğun etiketine göre, yeni verinin etiketinin belirlenmesi.

k sayısı, genellikle üzerinde çalışılan probleme ve verisetine göre, kendine özgü olarak belirlenmektedir.

Uygulama

Iris çiçeklerinin setosa, versicolor ve virginica türleri (kaynak)

Verisetini aşağıdaki gibi görselleştirmek mümkün:

Iris örneklerinin, sepal ve petal özelliklerine göre dağılımı.

K-NN Algoritmasını, basit bir sınıf yapısıyla oluşturabiliriz:

  • dist: Veriseti üzerindeki iki satırın/örneğin özellik değerlerinin uzaklığını hesaplamaktadır. Bunun için Öklid uzaklık formülü kullanılmaktadır.
  • get_nearest_neighbors: Parametre olarak aldığı örneği, veriseti üzerindeki diğer örneklerle karşılaştırarak, herbirine olan uzaklığı hesaplamaktadır. Uzaklıkların tutulduğu distances listesi, nihayetinde en yakından uzağa doğru sıralanır ve baştan k tanesi neighbors listesine eklenerek geri döndürülür.
  • predict: Kullanıcıdan test ve eğitim örneklerini almaktadır. Bahsettiğimiz gibi K-NN algoritması, model oluşturmaksızın çalışmaktadır. Dolayısıyla buradaki eğitim örnekleri, doğrudan test örnekleriyle karşılaştırılarak kullanılmaktadır. Her bir test örneği için en yakın k komşu hesaplanır ve bunların etiket değerleri targets listesine eklenir. Listede en fazla bulunan etiket değeri de, test örneğinin etiket değeri olarak atanır ve bu şekilde tahmin edilen tüm örnekler, y_predict listesiyle geri döndürülür.

Uygulamayı çalıştırmak için:

Verisetinden 50 veriyi (%33) test örneği olarak ayırdık. Tahmin edilen örnekler için bir hata matrisi çizdirelim:

Confusion matrix (Hata Matrisi)

Hata matrisine inceleyerek; setosa ve versicolor türlerinden toplam 34 örneği doğru şekilde sınıflandırırken, aslında virginica türünde olan 16 örnekten 1'inin versicolor olarak yanlış sınıflandırıldığını söyleyebiliriz.

K-NN algoritmasını farklı şekillerde ve tabi daha hassas veri bilimcisi öngörüleriyle uygulamak mümkün. Bu yazıda ana mantığını basitçe anlatmaya çalıştım.

Okuduğunuz için teşekkür ederim.