4. R ile KNN Uygulaması

Bu bölümde, R programlama dilini kullanarak K-En Yakın Komşu (k-NN) algoritmasını gerçek bir veri seti üzerinde adım adım uygulayacağız. Teorik bilgilerimizi pratiğe dökerek, veri hazırlığından model oluşturmaya ve performans değerlendirmeye kadar tüm süreci ele alacağız.

1. Örnek Veri Seti Seçimi ve Yüklemesi

Makine öğrenimi uygulamalarında sıkça kullanılan ve anlaşılması kolay olan Iris veri setini kullanacağız. Bu veri seti, botanikçi Edgar Anderson tarafından toplanmış, ünlü istatistikçi Ronald Fisher tarafından analiz edilerek literatüre kazandırılmıştır.

iris veri seti

iris veri seti, üç farklı iris çiçeği türünden (setosa, versicolor, virginica) her birinden 50’şer adet olmak üzere toplam 150 örnek içerir. Her örneğin dört sayısal özelliği (çanak yaprağı uzunluğu ve genişliği, taç yaprağı uzunluğu ve genişliği) ve bir hedef değişkeni (tür) bulunur.

data() ve str() fonksiyonları ile veri setini inceleme

Öncelikle iris veri setini R ortamına yükleyelim ve yapısını inceleyelim.

# iris veri setini yüklemeye gerek yok, R'da varsayılan olarak yüklüdür.
# Ancak bazen emin olmak için çağrılabilir.
data(iris)

# Veri setinin yapısını inceleyelim
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# İlk birkaç satırını görelim
head(iris)
# Veri setinin özet istatistiklerini görelim
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

str() çıktısından da görüldüğü üzere, veri setimiz 5 değişkene (4 sayısal özellik ve 1 faktör seviyeli Species yani tür) ve 150 gözleme sahiptir. Species değişkeni, tahmin etmeye çalışacağımız hedef değişkendir.

Veri setini görselleştirme (örneğin, plot() veya ggplot2 ile)

Veri setini görselleştirmek, özellikler arasındaki ilişkileri ve türler arasındaki ayrımı daha iyi anlamamıza yardımcı olur. Özellikle k-NN gibi mesafe tabanlı algoritmalarda bu, veri dağılımını gözlemlemek için önemlidir. ggplot2 paketi, estetik ve bilgilendirici görseller oluşturmak için harikadır.

# ggplot2 paketini yükleyelim (yüklü değilse install.packages("ggplot2") ile yükleyin)
library(ggplot2)

