logo

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

  • K-En Yakın Komşu, Denetimli Öğrenme tekniğini temel alan en basit Makine Öğrenimi algoritmalarından biridir.
  • K-NN algoritması, yeni vaka/veri ile mevcut vakalar arasındaki benzerliği varsayar ve yeni vakayı mevcut kategorilere en çok benzeyen kategoriye yerleştirir.
  • K-NN algoritması mevcut tüm verileri saklar ve benzerliğe göre yeni bir veri noktasını sınıflandırır. Bu, yeni veriler ortaya çıktığında K-NN algoritması kullanılarak kolayca iyi bir kategoriye sınıflandırılabileceği anlamına gelir.
  • K-NN algoritması Regresyon için kullanılabileceği gibi Sınıflandırma için de kullanılabilir ancak çoğunlukla Sınıflandırma problemlerinde kullanılır.
  • K-NN bir parametrik olmayan algoritma Bu, temel veriler üzerinde herhangi bir varsayımda bulunmadığı anlamına gelir.
  • Aynı zamanda denir tembel öğrenci algoritması çünkü eğitim setinden hemen öğrenmez, bunun yerine veri setini saklar ve sınıflandırma anında veri seti üzerinde bir işlem gerçekleştirir.
  • KNN algoritması eğitim aşamasında sadece veri setini saklar ve yeni veri aldığında bu veriyi yeni veriye çok benzeyen bir kategoriye sınıflandırır.
  • Örnek:Diyelim ki elimizde kedi ve köpeğe benzeyen bir canlı resmi var ama onun kedi mi köpek mi olduğunu bilmek istiyoruz. Bu tanımlama için benzerlik ölçüsü üzerinde çalışan KNN algoritmasını kullanabiliriz. KNN modelimiz, yeni veri setinin kedi ve köpek görsellerine benzer özelliklerini bulacak ve en benzer özelliklere göre onu kedi veya köpek kategorisine koyacaktır.
Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

Neden bir K-NN Algoritmasına ihtiyacımız var?

İki kategori olduğunu, yani Kategori A ve Kategori B olduğunu ve yeni bir x1 veri noktamız olduğunu, dolayısıyla bu veri noktasının bu kategorilerden hangisinde yer alacağını varsayalım. Bu tür problemleri çözmek için bir K-NN algoritmasına ihtiyacımız var. K-NN'nin yardımıyla belirli bir veri kümesinin kategorisini veya sınıfını kolayca tanımlayabiliriz. Aşağıdaki diyagramı göz önünde bulundurun:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

K-NN nasıl çalışır?

K-NN'nin çalışması aşağıdaki algoritmaya dayanarak açıklanabilir:

    Aşama 1:Komşuların K sayısını seçinAdım 2:Öklid mesafesini hesaplayın K komşu sayısı Aşama 3:Hesaplanan Öklid mesafesine göre en yakın K komşuyu alın.Adım-4:Bu k komşu arasında her kategorideki veri noktalarının sayısını sayın.Adım 5:Yeni veri noktalarını komşu sayısının maksimum olduğu kategoriye atayın.Adım-6:Modelimiz hazır.

Diyelim ki yeni bir veri noktamız var ve onu gerekli kategoriye koymamız gerekiyor. Aşağıdaki görüntüyü göz önünde bulundurun:

Java'da genellik
Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması
  • Öncelikle komşu sayısını seçeceğiz yani k=5'i seçeceğiz.
  • Daha sonra hesaplayacağız Öklid mesafesi veri noktaları arasındadır. Öklid mesafesi, geometride daha önce incelemiş olduğumuz iki nokta arasındaki mesafedir. Şu şekilde hesaplanabilir:
Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması
  • Öklid mesafesini hesaplayarak, A kategorisinde en yakın üç komşu ve B kategorisinde en yakın iki komşu olmak üzere en yakın komşuları elde ettik. Aşağıdaki görüntüyü inceleyin:
Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması
  • Görebildiğimiz gibi en yakın 3 komşu A kategorisindedir, dolayısıyla bu yeni veri noktası A kategorisine ait olmalıdır.

