تنفيذ SVM و Kernel SVM باستخدام لغة البرمجة Python Scikit-Learn

تنفيذ SVM و Kernel SVM باستخدام لغة البرمجة Python Scikit-Learn

المُقدّمة

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

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

1. تنفيذ SVM و Kernel SVM باستخدام لغة Scikit-Learn من Python

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

2. فهم المعلمات التشعبية SVM (قريبا!)

  • C Hyperparameter
  • معلمة غاما Hyperparameter

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

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

حالة الاستخدام: أوراق بنكية مزورة

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

ولكن ماذا يحدث عندما لا يكون هناك من ينظر إلى كل ملاحظة؟ هل هناك طريقة لمعرفة ما إذا كانت الأوراق النقدية مزورة أم حقيقية؟

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

نظرًا لاستخدام الصور ، يمكن ضغطها ، وتقليلها إلى درجات رمادية ، واستخراج قياساتها أو تحديد حجمها. بهذه الطريقة ، ستكون المقارنة بين قياسات الصور ، بدلاً من بكسل كل صورة.

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

خلفية SVMs

تم تقديم SVMs في البداية في عام 1968 ، بواسطة فلاديمير فابنيك وأليكسي تشيرفونينكيس. في ذلك الوقت ، كانت الخوارزمية الخاصة بهم مقتصرة على تصنيف البيانات التي يمكن فصلها باستخدام خط مستقيم واحد فقط ، أو البيانات التي كانت قابلة للفصل خطيًا. يمكننا أن نرى كيف سيبدو هذا الانفصال:

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

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

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

ولكن ماذا يحدث إذا لم تكن هناك طريقة لفصل البيانات باستخدام خط مستقيم واحد؟ إذا كانت هناك نقاط فوضوي خارج المكان ، أو إذا كانت هناك حاجة إلى منحنى؟

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

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

يتم تنفيذ SVMs بطريقة فريدة عند مقارنتها بخوارزميات التعلم الآلي الأخرى ، بمجرد أن تستند إلى التفسيرات الإحصائية لماهية التعلم ، أو بناءً عليه نظرية التعلم الإحصائي.

في هذه المقالة ، سنرى ما هي خوارزميات Support Vector Machines ، والنظرية الموجزة وراء آلة متجه الدعم ، وتنفيذها في مكتبة Python Scikit-Learn. سننتقل بعد ذلك نحو مفهوم SVM آخر ، يُعرف باسم نواة SVMالطرق أو خدعة نواة، وسيتم تنفيذه أيضًا بمساعدة Scikit-Learn.

نموذج بسيط (خطي) SVM

حول مجموعة البيانات

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

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

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

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

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

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

مجموعة بيانات الأوراق النقدية التي سنستخدمها في هذا القسم هي نفسها التي تم استخدامها في قسم التصنيف في شجرة القرار التعليمي.

ملحوظة: يمكنك تنزيل مجموعة البيانات هنا.

دعنا نستورد البيانات إلى الباندا dataframe الهيكل ، وألق نظرة على صفوفه الخمسة الأولى بامتداد head() الأسلوب.

لاحظ أنه يتم حفظ البيانات بتنسيق txt (نص) ، مفصولاً بفاصلات ، وبدون رأس. يمكننا إعادة بنائه كجدول من خلال قراءته على أنه ملف csv، مع تحديد separator كفاصلة وإضافة أسماء الأعمدة بامتداد names جدال.

دعنا نتبع هذه الخطوات الثلاث في وقت واحد ، ثم نلقي نظرة على الصفوف الخمسة الأولى من البيانات:

import pandas as pd 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()

وينتج عنه:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

ملحوظة: يمكنك أيضًا حفظ البيانات محليًا واستبدالها data_link For data_path، وقم بتمرير المسار إلى ملفك المحلي.

يمكننا أن نرى أن هناك خمسة أعمدة في مجموعة البيانات لدينا ، وهي variance, skewness, curtosis, entropyو class. في الصفوف الخمسة ، تمتلئ الأعمدة الأربعة الأولى بأرقام مثل 3.62160 ، 8.6661 ، -2.8073 أو متواصل القيم ، والأخير class يحتوي العمود على صفوفه الخمسة الأولى المملوءة بالأصفار ، أو أ منفصل .

