خوارزمية KNN (أقرب الجيران): تصنيف البيانات بناءً على التشابه

دقائق القراءة: 6

خوارزمية KNN (أقرب الجيران): تصنيف البيانات بناءً على التشابه

تُعد خوارزمية KNN أو K-Nearest Neighbors من أبسط وأوضح خوارزميات تعلم الآلة (Machine Learning) الخاضع للإشراف. ورغم بساطتها النظرية، فإن فعاليتها العملية كبيرة جداً عندما تكون البيانات نظيفة، والميزات معبّرة، والمسافات محسوبة بطريقة صحيحة. الفكرة الجوهرية فيها هي أن العينة الجديدة تُصنَّف بناءً على أقرب العينات المعروفة إليها من حيث التشابه العددي.

تكمن قوة KNN في أنها لا تبني نموذجاً رياضياً صريحاً أثناء التدريب، بل تحتفظ بالبيانات وتؤجل قرار التصنيف إلى وقت التنبؤ. لهذا تُصنّف غالباً ضمن نماذج Lazy Learning. هذا السلوك يجعلها مناسبة للتجارب السريعة والتعليم، لكنه يفرض تحديات مهمة عند التعامل مع أحجام كبيرة من البيانات.

كيف تعمل خوارزمية KNN عملياً؟

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

هذا يعني أن جودة النموذج لا تعتمد فقط على اختيار قيمة K، بل أيضاً على جودة تمثيل البيانات نفسها. لذلك فإن مرحلة إعداد البيانات للتدريب (Data Preprocessing): تحجيم البيانات (Scaling & Normalization) تُعد عاملاً حاسماً، لأن الخوارزمية حساسة جداً لفروقات المقاييس بين الأعمدة.

الخطوات الأساسية للتصنيف باستخدام KNN

  • جمع البيانات وتحديد المتغير الهدف.
  • تنظيف القيم الناقصة أو الشاذة قبل التدريب.
  • اختيار الميزات المؤثرة في التصنيف.
  • تحجيم البيانات بحيث لا يطغى عمود عددي على غيره.
  • تقسيم البيانات إلى تدريب واختبار.
  • اختيار قيمة مناسبة لـ K.
  • قياس الأداء ثم إعادة الضبط والتحسين.

أهمية المسافة في KNN ولماذا التحجيم ضروري؟

تعتمد الخوارزمية على مفهوم المسافة، وغالباً تُستخدم مسافة Euclidean Distance. إذا كان لديك عمود يمثل الدخل السنوي وآخر يمثل العمر، فإن نطاق الدخل قد يكون بالآلاف بينما العمر بالعشرات. هنا سيهيمن عمود الدخل على حساب المسافة، حتى لو كان العمر أهم فعلياً في قرار التصنيف.

لذلك يجب تطبيق تقنيات التحجيم مثل StandardScaler أو MinMaxScaler. كما أن جودة الأعمدة نفسها ترتبط بما تعلمناه سابقاً في هندسة الميزات (Feature Engineering): كيف تستخرج بيانات جديدة من البيانات الحالية؟، لأن أي تمثيل أفضل للبيانات يحسن مفهوم التشابه الذي تعتمد عليه الخوارزمية.

في بيئات Big Data، لا يكفي تطبيق KNN مباشرة على بيانات خام ضخمة. الأفضل تصميم طبقة ETL Pipeline تنظف البيانات، توحد المقاييس، وتنتج ميزات أقل عدداً وأكثر دلالة لتقليل كلفة البحث عن الجيران.

اختيار قيمة K: توازن بين الضوضاء والتعميم

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

عملياً، يُفضّل استخدام بيانات اختبار منفصلة أو أسلوب Cross Validation. كما أن الخطوة الأساسية قبل ذلك هي تقسيم البيانات (Train/Test Split): لماذا يجب أن نختبر النموذج على بيانات لم يرها من قبل؟ لضمان أن التقييم يعكس قدرة التعميم وليس فقط الحفظ.

تطبيق عملي باستخدام Python

فيما يلي مثال مبسط على تدريب نموذج KNN باستخدام بيانات Iris. المثال يوضح التحجيم، التقسيم، التدريب، ثم التقييم بطريقة مناسبة للمبتدئ والمتقدم معاً.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import pandas as pd

# تحميل البيانات
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target

# تقسيم البيانات
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# التحجيم
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# بناء النموذج
model = KNeighborsClassifier(n_neighbors=5, metric="euclidean")
model.fit(X_train_scaled, y_train)