K-NN Algoritmasında K değeri nasıl seçilir?

K-NN algoritmasında K değerini seçerken hatırlanması gereken bazı noktalar aşağıda verilmiştir:

  • 'K' için en iyi değeri belirlemenin özel bir yolu yoktur, dolayısıyla bunlardan en iyisini bulmak için bazı değerleri denememiz gerekir. K için en çok tercih edilen değer 5’tir.
  • K=1 veya K=2 gibi çok düşük bir K değeri gürültülü olabilir ve modelde aykırı değerlerin etkilerine yol açabilir.
  • K için büyük değerler iyidir ancak bazı zorluklarla karşılaşılabilir.

KNN Algoritmasının Avantajları:

  • Uygulanması basittir.
  • Gürültülü eğitim verilerine karşı dayanıklıdır
  • Eğitim verilerinin büyük olması daha etkili olabilir.

KNN Algoritmasının Dezavantajları:

  • Bazen karmaşık olabilecek K değerini her zaman belirlememiz gerekir.
  • Tüm eğitim örnekleri için veri noktaları arasındaki mesafenin hesaplanması nedeniyle hesaplama maliyeti yüksektir.

KNN algoritmasının Python uygulaması

K-NN algoritmasının Python uygulamasını yapmak için Lojistik Regresyonda kullandığımız problemin ve veri setinin aynısını kullanacağız. Ancak burada modelin performansını artıracağız. Sorunun açıklaması aşağıdadır:

K-NN Algoritması Sorunu: Yeni bir SUV araba üreten bir Araba üreticisi firma var. Şirket, reklamları söz konusu SUV'u satın almakla ilgilenen kullanıcılara göstermek istiyor. Bu problem için, sosyal ağ üzerinden birden fazla kullanıcının bilgisini içeren bir veri setimiz var. Veri seti çok fazla bilgi içeriyor ancak Tahmini Maaş Ve Yaş bağımsız değişkeni dikkate alacağız ve Satın alınan değişken bağımlı değişken içindir. Veri kümesi aşağıdadır:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

K-NN algoritmasını uygulama adımları:

  • Veri Ön İşleme adımı
  • K-NN algoritmasını Eğitim setine uydurma
  • Test sonucunu tahmin etmek
  • Sonucun doğruluğunu test edin (Karışıklık matrisinin oluşturulması)
  • Test seti sonucunun görselleştirilmesi.

Veri Ön İşleme Adımı:

Veri Ön İşleme adımı, Lojistik Regresyon ile tamamen aynı kalacaktır. Aşağıda bunun kodu verilmiştir:

 # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test) 

Yukarıdaki kodu çalıştırarak veri setimiz programımıza aktarılır ve önceden işlenir. Özellik ölçeklendirmeden sonra test veri kümemiz şöyle görünecektir:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

Yukarıdaki çıktı görüntüsünden verilerimizin başarıyla ölçeklendirildiğini görebiliriz.

    K-NN sınıflandırıcısını Eğitim verilerine uydurma:
    Şimdi K-NN sınıflandırıcısını eğitim verilerine uyarlayacağız. Bunu yapmak için içe aktaracağız KKomşularSınıflandırıcı sınıfı Sklearn Komşuları kütüphane. Sınıfı içe aktardıktan sonra oluşturacağız. Sınıflandırıcı sınıfın nesnesi. Bu sınıfın parametresi şu şekilde olacaktır:
      n_komşular:Algoritmanın gerekli komşularını tanımlamak. Genellikle 5 alır.metrik='minkowski':Bu varsayılan parametredir ve noktalar arasındaki mesafeye karar verir.p=2:Standart Öklid metriğine eşdeğerdir.
    Daha sonra sınıflandırıcıyı eğitim verilerine uyarlayacağız. Aşağıda bunun kodu verilmiştir:
 #Fitting K-NN classifier to the training set from sklearn.neighbors import KNeighborsClassifier classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 ) classifier.fit(x_train, y_train) 