نظرًا لأن هدفنا هو التنبؤ بما إذا كانت ورقة العملة البنكية أصلية أم لا ، فيمكننا القيام بذلك بناءً على السمات الأربع للملاحظة:

  • variance من صورة Wavelet Transformed. بشكل عام ، التباين هو قيمة مستمرة تقيس مدى قرب أو بعد نقاط البيانات من متوسط ​​قيمة البيانات. إذا كانت النقاط أقرب إلى متوسط ​​قيمة البيانات ، فإن التوزيع يكون أقرب إلى التوزيع الطبيعي ، مما يعني عادةً أن قيمها موزعة بشكل أفضل ويسهل التنبؤ بها إلى حد ما. في سياق الصورة الحالي ، هذا هو تباين المعاملات التي تنتج من تحويل المويجات. كلما قل التباين ، كلما اقتربت المعاملات من ترجمة الصورة الفعلية.

  • skewness من Wavelet Transformed image. الانحراف هو قيمة مستمرة تشير إلى عدم تناسق التوزيع. إذا كان هناك المزيد من القيم على يسار المتوسط ​​، فسيكون التوزيع سلبيا منحرف، إذا كان هناك المزيد من القيم على يمين الوسط ، فسيكون التوزيع انحراف إيجابي، وإذا كان الوسط والوضع والوسيط متماثلين ، فسيكون التوزيع كان الشكل أكثر تماثلا. كلما كان التوزيع أكثر تناسقًا ، كلما كان أقرب إلى التوزيع الطبيعي ، مع توزيع قيمه بشكل أفضل. في السياق الحالي ، هذا هو الانحراف في المعاملات التي تنتج من التحويل المويجي. كلما كان التناظر أكثر ، كلما اقتربنا من المعاملاتvariance, skewness, curtosis, entropyإعادة ترجمة الصورة الفعلية.

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

  • curtosis (أو التفرطح) لصورة Wavelet Transformed. التفرطح هو قيمة مستمرة تصف أيضًا شكل التوزيع ، مثل الانحراف. اعتمادًا على معامل التفرطح (k) ، يمكن أن يكون التوزيع - عند مقارنته بالتوزيع الطبيعي مسطحًا إلى حد ما - أو يحتوي على بيانات أكثر أو أقل في أطرافه أو ذيوله. عندما يكون التوزيع أكثر انتشارًا وتملقًا ، يتم استدعاؤه بلاتيكورتيك؛ عندما يكون أقل انتشارًا وأكثر تركيزًا في الوسط ، ميسوكورتيك؛ وعندما يتركز التوزيع بالكامل تقريبًا في الوسط ، يطلق عليه ليبتوكورتيك. هذه هي نفس حالة التباين والالتواء في الحالات السابقة ، فكلما كان التوزيع أكثر دقة ، كلما اقتربت المعاملات من ترجمة الصورة الفعلية.

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

  • entropy من الصورة. الانتروبيا هي أيضًا قيمة مستمرة ، وعادةً ما تقيس العشوائية أو الفوضى في النظام. في سياق الصورة ، يقيس الانتروبيا الفرق بين البكسل والبكسل المجاور له. بالنسبة لسياقنا ، فكلما زاد الانتروبيا في المعاملات ، زادت الخسارة عند تحويل الصورة - وكلما صغر الانتروبيا ، قل فقدان المعلومات.

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

المتغير الخامس كان class متغير ، والذي ربما يحتوي على قيم 0 و 1 ، يشير إلى ما إذا كانت الملاحظة حقيقية أم مزورة.

يمكننا التحقق مما إذا كان العمود الخامس يحتوي على أصفار وآحاد مع Pandas unique() الأسلوب:

bankdata['class'].unique()

الطريقة أعلاه تعيد:

array([0, 1]) 

تقوم الطريقة أعلاه بإرجاع مصفوفة ذات قيم 0 و 1. هذا يعني أن القيم الوحيدة الموجودة في صفوف الفصل لدينا هي الأصفار والآحاد. إنه جاهز للاستخدام كملف الهدف في التعلم الخاضع للإشراف لدينا.

  • class من الصورة. هذه قيمة عددية ، تكون 0 عندما تكون الصورة مزورة ، و 1 عندما تكون الصورة حقيقية.

نظرًا لأن لدينا عمودًا يحتوي على التعليقات التوضيحية للصور الحقيقية والمنسية ، فهذا يعني أن نوع التعلم لدينا هو أشرف.

المشورة: لمعرفة المزيد حول الأسباب الكامنة وراء تحويل Wavelet على صور الأوراق النقدية واستخدام SVM ، اقرأ الورقة المنشورة للمؤلفين.

