فهم المعلمات التشعبية SVM

فهم المعلمات التشعبية SVM

المُقدّمة

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

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

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

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

2. فهم المعلمات التشعبية SVM

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

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

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

لنتعلم كيفية تنفيذ التحقق المتقاطع وإجراء ضبط للمعلمة الفائقة.

المعلمات الفائقة SVM

لرؤية جميع معلمات النموذج التي تم تعيينها بالفعل بواسطة Scikit-Learn وقيمها الافتراضية ، يمكننا استخدام get_params() الأسلوب:

svc.get_params()

تعرض هذه الطريقة:

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

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

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

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

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

عندما يتم اختيار هذه الهوامش ، فإن المعلمة التي تحددها هي C المعلمة.

C Hyperparameter

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

فهم معلمات SVM الفائقة وذكاء بيانات PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

يمكننا تجربة ملف الأصغر قيمة "C" وفهم عمليًا ما يحدث مع a هامش أكبر. للقيام بذلك ، سننشئ مصنفًا جديدًا ، svc_c، وتغيير فقط قيمة C إلى 0.0001. دعنا نكرر أيضًا fit و predict خطوات:

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

يمكننا الآن إلقاء نظرة على نتائج بيانات الاختبار:

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

هذا ينتج:

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

فهم معلمات SVM الفائقة وذكاء بيانات PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

باستخدام أصغر C والحصول على هامش أكبر ، أصبح المصنف أكثر مرونة ومع وجود المزيد من أخطاء التصنيف. في تقرير التصنيف ، يمكننا أن نرى أن f1-score، الذي كان سابقًا 0.99 لكلا الفئتين ، انخفض إلى 0.88 للفئة 0 ، وإلى 0.84 للفئة 1. في مصفوفة الارتباك ، انتقل النموذج من 2 إلى 6 إيجابيات خاطئة ، ومن 2 إلى 31 سلبية كاذبة.

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

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

وينتج عنه:

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

فهم معلمات SVM الفائقة وذكاء بيانات PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

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

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

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

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

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

معلمة غاما Hyperparameter

يمكن اختيار حدود القرار اللانهائية ، وبعض هذه الحدود ستفصل بين الفئات والبعض الآخر لن يفصل. عند اختيار حد قرار فعال ، هل يجب مراعاة أول 10 نقاط أقرب من كل فئة؟ أم ينبغي النظر في المزيد من النقاط ، بما في ذلك النقاط البعيدة؟ في SVM ، يتم تحديد اختيار النطاق هذا بواسطة معلمة تشعبية أخرى ، gamma.

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

فهم معلمات SVM الفائقة وذكاء بيانات PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

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

فهم معلمات SVM الفائقة وذكاء بيانات PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

في حالة نموذجنا ، القيمة الافتراضية لـ gamma وكان scale. كما يمكن رؤيته في ملف وثائق Scikit-Learn SVC، فهذا يعني أن قيمتها هي:

$$
جاما = (1 / نص {n_features} * X.var ())
$$

or

$$
جاما = (1 / نص {number_of_features} * نص {features_variance})
$$

في حالتنا ، نحتاج إلى حساب التباين X_train، اضربها في 4 وقسم النتيجة على 1. يمكننا القيام بذلك باستخدام الكود التالي:

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

هذا ينتج:

gamma: 0.013924748072859962

هناك أيضًا طريقة أخرى للنظر إلى قيمة gamma، من خلال الوصول إلى كائن المصنف gamma مع المعلمة ._gamma:

svc._gamma 

يمكننا أن نرى أن gamma المستخدم في المصنف الخاص بنا كان منخفضًا ، لذا فقد اعتبر أيضًا النقاط البعيدة.

