دعم الآلة الناقلة (SVM): المفاهيم الأساسية واستخدام دوال النواة لتحسين تصنيف البيانات غير الخطية

دعم الآلة الناقلة (SVM)
بشكل عام، هناك استراتيجيتان شائعتان عند محاولة تصنيف البيانات غير الخطية:
-
تطبيق خوارزمية تصنيف غير خطية على البيانات في فضائها الأصلي للميزات.
-
توسيع فضاء الميزات إلى بعد أعلى حيث يمكن وجود حد قرار خطي.
تهدف آلات الدعم الناقل (SVM) إلى إيجاد حد قرار خطي في فضاء أبعاد أعلى، لكنها تقوم بذلك بطريقة حسابية فعالة باستخدام دوال النواة (Kernel functions)، والتي تسمح لها بإيجاد هذا الحد بدون الحاجة لتطبيق التحويل غير الخطي على الملاحظات بشكل صريح.
هناك العديد من الخيارات المختلفة لتوسيع فضاء الميزات عبر بعض التحولات غير الخطية للميزات (مثل متعدد الحدود من الدرجة الأعلى، أو مصطلحات التفاعل، إلخ). لنأخذ مثالاً على توسيع فضاء الميزات باستخدام توسيع متعدد الحدود التربيعي.
افترض أن مجموعة الميزات الأصلية لدينا تتكون من pp ميزات كما في الشكل التالي:
صورة توضيحية للمؤلف، مستوحاة من كتاب “مقدمة في التعلم الإحصائي”، الفصل التاسع
بعد تطبيق التوسيع التربيعي لمجموعة الميزات، تصبح مجموعة الميزات الجديدة مكونة من 2p2p ميزات كما يلي:
صورة توضيحية للمؤلف، مستوحاة من كتاب “مقدمة في التعلم الإحصائي”، الفصل التاسع
الآن، نحتاج إلى حل مشكلة الأمثل التالية:
مشكلة الأمثل لـ SVM\text{مشكلة الأمثل لـ SVM}
صورة توضيحية للمؤلف، مستوحاة من كتاب “مقدمة في التعلم الإحصائي”، الفصل التاسع
هذه المشكلة مماثلة لمشكلة الأمثل الخاصة بـ SVC التي رأيناها سابقًا، لكن الآن لدينا مصطلحات تربيعية مدرجة في فضاء الميزات، لذا لدينا ضعف عدد الميزات. الحل لهذه المشكلة سيكون خطيًا في الفضاء التربيعي، ولكنه يصبح غير خطي عند ترجمته مرة أخرى إلى الفضاء الأصلي للميزات.
مع ذلك، لحل المشكلة أعلاه، يجب تطبيق تحويل متعدد الحدود التربيعي على كل ملاحظة يتم تدريب الـ SVC عليها، وهذا قد يكون مكلفًا حسابيًا عند التعامل مع بيانات ذات أبعاد عالية. بالإضافة إلى ذلك، قد لا يوجد حد قرار خطي حتى بعد تطبيق التوسيع التربيعي للبيانات المعقدة، مما يستدعي استكشاف فضاءات ذات أبعاد أعلى. هذه التحولات غير الخطية يمكن أن تكون مكلفة للغاية من الناحية الحسابية. لذلك، من المثالي أن نتمكن من إيجاد حد القرار في الفضاء عالي الأبعاد بدون الحاجة إلى تطبيق التحويل غير الخطي فعليًا على البيانات.
لحسن الحظ، تبين أن حل مشكلة الأمثل الخاصة بـ SVC لا يتطلب معرفة صريحة بمصفوفة الميزات لكل ملاحظة في مجموعة البيانات. يكفي أن نعرف كيف تتقارن الملاحظات مع بعضها البعض في الفضاء عالي الأبعاد. رياضيًا، هذا يعني أننا فقط بحاجة إلى حساب المنتجات الداخلية الثنائية بين الملاحظات (pairwise inner products)، حيث يمكن اعتبار المنتج الداخلي كقيمة تُعبّر عن مدى التشابه بين ملاحظتين.
لحسن الحظ، في بعض فضاءات الميزات، توجد دوال (تُعرف بدوال النواة Kernel functions) تسمح بحساب المنتج الداخلي بين ملاحظتين دون الحاجة إلى تحويل تلك الملاحظات صراحة إلى فضاء الميزات. يمكن العثور على شرح أكثر تفصيلاً عن هذه الخاصية السحرية لدوال النواة ومتى يمكن تطبيقها في الفصل الثالث والسادس من المرجع ذاته.
نظرًا لأن دوال النواة تسمح لنا بالعمل في فضاء أبعاد أعلى، فلدينا حرية تعريف حدود قرار أكثر مرونة من تلك التي يوفرها SVC التقليدي.
لننظر إلى دالة النواة الشهيرة: دالة النواة الأساسية الشعاعية (Radial Basis Function – RBF).
صورة توضيحية للمؤلف، مستوحاة من كتاب “مقدمة في التعلم الإحصائي”، الفصل التاسع
الصيغة معروضة أعلاه كمرجع، لكن لفهم مبسط يمكن التفكير بها كدالة تقيس مدى “تشابه” ملاحظتين في فضاء عالي الأبعاد (يُعتبر عادة فضاء لانهائي الأبعاد).
لنعُد إلى البيانات التي شاهدناها في نهاية قسم SVC. عند تطبيق دالة النواة RBF على مصنف SVM وتدريبه على هذه البيانات، نستطيع إنتاج حد قرار يميز بين الفئات بشكل أفضل بكثير من SVC التقليدي.
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_circles
from sklearn import svm
# إنشاء دائرتين متداخلتين
X, Y = make_circles(n_samples=100, factor=0.3, noise=0.05, random_state=0)
kernel_list = [‘linear’, ‘rbf’]
fignum = 1
for k in kernel_list:
# تدريب النموذج
clf = svm.SVC(kernel=k, C=1)
clf.fit(X, Y)
# رسم الخط، النقاط، وأقرب المتجهات إلى المستوى
xx = np.linspace(-2, 2, 8)
yy = np.linspace(-2, 2, 8)
X1, X2 = np.meshgrid(xx, yy)
Z = np.empty(X1.shape)
for (i, j), val in np.ndenumerate(X1):
x1 = val
x2 = X2[i, j]
p = clf.decision_function([[x1, x2]])
Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = [“dashed”, “solid”, “dashed”]
colors = “k”
plt.figure(fignum, figsize=(4,3))
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
plt.scatter(
clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=80,
facecolors=”none”,
zorder=10,
edgecolors=”k”,
cmap=plt.get_cmap(“RdBu”),
)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolor=”black”, s=20)
# عرض نوع النواة ودقة النموذج
plt.title(f”Kernel = {k}: Accuracy = {clf.score(X, Y)}”)
plt.axis(“tight”)
fignum += 1
plt.show()
في الأعلى: SVM باستخدام النواة الخطية (SVC) يحقق دقة 69%. في الأسفل: SVM باستخدام نواة RBF يميز الفئات بشكل مثالي.
في النهاية، هناك العديد من الخيارات المختلفة لدوال النواة، مما يمنح حرية كبيرة في نوع حدود القرار التي يمكننا إنشاؤها. هذا يمكن أن يكون قويًا جدًا، ولكن من المهم مراعاة استخدام التنظيم (regularization) المناسب مع دوال النواة لتقليل فرص الإفراط في التخصيص (overfitting).
الكلمات الدلالية العربية المقترحة:
دعم الآلة الناقلة, دوال النواة, تصنيف غير خطي, توسيع فضاء الميزات, دالة RBF, تنظيم التعلم الآلي