يمكننا أيضًا معرفة عدد السجلات ، أو الصور التي لدينا ، من خلال النظر في عدد الصفوف في البيانات عبر ملف shape خاصية:

bankdata.shape

هذا ينتج:

(1372, 5)

السطر أعلاه يعني أن هناك 1,372،5 صفًا من صور الأوراق النقدية المحولة ، و XNUMX أعمدة. هذه هي البيانات التي سنحللها.

لقد قمنا باستيراد مجموعة البيانات الخاصة بنا وقمنا ببعض عمليات التحقق. الآن يمكننا استكشاف بياناتنا لفهمها بشكل أفضل.

استكشاف مجموعة البيانات

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

لمعرفة النسبة ، يمكننا حساب كل من القيم الصفرية والواحدة في البيانات value_counts() الأسلوب:

bankdata['class'].value_counts()

هذا ينتج:

0 762
1 610
Name: class, dtype: int64

في النتيجة أعلاه ، يمكننا أن نرى أن هناك 762 صفرًا و 610 آحادًا ، أو 152 أكثر من الآحاد. هذا يعني أن لدينا المزيد من الصور الحقيقية المزيفة ، وإذا كان هذا التناقض أكبر ، على سبيل المثال ، 5500 أصفار و 610 آحاد ، فقد يؤثر ذلك سلبًا على نتائجنا. بمجرد أن نحاول استخدام هذه الأمثلة في نموذجنا - فكلما زاد عدد الأمثلة الموجودة ، عادة ما يعني أنه كلما زادت المعلومات التي سيتعين على النموذج أن يقررها بين الملاحظات المزورة أو الحقيقية - إذا كان هناك عدد قليل من أمثلة الملاحظات الحقيقية ، يكون النموذج عرضة لأن يكون مخطئ عند محاولة التعرف عليهم.

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

الخطوة الأولى هي استخدام الباندا value_counts() مرة أخرى ، ولكن الآن دعونا نرى النسبة المئوية بتضمين الوسيطة normalize=True:

bankdata['class'].value_counts(normalize=True)

normalize=True يحسب النسبة المئوية للبيانات لكل فئة. حتى الآن ، النسبة المئوية للبيانات المزورة (0) والحقيقية (1) هي:

0 0.555394
1 0.444606
Name: class, dtype: float64

هذا يعني أن ما يقرب من (~) 56٪ من مجموعة البيانات لدينا مزورة و 44٪ منها حقيقية. هذا يعطينا نسبة 56٪ -44٪ ، وهو نفس الفرق بنسبة 12٪. يعتبر هذا فرقًا بسيطًا من الناحية الإحصائية ، لأنه يزيد قليلاً عن 10٪ ، لذلك تعتبر البيانات متوازنة. إذا كانت هناك نسبة 56:44 أو 80:20 بدلاً من نسبة 70:30 ، فسيتم اعتبار بياناتنا غير متوازنة ، وسنحتاج إلى معالجة بعض الاختلالات ، لكن لحسن الحظ ، ليس هذا هو الحال.

يمكننا أيضًا رؤية هذا الاختلاف بصريًا ، من خلال إلقاء نظرة على توزيع الفئة أو الهدف باستخدام الرسم البياني المشبع من Pandas ، باستخدام:

bankdata['class'].plot.hist();

هذا يرسم مدرج تكراري باستخدام بنية إطار البيانات مباشرة ، بالاقتران مع matplotlib مكتبة وراء الكواليس.

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

من خلال النظر إلى الرسم البياني ، يمكننا التأكد من أن قيمنا المستهدفة إما 0 أو 1 وأن ​​البيانات متوازنة.

كان هذا تحليلًا للعمود الذي كنا نحاول التنبؤ به ، ولكن ماذا عن تحليل الأعمدة الأخرى لبياناتنا؟

يمكننا إلقاء نظرة على القياسات الإحصائية باستخدام describe() طريقة إطار البيانات. يمكننا أيضًا استخدام ملفات .T of Transpose - لعكس الأعمدة والصفوف ، مما يجعل المقارنة عبر القيم أكثر مباشرة:

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

bankdata.describe().T

وينتج عنه:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

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

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

لنبدأ بتوزيع كل ميزة ، ونرسم الرسم البياني لكل عمود بيانات باستثناء class عمود. ال class لن يتم أخذ العمود في الاعتبار من خلال موقعه في مصفوفة أعمدة بيانات البنوك. سيتم تحديد جميع الأعمدة باستثناء العمود الأخير الذي يحتوي على columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

