Makine Öğrenmesi — KNN (K-Nearest Neighbors) Algoritması Nedir?
Makine öğrenmesi ile çözülebilen problemlerden biri çok geniş kullanım alanı ile sınıflandırma problemleridir. Günümüzdeki bir çok problem bir şekilde sınıflandırma problemi olarak tasarlanıp çözülebilmektdir. Aşağıdaki problemler sınıflandırma problemlerine örnek olarak verilebilir.
- Müşterinin verilen krediyi ödeyip ödeyemeyeceği (Customer Default Risk)
- Müşterinin aldığı servisi bırakıp bırakmayacağı (Customer Churn)
- Müşteri segmantasyon (Customer Segmantation)
- Kişiye özel ilaç tespiti
- E-posta spam filitrelemesi
- Görüntü tanıma (Image Recognition)
- El yazısı tanıma (Handwriting Recognition)
- Biyometrik tanımlama (Biometric Identification)
Bu problemleri çözmek üzere üretilmiş bir dolu algoritma bulunmaktadır. bunlar içinden KNN (K-Nearest Neighbors) Algoritmasından bir örnek ile bahsedeceğim.
KNN en basit anlamı ile içerisinde tahmin edilecek değerin bağımsız değişkenlerinin oluşturduğu vektörün en yakın komşularının hangi sınıfta yoğun olduğu bilgisi üzerinden sınıfını tahmin etmeye dayanır.
KNN (K-Nearest Neighbors) Algoritması iki temel değer üzerinden tahmin yapar;
- Distance (Uzaklık): Tahmin edilecek noktanın diğer noktalara uzaklığı hesaplanır. Bunun için Minkowski uzaklık hesaplama fonksiyonu kullanılır.
- K (komuşuluk sayısı): En yakın kaç komşu üzerinden hesaplama yapılacağını söyleriz. K değeri sonucu direkt etkileyecektir. K 1 olursa overfit etme olasılığı çok yüksek olacaktır. Çok büyük olursa da çok genel sonuçlar verecektir. Bu sebeple optimum K değerini tahmin etmek problemin asıl konusu olarak karşımızda durmaktadır. K değerinin önemini aşağıdaki grafik çok güzel bir şekilde göstermektedir. Eğer K=3 ( düz çizginin olduğu yer) seçersek sınıflandırma algoritması ? işareti ile gösterilen noktayı, kırmızı üçgen sınıfı olarak tanımlayacaktır. Fakat K=5 (kesikli çizginin olduğu alan) seçersek sınıflandırma algoritması, aynı noktayı mavi kare sınıfı olarak tanımlayacaktır.
KNN (K-Nearest Neighbors) Algoritması ile üretilmiş bir modelin başarımını ölçmek için genel olarak kullanılan 3 adet indikatör vardır.
- Jaccard Index: Doğru tahmin kümesi ile gerçek değer kümesinin kesişim kümesinin bunların birleşim kümesine oranıdır.1 ile 0 arası değer alır. 1 en iyi başarım anlamına gelir.
- F1-Score: Confusion Matriks üzerinden hesaplanan Precission ve Recall değerlerinden hesaplanır. Pre=TP/(TP+FP) Rec=TP/(TP+FN) F1-Score= 2((PreRec)/(Pre+Rec)) 1 ile 0 arası değer alır. 1 en iyi başarım anlamına gelir.
- LogLoss: Logistic Regresyon sonunda tahminlerin olasılıkları üzerinden LogLoss değeri hesaplanır. 1 ile 0 arası değer alır. Yukarıdaki iki değerden farklı olarak 0 en iyi başarım anlamına gelir.
KNN (K-Nearest Neighbors) Algoritması İçin Basit Bir Örnek
Örnek olarak bir telefon şirketinin örnek verileri üzerinden müşteri kategorisini tahmin eden bir model inşa etmeye çalışacağız. Tahmin etmeye çalışacağımız veri “custcat” kolonunda bulunuyor. Bu kolondaki her bir sayısal değerin karşılığı aşağıdaki gibidir;
- 1- Basic Service
- 2- E-Service
- 3- Plus Service
- 4- Total Service
Öncelikli olarak verinin pandas ile yüklenmesi ve incelenmesi adımlarını yapacağız.
Hangi sınıfta kaç tane müşteri olduğuna bakalım. Bu inceleme ele aldığımız verinin model oluşturmak için uygunluğu konusunda bize fikir verecektir. Eğer sınıflara göre dağılımı düzgün olmayan bir veri setimiz var ise doğru bir model geliştirmemiz mümkün olmayacaktır.
Öncelikli olarak verimizi analiz için hazırlamak gerekiyor. Scikit-learn ile çalışabilmek için bağımlı değişken ve bağımsız değişkenlerimizi ayrı ayrı numpy array tipine dönüştürmemiz gerekiyor.
KNN gibi noktalar arası mesafe temelli algoritmalardan daha başarılı sonuç elde etmek için veriler normalize edilir.
Bir model geliştirdikten sonra sonuçlarını bildiğimiz veriler ile modelin test edilmesi oldukça önemlidir. Bu testin ise eğitim yaparken kullanılan veri seti dışında bir veri seti olması, bize gerçek hayatta modelimizin nasıl bir performans göstereceğini söyleyecektir. Bu amaçla elimizdeki toplam veri setini train/test (eğitim/test) olarak ikiye ayıracağız.
KNN (K-Nearest Neighbors) Algoritmasını kullanarak sınıflandırma işlemine başlayacağız. İlk olarak k=4 (En yakın 4 komşu içerisindeki yoğunluğa göre karar verecek) olarak modelimizi eğitelim.
neigh ismini verdiğimiz modelimizi eğittik. Şimdi bu model ile prediction yapalım ve sonuçların performansına bakalım.
Multilabel (Çoklu sonuç) tahmin yapılması durumunda bunun accuracy (doğruluğu) değerlendirmesi için accuracy classification score fonksiyonu kullanılabilir. Bu fonksiyon jaccard index benzeri bir sonuç verir.
Eğer K değerini 4 yerine 6 seçseydik sonuç nasıl değişirdi. Bunu görmek için modelimizi yeniden eğitip sonuçlarını karşılaştıralım.
Sonuç daha iyi olmadı. Peki doğru k değerini seçtiğimizden nasıl emin olabiliriz. Daha iyi bir soru ile optimum k değerini nasıl bulabiliriz. Bunun için bir aralık için tüm k değerleri için modelimizi eğitim accuracy score üzerinden bir karşılaştırma yapıp olası en iyi k değeri bulunabilir.
Örnek olsun diye k değerinin 1–10 arasındaki durumlarını inceleyelim.
Elde ettiğimiz sonuçlara grafik üzerinden bakarak optimum K değerini görebiliriz.
Grafikten görebileceğimiz gibi en iyi değer K=9 olduğunda gerçekleşmiş. Bunu aşağıdaki şekilde grafik çizdirmeden de görebiliriz.
Basit bir örnek üzerinden KNN (K-Nearest Neighbors) Algoritmasını anlatmaya çalıştım. Ekran görüntülerini gördüğünüz kodlara ve daha detaylı bilgilere aşağıdaki linklerden ulaşabilirsiniz.