الملخص

يعد K اقرب جار (KNN) بديهيًا للفهم ويسهل تنفيذ الخوارزمية. يمكن للمبتدئين إتقان هذه الخوارزمية حتى في المراحل الأولى من دراسات التعلم الآلي الخاصة بهم.

مقال KNN هذا هو:

  • فهم تمثيل وتنبؤ خوارزمية K اقرب جار (KNN).
  • فهم كيفية اختيار مقدار K وقياس المسافة.
  • طرق تحضير البيانات المطلوبة وإيجابيات وسلبيات خوارزمية KNN.
  • تنفيذ Pseudocode و Python.

المقدمة

تندرج خوارزمية K اقرب جار ضمن فئة التعلم بلإشراف وتستخدم للتصنيف (الأكثر شيوعًا) والانحدار. إنها خوارزمية متعددة الاستخدامات تُستخدم أيضًا لحساب المقادیر المفقودة وإعادة تشكيل مجموعات البيانات. كما يوحي الاسم (K اقرب جار) بأنه يعتبر K أقرب الجيران (نقاط البيانات) للتنبؤ بالفئة أو القيمة المستمرة لنقطة البيانات الجديدة.

تعلم الخوارزمية هو:

التعلم القائم على المثيل (Instance-based learning): هنا لا نتعلم الأوزان من بيانات التدريب للتنبؤ بالمخرجات (كما هو الحال في الخوارزميات المستندة إلى النموذج) ولكننا نستخدم حالات تدريب كاملة للتنبؤ بمخرجات البيانات غير المرئية.

التعلم الكسول (Lazy Learning): لا يتم تعلم النموذج باستخدام بيانات التدريب مسبقًا ويتم تأجيل عملية التعلم إلى وقت يتم فيه طلب التنبؤ في المثيل الجديد.

غير البارامتری (Non -Parametric): في KNN، لا يوجد شكل محدد مسبقًا لوظيفة التعيين.

كيف تعمل KNN؟

1. المبدأ

تأمل الشكل التالي. لنفترض أننا قمنا برسم نقاط بيانات من مجموعة التدريب الخاصة بنا على مساحة ميزة ثنائية الأبعاد. كما هو موضح، لدينا إجمالي 6 نقاط بيانات (3 أحمر و 3 أزرق). تنتمي نقاط البيانات الحمراء إلى “class1” ونقاط البيانات الزرقاء تنتمي إلى “class2″. وتمثل نقطة البيانات الصفراء في مساحة المعلم النقطة الجديدة التي سيتم التنبؤ بالفئة من أجلها. من الواضح أننا نقول إنها تنتمي إلى ” class1″ (النقاط الحمراء).

لماذا ا؟

لأن أقرب جيرانها ينتمون إلى تلك الفئة!

خوارزمية KNN

نعم، هذا هو المبدأ الكامن وراء K اقرب جار. هنا ، أقرب الجيران هم نقاط البيانات التي لها مسافة حد ادنی في مساحة الميزة من نقطة البيانات الجديدة الخاصة بنا. و K هو عدد نقاط البيانات التي نأخذها في الاعتبار عند تطبيقنا للخوارزمية. لذلك، يعد قياس المسافة و مقدار K اعتبارين مهمين أثناء استخدام خوارزمية KNN. المسافة الإقليدية هي مقياس المسافة الأكثر شيوعًا. يمكنك أيضًا استخدام مسافة هامنج ومسافة مانهاتن ومسافة مينكوفسكي حسب حاجتك. للتنبؤ بفئة / قيمة مستمرة لنقطة بيانات جديدة ، فإنها تأخذ في الاعتبار جميع نقاط البيانات في مجموعة بيانات التدريب. البحث عن الجيران الأقرب “K” لنقطة البيانات الجديدة (نقاط البيانات) من مساحة الخصیصه لصائق الفئات أو المقادیر المستمرة.

ثم:

بالنسبة للتصنيف: تعتبر تسمية الفئة المخصصة لأغلبية K أقرب الجيران من مجموعة بيانات التدريب فئة متوقعة لنقطة البيانات الجديدة.

بالنسبة للانحدار: المتوسط أو الوسط المقادیر المستمرة المخصصة لـ K أقرب الجيران من مجموعة بيانات التدريب هو مقدار مستمرة متوقعة لنقطة بياناتنا الجديدة.

2. تمثيل النموذج

هنا، لا نتعلم الأوزان ونخزنها، بدلاً من ذلك، يتم تخزين مجموعة بيانات التدريب بالكامل في الذاكرة. لذلك، يمثل تمثيل النموذج لـ KNN مجموعة بيانات التدريب بأكملها.

كيف تختار مقدار K؟

K هي بارامتره مهمة في خوارزمية KNN. بعض الاقتراحات لاختيار قيمة K هي:

  1. استخدام منحنيات الخطأ: يوضح الشكل أدناه منحنيات الخطأ لقيم مختلفة لـ K لبيانات التدريب والاختبار.