ملاحظات: كما رأينا، C و gamma مهمة لبعض تعريفات النموذج. معلمة أخرى ، random_state، غالبًا في Scikit Learn لضمان خلط البيانات أو بذرة عشوائية للنماذج ، لذلك لدينا دائمًا نفس النتائج ، ولكن هذا يختلف قليلاً بالنسبة لـ SVM. على وجه الخصوص ، random_state له آثار فقط إذا كانت هناك معلمة تشعبية أخرى ، probability، على صواب. هذا لأنه سيتم خلط البيانات للحصول على تقديرات الاحتمالية. إذا كنا لا نريد تقديرات احتمالية لفئاتنا وتم تعيين الاحتمالية على false ، فإن SVM's random_state المعلمة ليس لها آثار على نتائج النموذج.

لا توجد قاعدة حول كيفية اختيار القيم للمعلمات الفائقة ، مثل C و gamma - ستعتمد على المدة والموارد المتاحة لتجربة قيم مختلفة للمعلمات الفائقة ، والتحولات التي يمكن إجراؤها على البيانات ، والنتائج المتوقعة . الطريقة المعتادة للبحث عن قيم المعامل التشعبي هي عن طريق الجمع بين كل من القيم المقترحة من خلال a بحث الشبكة جنبًا إلى جنب مع الإجراء الذي يطبق قيم المعلمات الفائقة ويحصل على مقاييس لأجزاء مختلفة من البيانات تسمى عبر المصادقة. في Scikit-Learn ، تم تنفيذ هذا بالفعل باسم GridSearchCV (السيرة الذاتية من التحقق من الصحة).

لإجراء بحث في الشبكة مع التحقق المتقاطع ، نحتاج إلى استيراد ملف GridSearchCV، حدد قاموسًا بقيم المعلمات التشعبية التي سيتم تجربتها ، مثل نوع kernel، النطاق لـ Cولل gamma، قم بإنشاء مثيل لـ SVC، تعريف score أو مقياس سيتم استخدامه للتقييم (هنا سنختار التحسين لكل من الدقة والاسترجاع ، لذلك سنستخدم f1-score) ، عدد الأقسام التي سيتم إجراؤها في البيانات لتشغيل البحث فيها cv - الافتراضي هو 5 ، ولكن من الممارسات الجيدة استخدام 10 على الأقل - هنا ، سنستخدم 5 طيات بيانات لتوضيح الأمر عند مقارنة النتائج.

GridSearchCV لديها fit الطريقة التي تتلقى بيانات القطار الخاصة بنا وتقسيمها بشكل أكبر في مجموعات القطار والاختبار للتحقق المتقاطع. يمكننا أن نضع return_train_score إلى الصواب لمقارنة النتائج والتأكد من عدم وجود فائض.

هذا هو رمز البحث الشبكي مع التحقق المتقاطع:

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

ينتج هذا الرمز:

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

بعد إجراء البحث في المعامل التشعبي ، يمكننا استخدام ملحق best_estimator_, best_params_ و best_score_ خصائص للحصول على أفضل نموذج وقيم معلمات وأعلى درجة f1:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

وينتج عنه:

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

بتأكيد تخميننا الأولي من خلال النظر إلى البيانات ، فإن أفضل نموذج لا يحتوي على نواة خطية ، بل نواة غير خطية ، RBF.

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

يبلغ قطر كلاً من C و gamma لها قيمة 1 ، و f1-score مرتفع جدًا ، 0.99. نظرًا لأن القيمة عالية ، دعنا نرى ما إذا كان هناك زيادة في الأداء من خلال إلقاء نظرة خاطفة على متوسط ​​درجات الاختبار والقطار التي أعادناها ، داخل cv_results_ موضوع:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

كانت الدرجات المتوسطة:

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

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

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

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

وفي الختام

في هذه المقالة ، فهمنا المعلمات الافتراضية وراء تنفيذ SVM لـ Scikit-Learn. لقد فهمنا ماهية معلمات C و Gamma ، وكيف يمكن أن يؤثر تغيير كل منها على نموذج SVM.

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

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

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

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