بعد تشغيل الكود أعلاه ، يمكننا أن نرى كلاهما skewness و entropy توزيعات البيانات منحرفة بشكل سلبي و curtosis منحرف بشكل إيجابي. جميع التوزيعات متناظرة و variance هو التوزيع الوحيد القريب من الوضع الطبيعي.

يمكننا الآن الانتقال إلى الجزء الثاني ، ورسم مخطط التشتت لكل متغير. للقيام بذلك ، يمكننا أيضًا تحديد جميع الأعمدة باستثناء الفئة ، مع columns[:-1]، استخدم Seaborn scatterplot() وحلقتان للحصول على الاختلافات في الاقتران لكل ميزة. يمكننا أيضًا استبعاد إقران ميزة مع نفسها ، عن طريق اختبار ما إذا كانت الميزة الأولى تساوي الثانية مع if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

لاحظ أن جميع الرسوم البيانية تحتوي على نقاط بيانات حقيقية ومزورة لا تنفصل بوضوح عن بعضها البعض ، وهذا يعني أن هناك نوعًا من التراكب في الفئات. نظرًا لأن نموذج SVM يستخدم خطًا للفصل بين الفئات ، فهل يمكن فصل أي من هذه المجموعات في الرسوم البيانية باستخدام سطر واحد فقط؟ يبدو من غير المحتمل. هذا ما تبدو عليه معظم البيانات الحقيقية. أقرب ما يمكننا الوصول إليه للفصل هو الجمع بين skewness و varianceالطرق أو entropy و variance المؤامرات. ربما يكون هذا بسبب variance البيانات التي لها شكل توزيع أقرب إلى العادي.

لكن النظر إلى كل هذه الرسوم البيانية بالتسلسل قد يكون صعبًا بعض الشيء. لدينا بديل للنظر في جميع الرسوم البيانية للتوزيع والمخطط المبعثر معًا باستخدام Seaborn's pairplot().

يمكن استبدال كلتا حلقات for السابقة التي قمنا بها بهذا السطر فقط:

sns.pairplot(bankdata, hue='class');

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

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

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

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

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

تنفيذ SVM باستخدام Scikit-Learn

قبل التعمق أكثر في نظرية كيفية عمل SVM ، يمكننا بناء أول نموذج أساسي لدينا باستخدام البيانات ، و Scikit-Learn's دعم مصنف النواقل or SVC فئة.

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

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

يقول بعض الناس أن التقييم هو تلك المجموعة الوسيطة ، والبعض الآخر سيقول أن مجموعة الاختبار هي المجموعة الوسيطة ، وأن مجموعة التقييم هي المجموعة النهائية. هذه طريقة أخرى لمحاولة ضمان أن النموذج لا يرى نفس المثال بأي شكل من الأشكال ، أو نوعًا ما تسرب البيانات لا يحدث ، وأن هناك تعميمًا للنموذج من خلال تحسين آخر مجموعة مقاييس. إذا كنت تريد اتباع هذا النهج ، فيمكنك تقسيم البيانات مرة أخرى كما هو موضح في هذا تدريب Scikit-Learn's train_test_split () - مجموعات التدريب والاختبار والتحقق من الصحة يرشد.

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

في الجلسة السابقة ، فهمنا البيانات واستكشفناها. الآن ، يمكننا تقسيم بياناتنا إلى صفيفتين - واحدة للميزات الأربعة ، والأخرى للميزة الخامسة أو الهدف. نظرًا لأننا نريد التنبؤ بالفئة اعتمادًا على معاملات المويجات ، فإن لدينا y سيكون ال class العمود ولدينا X سوف variance, skewness, curtosisو entropy الأعمدة.

لفصل الهدف والميزات ، يمكننا أن ننسب فقط class العمود ل y، وإسقاطه لاحقًا من إطار البيانات لإسناد الأعمدة المتبقية إليه X مع .drop() الأسلوب:

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

بمجرد تقسيم البيانات إلى سمات وتسميات ، يمكننا تقسيمها إلى مجموعات تدريب واختبار. يمكن أن يتم ذلك باليد ، ولكن model_selection تحتوي مكتبة Scikit-Learn على ملف train_test_split() الطريقة التي تسمح لنا بتقسيم البيانات بشكل عشوائي إلى مجموعات تدريب واختبار.