خوارزمية KNN

عند قيم K المنخفضة، هناك فرط في البيانات / تباين كبير. لذلك فإن خطأ الاختبار مرتفع وخطأ التدریب منخفض. عند k=1 في بيانات التدریب، يكون الخطأ دائمًا صفراً، لأن أقرب جار لتلك النقطة هو تلك النقطة نفسها. لذلك، على الرغم من أن خطأ التدريب منخفض، فإن خطأ الاختبار مرتفع عند قيم K المنخفضة. وهذا ما يسمى overfitting. كلما قمنا بزيادة قيمة K، يتم تقليل خطأ الاختبار. ولكن بعد قيمة K معينة، يتم إدخال التحيز / نقص الملاءمة ويرتفع خطأ الاختبار. لذلك يمكننا القول في البداية أن خطأ بيانات الاختبار مرتفع (بسبب التباين) ثم ينخفض ويستقر ومع زيادة أخرى في قيمة K، فإنه يزداد مرة أخرى (بسبب التحيز). تعتبر قيمة K عند استقرار خطأ الاختبار وتكون منخفضة بمثابة القيمة المثلى لـ K. من منحنى الخطأ أعلاه، يمكننا اختيار k=8 لتنفيذ خوارزمية KNN الخاصة بنا.

2. أيضًا، معرفة المجال مفيدة جدًا في اختيار قيمة K.

3. يجب أن تكون قيمة K فردية أثناء النظر في التصنيف الثنائي (من صنفين).

إعداد البيانات المطلوبة

  1. تدریج البيانات: لتحديد موقع نقطة البيانات في مساحة الخصائص متعددة الأبعاد، سيكون من المفيد أن تكون جميع الخصائص على نفس المقياس. ومن ثم فإن تطبيع البيانات أو التقييس سيساعد.
  2.  تقليل الأبعاد: قد لا تعمل KNN بشكل جيد إذا كان هناك العديد من الخصائص. ومن ثم يمكن تنفيذ تقنيات تقليل الأبعاد مثل اختيار الخصیصه، وتحليل المكونات الرئيسية.
  3. معالجة القيمة المفقودة: إذا كانت هناك M بيانات خصیصه واحدة مفقودة لمثال معين في مجموعة التدريب، فلا يمكننا تحديد المسافة من تلك النقطة أو حسابها. لذلك فإن حذف هذا الصف أو التضمين مطلوب.

تنفیذ بايثون

تنفيذ خوارزمية K اقرب جار باستخدام مكتبة scikit-Learn الخاصة ببايثون:

الخطوة 1: الحصول على البيانات وتحضيرها

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier 
from sklearn import metrics

بعد تحميل المكتبات المهمة، نقوم بإنشاء بياناتنا باستخدام مجموعات البيانات sklearn مع 200 عينة و 8 خصائص وفئتين. ثم يتم تقسيم البيانات إلى التدریب (80٪) واختبار (20٪) البيانات وقياسها باستخدام StandardScaler.

X,Y=make_classification(n_samples= 200,n_features=8,n_informative=8,n_redundant=0,n_repeated=0,n_classes=2,random_state=14)
X_train, X_test, y_train, y_test= train_test_split(X, Y, test_size= 0.2,random_state=32)
sc= StandardScaler()
sc.fit(X_train)
X_train= sc.transform(X_train)
sc.fit(X_test)
X_test= sc.transform(X_test)
X.shape

الاخراج سیکون کما یلی:

(200, 8)

الخطوة 2: اکتشاف قيمة K

لاختيار قيمة K، نستخدم منحنيات الخطأ وقيمة K مع التباين الأمثل، ويتم اختيار خطأ التحيز كقيمة K لأغراض التنبؤ. مع منحنى الخطأ المرسوم أدناه ، نختار K=7 للتنبؤ.

error1= []
error2= []
for k in range(1,15):
    knn= KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train,y_train)
    y_pred1= knn.predict(X_train)
    error1.append(np.mean(y_train!= y_pred1))
    y_pred2= knn.predict(X_test)
    error2.append(np.mean(y_test!= y_pred2))
# plt.figure(figsize(10,5))
plt.plot(range(1,15),error1,label="train")
plt.plot(range(1,15),error2,label="test")
plt.xlabel('k Value')
plt.ylabel('Error')
plt.legend()

الاخراج سیکون کما یلی:

الخطوة 3: التنبؤ

في الخطوة 2، اخترنا قيمة K لتكون 7. الآن نستبدل هذه القيمة ونحصل على درجة الدقة 0.9 لبيانات الاختبار.

knn= KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train,y_train)
y_pred= knn.predict(X_test)
metrics.accuracy_score(y_test,y_pred)

الاخراج سیکون کما یلی:

0.9

المصادر

المصدر الاول

منشور ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة