Ana içeriğe geç

R ile K-En Yakın Komşu (KNN) Sınıflandırması Eğitimi

R ile K-En Yakın Komşu (KNN) sınıflandırmasına dalın. 'class' ve 'caret' R paketlerini kullanmayı, hiperparametre ayarlamayı ve model performansını değerlendirmeyi öğrenin.
· 11 dk. oku

Yapay Zeka ile Keşfedin

image2.png

R, KNN sınıflandırmasını uygulamak için güçlü bir araçtır ve genellikle veri bilimciler ile istatistikçiler tarafından çeşitli makine öğrenimi uygulamalarında kullanılır.

Bu derste K-En Yakın Komşular’ı, nasıl çalıştığını ve bazı avantajları ile dezavantajlarını öğreneceğiz. Ayrıca KNN sınıflandırma modelini kolayca uygulamak için 'class' ve 'caret' R Paketlerini kullanacağız.

K-En Yakın Komşular nedir?

K-En Yakın Komşular (KNN), hem regresyon hem de sınıflandırma görevleri için kullanılabilen gözetimli bir makine öğrenimi modelidir. Algoritma parametrik değildir; yani verinin temel dağılımı hakkında herhangi bir varsayımda bulunmaz.

KNN algoritması, test veri kümesinin etiketlerini, eğitim veri kümesinin öznitelik uzayındaki en yakın komşularının etiketlerine bakarak tahmin eder. “K”, modelin performansını eniyilemek için ayarlanabilen en önemli hiperparametredir.

KNN, çok çeşitli sınıflandırma problemlerinde iyi sonuçlar veren basit ve sezgisel bir algoritmadır. Uygulaması ve anlaşılması kolaydır; küçük ve büyük veri kümelerine uygulanabilir. Ancak bazı sakıncaları da vardır; başlıca dezavantajı, büyük veri kümeleri veya yüksek boyutlu öznitelik uzayları için hesaplama açısından pahalı olabilmesidir.

KNN algoritması e-ticaret öneri motorlarında, görüntü tanımada, sahtekarlık tespitinde, metin sınıflandırmada, anomali tespitinde ve daha birçok alanda kullanılır. Bu derste, KNN algoritmasını bir kredi onay sistemi için kullanacağız.

Eğer kafanız karışıksa ve veri bilimi yolculuğunuza nasıl başlayacağınızı bilmiyorsanız, R ile Profesyonel Veri Bilimci kariyer yolunu takip ederek veri biliminde başarılı bir kariyer için kendinizi hazırlayın. Bu beceri yolu, R programlama, veri alımı, veri temizleme, veri işleme, veri görselleştirme, makine öğrenimi, hipotez testleri, deney tasarımları, SQL ve Git konularında ustalaşmanıza yardımcı olacaktır.

K-En Yakın Komşular Sınıflandırması nasıl çalışır?

KNN sınıflandırma algoritması, eğitim veri kümesinde yeni bir veri noktasına en yakın K komşuyu (en yakın veri noktalarını) bularak çalışır. Ardından, komşular arasındaki çoğunluk sınıfının etiketini yeni veri noktasına atar.

Algoritmayı birkaç parçaya bölelim.

İlk olarak, yeni veri noktaları ile eğitim setindeki tüm diğer veri noktaları arasındaki mesafeyi hesaplar ve en yakın K noktayı seçer. Mesafenin hesaplanmasında kullanılan metrik probleme göre değişebilir. En yaygın metrik Öklid mesafesidir.

K en yakın komşu belirlendikten sonra, algoritma bu komşular arasında çoğunlukta olan sınıfın etiketini yeni veri noktasına atar. Örneğin, iki etiket “mavi” ve bir etiket “kırmızı” ise, algoritma yeni veri noktasına “mavi” etiketini atar.

Gif from eunsukim.me

eunsukim.me kaynağından gif

Özet:

  1. Tahmin yapmak için kullanılacak en yakın komşu sayısı olan K değerini seçeceğiz.
  2. Bu nokta ile eğitim setindeki tüm noktalar arasındaki mesafeyi hesaplayın.
  3. Hesaplanan mesafelere göre K en yakın komşuyu seçin.
  4. Yeni veri noktasına çoğunluk sınıfının etiketini atayın.
  5. Test setindeki tüm veri noktaları için 2 ila 4. adımları tekrarlayın.
  6. Algoritmanın doğruluğunu değerlendirin.

“K” değeri kullanıcı tarafından verilir ve algoritmanın performansını eniyilemek için kullanılabilir. Küçük K değerleri aşırı öğrenmeye, büyük değerler ise yetersiz öğrenmeye yol açabilir. Bu nedenle, kararlılık ve en iyi uyumu sağlayan optimal değerleri bulmak kritik önemdedir.

R ile KNN uygulaması

Bu bölümde Kredi Verisini kullanacak ve class paketini kullanarak KNN sınıflandırması eğiteceğiz. Veri seti 10.000 krediden oluşuyor; müşterinin verilerine dayanarak bir kredinin geri ödenip ödenmeyeceğini bulacağız.

Veriyi Yükleme

Veri yükleme, işleme ve görselleştirme için gerekli R paketlerine erişmek amacıyla tidyverse kütüphanesini içe aktaracağız. suppressPackageStartupMessages uyarıları bastırır ve temiz bir çıktı alırsınız.

Ardından, veri setini yüklemek için read_csv kullanacak, subset fonksiyonuyla veri çerçevesinden “purpose” sütununu kaldıracak ve ilk 3 örneği görüntüleyeceğiz.

suppressPackageStartupMessages(library(tidyverse))

data <- read_csv('data/loans.csv.gz', show_col_types = FALSE)
data <- subset(data, select = -c(purpose))
head(data,3)

image4.png

Eğitim ve Test Ayrımı

Veri setini elle bölebiliriz, ancak caTools kütüphanesini kullanmak çok daha temizdir.

  • Tekrarlanabilirlik için tohum (seed) belirleyin.
  • sample.split kullanarak eğitim ve test veri kümeleri için 75:25 oranında indeks oluşturun.
  • Aşağıda gösterildiği gibi subset ile eğitim ve test veri kümelerini oluşturun.
library(caTools)
set.seed(255)

split = sample.split(data$not_fully_paid, 
                     SplitRatio = 0.75)
train = subset(data, 
                      split == TRUE)
test = subset(data, 
                  split == FALSE)

Özellik Ölçekleme

Şimdi hem eğitim hem de test setini ölçekleyeceğiz. Arka planda fonksiyon (x - mean(x)) / sd(x) kullanır. Yalnızca öznitelikleri ölçekliyor ve hem test hem de eğitim setlerinden hedef etiketleri çıkarıyoruz.

train_scaled = scale(train[-13])
test_scaled = scale(test[-13])

KNN Sınıflandırıcıyı Eğitme ve Tahmin

class kütüphanesi, KNN sınıflandırmayı eğitmek için oldukça popülerdir. Basit ve hızlıdır. Ölçeklenmiş eğitim ve test veri setini, hedef sütununu ve “k” hiperparametresini sağlayacağız.

library(class)
test_pred <- knn(
                 train = train_scaled, 
                 test = test_scaled,
                 cl = train$not_fully_paid, 
                 k=10
                 )

Model Değerlendirme

Model sonuçlarını değerlendirmek için table fonksiyonunu kullanarak bir karışıklık matrisi (confusion matrix) göstereceğiz. table fonksiyonuna gerçek (test hedefi) ve tahmin edilen etiketleri verdik ve görüldüğü gibi çoğunluk sınıfı için oldukça iyi sonuçlar aldık.

KNN algoritması dengesiz veriyle başa çıkmada iyi değildir; bu yüzden azınlık sınıflarında zayıf performans görüyoruz.

actual <- test$not_fully_paid

cm <- table(actual,test_pred)
cm
     test_pred
actual    0    1
     0 1988   23
     1  373   10

Doğruluğu, karışıklık matrisindeki doğru pozitif değerleri toplayıp hedef sütununun toplam uzunluğuna bölerek hesaplayabiliriz.

Gözlemlediğimiz üzere, basit bir modelde iyi bir doğruluk elde ettik. Bu doğruluğu “K” hiperparametresini ayarlayarak ve veri kümesini dengeleyerek artırabiliriz.