Çıktı: Yukarıdaki kodu çalıştırdığımızda çıktıyı şu şekilde elde edeceğiz:

 Out[10]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform') 
    Test Sonucunu Tahmin Etme:Test seti sonucunu tahmin etmek için bir y_pred Lojistik Regresyonda yaptığımız gibi vektör. Aşağıda bunun kodu verilmiştir:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Çıktı:

Yukarıdaki kodun çıktısı şöyle olacaktır:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması
    Karışıklık Matrisinin Oluşturulması:
    Şimdi sınıflandırıcının doğruluğunu görmek için K-NN modelimizin Karışıklık Matrisini oluşturacağız. Aşağıda bunun kodu verilmiştir:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

Yukarıdaki kodda, merge_matrix fonksiyonunu içe aktardık ve cm değişkenini kullanarak çağırdık.

kesir olarak 0,06

Çıktı: Yukarıdaki kodu çalıştırdığımızda aşağıdaki matrisi elde edeceğiz:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

Yukarıdaki görselde 64+29= 93 doğru tahmin, 3+4= 7 yanlış tahmin olduğunu, Lojistik Regresyonda ise 11 yanlış tahminin olduğunu görüyoruz. Yani K-NN algoritması kullanılarak modelin performansının iyileştirildiğini söyleyebiliriz.

    Eğitim seti sonucunun görselleştirilmesi:
    Şimdi K-NN modeli için eğitim seti sonucunu görselleştireceğiz. Grafiğin adı dışında kod, Lojistik Regresyonda yaptığımızla aynı kalacaktır. Aşağıda bunun kodu verilmiştir:
 #Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show() 

Çıktı:

Yukarıdaki kodu çalıştırdığımızda aşağıdaki grafiği elde edeceğiz:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

Çıktı grafiği Lojistik Regresyonda oluşturduğumuz grafikten farklıdır. Aşağıdaki noktalarda anlaşılabilir:

    • Gördüğümüz gibi grafik kırmızı noktayı ve yeşil noktaları gösteriyor. Yeşil noktalar Satın Alınan(1) ve Kırmızı Noktalar Satın Alınmayan(0) değişkenine aittir.
    • Grafik herhangi bir düz çizgi veya herhangi bir eğri göstermek yerine düzensiz bir sınır gösteriyor çünkü bu bir K-NN algoritması, yani en yakın komşuyu buluyor.
    • SUV satın almayan kullanıcıların çoğu kırmızı bölgede, SUV satın alan kullanıcılar ise yeşil bölgede olduğundan grafik, kullanıcıları doğru kategorilerde sınıflandırmıştır.
    • Grafik iyi sonuç veriyor ancak yine de kırmızı bölgede bazı yeşil noktalar ve yeşil bölgede kırmızı noktalar var. Ancak bu modelin aşırı uyum sorunlarının önlenmesi nedeniyle bu büyük bir sorun değildir.
    • Bu nedenle modelimiz iyi eğitilmiştir.
    Test seti sonucunun görselleştirilmesi:
    Modelin eğitimi sonrasında artık yeni bir veri seti yani Test veri seti koyarak sonucu test edeceğiz. Bazı küçük değişiklikler dışında kod aynı kalır: örneğin x_train ve y_train tarafından değiştirilecek x_test ve y_test .
    Aşağıda bunun kodu verilmiştir:
 #Visualizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show() 

Çıktı:

Makine Öğrenimi için K-En Yakın Komşu(KNN) Algoritması

Yukarıdaki grafik test veri setinin çıktısını göstermektedir. Grafikte görebileceğimiz gibi, kırmızı noktaların çoğu kırmızı bölgede ve yeşil noktaların çoğu da yeşil bölgede olduğundan tahmin edilen çıktı gayet iyi.

Ancak kırmızı bölgede az sayıda yeşil nokta, yeşil bölgede ise birkaç kırmızı nokta bulunmaktadır. Bunlar karışıklık matrisinde gözlemlediğimiz yanlış gözlemlerdir (7 Yanlış çıktı).