# Taç yaprağı uzunluğu ve genişliğine göre türleri görselleştirelim
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = Species)) +
  geom_point(size = 3, alpha = 0.7) +
  labs(
    title = "Iris Türleri: Taç Yaprağı Uzunluğu vs Genişliği",
    x = "Taç Yaprağı Uzunluğu (cm)",
    y = "Taç Yaprağı Genişliği (cm)",
    color = "Tür"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# Çanak yaprağı uzunluğu ve genişliğine göre görselleştirelim
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point(size = 3, alpha = 0.7) +
  labs(
    title = "Iris Türleri: Çanak Yaprağı Uzunluğu vs Genişliği",
    x = "Çanak Yaprağı Uzunluğu (cm)",
    y = "Çanak Yaprağı Genişliği (cm)",
    color = "Tür"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Görselleştirmelerden de anlaşılacağı üzere, setosa türü diğerlerinden belirgin şekilde ayrılırken, versicolor ve virginica türleri arasında bir miktar örtüşme bulunmaktadır. Bu, sınıflandırma modelimizin bu iki türü ayırmakta biraz daha zorlanabileceğine işaret edebilir.

2. Veri Hazırlığı

Makine öğrenimi modellerini uygulamadan önce veri setini doğru şekilde hazırlamak çok önemlidir. Bu adımlar, modelin daha iyi öğrenmesini ve daha doğru tahminler yapmasını sağlar.

Hedef değişkeni (Species) faktöre dönüştürme**

iris$Species zaten bir faktör değişkenidir, ancak bazı veri setlerinde hedef değişken sayısal veya karakter olarak gelebilir. k-NN sınıflandırması için hedef değişkenin faktör olduğundan emin olmak önemlidir.

# Zaten faktör olduğunu kontrol edelim
is.factor(iris$Species)
## [1] TRUE
# Eğer değilse, aşağıdaki gibi dönüştürülebilirdi:
# iris$Species <- as.factor(iris$Species)

Eğitim ve Test Setlerinin Oluşturulması (sample() fonksiyonu)

Modelimizin genellenebilirlik yeteneğini değerlendirmek için veri setini eğitim ve test olmak üzere ikiye ayırmamız gerekir. Eğitim seti modeli “öğretmek” için kullanılırken, test seti modelin daha önce görmediği veriler üzerindeki performansını ölçmek için kullanılır. Genellikle %70 eğitim, %30 test oranı tercih edilir.

# Tekrar üretilebilir sonuçlar için set.seed kullanalım
set.seed(123)

# Veri setinin satır sayılarını alalım
n <- nrow(iris)

# Eğitim seti için %70'lik indeksleri rastgele seçelim
train_index <- sample(1:n, size = round(0.7 * n))

# Eğitim ve test setlerini oluşturalım
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]

# Setlerin boyutlarını kontrol edelim
cat("Eğitim seti boyutu:", nrow(train_data), "\n")
## Eğitim seti boyutu: 105
cat("Test seti boyutu:", nrow(test_data), "\n")
## Test seti boyutu: 45

Veri Ölçeklendirme Uygulaması (manuel olarak veya scale() fonksiyonu)

k-NN algoritması mesafe tabanlı olduğu için, özelliklerin farklı ölçeklerde olması durumunda büyük ölçekli özellikler mesafeyi domine edebilir. Bu durumu önlemek için veri ölçeklendirme (feature scaling) yapılması şarttır. scale() fonksiyonu, verileri standartlaştırmak (ortalama 0, standart sapma 1) için harika bir araçtır.

Önemli: Ölçeklendirme parametreleri (ortalama ve standart sapma) yalnızca eğitim seti üzerinden hesaplanmalı ve hem eğitim hem de test setine bu parametrelerle uygulanmalıdır. Test setini de eğitim setiyle aynı şekilde dönüştürmek, veri sızıntısını (data leakage) önler.

# Yalnızca sayısal özellikleri ölçeklendireceğiz.
# Hedef değişken (Species) hariç diğer sütunları seçelim.
train_features <- train_data[, 1:4]
test_features <- test_data[, 1:4]

# Eğitim seti üzerinde standartlaştırma (ortalama 0, sd 1) yapalım.
# center = TRUE (ortalama çıkarma), scale = TRUE (standart sapmaya bölme)
scaled_train_features <- scale(train_features, center = TRUE, scale = TRUE)

# Eğitim setinden hesaplanan ortalama ve standart sapma değerlerini kaydedelim
mean_vals <- attr(scaled_train_features, "scaled:center")
sd_vals <- attr(scaled_train_features, "scaled:scale")

# Test setini, eğitim setinden hesaplanan ortalama ve standart sapma ile ölçeklendirelim
scaled_test_features <- scale(test_features, center = mean_vals, scale = sd_vals)

# Ölçeklendirilmiş verilerin ilk birkaç satırını görelim
head(scaled_train_features)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width
## 14   -1.76664631  -0.1186139   -1.4793538  -1.4471163
## 50   -0.96560680   0.5607204   -1.3126884  -1.3157877
## 118   2.12411700   1.6929443    1.6317336   1.3107847
## 43   -1.65221209   0.3342756   -1.3682435  -1.3157877
## 150   0.06430113  -0.1186139    0.7428515   0.7854702
## 148   0.75090642  -0.1186139    0.7984066   1.0481275
head(scaled_test_features)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1    -0.8511726   1.0136099    -1.312688   -1.315788
## 2    -1.0800410  -0.1186139    -1.312688   -1.315788
## 3    -1.3089094   0.3342756    -1.368244   -1.315788
## 5    -0.9656068   1.2400547    -1.312688   -1.315788
## 11   -0.5078699   1.4664995    -1.257133   -1.315788
## 18   -0.8511726   1.0136099    -1.312688   -1.184459
# Hedef değişkenleri (Species) ayrı değişkenlerde tutalım
train_labels <- train_data$Species
test_labels <- test_data$Species

Dostlar, Artık veri setimiz k-NN algoritmasına uygulamak için hazır!

3. class Paketi ile KNN Uygulaması

R’da k-NN algoritmasını uygulamak için en yaygın kullanılan paketlerden biri class paketidir. Bu paketin içindeki knn() fonksiyonu, k-NN sınıflandırmasını kolayca yapmamızı sağlar.

knn() fonksiyonunun tanıtımı ve parametreleri

knn() fonksiyonunun temel yapısı ve parametreleri şunlardır:

knn(train, test, cl, k)

-train: Eğitim setinin özellik matrisi (ölçeklendirilmiş hali).

-test: Test setinin özellik matrisi (ölçeklendirilmiş hali).

-cl: Eğitim setindeki gözlemlerin gerçek sınıf etiketleri (faktör vektörü).

-k: Dikkate alınacak en yakın komşu sayısı.

Temel bir KNN modelinin oluşturulması

Şimdi, ölçeklendirilmiş veri setimiz ve seçtiğimiz bir k değeri ile ilk k-NN modelimizi oluşturalım. k için başlangıçta basit bir değer olan 3’ü seçelim.

# class paketini yükleyelim (yüklü değilse install.packages("class") ile yükleyin)
library(class)

# k-NN modelini oluşturalım (burada sadece tahmin yapılıyor)
k_value <- 3
knn_predictions <- knn(train = scaled_train_features,
                       test = scaled_test_features,
                       cl = train_labels,
                       k = k_value)

# Tahminlerin ilk birkaçını görelim
head(knn_predictions)
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica

knn_predictions değişkeni, test setindeki her bir gözlem için modelimizin tahmin ettiği sınıf etiketlerini içermektedir.

4. Model Performansının Değerlendirilmesi

Modelimizin ne kadar iyi performans gösterdiğini anlamak için tahminlerimizi gerçek etiketlerle karşılaştırmamız gerekir. Bunun için Karmaşıklık Matrisi (Confusion Matrix) ve ondan türetilen çeşitli metrikler kullanılır.

Karmaşıklık Matrisi (Confusion Matrix) nedir ve nasıl yorumlanır?

Karmaşıklık Matrisi, bir sınıflandırma modelinin performansını özetleyen bir tablodur. Gerçek sınıfları (satırlar) ile modelin tahmin ettiği sınıfları (sütunlar) karşılaştırır. Özellikle ikili sınıflandırma (binary classification) problemleri için dört temel kavram üzerine kuruludur:

  • Doğru Pozitif (True Positive - TP): Modelin pozitif olarak tahmin ettiği ve gerçekte de pozitif olan durumlar. (Örn: Hasta olan kişiyi doğru bir şekilde hasta olarak tahmin etmek.)
  • Doğru Negatif (True Negative - TN): Modelin negatif olarak tahmin ettiği ve gerçekte de negatif olan durumlar. (Örn: Sağlıklı olan kişiyi doğru bir şekilde sağlıklı olarak tahmin etmek.)
  • Yanlış Pozitif (False Positive - FP): Modelin pozitif olarak tahmin ettiği ancak gerçekte negatif olan durumlar (Tip I Hata). (Örn: Sağlıklı kişiyi hasta olarak tahmin etmek - “Alarm yanlış çaldı”.)
  • Yanlış Negatif (False Negative - FN): Modelin negatif olarak tahmin ettiği ancak gerçekte pozitif olan durumlar (Tip II Hata). (Örn: Hasta kişiyi sağlıklı olarak tahmin etmek - “Teşhis konulamadı”.)

Çok sınıflı sınıflandırmada, bu kavramlar her sınıf için “bir-e-karşı-diğerleri” (one-vs-rest) yaklaşımıyla genişletilir.

caret paketi (confusionMatrix() fonksiyonu) veya manuel hesaplama

caret paketi, makine öğrenimi modellerinin eğitilmesi ve değerlendirilmesi için kapsamlı araçlar sunar. confusionMatrix() fonksiyonu, karmaşıklık matrisini ve birçok performans metriklerini kolayca hesaplamamızı sağlar.

# caret paketini yükleyelim (yüklü değilse install.packages("caret") ile yükleyin)
library(caret)
## Loading required package: lattice
# Karmaşıklık Matrisini oluşturalım
conf_matrix <- confusionMatrix(data = knn_predictions, reference = test_labels)

# Matrisi yazdıralım
print(conf_matrix)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         14          0         0
##   versicolor      0         17         1
##   virginica       0          1        12
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9556          
##                  95% CI : (0.8485, 0.9946)
##     No Information Rate : 0.4             
##     P-Value [Acc > NIR] : 2.842e-15       
##                                           
##                   Kappa : 0.9326          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9444           0.9231
## Specificity                 1.0000            0.9630           0.9688
## Pos Pred Value              1.0000            0.9444           0.9231
## Neg Pred Value              1.0000            0.9630           0.9688
## Prevalence                  0.3111            0.4000           0.2889
## Detection Rate              0.3111            0.3778           0.2667
## Detection Prevalence        0.3111            0.4000           0.2889
## Balanced Accuracy           1.0000            0.9537           0.9459

Temel Sınıflandırma Metriklerinin Detaylı İncelenmesi

confusionMatrix() çıktısı, modelimizin genel doğruluğunu (Accuracy) ve her sınıf için spesifik metrikleri (Precision, Recall / Sensitivity, F1-Score, vb.) içerir. Bu metrikleri daha yakından inceleyelim:

1. Doğruluk (Accuracy)

Tanım: Modelin yaptığı tüm doğru tahminlerin (hem pozitif hem negatif) toplam tahmin sayısına oranıdır. Genellikle ilk bakılan metrik olsa da, sınıf dengesizliği olan veri setlerinde yanıltıcı olabilir.

Formül: \[ \text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}} \] Yorum: %95 Doğruluk, modelin gözlemlerin %95’ini doğru sınıflandırdığı anlamına gelir. Eğer bir sınıftan çok az örnek varsa, model o sınıfı yanlış tahmin etse bile genel doğruluk yüksek görünebilir.

2. Hassasiyet (Precision)

Tanım: Modelin pozitif olarak tahmin ettiği durumlar arasında, gerçekten pozitif olanların oranıdır. Yanlış pozitifleri minimize etmek istediğimiz durumlarda önemlidir.

Formül: \[ \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} \] Yorum: Yüksek hassasiyet, modelin “pozitif” dediğinde yanılma olasılığının düşük olduğunu gösterir. Örneğin, spam e-posta tespitinde yüksek hassasiyet önemlidir; çünkü meşru bir e-postayı (gerçek negatif) yanlışlıkla spam (yanlış pozitif) olarak işaretlemek istenmez.

3. Duyarlılık (Recall / Sensitivity)

Tanım: Gerçekte pozitif olan tüm durumlar arasında, modelin doğru bir şekilde pozitif olarak tahmin ettiği durumların oranıdır. Yanlış negatifleri minimize etmek istediğimiz durumlarda önemlidir.

Formül: \[ \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} \] Yorum: Yüksek duyarlılık, modelin gerçek pozitifleri kaçırma olasılığının düşük olduğunu gösterir. Örneğin, bir hastalık teşhisinde yüksek duyarlılık önemlidir; çünkü hasta bir kişiyi (gerçek pozitif) yanlışlıkla sağlıklı (yanlış negatif) olarak sınıflandırmak istenmez.

4. F1-Skor (F1-Score)