accuracy <- sum(diag(cm))/length(actual)
sprintf("Accuracy: %.2f%%", accuracy*100)
'Accuracy: 83.46%'

R'da caret kullanarak KNN Sınıflandırması

Bu bölümde her şey için caret kullanacağız. caret, makine öğrenimi modellerini oluşturmak ve değerlendirmek için bir R paketidir. Başlıca makine öğrenimi algoritmaları için bir arayüz sunar.

Veri setini bölmek ve ön işlemek, hiperparametre ayarlaması yapmak ve modelleri eğitip değerlendirmek için kullanacağız.

Eğitim ve Test Ayrımı

caret Paketini içe aktaracak ve tekrarlanabilirlik için tohum belirleyeceğiz. Ardından, hedef değişkeni tam sayıdan faktöre dönüştüreceğiz. Son olarak, veri setini 80:20 oranında eğitim ve test kümelerine bölmek için createDataPartition kullanacağız.

suppressPackageStartupMessages(library(caret))
set.seed(255)

data$not_fully_paid <- factor(data$not_fully_paid, levels = c(0, 1))

trainIndex <- createDataPartition(data$not_fully_paid, 
								  times=1, 
								  p = .8, 
								  list = FALSE)
train <- data[trainIndex, ]
test <- data[-trainIndex, ]

Veri Ön İşleme

Ardından preProcess fonksiyonunu kullanarak hem eğitim hem de test setini ölçekleyeceğiz.

preProcValues <- preProcess(train, method = c("center", "scale"))
trainTransformed <- predict(preProcValues, train)
testTransformed <- predict(preProcValues, test)

Model Ayarlama

KNN modelimizi eğitmeden önce, eğitim fonksiyonunu kullanarak “K” için en iyi değeri bulmalıyız. train fonksiyonu bir formül, ölçeklenmiş eğitim veri seti, model adı, eğitim kontrol yöntemi (çapraz doğrulama) ve hiperparametre listesini ister. “K” değerinin 3, 5 ve 7 olduğu durumlarda model performansını kontrol edeceğiz.

knnModel <- train(
		     not_fully_paid ~ ., 
		     data = trainTransformed, 
	            method = "knn", 
		     trControl = trainControl(method = "cv"), 
		     tuneGrid = data.frame(k = c(3,5,7))
		    )

En İyi Performans Gösteren Modeli Eğitme

En iyi “K” değerini bulduktan sonra, ölçeklenmiş eğitim veri setiyle KNN sınıflandırma modelini eğiteceğiz.

best_model<- knn3(
                  not_fully_paid ~ .,
                  data = trainTransformed,
                  k = knnModel$bestTune$k
                 )

Model Değerlendirme

caret basit ve güçlü bir model değerlendirme fonksiyonu sağlar. Model performans sonuçlarını göstermek için önce görülmemiş test veri seti için etiketleri tahmin etmeliyiz. Ardından, confusionMatrix fonksiyonunu kullanarak tahmin edilen ve gerçek değerlerle model performansını değerlendireceğiz.

predictions <- predict(best_model, testTransformed,type = "class")
# Calculate confusion matrix
cm <- confusionMatrix(predictions, testTransformed$not_fully_paid)
cm

Sonuç olarak, karışıklık matrisini, model doğruluğunu, P-Değerini, model duyarlılığını ve modelin kararlılığını ve performansını belirlemeye yardımcı olacak diğer önemli metrikleri elde ederiz.

Görüldüğü üzere model, bir azınlık sınıfı olan “Neg Pred Value” üzerinde oldukça kötü performans göstermiş ve dengeli doğruluğumuz yüzde 51 olmuştur. Yazı tura ile benzer bir sonuç elde edebiliriz.

Sınıfları aşırı örnekleme ve eksik örnekleme yöntemleriyle dengeleyerek sonucu iyileştirebiliriz. Ayrıca özellik mühendisliği yaparak yeni öznitelikler oluşturabilir ve yüksek korelasyonlu öznitelikleri çıkarabiliriz.

Confusion Matrix and Statistics

          Reference