لاستخدامها ، يمكننا استيراد المكتبة والاتصال ب train_test_split() طريقة تمرير X و y البيانات وتحديد ملف test_size لتمريرها كحجة. في هذه الحالة ، سوف نحددها على أنها 0.20- هذا يعني أن 20٪ من البيانات ستستخدم للاختبار ، و 80٪ أخرى للتدريب.

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

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

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

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

لاحظ أن train_test_split() طريقة إرجاع بالفعل X_train, X_test, y_train, y_test مجموعات بهذا الترتيب. يمكننا طباعة عدد العينات المنفصلة للتدريب والاختبار عن طريق الحصول على أول (0) عنصر من shape إرجاع الخاصية tuple:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

وهذا يدل على أن هناك 1097 عينة للتدريب و 275 عينة للاختبار.

تدريب النموذج

لقد قسمنا البيانات إلى مجموعات تدريب واختبار. حان الوقت الآن لإنشاء نموذج SVM وتدريبه على بيانات القطار. للقيام بذلك ، يمكننا استيراد Scikit-Learn's svm مكتبة جنبا إلى جنب مع دعم مصنف النواقل فئة ، أو SVC فئة.

بعد استيراد الفصل ، يمكننا إنشاء مثيل له - نظرًا لأننا نقوم بإنشاء نموذج SVM بسيط ، فإننا نحاول فصل بياناتنا خطيًا ، حتى نتمكن من رسم خط لتقسيم بياناتنا - وهو نفس استخدام دالة خطية - بالتعريف kernel='linear' كحجة للمصنف:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

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

يمكننا تنفيذ الكود التالي لتدريب النموذج:

svc.fit(X_train, y_train)

تمامًا مثل هذا ، يتم تدريب النموذج. حتى الآن ، فهمنا البيانات ، وقمنا بتقسيمها ، وإنشاء نموذج SVM بسيط ، وتركيب النموذج لبيانات القطار.

تتمثل الخطوة التالية في فهم مدى نجاح ذلك في وصف بياناتنا. بمعنى آخر ، للإجابة عما إذا كان SVM الخطي خيارًا مناسبًا.

يتنبأ

هناك طريقة للإجابة على ما إذا كان النموذج قد تمكن من وصف البيانات هو الحساب والنظر إلى بعض التصنيفات المقاييس.

بالنظر إلى أن التعلم خاضع للإشراف ، يمكننا عمل تنبؤات باستخدام X_test وقارن نتائج التوقع - التي قد نسميها y_pred - مع الواقع y_testالطرق أو الحقيقة الأرض.

للتنبؤ ببعض البيانات ، فإن النموذج predict() يمكن استخدام الطريقة. تستقبل هذه الطريقة ميزات الاختبار ، X_test، كوسيطة وإرجاع توقع ، إما 0 أو 1 ، لكل واحد من X_testصفوف.

بعد توقع X_test البيانات ، يتم تخزين النتائج في ملف y_pred عامل. لذلك فإن كل فئة من الفئات التي تم توقعها باستخدام نموذج SVM الخطي البسيط موجودة الآن في y_pred المتغير.

هذا هو رمز التنبؤ:

y_pred = svc.predict(X_test)

بالنظر إلى أن لدينا التنبؤات ، يمكننا الآن مقارنتها بالنتائج الفعلية.

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

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

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

  2. دقة: عندما يكون هدفنا هو فهم قيم التنبؤ الصحيحة التي اعتبرها المصنف صحيحًا. ستقسم الدقة تلك القيم الإيجابية الحقيقية على العينات التي تم توقعها على أنها إيجابية ؛

$$
الدقة = فارك {النص {الإيجابيات الحقيقية}} {النص {الإيجابيات الحقيقية} + النص {الإيجابيات الخاطئة}}
$$

  1. تذكر: تُحسب بشكل شائع جنبًا إلى جنب مع الدقة لفهم عدد الإيجابيات الحقيقية التي حددها المصنف لدينا. يتم حساب الاسترجاع بقسمة الإيجابيات الحقيقية على أي شيء كان ينبغي توقعه على أنه إيجابي.

$$
الاستدعاء = frac {النص {الإيجابيات الحقيقية}} {النص {الإيجابيات الحقيقية} + النص {السلبيات الكاذبة}}
$$

  1. نتيجة F1: هو متوازن ام الوسط التوافقي من الدقة والاستدعاء. أدنى قيمة هي 0 وأعلى قيمة هي 1. متى f1-score تساوي 1 ، فهذا يعني أنه تم توقع جميع الفئات بشكل صحيح - هذه درجة صعبة للغاية للحصول عليها باستخدام بيانات حقيقية (توجد استثناءات دائمًا تقريبًا).