Tanım: Hassasiyet ve Duyarlılık’ın harmonik ortalamasıdır. Hem hassasiyetin hem de duyarlılığın önemli olduğu durumlarda dengeli bir metrik sunar. Özellikle sınıf dengesizliği olan veri setlerinde doğruluktan daha iyi bir gösterge olabilir.

Formül: \[ \text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \] Yorum: F1-Skor, 0 (en kötü) ile 1 (en iyi) arasında değişir. Modelin hem yanlış pozitifleri hem de yanlış negatifleri iyi bir dengeyle yönettiğini gösterir.

5. Özgüllük (Specificity)

Tanım: Gerçekte negatif olan tüm durumlar arasında, modelin doğru bir şekilde negatif olarak tahmin ettiği durumların oranıdır. Duyarlılığın (Recall) tamamlayıcısıdır.

Formül: \[ \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} \] Yorum: Yüksek özgüllük, modelin gerçek negatifleri doğru bir şekilde tanımlama yeteneğinin iyi olduğunu gösterir.

6. Kappa İstatistiği (Kappa Statistic)

Tanım: Modelin sınıflandırma performansının, rastgele bir sınıflandırıcının performansına kıyasla ne kadar iyi olduğunu ölçen bir metriktir. Rastgele şans faktörünü hesaba katar.

Yorum: Kappa değeri -1 ile 1 arasında değişir.

-1: Mükemmel uyum.

-0: Şans eseri uyum.

-< 0: Şanstan daha kötü uyum.

Genellikle 0.60’ın üzerindeki değerler iyi bir uyum olarak kabul edilir. Sınıf dengesizliği olan veri setlerinde Doğruluk’tan daha güvenilir bir ölçüttür.

conf_matrix Çıktısının Yorumu:

Bu tablo, modelimizin test setindeki her bir gözlemi nasıl sınıflandırdığını gösterir.

  • Satırlar (Prediction): Modelimizin yaptığı tahminler.

  • Sütunlar (Reference): Gözlemlerin gerçek sınıfları.

Yorumlar:

  • setosa için:

    • Gerçekte setosa olan 14 örneği doğru bir şekilde setosa olarak tahmin etmiş (TP = 14).

    • Hiçbir versicolor veya virginica örneğini yanlışlıkla setosa olarak tahmin etmemiş (FP = 0). Bu mükemmel bir durumdur.

  • versicolor için:

    • Gerçekte versicolor olan 17 örneği doğru bir şekilde versicolor olarak tahmin etmiş (TP = 17).

    • Gerçekte virginica olan 1 örneği yanlışlıkla versicolor olarak tahmin etmiş (FP = 1, virginica sınıfı için).

    • Gerçekte setosa olan hiçbir örneği yanlışlıkla versicolor olarak tahmin etmemiş (FP = 0, setosa sınıfı için).

  • virginica için:

    • Gerçekte virginica olan 12 örneği doğru bir şekilde virginica olarak tahmin etmiş (TP = 12).

    • Gerçekte versicolor olan 1 örneği yanlışlıkla virginica olarak tahmin etmiş (FP = 1, versicolor sınıfı için).

    • Gerçekte setosa olan hiçbir örneği yanlışlıkla virginica olarak tahmin etmemiş (FP = 0, setosa sınıfı için).

Özetle: Modelimiz setosa türünü %100 doğrulukla sınıflandırmış. Ancak versicolor ve virginica türleri arasında bir miktar karışıklık yaşamış (bir virginica’yı versicolor olarak, bir versicolor’u da virginica olarak tahmin etmiş). Bu, görselleştirmede gördüğümüz örtüşen bölgelerle de tutarlıdır.

5. k Değerinin Optimizasyonu

Daha önceki teorik kısımda bahsettiğimiz gibi, k değeri k-NN modelinin performansı üzerinde büyük bir etkiye sahiptir. Optimal k değerini bulmak, modelimizin genellenebilirlik yeteneğini artırmak için kritik öneme sahiptir.

Farklı k değerleri için modelin tekrar çalıştırılması

Farklı k değerlerini deneyerek en iyi performansı veren k değerini bulabiliriz. Örneğin, k=1’den başlayıp belirli bir sayıya kadar (örn. 20-30) tek sayı k değerlerini test edebiliriz.

# Farklı k değerlerini depolamak için bir vektör oluşturalım
k_values <- 1:20
accuracies <- numeric(length(k_values))

# Her bir k değeri için modeli çalıştıralım ve doğruluğu kaydedelim
for (i in seq_along(k_values)) {
  k_val <- k_values[i]
  knn_pred_temp <- knn(train = scaled_train_features,
                       test = scaled_test_features,
                       cl = train_labels,
                       k = k_val)
  conf_matrix_temp <- confusionMatrix(data = knn_pred_temp, reference = test_labels)
  accuracies[i] <- conf_matrix_temp$overall['Accuracy']
}

# Sonuçları bir data frame'e dönüştürelim
accuracy_df <- data.frame(k = k_values, Accuracy = accuracies)
print(accuracy_df)
##     k  Accuracy
## 1   1 0.9333333
## 2   2 0.9555556
## 3   3 0.9555556
## 4   4 0.9777778
## 5   5 0.9777778
## 6   6 0.9777778
## 7   7 0.9777778
## 8   8 0.9777778
## 9   9 0.9777778
## 10 10 0.9777778
## 11 11 0.9777778
## 12 12 0.9777778
## 13 13 0.9777778
## 14 14 0.9777778
## 15 15 0.9777778
## 16 16 0.9777778
## 17 17 0.9777778
## 18 18 0.9777778
## 19 19 0.9777778
## 20 20 0.9555556

Elde edilen doğruluk değerlerinin görselleştirilmesi

Elde ettiğimiz doğruluk değerlerini görselleştirmek, k değeri arttıkça performansın nasıl değiştiğini anlamamızı sağlar. Genellikle, belirli bir k değerine kadar doğruluk artar, sonra plato çizebilir veya düşmeye başlayabilir.

