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?
K-NN (K-Nearest Neighbors) algoritması, model oluşturmaksızın; sınıflandırma ve regresyon problemlerinin her ikisi üzerinde de çalışabilen, denetimli makine öğrenmesi algoritmasıdır. Veriler üzerinde basit denebilecek bir çıkarımla tahmin yapmaktır. Bu çıkarıma göre; etiket değeri tahmin edilecek bir veri için, n-boyutlu bir uzayda, kendisine en yakın k komşunun etiket değerleri referans alınmalıdır.
Ö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.
Algoritmanın adımlarını özetlersek:
- k değerinin belirlenmesi,
- Veriseti üzerindeki komşuların belirlenmesi,
- En yakın k komşunun etiket değerlerinin belirlenmesi,
- 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
Algoritmayı üzerinde çalıştırmak için Iris verisetini kullanabiliriz. Makine öğrenmesi alanındaki en yaygın verisetlerinden birisi olan Iris: Setosa, Versicolor ve Virginica türlerindeki 3 farklı Iris çiceğinden 50'şer örnek içermektedir. Örnekler, irislerin sepal ve petal yapraklarının genişlik ve uzunluklarından oluşan toplam 4 özelliğe (feature) sahiptir. Amaç; veriseti üzerinde test edilmek üzeren ayrılan ve etiket değeri gizli tutulan örneklerin, sepal ve petal yapraklarına göre hangi iris türüne ait olduğunun belirlenmesidir.
Verisetini aşağıdaki gibi görselleştirmek mümkün:
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:
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.