# التنبؤ
y_pred = model.predict(X_test_scaled)

# التقييم
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nConfusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))

هذا المثال يبيّن نقطة جوهرية: الخوارزمية نفسها قصيرة جداً برمجياً، لكن القيمة الحقيقية تأتي من جودة البيانات، واختيار الميزات، وضبط الإعدادات. لهذا من المفيد إتقان أدوات مثل مكتبة Pandas (1): قراءة واستدعاء البيانات من ملفات CSV و Excel برمجياً ومكتبة NumPy: القوة الضاربة في معالجة المصفوفات والعمليات الرياضية المعقدة قبل الدخول في النمذجة.

كيف نتعامل مع KNN في البيانات الكبيرة؟

المشكلة الرئيسية في KNN أنه عند كل عملية تنبؤ يحتاج إلى مقارنة السجل الجديد بعدد كبير من السجلات المخزنة. في الأنظمة الصغيرة لا يمثل ذلك مشكلة، لكن في بنى Big Data قد ترتفع الكلفة الحسابية والذاكرية بشكل واضح، خصوصاً مع آلاف الميزات أو ملايين الصفوف.

في هذه الحالة نلجأ عادة إلى استراتيجيات هندسية مثل تقليل الأبعاد، اختيار عينة ذكية، أو استخدام هياكل فهرسة وتقريب للجيران. كما يمكن تنفيذ تجهيز البيانات وتخفيضها باستخدام Apache Spark قبل التصدير إلى بيئة النمذجة، بدلاً من إجراء المقارنة الخام على كامل البيانات دفعة واحدة.

من منظور Performance Optimization، أفضل تحسين لـ KNN ليس دائماً في الخوارزمية نفسها، بل في تقليل عدد الصفوف غير المفيدة، إزالة الأعمدة الضعيفة، وتوحيد التمثيل العددي قبل مرحلة البحث. هذه القرارات المعمارية تختصر الزمن أكثر من أي تحسين سطحي في الكود.

متى تكون KNN مناسبة ومتى لا تكون الخيار الأفضل؟

تكون KNN مناسبة عندما تكون العلاقات بين البيانات محلية وقائمة على التشابه، مثل تصنيف العملاء، التعرف على الأنماط البسيطة، أو التوصية بناءً على قرب السلوك. وهي مفيدة أيضاً كخط أساس Baseline قبل مقارنة نتائجها مع خوارزميات أخرى.

لكنها ليست دائماً الخيار الأمثل. إذا كانت البيانات عالية الأبعاد جداً، أو تحتوي على ضوضاء كبيرة، أو كان زمن التنبؤ يجب أن يكون فورياً في أنظمة الإنتاج، فقد تكون نماذج مثل الانحدار اللوجستي (Logistic Regression): التنبؤ بالنتائج الثنائية أو شجرة القرارات (Decision Trees): كيف يتخذ الذكاء الاصطناعي قراراته بخطوات منطقية؟ أو حتى الغابات العشوائية (Random Forest): دمج مئات الأشجار لرفع دقة التوقعات أكثر ملاءمة.

أبرز المزايا والقيود

  • المزايا: سهلة الفهم، لا تحتاج افتراضات معقدة، فعالة في كثير من مسائل التصنيف الصغيرة والمتوسطة.
  • القيود: بطيئة وقت التنبؤ، حساسة للتحجيم، تتأثر بالميزات غير المهمة، وتضعف مع الأبعاد العالية.

حالات استخدام واقعية

تُستخدم KNN في تصنيف البريد المزعج، التوصية بالمنتجات المتشابهة، اكتشاف العملاء الأقرب سلوكياً، والتعرف المبدئي على الصور أو النصوص بعد تحويلها إلى تمثيل عددي. في البيانات النصية مثلاً، لا تعمل الخوارزمية على الكلمات مباشرة، بل على متجهات عددية مشتقة من النص.

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

في النهاية، خوارزمية KNN ليست مجرد أداة تعليمية بسيطة، بل نموذج فعّال عندما نفهم منطق التشابه، ونبني بيانات جيدة، ونعالج تحديات الأداء مبكراً. نجاحها لا يأتي من سطر fit() فقط، بل من سلسلة كاملة تبدأ من التنظيف، وتمر بالتحجيم، وتنتهي بتقييم علمي دقيق للنموذج.

اترك تعليقاً

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