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.
K-NN’nin uygulanması (kaynak)
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.
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.