İncelemeye algoritmanın sözde kodunu (pseudo code) yazarak başlayalım isterseniz:
Şekilde belirtildiği gibi en fazla sayıdaki sınıfın etiketi örneğimize atanır.
k-NN bu kadar etkin ve kolay bir algoritma olmasına karşın bazı önemli dezavantajlara sahiptir.
Küçük bir kodlama örneği yapalım şimdi. Bu örnek için iris veri setini kullanalım. (Laf aramızda ben sıkıldım bu iris veri setinden artık :) İlerleyen yazılarımızda daha başka veri setleri kullanmaya çalışacağım)
# pandas yüklemek lazım!
import pandas as pd
# numpy
import numpy as np
# matplotlib
import matplotlib.pyplot as plt
# ggplot stilinde kullanalım
plt.style.use('ggplot')
# Scikit Learn
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
%matplotlib notebook
# iris verisetini yukluyoruz
iris = datasets.load_iris()
# 1. ve 3. özniteliği alalım
X = iris.data[:, [0,2]]
y = iris.target
plt.figure()
# Haydi çizdirelim bunu
# Setosa için
plt.scatter(X[y==0,0],X[y==0,1],c="b")
# Versicolor için
plt.scatter(X[y==1,0],X[y==1,1],c='r')
# Virginica için
plt.scatter(X[y==2,0],X[y==2,1],c="g")
plt.legend(iris["target_names"])
plt.xlabel(iris.feature_names[0]);
plt.ylabel(iris.feature_names[2]);
# Çizdirmeyi gerçekleştirmek için yardımcı fonksiyonu çağıralım
import sys
sys.path.append("..")
from datafloyd.plot import plot_decision_region
# Sınıflandırıcıyı eğitelim ve görselleştirelim
kNN = KNeighborsClassifier(n_neighbors=3,metric="euclidean")
kNN.fit(X,y)
plt.figure()
plot_decision_region(X,y,kNN,legend=iris.target_names)
plt.xlabel(iris.feature_names[0]);
plt.ylabel(iris.feature_names[2]);
plt.title("kNN'de en yakın 3 komşu kullanıldı");
Şimdi isterseniz bir de k değerini arttıralım neler olacak bakalım. Değişimi daha iyi anlayabilmek için bu değeri 21 seçelim
# Sınıflandırıcıyı eğitelim ve görselleştirelim
kNN = KNeighborsClassifier(n_neighbors=21,metric="euclidean")
kNN.fit(X,y)
plt.figure()
plot_decision_region(X,y,kNN,legend=iris.target_names)
plt.xlabel(iris.feature_names[0]);
plt.ylabel(iris.feature_names[2]);
plt.title("kNN'de en yakın 3 komşu kullanıldı");
Gördüğünüz gibi sınır değişti, çünkü artık en yakın 21 komşuluk değerlendiriliyor. Bir de uzaklık ölçütünü değiştirelim bakalım neler olacak.
# Sınıflandırıcıyı eğitelim ve görselleştirelim
kNN = KNeighborsClassifier(n_neighbors=21,metric="chebyshev")
kNN.fit(X,y)
plt.figure()
plot_decision_region(X,y,kNN,legend=iris.target_names)
plt.xlabel(iris.feature_names[0]);
plt.ylabel(iris.feature_names[2]);
plt.title("kNN'de en yakın 3 komşu kullanıldı");
Buradaki "Chebysev" metriği "max(|x - y|)" şeklinde tanımlandığı için karar sınırları oldukça değişti gördüğünüz gibi.
Bir başka yazımızda tekrar görüşmek üzere esen kalın!