تطبيق نكهات SVM الأخرى مع Python Scikit-Learn

تطبيق نكهات SVM الأخرى مع Python Scikit-Learn

المُقدّمة

هذا الدليل هو الجزء الثالث والأخير من ثلاثة أدلة حول آلات المتجهات الداعمة (SVM). في هذا الدليل ، سنواصل العمل مع حالة استخدام الأوراق النقدية المزورة ، وسنلخص سريعًا الفكرة العامة وراء SVMs ، ونفهم ما هي خدعة النواة ، وننفذ أنواعًا مختلفة من النواة غير الخطية باستخدام Scikit-Learn.

في السلسلة الكاملة من أدلة SVM ، إلى جانب التعرف على أنواع أخرى من SVMs ، ستتعرف أيضًا على معلمات SVM بسيطة ومعلمات SVM محددة مسبقًا ومعلمات C و Gamma الفائقة وكيف يمكن ضبطها باستخدام بحث الشبكة والتحقق المتقاطع.

إذا كنت ترغب في قراءة الأدلة السابقة ، يمكنك إلقاء نظرة على أول دليلين أو معرفة الموضوعات التي تهمك أكثر. يوجد أدناه جدول الموضوعات التي تم تناولها في كل دليل:

  1. تنفيذ SVM و Kernel SVM باستخدام لغة البرمجة Python Scikit-Learn
  • حالة الاستخدام: انسى الأوراق النقدية
  • خلفية SVMs
  • نموذج بسيط (خطي) SVM
    • حول مجموعة البيانات
    • استيراد مجموعة البيانات
    • استكشاف مجموعة البيانات
  • تنفيذ SVM باستخدام Scikit-Learn
    • تقسيم البيانات إلى تدريب / مجموعات اختبار
    • تدريب النموذج
    • يتنبأ
    • تقييم النموذج
    • تفسير النتائج
  1. فهم المعلمات التشعبية SVM
  • C Hyperparameter
  • معلمة غاما Hyperparameter

3. تطبيق نكهات SVM الأخرى باستخدام Scikit-Learn من Python

  • الفكرة العامة لـ SVMs (ملخص)
  • نواة (خدعة) SVM
  • تطبيق SVM غير الخطي للنواة باستخدام Scikit-Learn
  • استيراد مكتبات
    • استيراد مجموعة البيانات
    • تقسيم البيانات إلى ميزات (س) والهدف (ص)
    • تقسيم البيانات إلى مجموعات تدريب / اختبار
    • تدريب الخوارزمية
  • نواة متعددة الحدود
    • يتنبأ
    • تقييم الخوارزمية
  • نواة جاوس
    • التنبؤ والتقييم
  • نواة السيني
    • التنبؤ والتقييم
  • مقارنة أداء النواة غير الخطية

دعنا نتذكر ما هو كل شيء عن SVM قبل رؤية بعض الاختلافات المثيرة للاهتمام لنواة SVM.

الفكرة العامة لـ SVMs

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

حدود متعددة للقرار

الشكل 1: حدود القرار المتعددة

عندما يختار SVM ملف حدود القرار، يختار حدًا يزيد المسافة بينه وبين أقرب نقاط بيانات للفئات. نحن نعلم بالفعل أن أقرب نقاط البيانات هي متجهات الدعم وأن المسافة يمكن تحديدها معًا C و gamma المعلمات الفائقة.

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

حدود القرار مع ناقلات الدعم

الشكل 2: حدود القرار مع متجهات الدعم

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

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

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

المشورة: الآن بعد أن قمنا بتلخيص العملية الحسابية ، من الواضح أن المسافة بين نقاط البيانات ستؤثر على حدود القرار التي يختارها SVM ، بسبب ذلك ، تحجيم البيانات عادة ما يكون ضروريًا عند استخدام مصنف SVM. جرب استخدام طريقة Scaler القياسية لـ Scikit-Learn لتجهيز البيانات ، ثم تشغيل الأكواد مرة أخرى لمعرفة ما إذا كان هناك اختلاف في النتائج.

نواة (خدعة) SVM

في القسم السابق ، تذكرنا ونظمنا الفكرة العامة لـ SVM - ونرى كيف يمكن استخدامها للعثور على حدود القرار الأمثل للبيانات القابلة للفصل خطيًا. ومع ذلك ، في حالة البيانات غير القابلة للفصل خطيًا ، مثل تلك الموضحة في الشكل 3 ، نعلم بالفعل أنه لا يمكن استخدام الخط المستقيم كحد قرار.

البيانات غير القابلة للفصل خطيًا

الشكل 3: البيانات غير القابلة للفصل خطيًا

