الـ SVM في التطبيق
النظرية نص الحكاية بس. دلوقتي هندرّب ونظبط ونقيّم SVMs حقيقية باستخدام scikit-learn — من البيانات الخام لحد classifier شغّال.
اعمل scaling للبيانات دايمًا
الـ SVMs مش محايدة ناحية المقياس — المسافات هي اللي بتسوق الـ margin. اعمل الـ scaling دايمًا جوه Pipeline عشان تتجنّب الـ data leakage (تسرب البيانات).
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
الـ API بتاع SVC
- kernel —
'rbf'افتراضيًا،'linear'،'poly' - C — قوة الـ regularization (1.0 افتراضيًا)
- gamma — الـ bandwidth بتاع RBF (
'scale'افتراضيًا) - probability — يشغّل الـ Platt scaling (أبطأ)
- class_weight —
'balanced'للبيانات اللي مش متوازنة
الـ cross-validation
تقسيمة واحدة بتدّي تقديرات فيها noise. الـ k-fold CV (التحقق المتقاطع) بياخد المتوسط على k fold على جنب — كل نقطة بيانات بتتختبر مرة واحدة.
الـ folds المتوازنة
- استخدم StratifiedKFold عشان تحافظ على نسب الفئات
- اعمل shuffle قبل التقسيم (ظبط random_state)
- 5 أو 10 folds هو المعيار
- درّب الـ preprocessing جوه كل fold عن طريق Pipeline
- بلّغ بالمتوسط ± الـ standard deviation على الـ folds
الـ grid search
C وγ بيتفاعلوا — ظبطهم مع بعض، مش كل واحد لوحده. دوّر على مقياس لوغاريتمي: {0.01، 0.1، 1، 10، 100}.
الـ trade-offs بتوع C وγ
- C كبير — margin صغير، أخطاء قليلة مسموحة ← خطر overfitting
- C صغير — margin واسع، أخطاء أكتر ← خطر underfitting
- γ كبير — جرس RBF ضيق → حد متعرّج
- γ صغير — جرس RBF واسع → حد ناعم
- C كبير + γ كبير = overfitting
metrics التقييم
- الـ precision (الإحكام) — من الـ positives المتوقعة، كام منها صح؟
- الـ recall (الاستدعاء) — من الـ positives الحقيقية، مسكنا كام؟
- F1 — الوسط التوافقي للـ precision والـ recall
- الـ confusion matrix (مصفوفة الالتباس) — تفصيل كامل لـ TP/FP/TN/FN
- الـ accuracy بتضلّل على الفئات اللي مش متوازنة
الـ Platt scaling
خلّي probability=True عشان تاخد احتمالات متعايرة. الـ Platt scaling (تحجيم Platt) بيدرّب logistic sigmoid فوق درجات القرار بتاعة الـ SVM.
أبعد من الثنائي
- multi-class — الـ SVM ثنائي؛
SVCبيعمل fit one-vs-one، K(K−1)/2 model، وتصويت أغلبية - one-vs-rest — الافتراضي في
LinearSVC: K models، واحد لكل فئة، والأعلى درجة بيكسب - SVR — regression عن طريق أنبوبة ε-insensitive؛ الأخطاء جوه ±ε مبتكلّفش حاجة
- الـ support vectors = النقط اللي على الأنبوبة أو بره؛ نفس الـ kernels وC زي SVC
- LinearSVC بيكبر للملايين (LIBLINEAR، O(n)) — النصوص، البيولوجيا، البيانات الـ sparse
الفخاخ العملية
- الـ scaling بره الـ Pipeline → data leakage
- البحث الخطي عن C وγ → بتفوّت الأمثل
- تجاهل تحذيرات التقارب ← model مش صالح
- استخدام الـ accuracy على بيانات مش متوازنة ← مضلّل
- ظبط C وγ كل واحد لوحده → أقل من الأمثل
- نسيان class_weight على الفئات اللي مش متوازنة
اتعلّمت إيه
اعمل scaling للـ features جوه Pipeline. ظبط C وγ مع بعض بـ grid search لوغاريتمي. استخدم StratifiedKFold. قيّم بالـ F1 والـ confusion matrix. وللبيانات الكبيرة، استخدم LinearSVC. الوحدة 4 خلصت!