$$
text {f1-score} = 2 * frac {text {دقة} * نص {استدعاء}} {نص {دقة} + نص {استدعاء}}
$$

لقد تعرفنا بالفعل على مصفوفة الارتباك والدقة والاستدعاء ومقاييس درجة F1. لحسابها ، يمكننا استيراد Scikit-Learn metrics مكتبة. تحتوي هذه المكتبة على ملف classification_report و confusion_matrix طريقة تقرير التصنيف بإرجاع الدقة والاستدعاء والنتيجة f1. كلاهما classification_report و confusion_matrix يمكن استخدامها بسهولة لمعرفة القيم لجميع هذه المقاييس المهمة.

لحساب المقاييس ، نقوم باستيراد الطرق ، وندعوها وتمرير التصنيفات المتوقعة كوسيطات ، y_test، وتسميات التصنيف ، أو y_true.

للحصول على تصور أفضل لمصفوفة الارتباك ، يمكننا رسمها في Seaborn's heatmap جنبًا إلى جنب مع التعليقات التوضيحية المتعلقة بالكمية ، وبالنسبة لتقرير التصنيف ، فمن الأفضل طباعة نتائجه ، بحيث يتم تنسيق نتائجه. هذا هو الكود التالي:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

يعرض هذا:

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

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

في تقرير التصنيف ، نعلم أن هناك دقة تبلغ 0.99 ، واسترجاع 0.99 ودرجة f1 تبلغ 0.99 للملاحظات المزورة ، أو الفئة 0. وقد تم الحصول على هذه القياسات باستخدام 148 عينة كما هو موضح في عمود الدعم. وفي الوقت نفسه ، بالنسبة للفئة 1 ، أو الملاحظات الحقيقية ، كانت النتيجة وحدة واحدة أقل ، و 0.98 من الدقة ، و 0.98 للتذكر ، ونفس الدرجة f1. هذه المرة ، تم استخدام 127 قياسًا للصورة للحصول على تلك النتائج.

إذا نظرنا إلى مصفوفة الارتباك ، يمكننا أيضًا أن نرى أنه من 148 عينة من الفئة 0 ، تم تصنيف 146 بشكل صحيح ، وكان هناك 2 من الإيجابيات الخاطئة ، بينما بالنسبة لـ 127 عينة من الفئة 1 ، كان هناك سلبيتان خاطئتان و 2 إيجابيًا حقيقيًا.

يمكننا قراءة تقرير التصنيف ومصفوفة الارتباك ولكن ماذا يعنيان؟

تفسير النتائج

لمعرفة المعنى ، دعنا نلقي نظرة على جميع المقاييس مجتمعة.

تم تصنيف جميع عينات الفئة 1 تقريبًا بشكل صحيح ، وكان هناك خطأان في نموذجنا عند تحديد الأوراق النقدية الفعلية. هذا هو نفسه 2 ، أو 0.98٪ ، أذكر. يمكن قول شيء مشابه عن الفئة 98 ، تم تصنيف عينتين فقط بشكل غير صحيح ، في حين تم تصنيف 0 عينة سلبية حقيقية ، بإجمالي دقة 2٪.

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

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

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

للتنبؤ ببيانات القطار ، يمكننا تكرار ما فعلناه لبيانات الاختبار ، ولكن الآن مع X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

هذا ينتج:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

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

من السهل أن ترى أنه يبدو أن هناك فائضًا ، بمجرد أن تكون مقاييس القطار 99٪ عندما يكون لديك 4 أضعاف البيانات. ما الذي يمكن عمله في هذا السيناريو؟

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

يمكنك التحقق من الجزء الثاني من هذا الدليل (قريبا!) لمعرفة كيفية تنفيذ التحقق المتقاطع وإجراء ضبط للمعلمة الفائقة.

وفي الختام

في هذه المقالة درسنا النواة الخطية البسيطة SVM. لقد حصلنا على الحدس وراء خوارزمية SVM ، واستخدمنا مجموعة بيانات حقيقية ، واستكشفنا البيانات ، ورأينا كيف يمكن استخدام هذه البيانات مع SVM من خلال تنفيذها مع مكتبة Python Scikit-Learn.

للاستمرار في التمرين ، يمكنك تجربة مجموعات البيانات الواقعية الأخرى المتوفرة في أماكن مثل Kaggle, UCI, مجموعات البيانات العامة Big Queryوالجامعات والمواقع الحكومية.

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

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

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