بدلاً من ذلك ، يمكننا استخدام النسخة المعدلة من SVM التي ناقشناها في البداية ، والتي تسمى Kernel SVM.

بشكل أساسي ، ما سيفعله kernel SVM هو عرض البيانات غير الخطية القابلة للفصل ذات الأبعاد السفلية إلى شكلها المقابل بأبعاد أعلى. هذه خدعة ، لأنه عند عرض بيانات غير قابلة للفصل خطيًا بأبعاد أعلى ، يتغير شكل البيانات بطريقة تجعلها قابلة للفصل. على سبيل المثال ، عند التفكير في 3 أبعاد ، يمكن أن ينتهي الأمر بتخصيص نقاط البيانات من كل فئة في بُعد مختلف ، مما يجعلها قابلة للفصل. يمكن أن تكون إحدى طرق زيادة أبعاد البيانات من خلال أسها. مرة أخرى ، هناك رياضيات معقدة متضمنة في هذا ، لكن لا داعي للقلق بشأن ذلك من أجل استخدام SVM. بدلاً من ذلك ، يمكننا استخدام مكتبة Python Scikit-Learn لتنفيذ واستخدام النواة غير الخطية بنفس الطريقة التي استخدمنا بها الخطية.

تطبيق SVM غير الخطي للنواة باستخدام Scikit-Learn

في هذا القسم ، سنستخدم نفس مجموعة البيانات للتنبؤ بما إذا كانت الورقة النقدية حقيقية أم مزورة وفقًا للميزات الأربع التي نعرفها بالفعل.

سترى أن بقية الخطوات هي خطوات نموذجية للتعلم الآلي وتحتاج إلى القليل من الشرح حتى نصل إلى الجزء الذي نقوم فيه بتدريب أجهزة SVM غير الخطية الخاصة بنا.

استيراد مكتبات

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

استيراد مجموعة البيانات

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

تقسيم البيانات إلى ميزات (س) والهدف (ص)

X = bankdata.drop('class', axis=1)
y = bankdata['class']

تقسيم البيانات إلى تدريب / مجموعات اختبار

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

تدريب الخوارزمية

لتدريب kernel SVM ، سنستخدم نفس الشيء SVC فئة Scikit-Learn svm مكتبة. يكمن الاختلاف في قيمة معلمة kernel الخاصة بـ SVC فئة.

في حالة SVM البسيط ، استخدمنا "الخطي" كقيمة لمعامل kernel. ومع ذلك ، كما ذكرنا سابقًا ، بالنسبة لـ kernel SVM ، يمكننا استخدام نواة Gaussian أو متعدد الحدود أو السيني أو النواة القابلة للحساب. سنقوم بتطبيق حبات متعددة الحدود ، و Gaussian ، و sigmoid ، وننظر في مقاييسها النهائية لمعرفة أي منها يبدو مناسبًا لفئاتنا بمقياس أعلى.

1. نواة متعددة الحدود

في الجبر ، كثير الحدود هو تعبير عن النموذج:

$$
2 أ * ب ^ 3 + 4 أ - 9
$$

هذا له متغيرات ، مثل a و b، الثوابت ، في مثالنا ، 9 والمعاملات (ثوابت مصحوبة بمتغيرات) مثل 2 و 4. 3 تعتبر درجة كثيرة الحدود.

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

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

لذلك ، لتنفيذ نواة كثيرة الحدود، إلى جانب اختيار ملف poly kernel ، سنقوم أيضًا بتمرير قيمة لـ degree المعلمة من SVC فصل. يوجد أدناه الرمز:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

يتنبأ

الآن ، بمجرد أن ندرب الخوارزمية ، فإن الخطوة التالية هي عمل تنبؤات على بيانات الاختبار.

كما فعلنا من قبل ، يمكننا تنفيذ البرنامج النصي التالي للقيام بذلك:

y_pred_poly = svclassifier.predict(X_test)

تقييم الخوارزمية

كالعادة ، فإن الخطوة الأخيرة هي إجراء تقييمات على النواة متعددة الحدود. نظرًا لأننا كررنا رمز تقرير التصنيف ومصفوفة الارتباك عدة مرات ، فلنحولها إلى وظيفة display_results بعد تلقي الاحترام y_test, y_pred والعنوان لمصفوفة الارتباك Seaborn مع cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

الآن ، يمكننا استدعاء الدالة وإلقاء نظرة على النتائج التي تم الحصول عليها باستخدام نواة متعددة الحدود:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

يبدو الإخراج كالتالي:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

