Makine Öğrenmesi - II. Doğrusal Olmayan İlişkiler (Non-Linear Relationships)
K-nearest Neighbours (KNN) (K-En Yakın Komşu)
K-En Yakın Komşu Regresyonu (K-nearest Neighbours Regression - KNN), bağımlı değişken değerini bağımsız değişkenlerin en yakın komşularının ortalamasını alarak yaklaşık olarak tahmin eden bir yöntemdir.
Kullanımı için "KNeighborsRegressor" kütüphanesinin içe aktarılması gerekmektedir.
from sklearn.neighbors import KNeighborsRegressor
Söz dizimi: KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)
- n_neighbors, komşu sayısını temsil etmektedir. Default olarak 5 değerini almaktadır.
Şekil-1 de kırmızı olarak işaretlenen noktanın tahmin değerini bulabilmek için "n" adet komşusunun ortalamasını alarak sonuca ulaşır.
Örnek-1: Rastgele değerleri bulunan 5000 satırlık 2 bağımsız ve 1 bağımlı değişkenden oluşan bir veri seti oluşturarak KNN Regresyonu ile Modeli eğitelim. Eğitilen modele girilecek olan 2 bağımsız değer karşılığında bağımlı değişken değerini tahmin edelim.
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
#Rastgele değerli x ve y değerlerini oluşturuldu
x,y=make_regression(n_samples=5000,n_features=2,n_targets=1)
#İlk satır elemanlarını gözlemleyelim
print(f"1. satır x değerleri: {x[0:1]}")
print(f"1. satır y değeri {y[0:1]}")
Çıktı:
1. satır x değerleri: [[1.19892226 0.12587276]] 1. satır y değeri [53.21812893]
#Veri seti boyutu
print(f"x (bağımsız değişken) boyutu : {x.shape}")
print(f"y (bağımlı değişken) boyutu : {y.shape}")
Çıktı:
x (bağımsız değişken) boyutu : (5000, 2) y (bağımlı değişken) boyutu : (5000,)
#KNN Regresyon ile model eğitimi işlemleri
#Komşu sayısını "n_neighbors" 3 olarak girelim ve Modeli eğitelim
KNN=KNeighborsRegressor(n_neighbors=3)
KNN.fit(x,y)
#Model eğitimi sonrası tahmin işlemleri
tahmin_dizisi=[[4,12]]
KNN.predict(tahmin_dizisi)
Çıktı:
array([286.94125609])
Görüldüğü gibi 4 ve 12 değerleri K-En Yakın Komşu Regresyonu ile eğitilmiş modele giridldiğinde 286.941 değeri tahmin edilmiş olundu.
Örnek-2: Adversting veri setini K-En Yakın Komşu Regresyonu ile eğitelim.
import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error
from sklearn.neighbors import KNeighborsRegressor
df=pd.read_csv("advertising.csv")
df.head()
Çıktı:
#Veri setimizde boş değer olmadığı için Regresyon adımına geçebiliriz.
df.isnull().sum()
Çıktı:
TV 0 Radio 0 Newspaper 0 Sales 0 dtype: int64
x,y=df.drop("Sales",axis=1),df[["Sales"]]
x.shape,y.shape
Çıktı:
((200, 3), (200, 1))
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=13,test_size=0.2)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
Çıktı:
((160, 3), (40, 3), (160, 1), (40, 1))
KNN=KNeighborsRegressor() #komşu sayısı default olarak 5
KNN.fit(x_train,y_train)
predict_KNN=KNN.predict(x_test)
(mean_squared_error(y_test,predict_KNN))**.5
Çıktı:
1.698561155802169
r2_score(y_test,predict_KNN)*100
Çıktı:
90.44693241503764
K-En Yakın Komşu Regresyonu'na göre "advertising" veri seti "Sales" sütunu değerlerini %90.44 doğrulukla tahmin etmiş olduk. Kendimiz de bir değer yazarak tahmini Sales değerini bulabiliriz.
KNN.predict([[4,5,7]]) #Tv,Radio,Newspaper değerleri
Çıktı:
array([[6.2]])