فهم خوارزمية أقرب الجيران (k- Nearest Neighbors (kNN مع مثال عملي في Python

تعتبر خورازمية أقرب الجيران من إحدى أهم و أبسط خوارزميات التعليم الالي الموجه -التي تعمل بمشرف – و تعتبر خوازمية الجار الأقرب من خوارزميا التصنفيف الوصفي و التنبوئي. لها القدرة على التعامل مع البيانات الشاذه. يعتمد مبدأ عمل هذه الخوارزمية على حساب المسافة الاقليدية* بين النقاط حيث كلما قلت المسافة بين نقطتين زادت إحتمالية إنتماء النقطة لبعضهما البعض و من هنا جاء إسم الخوارزمية ،و يشير الحرف K إلىُ الحاالت التي سيتم تصنيفها بناء على المسافات بينها -أي بين الجيران- يعني إذا أفترضنا أن k = 3 فإن الخوازمية ستقيس المسافة بين النقطة المستهدفة و أقرب ثلاث نقاط إليها فإذا كانت أقرب نقطتين تنتمي للمجموعة أ و النقطة الثالثة لوحدها تنتنمي للمجموعة ب فإن النقطة المستهدفة سيتم تصنيفها على أساس أنها تنتمي للمجموعة أ. كما في الصورة أدناه

يتم استخدامه هذه الخوارزمية لحل كل من مسائل التصنيف والانحدار. ومع ذلك ، فإنها تستخدم على نطاق واسع في مسائل التصنيف في مجال الصناعة و التجارة.

يمكن بسهولة ربط هذه الخوارزمية بحياتنا اليومية. إذا كنت تريد التعرف على شخص ليس لديك معلومات عنه ، فإنك في البدية ترغب في التعرف على أصدقائه المقربين والدوائر التي يقضي جل وقته فيها لمعرفة شخصية و أخلاق الشخص!

الأشياء التي يجب مراعاتها قبل اختيار خوارزمية أقرب الجيران kNN:

  • تعتبر هذه الخوارزمية مكلفه حسابيا
  • يجب أن تكون المتغيرات موحدة normalized ، وإلا فإن متغيرات النطاق الأعلى يمكن أن تتحيز لفئة
  • يحبذ معالجة البيانات قبل تطبيق الخوارزمية عليها مثل إزالة القيم الشاذة و الضوضاء.

مميزات خوارزمية الجار الأقرب kNN

  • لا تتضمن عملية تدريب – لا تتضمن خوارزمية kNN على عملية تدريب للبيانات, البيانات نفسها هي نموذج ستكون مرجعًا للتنبؤ المستقبلي و لهذا السبب فهي فعالة للغاية من حيث الوقت من حيث الارتجال للنمذجة العشوائية على البيانات المتاحة.
  • سهلة التنفيذ- تعتبر خوارزمية الجار الأقرب kNN سهل التنفيذ للغاية حيث أن الشيء الوحيد الذي يجب حسابه هو فقط المسافة بين النقاط المختلفة على أساس بيانات الميزات المختلفة ويمكن بسهولة حساب هذه المسافة باستخدام دالة المسافة سواءا الإقليدية Euclidean أو مانهاتن Manhattan.
  • نظرًا لعدم وجود عملية تدريب للبيانات  يمكن إضافة بيانات جديدة في أي وقت لأنها لن تؤثر على النموذج.

عيواب خوارزمية الجار الأقرب kNN

  • لا تعمل بشكل جيد مع مجموعة البيانات الكبيرة لأن حساب المسافات بين كل مثيل للبيانات سيكون مكلفًا للغاية.
  • لا تعمل بشكل جيد مع الأبعاد العالية high dimensionality لأن هذا سيعقد عملية حساب المسافة لكل بُعد.
  • حساسة للبيانات الشاذة والمفقودة.

تطبيق عملي على لغة البايثون

أولا نعمل على إستيراد المكتبات الضرورية

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

ثانيا نرفع البيانات المقرر تطبيق الخوارزمية عليها

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
# نسمي الأعمدة من أجل تسهيل عملية التفريق بين بيانات الهدف و بيانات الميزات
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
# قراءة قاعدة البيانات بإستخدام مكتبة بانداس
dataset = pd.read_csv(url, names=names)
dataset.head()

ثالثا معالجة البيانات

1- إختيار قيم x – الميزات – و y – الهدف –

X = dataset.iloc[:, :-1].values 
y = dataset.iloc[:, 4].values

2- تقسيم البيانات إلى بيانات تدريب و بيانات إختبار – ملاحظة توجد بيانات تدريب لكن لا توجد عملية تدريب على هذه البيانات في هذه الخوارزمية – عملية التقسيم فقط من إجل إختبار كقائة النموذج بإستخدام بيانات جديدة فقط

from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)

3- توحيد البيانات Feature Scaling

from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
scaler.fit(X_train) 
X_train = scaler.transform(X_train) 
X_test = scaler.transform(X_test)

رابعا تشغيل النموذج و تخمين النتائج

from sklearn.neighbors import KNeighborsClassifier 
classifier = KNeighborsClassifier(n_neighbors=5) 
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)

خامسا تقييم النموذج

from sklearn.metrics import classification_report, confusion_matrix 
print(confusion_matrix(y_test, y_pred)) 
print(classification_report(y_test, y_pred))

كفاءة النموذج وصلت الى 93 %

سادسا مقارنة قيم الخطا مع تغير قيم k -عدد الجيران- عن طريق حساب قيمة الخطأ لقيم k بين 1 و 40  و رسم الرسم البياني

error = [] 
# Calculating error for K values between 1 and 40 
for i in range(1, 40): 
   knn = KNeighborsClassifier(n_neighbors=i) 
   knn.fit(X_train, y_train) 
   pred_i = knn.predict(X_test) 
   error.append(np.mean(pred_i != y_test))

 

plt.figure(figsize=(12, 6)) 
plt.plot(range(1, 40), error, 
   color='red', linestyle='dashed', 
   marker='o', markerfacecolor='blue', 
   markersize=10) 
plt.title('Error Rate K Value') 
plt.xlabel('K Value') plt.ylabel('Mean Error')

و هذه النتائج النهائية

المراجع

1- المرجع الاول

2- المرجع الثاني

3- المرجع الثالث


  • ملاحظة قد تكون دالة المسافة هذه إقليدية Euclidean, مانهاتن Manhattan, مينكوفسكي Minkowski , أو دالة مسافة هامينغ Hamming .
Share on facebook
فاسبوك
Share on twitter
تويتر
Share on linkedin
لينكد إن
Share on whatsapp
واتساب

اترك تعليقاً

المشاركات الاخيرة

أحدث التعليقات

أفحص بحثك بالمجان

رفع الملف