Prediction    0    1
         0 1570  288
         1   39   18
                                          
               Accuracy : 0.8292          
                 95% CI : (0.8116, 0.8458)
    No Information Rate : 0.8402          
    P-Value [Acc > NIR] : 0.9091          
                                          
                  Kappa : 0.0516          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.97576         
            Specificity : 0.05882         
         Pos Pred Value : 0.84499         
         Neg Pred Value : 0.31579         
             Prevalence : 0.84021         
         Detection Rate : 0.81984         
   Detection Prevalence : 0.97023         
      Balanced Accuracy : 0.51729         
                                          
       'Positive' Class : 0

Sonucu bir veri çerçevesi olarak göstererek de sadeleştirebiliriz.

data.frame(Accuracy = cm$overall["Accuracy"],
           Sensitivity = cm$byClass["Sensitivity"],
           Specificity = cm$byClass["Specificity"])

image3.png

Python tutkunuysanız ve KNN sınıflandırmasının nasıl yapılacağını öğrenmek istiyorsanız, örneklerle KNN kavramlarını ve iş akışını anlamak için scikit-learn ile K-En Yakın Komşular (KNN) Sınıflandırması dersimizi okuyun.

KNN kullanmanın Avantajları ve Dezavantajları

Avantajlar

  1. Anlaşılması ve uygulanması basit bir algoritmadır.
  2. Çok yönlüdür; hem regresyon hem de sınıflandırma görevlerinde kullanılabilir.
  3. Tahmin edilen sınıf, eğitim verilerindeki en yakın komşuların etiketlerine dayandığından görselleştirilebilen ve anlaşılabilen yorumlanabilir sonuçlar sağlar.
  4. KNN, sınıflar arasındaki karar sınırı hakkında varsayımda bulunmaz; bu özellik, öznitelikler arasındaki doğrusal olmayan ilişkileri yakalamasına olanak tanır.
  5. Algoritma, verinin dağılımı hakkında varsayımda bulunmaz; bu da onu çok çeşitli problemler için uygun kılar.
  6. KNN bir model inşa etmez. Eğitim verisini saklar ve tahmin için kullanır.

Dezavantajlar

  1. Büyük ve karmaşık veri kümeleri için hesaplama ve bellek açısından pahalıdır.
  2. KNN’in dengesiz verideki performansı düşer. Çoğunluk sınıfına eğilim gösterir ve bu, azınlık sınıfları için zayıf performansla sonuçlanabilir.
  3. Gürültülü veriler için uygun değildir. Bir veri noktasının en yakın komşuları gerçek sınıf etiketini temsil etmeyebilir.
  4. Yüksek boyutlu veriler için uygun değildir; çünkü yüksek boyutlarda tüm veri noktaları arasındaki mesafeler benzer hale gelebilir.
  5. Optimal K komşu sayısını bulmak zaman alıcı olabilir.
  6. KNN aykırı değerlere duyarlıdır; çünkü komşuları bir uzaklık ölçütüne göre seçer.
  7. Eğitim veri setindeki eksik değerleri iyi yönetemez.

Sonuç

Bu derste, R ile K-En Yakın Komşular (KNN) sınıflandırmasının nasıl kullanılacağını öğrendik. KNN’in temel kavramını ve nasıl çalıştığını ele aldık. Ayrıca, gerçek bir veri kümesi üzerinde KNN sınıflandırma modellerini eğitmek ve değerlendirmek için class ve caret olmak üzere iki kütüphane hakkında bilgi edindik.

R ile diğer gözetimli makine öğrenimi algoritmalarını öğrenmek için R'da Gözetimli Öğrenme: Sınıflandırma kursunu alın. Naive Bayes, Lojistik Regresyon ve Sınıflandırma Ağaçlarını örnekler ve kod alıştırmalarıyla öğreneceksiniz.

R derslerinde veri işleme, veri setini bölme ve işleme, hiperparametre ayarlama, modelleri eğitme ve sonuçları değerlendirme adımları yer alır. Dengesiz bir veri seti nedeniyle azınlık sınıfında en kötü performansı elde ettik.

KNN algoritmasının mükemmel olmadığını, bazı dezavantajlarının da bulunduğunu ve onu birincil modeliniz olarak seçmeden önce birçok unsuru göz önünde bulundurmanız gerektiğini anlamanız gerekir.

Abid Ali Awan

Yazar

Abid Ali Awan

Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

Konular

İlgili