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.
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 setiiris 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.
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.
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)
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
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!
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 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ı.
Ş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.
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, 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:
Ç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 hesaplamacaret 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
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.
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ğ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 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.
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ı:
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.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.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.
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.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.
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)
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ı:
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).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.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.k değerlerinde
zirve yaptığını, ancak bu zirvelerin arasında düşüşler yaşandığını
gösterir.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.
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.
Ş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.
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.
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.
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))
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.
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.
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.
Ö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.
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.
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.
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.
(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.
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.
Ç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”.
Ç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.
Ç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.
Ç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).
Ç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.
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.
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: Modelleme karmaşıklığı yüksek, gürültüye
duyarlı, aşırı öğrenme (overfitting) riski.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.
k-NN algoritmasını gerçek dünya problemlerine uygularken göz önünde bulundurmanız gereken bazı önemli noktalar:
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.
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.
Boyutluluk Lanetine Karşı Tedbir Alın:
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.
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.Kategorik Özelliklerle Başa Çıkma:
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:
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.