ggplot(accuracy_df, aes(x = k, y = Accuracy)) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color = "red", size = 2) +
  labs(
    title = "Farklı k Değerleri İçin KNN Doğruluğu",
    x = "k Değeri",
    y = "Doğruluk (Accuracy)"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  scale_x_continuous(breaks = k_values) # Tüm k değerlerini eksende gösterelim
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Görselden, hangi k değerlerinin daha iyi performans gösterdiğini ve en yüksek doğruluğa hangi k değerinde ulaşıldığını görebiliriz.

Farklı k Değerleri İçin KNN Doğruluğu Grafiğinin Yorumlanması

Yukarıdaki grafik, k-NN modelimizin test seti üzerindeki doğruluk performansının, k değeri değiştikçe nasıl bir eğilim gösterdiğini net bir şekilde ortaya koymaktadır. Bu görsel, optimal k değerini seçmek için bize önemli ipuçları sunar.

Grafik Üzerindeki Gözlemler ve Yorumları:

  1. Başlangıç Düşüşü (k=1’den k=2’ye):
    • k=1 iken modelin doğruluğu yaklaşık %93.3 civarındadır.
    • k=2 olduğunda doğrulukta hafif bir artışla %95.5 civarına yükselmiştir. Bu, tek bir komşuya güvenmek yerine iki komşunun oyuna bakmanın daha sağlam bir tahmin sağladığını gösterir.
  2. Keskin Artış ve Kararlılık (k=2’den k=4’e ve sonrası):
    • k=3 değerinde doğrulukta bir miktar daha artış gözlemlenirken, asıl büyük sıçrama k=4 değerinde yaşanmıştır. Modelin doğruluğu bu noktada keskin bir şekilde %97.7 civarına yükselmiştir.
    • k=4’ten k=19’a kadar modelin doğruluğu sabit kalmıştır. Bu uzun plato, modelin bu aralıktaki k değerleri için oldukça kararlı ve yüksek bir performans sergilediğini gösterir. Bu aralıkta seçilen herhangi bir k değeri, test seti üzerinde benzer derecede iyi bir doğruluk sağlayacaktır. Bu durum, modelin gürültüye karşı dayanıklılığının arttığını ve genellenebilir bir yapıya ulaştığını gösterir.
  3. Performansta Düşüş (k=19’dan k=20’ye):
    • k=19’dan sonra, k=20’de modelin doğruluğunda belirgin bir düşüş gözlemlenmiştir. Doğruluk yaklaşık %95.5’e geri dönmüştür. Bu düşüş, çok fazla komşu dahil etmenin yerel desenleri ve ayrımları bulanıklaştırmaya başladığını, yani modelin yetersiz öğrenmeye (underfitting) doğru eğilim gösterdiğini işaret eder. Çok fazla komşu, kararı daha genel bir hale getirir ve küçük ama önemli farkları gözden kaçırabilir.

Optimal k Değeri Seçimi:

Bu grafiğe göre, modelimiz için en uygun k değeri aralığı k=4 ile k=19 arasındadır. Bu aralıktaki tüm k değerleri en yüksek doğruluğu (%97.7 civarı) sağlamaktadır.

  • Genellikle, birden fazla k değeri aynı en yüksek doğruluğu verdiğinde, daha küçük olan k değerleri tercih edilebilir. Daha küçük k değerleri modelin hesaplama yükünü azaltır ve daha az komşu ile benzer performans elde edildiği için daha “basit” bir model sunar. Ayrıca, k değerinin artmasıyla birlikte modelin genellenebilirliğinin aşırıya kaçma riskini de (underfitting) azaltır.
  • Bu durumda, k=4 veya k=5 gibi bir değer seçmek mantıklı olacaktır. Tek sayılar genellikle beraberlik durumlarını önlemek için tercih edildiğinden, k=5 iyi bir başlangıç noktası olabilir. (Ancak bu grafikte k=4 de aynı performansı göstermiştir).

Genel Sonuç:

Bu grafik, k değerinin k-NN algoritmasında ne denli kritik bir hiperparametre olduğunu açıkça göstermektedir. Doğru k değerini seçmek, modelin aşırı öğrenme (küçük k) veya yetersiz öğrenme (büyük k) tuzaklarından kaçınmasını ve test verileri üzerinde en iyi genelleştirme performansını sergilemesini sağlar.

Çapraz doğrulama(Cross-Validation) ile optimal k değerini bulma (caret paketi ile detaylı)

Yukarıdaki yöntem basit bir test seti üzerinde k değerlerini denemektir. Daha sağlam bir yaklaşım ise çapraz doğrulama (cross-validation) kullanmaktır. caret paketi, bu süreci otomatikleştirmek için güçlü araçlar sunar.

caret paketi içindeki train() fonksiyonu, çapraz doğrulama ile çeşitli modelleri eğitmek ve hiperparametreleri ayarlamak için kullanılır.

# trainControl fonksiyonu ile çapraz doğrulama yöntemini ayarlayalım
# method = "cv" (cross-validation), number = 10 (10 katmanlı çapraz doğrulama)
tr_control <- trainControl(method = "cv", number = 10)

# k değerlerinin deneneceği aralığı belirleyelim
# k-NN için "k" parametresi, tuneGrid ile belirtilir
tune_grid <- expand.grid(k = seq(1, 25, by = 2)) # 1'den 25'e kadar tek sayıları deneyelim

# train fonksiyonu ile k-NN modelini çapraz doğrulama ile eğitelim
# "knn" metodu, class paketi içindeki knn fonksiyonunu kullanır
knn_model_cv <- train(x = scaled_train_features, # Özellikler
                      y = train_labels,           # Hedef değişken
                      method = "knn",             # Model metodu
                      trControl = tr_control,     # Çapraz doğrulama ayarları
                      tuneGrid = tune_grid,       # Denenecek k değerleri
                      preProcess = c("center", "scale") # Ön işleme (zaten yaptık ama burada da belirtilebilir)
                      )

# En iyi k değerini ve model sonuçlarını görelim
print(knn_model_cv)
## k-Nearest Neighbors 
## 
## 105 samples
##   4 predictor
##   3 classes: 'setosa', 'versicolor', 'virginica' 
## 
## Pre-processing: centered (4), scaled (4) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 94, 94, 94, 95, 96, 95, ... 
## Resampling results across tuning parameters:
## 
##   k   Accuracy   Kappa    
##    1  0.9507071  0.9256367
##    3  0.9597980  0.9392170
##    5  0.9416162  0.9120565
##    7  0.9225253  0.8829852
##    9  0.9236364  0.8847222
##   11  0.9527273  0.9287231
##   13  0.9316162  0.8966718
##   15  0.9216162  0.8808065
##   17  0.9307071  0.8943867
##   19  0.9518182  0.9269188
##   21  0.9518182  0.9269188
##   23  0.9518182  0.9269188
##   25  0.9307071  0.8951006
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 3.
# En iyi k değeri
best_k <- knn_model_cv$bestTune$k
cat("\nOptimal k değeri (Çapraz Doğrulama ile):", best_k, "\n")
## 
## Optimal k değeri (Çapraz Doğrulama ile): 3
# Modelin çapraz doğrulama sonuçlarını görselleştirelim
plot(knn_model_cv)

Çapraz Doğrulama ile Optimal k Değeri Bulma Grafiğinin Yorumlanması

Bu grafik, caret paketi kullanılarak 10 katmanlı çapraz doğrulama ile farklı k değerleri (#Neighbors) için k-NN modelinin elde ettiği ortalama doğruluk (Accuracy (Cross-Validation)) değerlerini göstermektedir. Bu yöntem, modelin farklı veri alt kümelerinde nasıl performans gösterdiğini değerlendirerek daha sağlam bir k değeri seçmemizi sağlar.

Grafik Üzerindeki Gözlemler ve Yorumları:

  1. İlk k Değerlerindeki Dalgalanma:
    • Grafiğe göre, k=1 ile başlayan k değerlerinde doğrulukta belirgin bir dalgalanma gözlemlenmektedir. Özellikle k=1 ve k=3’te yüksek doğruluk (yaklaşık %95 - %96) görülürken, k=7 civarında doğruluk düşüş yaşayarak en düşük seviyelerden birine inmiştir (yaklaşık %92.2).
    • Bu dalgalanma, küçük k değerlerinin veri setindeki yerel gürültüye ve aykırı değerlere daha duyarlı olabileceğini göstermektedir. k değerinin artmasıyla birlikte modelin genelleme yeteneği artarken, çok küçük k değerlerinde rastgele varyasyonların etkisi daha belirgin olabilir.
  2. Maksimum Doğruluk Noktaları:
    • Grafikte iki ana pik noktası görülmektedir. İlk yüksek doğruluk k=3 civarında (yaklaşık %96) ve ikinci yüksek doğruluk k=11 civarında (yaklaşık %95.2) gözlemlenmektedir. Ayrıca k=19 ve k=21 değerlerinde de benzer şekilde yüksek doğruluk (%95.2 civarı) elde edilmiştir.
    • Bu durum, modelin performansının belirli k değerlerinde zirve yaptığını, ancak bu zirvelerin arasında düşüşler yaşandığını gösterir.
  3. Performans Düşüşleri:
    • k=3’ten sonra k=7’ye kadar keskin bir düşüş yaşanmıştır. Bu, modelin çok az komşu sayısından daha fazla komşu sayısına geçişte, belki de bazı önemli yerel ayrımları gözden kaçırdığını düşündürebilir.
    • k=11’deki zirveden sonra k=15’e doğru tekrar bir düşüş yaşanmıştır.
    • k=21’den sonra k=25’e doğru yine bir düşüş trendi başlamıştır. Bu düşüşler, çok sayıda komşu dikkate alındığında modelin yetersiz öğrenmeye (underfitting) eğilim gösterdiğini, yani yerel desenleri ve ayrımları yeterince yakalayamadığını işaret eder.

Optimal k Değeri Seçimi:

Bu çapraz doğrulama sonuçlarına göre, modelin en yüksek ortalama doğruluğu k=3 değerinde yaklaşık %96 olarak elde edilmiştir. k=19 ve k=21 değerleri de benzer şekilde iyi performans göstermiş olsa da, genellikle daha basit (daha küçük k’lı) modeller tercih edildiği için k=3 en iyi seçenek olarak düşünülebilir. Eğer daha büyük bir k değeri tercih edilecekse ve performans düşüşü kabul edilebilir bir düzeyde ise, k=11 veya k=19-21 arasındaki değerler de değerlendirilebilir.

  • Çapraz doğrulama, tek bir test setine aşırı uyumu (overfitting) önleyerek k değeri seçimimizde daha güvenilir bir rehberlik sunar. Bu grafik, k değerinin model performansını nasıl hassas bir şekilde etkilediğini ve doğru k seçiminin modelin genellenebilirlik yeteneği için ne kadar kritik olduğunu göstermektedir.

Son Söz:

caret::train() fonksiyonu, farklı k değerleri için çapraz doğrulama yaparak en iyi k değerini bulur ve bu k değeri ile nihai modeli oluşturur. plot(knn_model_cv) ile doğruluk değerlerinin k’ya göre nasıl değiştiğini görselleştirebiliriz. Bu, daha önce manuel olarak yaptığımız görselleştirmeye benzer ancak çapraz doğrulamanın ortalama sonuçlarını gösterir, bu da daha güvenilir bir optimal k seçimi sunar.

5. Gelişmiş Konular ve Tartışma

Şimdiye kadar k-NN algoritmasının temel prensiplerini, R ile uygulamasını ve performans değerlendirmesini detaylıca ele aldık. Bu bölümde ise, algoritmanın daha gelişmiş yönlerine değinecek, karşılaştığı zorlukları ve gerçek dünyadaki uygulama alanlarını tartışacağız.

1. Regresyon için KNN (kNN-R)

k-NN algoritması, sadece sınıflandırma problemleri için değil, aynı zamanda regresyon problemleri için de kullanılabilir. Temel fark, yeni bir gözlemin değerini belirlerken “çoğunluk oyu” yerine “ortalama alma” yöntemini kullanmasıdır.

Çoğunluk oyu yerine ortalama alma

  • Sınıflandırmada (kNN-C): Yeni bir sorgu noktası için, en yakın k komşunun etiketlerine bakılır ve bu etiketler arasında en sık görüleni (yani çoğunluk oyu) sorgu noktasının tahmini sınıfı olarak atanır.

  • Regresyonda (kNN-R): Yeni bir sorgu noktası için, en yakın k komşunun hedef değişken değerleri alınır ve bu değerlerin ortalaması (veya medyanı) sorgu noktasının tahmini değeri olarak belirlenir.

Formül (Ortalama Alma):

Eğer \(y_1, y_2, ..., y_k\) seçilen \(k\) komşunun hedef değişken değerleri ise, tahmini \(\hat{y}\) değeri: \[ \hat{y} = \frac{1}{k} \sum_{i=1}^{k} y_i \] Regresyon için k-NN’de de mesafe metrikleri ve özellik ölçeklendirme aynı derecede önemlidir. k değeri seçimi de performans üzerinde kritik bir etkiye sahiptir; küçük k overfitting’e, büyük k ise underfitting’e yol açabilir.

Kısa bir R örneği

R’da regresyon için k-NN uygulaması genellikle FNN paketi gibi özel paketlerle yapılır. knn.reg() fonksiyonu bu amaçla kullanılabilir. Basit bir sentetik veri seti üzerinden örnek verelim:

# FNN paketini yükleyelim (yüklü değilse install.packages("FNN") ile yükleyin)
library(FNN)

# Sentetik veri seti oluşturalım
set.seed(42)
x_train <- runif(100, 0, 10) # 100 rastgele özellik
y_train <- sin(x_train) + rnorm(100, mean = 0, sd = 0.5) # Hedef değişken + gürültü

x_test <- runif(20, 0, 10) # 20 test özelliği
y_test <- sin(x_test) + rnorm(20, mean = 0, sd = 0.5) # Gerçek test hedef değişkeni

# Verileri ölçeklendirme (regresyonda da önemlidir)
# Sadece x değerlerini ölçeklendirelim, y değerleri tahmin edilecek
scaled_x_train <- scale(x_train)
scaled_x_test <- scale(x_test, center = attr(scaled_x_train, "scaled:center"), 
                       scale = attr(scaled_x_train, "scaled:scale"))

# knn.reg fonksiyonu ile regresyon uygulayalım
# k=5 olarak seçelim
k_value_reg <- 5
knn_reg_predictions <- knn.reg(train = scaled_x_train,
                               test = scaled_x_test,
                               y = y_train, # Eğitim setinin hedef değişkeni
                               k = k_value_reg)

# Tahminleri ve gerçek değerleri karşılaştıralım
head(data.frame(Gercek = y_test, Tahmin = knn_reg_predictions$pred))
# Model performansını değerlendirelim (Örn. RMSE)
rmse <- sqrt(mean((y_test - knn_reg_predictions$pred)^2))
cat("Regresyon k-NN için RMSE:", round(rmse, 3), "\n")
## Regresyon k-NN için RMSE: 0.471
# Görselleştirme
plot(x_train, y_train, main = "k-NN Regresyon Örneği",
     xlab = "Özellik (X)", ylab = "Hedef (Y)", col = "blue", pch = 16)
points(x_test, y_test, col = "red", pch = 17, cex = 1.2) # Gerçek test noktaları
points(x_test, knn_reg_predictions$pred, col = "green", pch = 4, cex = 1.2, lwd = 2) # k-NN tahminleri
legend("topright", legend = c("Eğitim Verisi", "Gerçek Test Değeri", "k-NN Tahmini"),
       col = c("blue", "red", "green"), pch = c(16, 17, 4), lwd = c(NA, NA, 2))

k-NN Regresyon Örneği Sonuçları ve Grafiğinin Yorumlanması

Yukarıdaki k-NN regresyon uygulamamızda, sentetik olarak oluşturulmuş bir veri seti üzerinde k=5 değeriyle bir k-NN regresyon modeli oluşturduk. Elde ettiğimiz tahmin tablosu ve özellikle grafik, modelin davranışını görsel olarak anlamamızı sağlıyor.

1. Tahmin Tablosunun Yorumlanması:

Bu tablo, test setimizdeki ilk 6 gözlem için gerçek Y değerlerini (Gercek) ve modelimizin bu gözlemler için yaptığı tahminleri (Tahmin) göstermektedir.

  • Yakınlık: Gördüğümüz kadarıyla, tahminler genellikle gerçek değerlere yakın seyretmektedir. Örneğin, ilk gözlemde gerçek değer -1.079 iken tahmin -1.037’dir, bu oldukça iyi bir eşleşmedir.
  • Sapmalar: Bazı durumlarda ise (örneğin 3. ve 5. gözlem), tahmin ile gerçek değer arasında daha belirgin sapmalar bulunmaktadır. Gerçek 0.649 iken tahmin 0.278, veya gerçek 0.892 iken tahmin 0.237 gibi. Bu sapmalar, modelin tüm noktaları mükemmel bir şekilde tahmin edemediğini, ancak genel eğilimi yakalamaya çalıştığını gösterir.
  • RMSE Değeri: Model performansını özetleyen RMSE (Root Mean Squared Error) değeri 0.471 olarak hesaplanmıştır. RMSE, tahmin hatalarının karelerinin ortalamasının kareköküdür ve regresyon modellerinde yaygın bir hata ölçütüdür. Daha düşük RMSE değerleri daha iyi model performansını gösterir. Bu örnek için 0.471, sentetik veri setimizin gürültü seviyesi (standart sapması 0.5) göz önüne alındığında kabul edilebilir bir hata oranıdır.

2. k-NN Regresyon Grafiğinin Yorumlanması:

Bu grafik, k-NN regresyon modelimizin nasıl çalıştığını görsel olarak anlamamız için kilit noktadır:

-Mavi Noktalar (.): Eğitim Verisi: Modelimizin öğrendiği ana veri setini temsil eder. Bu noktalar, sin(x) fonksiyonunun etrafında bir miktar gürültü ile dağılmış bir eğriyi takip etmektedir.

-Kırmızı Üçgenler (^): Gerçek Test Değeri: Modelin tahmin yapacağı test setindeki gözlemlerin gerçek Y değerleridir. Bu noktalar, eğitim verisinin genel eğilimine uygun olarak dağılmıştır.

-Yeşil Çarpılar (x): k-NN Tahmini: Modelimizin test setindeki her bir kırmızı üçgen için yaptığı Y tahminleridir. Bu noktalar, modelin test verilerini nasıl “yakaladığını” gösterir.

Grafik Üzerindeki Gözlemler:

-Genel Eğilimi Yakalama: Modelin yeşil çarpıları (tahminler), mavi eğitim noktalarının oluşturduğu sinüs dalgası şeklindeki genel eğilimi oldukça iyi bir şekilde takip etmektedir. Bu, k-NN regresyonun veri setindeki doğrusal olmayan ilişkileri başarılı bir şekilde yakalayabildiğini gösterir.

-Yumuşatma Etkisi (Smoothing Effect): k-NN regresyon, k komşunun ortalamasını aldığı için, tek tek veri noktalarındaki aşırı iniş çıkışları yumuşatma eğilimindedir. Yeşil tahmin noktaları, kırmızı gerçek test noktalarına göre daha pürüzsüz bir eğri oluşturur. Bu, modelin gürültüye karşı bir miktar dayanıklılık kazandığını gösterir.

-Kırmızı Üçgenler ile Yeşil Çarpılar Arasındaki Fark: Bazı kırmızı üçgenler (gerçek değerler), kendilerine karşılık gelen yeşil çarpıların (tahminler) üzerinde veya altında yer almaktadır. Bu farklar, modelin tahmin hatalarını temsil eder. Özellikle eğrinin dönüm noktalarında veya veri yoğunluğunun az olduğu bölgelerde bu sapmalar daha belirgin olabilir.

-Veri Yoğunluğu ve Tahmin Gücü: Eğitim verilerinin (mavi noktalar) yoğun olduğu bölgelerde, modelin tahminleri (yeşil çarpılar) gerçek değerlere (kırmızı üçgenler) daha yakın olma eğilimindedir. Verinin daha seyrek olduğu veya eğrinin daha hızlı değiştiği yerlerde tahminler biraz daha uzaklaşabilir.

Sonuç:

Bu k-NN regresyon örneği, algoritmanın sürekli hedef değişkenleri tahmin etme yeteneğini ve temel çalışma prensibini etkili bir şekilde göstermektedir. Seçilen k=5 değeri ile model, sentetik veri setimizdeki sinüs eğrisini başarılı bir şekilde öğrenmiş ve test noktaları üzerinde genellenebilir tahminler yapmıştır. RMSE değeri ve grafiksel gösterim, modelin performansının kabul edilebilir olduğunu ve genel eğilimi yakaladığını teyit etmektedir.

2. Boyutluluk Laneti (Curse of Dimensionality)

Boyutluluk Laneti (Curse of Dimensionality), veri setindeki özellik (boyut) sayısı arttıkça, makine öğrenimi algoritmalarının karşılaştığı zorlukları ifade eden bir terimdir. k-NN gibi mesafe tabanlı algoritmalar bu durumdan özellikle olumsuz etkilenir.

Nedir ve KNN üzerindeki etkisi?

Özellik sayısı arttıkça, veri uzayı (feature space) o kadar büyür ki, mevcut veri noktaları bu uzayda “seyrek” hale gelir. Bunun anlamı şudur:

-Mesafelerin Anlamsızlaşması: Yüksek boyutlu uzayda, tüm veri noktaları birbirine göre “uzak” görünmeye başlar. En yakın komşular bile aslında beklediğimizden daha uzak olabilir. Bu durum, mesafe tabanlı algoritmalarda “yakınlık” kavramını bozar ve komşuların gerçekten benzer olup olmadığı konusunda yanılgıya yol açar.

-Aşırı Öğrenme Riski: Her bir boyutun getirdiği gürültü (noise), modelin genelleme yeteneğini düşürür. Algoritma, gürültülü boyutlardaki önemsiz farklılıklara aşırı uyum sağlayabilir.

-Hesaplama Maliyeti: Yeni bir noktaya olan mesafeyi hesaplamak için her boyuttaki farkları dahil etmek gerektiğinden, hesaplama süresi özellik sayısıyla birlikte önemli ölçüde artar.

-KNN üzerindeki özel etkisi: k-NN, en yakın komşuları bulmak için tüm boyutları kullanır. Boyut sayısı arttıkça, “gerçek” en yakın komşuları bulmak zorlaşır, çünkü her boyutta çok küçük farklılıklar bile toplam mesafeyi büyütebilir ve aslında benzer olmayan noktaların “yakın” görünmesine neden olabilir. Bu, modelin performansını düşürür.

Çözüm önerileri (özellik seçimi/azaltma)

Boyutluluk Laneti ile mücadele etmek için çeşitli teknikler kullanılır:

-Özellik Seçimi (Feature Selection): En alakalı ve bilgilendirici özellikleri seçerek gereksiz veya gürültülü boyutları kaldırmayı amaçlar.

-Filtre Yöntemleri: İstatistiksel testler (korelasyon, ki-kare, ANOVA) kullanarak her özelliği hedef değişkenle ilişkisine göre puanlar.

-Sarmalayıcı Yöntemler: Belirli bir makine öğrenimi algoritması kullanarak özellik alt kümelerini değerlendirir (örn. Recursive Feature Elimination).

-Gömülü Yöntemler: Model eğitimi sırasında özellik seçimini gerçekleştiren algoritmalar (örn. Lasso regresyonu). Boyut Azaltma (Dimensionality Reduction): Verileri daha az sayıda yeni boyuta dönüştürerek bilgi kaybını minimize etmeyi amaçlar. Yeni boyutlar, orijinal boyutların bir kombinasyonudur.

-Temel Bileşen Analizi (Principal Component Analysis - PCA): Verideki en büyük varyansı yakalayan ortogonal doğrusal kombinasyonlar (ana bileşenler) oluşturur.

-Doğrusal Diskriminant Analizi (Linear Discriminant Analysis - LDA): Sınıflar arasındaki ayrımı maksimize eden yeni boyutlar oluşturur (sınıflandırma problemlerine özel).

t-SNE (t-Distributed Stochastic Neighbor Embedding) / UMAP (Uniform Manifold Approximation and Projection): Özellikle görselleştirme ve kümelenme için kullanılan doğrusal olmayan boyut azaltma teknikleri.

Bu yöntemler, k-NN’in yüksek boyutlu veri setlerinde daha verimli ve doğru çalışmasını sağlar.

3. Ağırlıklı KNN (Weighted KNN)

Standart k-NN algoritmasında, seçilen k komşunun hepsi eşit ağırlıkta oy kullanır (veya ortalamaya eşit katkıda bulunur). Ancak sezgisel olarak, sorgu noktasına daha yakın olan komşuların, daha uzak olan komşulardan daha fazla söz hakkına sahip olması mantıklıdır. Ağırlıklı k-NN bu fikri hayata geçirir.

Yakın komşuların katkısını mesafeye göre ağırlıklandırma

Ağırlıklı k-NN’de, her bir komşunun oyu veya regresyon katkısı, sorgu noktasına olan mesafesiyle ters orantılı bir ağırlıkla çarpılır. Yani, daha yakın komşular daha büyük ağırlık alırken, daha uzak komşular daha küçük ağırlık alır.

Yaygın Ağırlıklandırma Fonksiyonları:

-Ters Mesafe (Inverse Distance Weighting): Ağırlık, mesafenin tersi veya mesafenin karesinin tersi olarak hesaplanır.

\[ w_i = \frac{1}{d(x, x_i)} \quad \text{veya} \quad w_i = \frac{1}{d(x, x_i)^2} \]

Burada \(d(x, x_i)\), sorgu noktası \(x\) ile komşu \(x_i\) arasındaki mesafedir.

-Gauss Ağırlığı (Gaussian Weighting): Komşu noktaların ağırlığı, sorgu noktasına olan mesafelerinin Gauss (normal) dağılımına göre belirlenir.

K-NN Sınıflandırmada Ağırlıklı Oylama:

Her komşunun sınıfı, ağırlığı ile çarpılır ve toplamı en yüksek olan sınıf kazanır. Beraberlik durumlarını çözmekte de yardımcı olabilir.

K-NN Regresyonda Ağırlıklı Ortalama:

Her komşunun hedef değeri, ağırlığı ile çarpılır ve tüm bu çarpımların toplamı, ağırlıkların toplamına bölünür.

\[ \hat{y} = \frac{\sum_{i=1}^{k} w_i y_i}{\sum_{i=1}^{k} w_i} \] Avantajları:

  • Modelin, daha yakın komşuların daha güçlü etkisine sahip olmasını sağlayarak performansı artırabilir.

  • Aykırı değerlerin etkisini azaltmaya yardımcı olabilir (uzak aykırı değerler daha az ağırlık alır).

Dezavantajları:

  • Hala boyutluluk lanetine tabidir.

  • Ek bir hiperparametre (ağırlıklandırma fonksiyonu) seçimi gerektirebilir.

4. KNN’in Diğer Algoritmalarla Karşılaştırılması

(Dostlar merak etmeyin henüz öğrenmediğimiz karar ağaçları ve destek vektör makineleri ve daha fazlası ilerleyen derslerde hepsi anlatılacak örnekle açıklanacaktır.Biraz daha sabır dostlar…)

k-NN’in makine öğrenimi algoritmaları arasındaki yerini daha iyi anlamak için, onu diğer yaygın algoritmalarla karşılaştırmak faydalıdır. Aşağıdaki tablo, temel özellikleri ve davranışları açısından k-NN’i Karar Ağaçları, Destek Vektör Makineleri (SVM) ve Lojistik Regresyon ile karşılaştırmaktadır.

Özellik / Algoritma k-NN Karar Ağaçları (Decision Trees) Destek Vektör Makineleri (SVM) Lojistik Regresyon (Logistic Regression)
Model Türü Parametrik Olmayan, Tembel Öğrenici Parametrik Olmayan, Heyecanlı Öğrenici Parametrik, Heyecanlı Öğrenici Parametrik, Heyecanlı Öğrenici
Karmaşıklık Basit, sezgisel Orta (oluşturulan ağacın derinliğine göre) Orta-Yüksek (çekirdek fonksiyonuna göre) Basit
Açıklanabilirlik Yüksek (komşulara bakarak) Yüksek (ağaç yapısını inceleyerek) Düşük (özellikle doğrusal olmayan SVM) Yüksek (katsayıları inceleyerek)
Eğitim Süresi Çok Hızlı (model oluşturmaz) Hızlı Orta-Yavaş (özellikle büyük veri setleri) Hızlı
Tahmin Süresi Yavaş (her tahmin için tüm veriye bakar) Hızlı Hızlı Hızlı
Veri Ölçeklendirme Gerekli (Mesafe tabanlı) Genellikle Gerekli Değil Gerekli (Mesafe ve sınır tabanlı) Genellikle Gerekli (eğitim stabilitesi için)
Boyutluluk Laneti Çok Duyarlı Orta Duyarlılık Orta Duyarlılık (kernel ile yönetilebilir) Orta Duyarlılık
Aykırı Değer Duyarlılığı Yüksek (özellikle küçük k) Orta (derin ağaçlar duyarlı olabilir) Orta (yumuşak marj ile yönetilebilir) Orta
Uygulama Alanı Sınıflandırma, Regresyon Sınıflandırma, Regresyon Sınıflandırma, Regresyon Sınıflandırma (ikili/çoklu)

Karşılaştırma Özeti:

  • Basitlik ve Yorumlanabilirlik: k-NN, karar ağaçları ve lojistik regresyon gibi algoritmalarla birlikte en anlaşılır modellerden biridir.

  • Tembel Öğrenme: k-NN, modeli eğitim aşamasında oluşturmaması nedeniyle diğer algoritmaların çoğundan farklıdır. Bu, hızlı eğitim ancak yavaş tahmin anlamına gelir.

  • Veri Yapısına Duyarlılık: k-NN, parametrik olmayan bir model olduğu için verideki karmaşık, doğrusal olmayan ilişkileri yakalayabilir. Ancak ölçeklendirmeye ve boyutluluk lanetine karşı çok hassastır.

  • Hesaplama Maliyeti: Büyük veri setlerinde tahmin aşaması k-NN için bir darboğaz olabilirken, diğer “hevesli” öğreniciler eğitimde daha yavaş ancak tahminde daha hızlıdır.

5. Gerçek Dünya Uygulamaları

k-NN algoritmasının basitliği ve sezgiselliği, onu çeşitli sektörlerde ve problem alanlarında popüler bir seçim haline getirmiştir.

Tavsiye Sistemleri:

Çalışma Prensibi: Bir kullanıcının geçmiş tercihlerine (izlediği filmler, satın aldığı ürünler) bakılarak, o kullanıcıya benzer zevklere sahip “komşu” kullanıcılar bulunur. Bu komşu kullanıcıların beğendiği ancak ana kullanıcının henüz görmediği ürünler veya filmler tavsiye edilir.

Örnek: E-ticaret sitelerinde “bu ürünü alanlar bunları da aldı” veya müzik platformlarında “bu şarkıyı dinleyenler bunları da beğendi”.

Görüntü Tanıma ve Yüz Tanıma:

Çalışma Prensibi: Bir görüntünün veya yüzün özellikleri (piksel değerleri, doku, şekil) çıkarılır ve bu özellik vektörleri kullanılarak eğitim setindeki en benzer görüntüler bulunur. Yeni görüntünün sınıfı, en yakın komşuların sınıfı olarak atanır.

Örnek: Bir resimdeki nesnenin ne olduğunu tanımlama (kedi mi, köpek mi?) veya bir kişinin kimliğini doğrulama.

Tıp ve Sağlık Alanı:

Çalışma Prensibi: Hasta özelliklerine (semptomlar, laboratuvar sonuçları, genetik veriler) göre en benzer geçmiş hasta vakaları bulunur. Yeni bir hastanın teşhisi veya tedaviye yanıtı, benzer vakaların sonuçlarına göre tahmin edilir.

Örnek: Belirli bir hastalığın teşhisi, ilaç yanıtlarının tahmini, risk gruplarının belirlenmesi.

Finans Sektörü:

Çalışma Prensibi: Kredi başvuru sahiplerinin finansal özelliklerine (gelir, borç, kredi geçmişi) bakılarak, benzer profildeki geçmiş başvuru sahiplerinin kredi geri ödeme davranışları incelenir.

Örnek: Kredi risk değerlendirmesi, dolandırıcılık tespiti (benzer olmayan işlemlerin belirlenmesi).

Metin Sınıflandırma ve Duygu Analizi:

Çalışma Prensibi: Metinler (yorumlar, makaleler) sayısal özellik vektörlerine (kelime frekansları, TF-IDF değerleri) dönüştürülür. Yeni bir metnin konusu veya duygu durumu (pozitif, negatif, nötr), en benzer metinlerin etiketlerine göre tahmin edilir.

Örnek: Spam tespiti, müşteri yorumlarından duygu çıkarma, haber makalelerinin kategoriye ayrılması.

Sonuç:

k-NN algoritması, basitliğine rağmen hem sınıflandırma hem de regresyon problemlerinde güçlü ve etkili bir araçtır. Ancak “Boyutluluk Laneti” gibi zorlukları ve hesaplama maliyeti dezavantajlarını göz önünde bulundurarak, veri ön işleme (ölçeklendirme, özellik seçimi/azaltma) adımlarının hayati öneme sahip olduğunu unutmamak gerekir. Ağırlıklı k-NN gibi varyasyonlar, algoritmanın performansını daha da optimize etmek için esneklik sunar. Doğru kullanıldığında, k-NN birçok gerçek dünya problemi için sağlam bir temel çözüm sağlayabilir.

Son Sözler

Bu kapsamlı rehber boyunca, K-En Yakın Komşu (k-NN) algoritmasını teorik temelinden R ile pratik uygulamalarına, performans değerlendirmesinden gelişmiş konulara kadar derinlemesine inceledik. Şimdiye kadar öğrendiklerimizi özetleyelim ve k-NN ile çalışırken dikkate almanız gereken pratik ipuçlarına değinelim.

1. Özet ve Temel Çıkarımlar

  • Basit ve Sezgisel: k-NN, en basit makine öğrenimi algoritmalarından biridir ve çalışma prensibi insan sezgilerine oldukça yakındır: “Bana benzeyenlerin yaptığı gibi yaparım.” Yeni bir veri noktasını sınıflandırmak veya değerini tahmin etmek için, eğitim setindeki en yakın komşularına bakar.

  • Parametrik Olmayan ve Tembel Öğrenici: k-NN, verilerin belirli bir dağılıma sahip olduğunu varsaymaz (parametrik olmayan) ve eğitim aşamasında açık bir model oluşturmaz; tüm hesaplamaları tahmin aşamasında yapar (tembel öğrenici).

  • Çok Yönlülük: Hem sınıflandırma (kategorik hedef değişken) hem de regresyon (sürekli hedef değişken) problemleri için kullanılabilir. Sınıflandırmada çoğunluk oyu, regresyonda ise ortalama alma prensibiyle çalışır.

  • Hiperparametre k: Algoritmanın ana hiperparametresi olan k (komşu sayısı) değeri, modelin performansını doğrudan etkiler. Optimal k değeri genellikle çapraz doğrulama ile belirlenir.

    • Küçük k: Modelleme karmaşıklığı yüksek, gürültüye duyarlı, aşırı öğrenme (overfitting) riski.
    • Büyük k: Modelleme karmaşıklığı düşük, daha kararlı, yetersiz öğrenme (underfitting) riski.
  • Mesafe Metrikleri: Veri noktaları arasındaki benzerliği ölçmek için Öklid mesafesi en yaygın olanıdır, ancak Manhattan, Minkowski gibi başka metrikler de kullanılabilir.

  • Ağırlıklı k-NN: Komşuların katkısını mesafelerine göre ağırlıklandırarak modelin performansını potansiyel olarak artırabilir, daha yakın komşulara daha fazla önem verir.

  • Boyutluluk Laneti: k-NN, yüksek boyutlu veri setlerinde performans düşüşü yaşama eğilimindedir çünkü özellik sayısı arttıkça “yakınlık” kavramı anlamsızlaşır. Bu, algoritmanın temel dezavantajlarından biridir.

2. Pratik İpuçları ve Dikkat Edilmesi Gerekenler

k-NN algoritmasını gerçek dünya problemlerine uygularken göz önünde bulundurmanız gereken bazı önemli noktalar:

  1. Veri Ölçeklendirme KRİTİKTİR: k-NN mesafe tabanlı bir algoritma olduğu için, özelliklerin farklı ölçeklerde olması durumunda büyük değerli özellikler mesafeyi domine edecektir. Tüm sayısal özelliklerin standartlaştırılması (örn. scale() fonksiyonu ile ortalama 0, standart sapma 1) performansı önemli ölçüde artırır. Bu, k-NN için atlanmaması gereken en önemli adımdır.

  2. Optimal k Değerini Belirleyin: k değeri modelin yanlılık (bias) ve varyans (variance) dengeleyicisidir. Optimal k değerini bulmak için çapraz doğrulama (caret paketi train() fonksiyonu) gibi teknikleri mutlaka kullanın. Genellikle tek sayılar tercih edilir.

  3. Boyutluluk Lanetine Karşı Tedbir Alın:

    • Özellik Seçimi: İlgisiz veya fazla gürültülü özellikleri kaldırmak için özellik seçimi tekniklerini kullanın.
    • Boyut Azaltma: PCA gibi boyut azaltma teknikleri ile veri setinizin boyutunu düşürmeyi düşünebilirsiniz.
  4. Büyük Veri Setlerinde Performans Sorunları: k-NN, tembel bir öğrenici olduğu için tahmin aşamasında her sorgu noktası için tüm eğitim setini taraması gerekir. Bu durum, çok büyük eğitim setlerinde tahmin süresini oldukça uzatabilir.

    • Performans kaygılarınız varsa FNN gibi daha hızlı implementasyonları olan paketleri kullanabilir veya KD-Tree/Ball Tree gibi veri yapılarını kullanan k-NN varyasyonlarını inceleyebilirsiniz.
  5. Kategorik Özelliklerle Başa Çıkma:

    • Kategorik özellikler için One-Hot Encoding veya Dummy Coding gibi yöntemlerle sayısal temsilcilikler oluşturmanız gerekir. Aksi takdirde mesafe hesaplamaları doğru çalışmaz.
  6. Sınıf Dengesizliği: Hedef sınıflar arasında büyük bir dengesizlik varsa (örn. bir sınıfın örnek sayısı diğerlerinden çok azsa), k-NN baskın sınıfa doğru yanlılık gösterebilir.

    • Bunu ele almak için:

      • Sınıf ağırlıklandırması (ağırlıklı k-NN’de nadir sınıflara daha yüksek ağırlık verme).
      • Oversampling (SMOTE gibi tekniklerle nadir sınıf örneklerini çoğaltma) veya Undersampling (baskın sınıf örneklerini azaltma) teknikleri kullanılabilir.
  7. Yorumlanabilirlik: k-NN yüksek yorumlanabilirliğe sahiptir. Bir tahminin neden yapıldığını açıklamak için sadece en yakın komşulara ve onların etiketlerine bakmanız yeterlidir. Bu, modelin “kararını” müşterilere veya paydaşlara açıklamak istediğinizde büyük bir avantajdır.

Bu rehberle k-NN algoritmasını derinlemesine anladık ve R ile uygulamasını öğrendik. Ancak tabii ki makine öğrenimi dünyası k-NN ile sınırlı değil. Öğrenme yolculuğumuza bir sonraki adım olarak, veriyi tamamen farklı bir yaklaşımla öğrenen Karar Ağaçları algoritmasını keşfedeceğiz. Karar Ağaçları’nın ardından, bu ağaçların gücünü bir araya getiren ve daha istikrarlı tahminler sunan Rastgele Ormanlar (Random Forests) gibi topluluk öğrenme (ensemble learning) yöntemlerine geçiş yapacağız.

Bu algoritmaların temel prensiplerini ve R ile uygulamalarını öğrendikten sonra, makine öğrenimi iş akışının vazgeçilmez bir parçası olan gelişmiş veri ön işleme tekniklerine odaklanacağız. Bu özel modülde, özellik seçimi (feature selection) ve boyut azaltma (dimensionality reduction) yöntemlerini (PCA, LDA, RFE, Lasso gibi) detaylıca inceleyecek ve R’daki uygulamalarını öğreneceğiz.

Tüm bu bilgi birikimini tamamladıktan sonra, k-NN, Karar Ağaçları ve Rastgele Ormanları içeren kapsamlı bir gerçek dünya projesi üzerinde bir araya getirerek, her bir algoritmanın güçlü ve zayıf yönlerini aynı veri seti üzerinde pratik bir şekilde karşılaştıracak ve en uygun model seçiminin inceliklerini deneyimleyeceğiz. Bu sayede, farklı makine öğrenimi algoritmalarının veri bilimi araç kutunuzdaki yerini çok daha iyi anlayacaksınız.

Veriyle kalın, lütfen takipte kalın dostlar.