Makine Öğrenmesi - Sınıflandırma Algoritmaları
K-Nearest Neighbors Classifier
K-Nearest Neighbors Classifier (K-En Yakın Komşu Sınıflandırması - KNN), bağımsız değişkenler girdisine karşılık tahmin edilecek tahmin değerinin bağımsız değişkenlerin en yakın komşularının basit çoğunluğu ile sonuçlanır. Komşu noktalarda en fazla geçen değeri hedef olarak atayan bir sınıflandırma algoritmasıdır.
Kullanım için "KNeighborsClassifier" kütüphanesinin içe aktarılması gerekmektedir.
from sklearn.neighbors import KNeighborsClassifier
Söz dizimi : KNeighborsClassifier(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ğeri için "n" adet komşusunun en çok aldığı değer atanır.
Örnek-1: Bazı fiziksel özelliklere ve kan değerlerine bakılarak kişilerin kalp hastası olup olmayacağını tahmin edelim. Veri seti olarak "heart.csv" kullanılacaktır.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.neighbors import KNeighborsClassifier
Keşifsel Veri Analizi EDA
#Veri seti okunur
df=pd.read_csv("heart.csv")
df.head()
Çıktı:
# Veri seti hakkında bilgi
df.info()
Çıktı:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 303 entries, 0 to 302 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 age 303 non-null int64 1 sex 303 non-null int64 2 cp 303 non-null int64 3 trestbps 303 non-null int64 4 chol 303 non-null int64 5 fbs 303 non-null int64 6 restecg 303 non-null int64 7 thalach 303 non-null int64 8 exang 303 non-null int64 9 oldpeak 303 non-null float64 10 slope 303 non-null int64 11 ca 303 non-null int64 12 thal 303 non-null int64 13 target 303 non-null int64 dtypes: float64(1), int64(13) memory usage: 33.3 KB
#target sütunu eleman sayıları
df.target.value_counts()
Çıktı:
1 165 0 138 Name: target, dtype: int64
#Veri seti açıklamaları
df.describe()
Çıktı:
#Sütunların birbirleri ile korelasyonu
df.corr()
Çıktı:
#Korelasyon görüntülenmesi
plt.figure(figsize=(16,6))
sns.heatmap(df.corr(),annot=True)
Çıktı:
Model Oluşturma İşlemleri
#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("target",axis=1),df[["target"]]
#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=13)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
Çıktı:
((242, 13), (61, 13), (242, 1), (61, 1))
#KNeighborsClassifier ataması yapılır
KNN=KNeighborsClassifier()
#Model eğitme işlemi
KNN.fit(x_train,y_train)
#x_test verilerini tahminleme işlemi
predict_KNN=KNN.predict(x_test)
confusion_matrix(y_test,predict_KNN)
Çıktı:
array([[13, 13], [ 9, 26]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_KNN),annot=True,linewidths=2)
Çıktı:
#Sınıflandırma raporu
print(classification_report(y_test,predict_KNN))
Çıktı:
precision recall f1-score support 0 0.59 0.50 0.54 26 1 0.67 0.74 0.70 35 accuracy 0.64 61 macro avg 0.63 0.62 0.62 61 weighted avg 0.63 0.64 0.63 61
Sınıflandırma raporunda da görüldüğü gibi KNeighborsClassifier algoritması ile girilen değerlere göre target sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %64 olarak buldu.