تنفيذ نكهات SVM أخرى باستخدام ذكاء بيانات PlatoBlockchain من Python Scikit-Learn. البحث العمودي. منظمة العفو الدولية.

يمكننا الآن تكرار نفس الخطوات لنواة Gaussian و sigmoid.

2. نواة جاوس

لاستخدام نواة gaussian ، نحتاج فقط إلى تحديد 'rbf' كقيمة لـ kernel معلمة فئة SVC:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

عند استكشاف هذه النواة بشكل أكبر ، يمكنك أيضًا استخدام بحث الشبكة لدمجها مع مختلف C و gamma القيم.

التنبؤ والتقييم

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

يبدو إخراج Gaussian kernel SVM كما يلي:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

تنفيذ نكهات SVM أخرى باستخدام ذكاء بيانات PlatoBlockchain من Python Scikit-Learn. البحث العمودي. منظمة العفو الدولية.

3. نواة السيني

أخيرًا ، دعنا نستخدم نواة سينية لتنفيذ Kernel SVM. ألق نظرة على النص التالي:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

لاستخدام النواة السينية ، يجب عليك تحديد 'sigmoid' كقيمة لـ kernel المعلمة من SVC فئة.

التنبؤ والتقييم

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

يبدو إخراج Kernel SVM مع نواة Sigmoid كما يلي:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

تنفيذ نكهات SVM أخرى باستخدام ذكاء بيانات PlatoBlockchain من Python Scikit-Learn. البحث العمودي. منظمة العفو الدولية.

مقارنة أداء النواة غير الخطية

إذا قارنا بإيجاز أداء الأنواع المختلفة من النواة غير الخطية ، فقد يبدو أن النواة السينية لديها أدنى المقاييس ، وبالتالي فإن الأداء الأسوأ.

من بين نواة Gaussian ومتعددة الحدود ، يمكننا أن نرى أن نواة Gaussian حققت معدل تنبؤ مثالي بنسبة 100٪ - والذي عادة ما يكون مشبوهًا وقد يشير إلى زيادة في التجهيز ، في حين أن النواة متعددة الحدود أخطأت في تصنيف 68 حالة من الفئة 1.

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

الأمر كله يتعلق باختبار جميع النواة واختيار واحد مع مجموعة من المعلمات وإعداد البيانات التي تعطي النتائج المتوقعة وفقًا لسياق مشروعك.

المضي قدمًا - مشروع يدوي شامل

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من مشروع موجه: "توقع عملي لأسعار المنازل - التعلم الآلي في لغة Python".

تنفيذ نكهات SVM أخرى باستخدام ذكاء بيانات PlatoBlockchain من Python Scikit-Learn. البحث العمودي. منظمة العفو الدولية.

في هذا المشروع الموجه - ستتعلم كيفية بناء نماذج تعلم الآلة التقليدية القوية بالإضافة إلى نماذج التعلم العميق ، واستخدام مجموعة التعلم وتدريب المتعلمين الفوقيين للتنبؤ بأسعار المنازل من حقيبة من نماذج Scikit-Learn و Keras.

باستخدام Keras ، واجهة برمجة التطبيقات للتعلم العميق المبنية على قمة Tensorflow ، سنقوم بتجربة البنى وإنشاء مجموعة من النماذج المكدسة وتدريب المتعلم الفوقي الشبكة العصبية (نموذج المستوى الأول) لمعرفة سعر المنزل.

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

هذا مشروع شامل ، ومثل جميع مشاريع التعلم الآلي ، سنبدأ بـ - بـ تحليل البيانات استكشافية، تليها معالجة البيانات و اخيرا مبنى ضحل و نماذج التعلم العميق لتتناسب مع البيانات التي اكتشفناها ونظفناها سابقًا.

وفي الختام

في هذه المقالة ، قمنا بعمل ملخص سريع عن SVMs ، ودرسنا حول خدعة kernel وقمنا بتطبيق نكهات مختلفة من SVMs غير الخطية.

أقترح عليك تنفيذ كل نواة والاستمرار في المضي قدمًا. يمكنك استكشاف الرياضيات المستخدمة في إنشاء كل من الحبات المختلفة ، ولماذا تم إنشاؤها والاختلافات المتعلقة بمعلماتها الفائقة. بهذه الطريقة ، ستتعرف على التقنيات ونوع النواة الأفضل للتطبيق اعتمادًا على السياق والبيانات المتاحة.

سيساعدك الفهم الواضح لكيفية عمل كل نواة ومتى تستخدمها بالتأكيد في رحلتك. اسمحوا لنا أن نعرف كيف يسير التقدم وترميز سعيد!

الطابع الزمني:

اكثر من ستاكابوز