পাঠ ২৮ · ৪৫-এর মধ্যে · মডিউল ৪
Home / AI Courses / Machine Learning / Soft-margin SVM

Soft-margin SVM

Slack variables, the C parameter, and hinge loss
৭ মিনিট পড়া মাঝারি · Intermediate sklearn

এই পাঠে যা শিখবেন

  • কেন hard-margin বাস্তবে কাজ করে না — overlap, outlier, noise
  • Slack variable $\xi_i$-এর geometric meaning — প্রতিটি violation-এর "মাত্রা"
  • C hyperparameter-এর ভূমিকা — bias-variance trade-off-এর knob
  • Hinge loss + L2 — soft-margin SVM-এর equivalent rewriting
  • scikit-learn-এ SVC(C=...) ও LinearSVC — কখন কোনটি

১ · Hard-margin কেন বাস্তবে অচল

L27-এ আমরা ধরে নিয়েছিলাম দু'টি class linearly separable। বাস্তবে এটা প্রায় কখনোই সত্য নয়। ভাবুন bKash-এর fraud detection — বেশির ভাগ fraud-হীন transaction এক জায়গায়, কিছু fraud আলাদা — কিন্তু সীমান্তে অসংখ্য overlap। এই overlap কখনোই সরল রেখা দিয়ে আলাদা করা যাবে না।

Hard-margin তিন কারণে fail করে:

  • Infeasibility: overlap থাকলে কোনো $\mathbf{w}, b$ সব constraint মানতে পারে না — solver fail।
  • Outlier sensitivity: একটি ভুল-labeled point পুরো margin সংকীর্ণ করে — model degraded।
  • Overfitting: noisy training data-কে একদম "ঠিক" classify করতে চাইলে boundary বিকৃত হয় — test-এ পারফরম্যান্স পড়ে।
Soft-margin idea

Cortes ও Vapnik (১৯৯৫) প্রস্তাব করলেন — "প্রতিটি point-কে নিজ side-এ থাকতে হবে" এই কঠিন শর্ত শিথিল করুন। বরং একটি slack $\xi_i \geq 0$ যোগ করুন — কতটা violation মেনে নিতে রাজি, এবং সেই violation-এর জন্য একটি cost দিন। এর ফলে infeasibility দূর হয় এবং model outlier-প্রতিরোধী হয়।

২ · Slack variable — geometric meaning

প্রতিটি point-এ একটি $\xi_i \geq 0$ যোগ:

$$y_i (\mathbf{w}^\top \mathbf{x}_i + b) \geq 1 - \xi_i$$

$\xi_i$-এর তিন অবস্থা:

  • $\xi_i = 0$: point margin-এর বাইরে সঠিক side-এ। Constraint কড়াকড়িতে মানা।
  • $0 < \xi_i \leq 1$: point margin-এর মধ্যে কিন্তু সঠিক side-এ এখনো। "Margin violation" কিন্তু classification ঠিক।
  • $\xi_i > 1$: point ভুল side-এ — misclassified।
ভাবুন একটি ক্লাস টেস্ট — পূর্ণ মান ১০। সবাইকে বলা হয়েছিল ১০ পেতেই হবে (hard-margin)। অনেকেই পারল না। শিক্ষক নরম হয়ে বললেন — "যা পেলে না, সেটা $\xi_i$ — কিন্তু ৫-এর কম পেলে fail (margin-এ ভেতরে), ০-এর কম মানে ভুল উত্তর (wrong side)।" $\xi_i$ যত বড়, পেনাল্টি তত। কিন্তু কেউ একদম ফেল হলেও exam scrap হবে না — সেটাই soft-margin-এর শক্তি।

৩ · Soft-margin objective

Slack-এ penalty যোগ করে নতুন objective:

$$\min_{\mathbf{w}, b, \boldsymbol{\xi}} \;\; \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} \xi_i$$

$$\text{s.t. } \;\; y_i (\mathbf{w}^\top \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0$$

দু'টি term-এর টানাটানি:

  • $\tfrac{1}{2}\|\mathbf{w}\|^2$ — margin বড় রাখার ইচ্ছা।
  • $C \sum \xi_i$ — violation কমানোর ইচ্ছা।
  • $C$ এই দু'য়ের মধ্যে weight — হাইপারপ্যারামিটার।

৪ · C-এর প্রভাব

$C$ একটি regularization-এর বিপরীত dial:

  • $C \to \infty$: violation-এ বিশাল penalty — model hard-margin-এর কাছে যায়। Overfit হতে পারে — outlier-এ sensitive।
  • $C \to 0$: violation-এ low penalty — model অনেক slack accept করে। Margin খুব চওড়া কিন্তু underfit।
  • মাঝামাঝি $C$: sweet spot — cross-validation দিয়ে বাছাই।

Practical heuristic: $C \in \{0.01, 0.1, 1, 10, 100\}$ — log-scale grid search। sklearn-এর default $C=1.0$।

৫ · Hinge loss — equivalent rewriting

Constraint থেকে $\xi_i = \max(0, 1 - y_i (\mathbf{w}^\top \mathbf{x}_i + b))$ — এটাই minimum slack। প্রতিস্থাপন করলে objective:

$$\min_{\mathbf{w}, b} \;\; \underbrace{\frac{1}{2} \|\mathbf{w}\|^2}_{\text{L2 reg}} + C \sum_i \underbrace{\max(0, \; 1 - y_i (\mathbf{w}^\top \mathbf{x}_i + b))}_{\text{hinge loss}}$$

এটি unconstrained form — যেকোনো gradient-based optimizer দিয়ে minimize করা যায়। SGD, Adam — সবই কাজ করে।

Hinge loss ($\max(0, 1-yz)$):

  • $yz \geq 1$ → loss = 0 (margin-এর বাইরে correct side)।
  • $0 \leq yz < 1$ → loss = $1-yz$ ∈ (0, 1] (margin violation)।
  • $yz < 0$ → loss > 1 (misclassified — penalty বাড়ছে linearly)।
তিন loss — কোনটি কোথায় শূন্য x-axis: y·z (margin score) y·z loss 0 1 -1 Hinge (SVM) Logistic Squared 0/1 (target) hinge = 0 here
Hinge loss — $y\cdot z \geq 1$ অঞ্চলে একদম শূন্য, তার বামে linearly বাড়ে। এই "kink"-ই SVM-কে support vector sparsity দেয়।

৬ · scikit-learn — হাতে-কলমে

Python · sklearn
import numpy as np
from sklearn.svm import SVC
from sklearn.datasets import make_blobs
from sklearn.model_selection import cross_val_score

# overlap-যুক্ত data — std বাড়ালে দু'class কাছে আসে
X, y = make_blobs(n_samples=200, centers=2, cluster_std=2.5,
                  random_state=42)

# C-এর প্রভাব দেখি
for C in [0.01, 0.1, 1, 10, 100]:
    clf = SVC(C=C, kernel="linear")
    scores = cross_val_score(clf, X, y, cv=5)
    clf.fit(X, y)
    n_sv = clf.support_.size
    margin = 2 / np.linalg.norm(clf.coef_[0])
    print(f"C={C:>6}: acc={scores.mean():.3f}, "
          f"#SV={n_sv:>3}, margin={margin:.3f}")

    
Output-এ pattern দেখুন: ছোট $C$-তে margin চওড়া, support vector বেশি (অনেক point margin-এ ঢুকছে)। বড় $C$-তে margin সংকীর্ণ, কম SV কিন্তু প্রতিটি কঠিন boundary-এ। মাঝামাঝি $C$-তে accuracy সাধারণত peak।

৭ · LinearSVC বনাম SVC(kernel="linear")

  • LinearSVC: liblinear backend, primal form, $O(n)$ scaling — large dataset-এ দ্রুত। শুধু linear।
  • SVC(kernel="linear"): libsvm backend, dual form, $O(n^2)$-$O(n^3)$ — ছোট-মাঝারি data। Kernel-এ extendable।
  • Rule of thumb: $n > 10{,}000$ → LinearSVC; ছোট ও non-linear plan → SVC।

৮ · Class imbalance ও class_weight

Fraud detection-এ ৯৯.৯৯% non-fraud। default-এ SVM সবাইকে non-fraud predict করে ফেললেও accuracy ৯৯.৯৯%। সমাধান:

Python · sklearn
from sklearn.svm import SVC

# minority class-এর penalty বাড়ানো
clf = SVC(C=1.0, kernel="linear",
          class_weight="balanced")     # বা {0: 1, 1: 100}
clf.fit(X_train, y_train)

    

Effectively — minority class-এর প্রতিটি violation-এ আলাদা (বড়) $C_i$। SMOTE বা undersampling-এর বিকল্প।

$C$ tune করার সময় শুধু training accuracy দেখে decision নেবেন না — সবসময় validation/CV ব্যবহার করুন। বড় $C$-এ training accuracy বাড়লেও test-এ পড়ে যেতে পারে — classic overfit signal।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ $C$ কেন "regularization-এর বিপরীত"? Ridge regression-এর $\alpha$-এর সঙ্গে সম্পর্ক কী?

এই সংযোগ ML theory-র অন্যতম elegant insight — দু'টি ভিন্ন community (statistics ও computer science) একই গণিতে এসে পৌঁছায়।

Ridge regression (L15):

$$\min_{\mathbf{w}} \;\; \sum_i (y_i - \mathbf{w}^\top \mathbf{x}_i)^2 + \alpha \|\mathbf{w}\|^2$$

এখানে $\alpha$ — regularization strength। বড় $\alpha$ = $\mathbf{w}$ ছোট রাখার বেশি pressure = সরল model।

Soft-margin SVM:

$$\min_{\mathbf{w}, b} \;\; \frac{1}{2}\|\mathbf{w}\|^2 + C \sum_i \xi_i$$

সমান scale করতে ($\frac{1}{C}$ গুণ):

$$\frac{1}{C} \cdot \frac{1}{2}\|\mathbf{w}\|^2 + \sum_i \xi_i$$

এখন $\frac{1}{2C}$-কে $\alpha$-এর role-এ চিনুন। অর্থাৎ $\alpha = \frac{1}{2C}$।

সংযোগ স্পষ্ট:

  • $C$ বড় → $\alpha$ ছোট → কম regularization → complex model।
  • $C$ ছোট → $\alpha$ বড় → বেশি regularization → সরল model।
  • "$C$ regularization-এর বিপরীত" — কারণ scaling-এ $\alpha = 1/(2C)$।

ঐতিহাসিক context:

  • Statisticians (Tikhonov, Hoerl-Kennard) — "regularization" pursped।
  • SVM community (Vapnik, Cortes) — "margin maximization" আনল।
  • ২০০০-এর দশকে clear হলো — দু'টোই একই Bayesian prior-এর dual: $\mathbf{w}$-এর উপর Gaussian prior।

Lasso, Elastic Net-এর সাথে:

  • L2 reg (Ridge / standard SVM) — small smooth weight।
  • L1 reg (Lasso / L1-SVM) — sparse weight, feature selection।
  • Elastic Net — দু'য়ের মিশ্রণ। SVM-এও l1-loss variant আছে (LinearSVC(penalty="l1"))।

Practical implication:

  • Logistic regression-এ $C$ tune করলে ridge-এর $1/\alpha$ tune করছেন — sklearn convention।
  • SVM-এ একই $C$ — confusion-এ ফেলে অনেক beginner-কে।

মূল উপলব্ধি: Names আলাদা — gradient descent-এর "learning rate" আর Bayesian-এর "prior precision" — কিন্তু gradient-এ একই কাজ। ভাল ML engineer এই conversions তৎক্ষণাৎ ধরতে পারেন। SVM-এর $C$ আর Ridge-এর $\alpha$ — fundamentally same dial।

প্র ০২ Hinge loss vs Logistic loss vs 0/1 loss — কোনটা "সঠিক" loss এবং কখন কোনটা ব্যবহার করব?

Loss function-এর choice — ML-এর সবচেয়ে underappreciated decision। একই data, একই hypothesis class — শুধু loss বদলালে behavior সম্পূর্ণ ভিন্ন।

0/1 loss (target):

  • $\mathbb{1}[y_i \neq \hat{y}_i]$ — ভুল হলে ১, ঠিক হলে ০।
  • "আদর্শ" classification metric — accuracy-র direct counterpart।
  • সমস্যা: discontinuous, non-differentiable, non-convex। Optimization NP-hard।
  • তাই কেউ সরাসরি optimize করে না — surrogate loss দিয়ে approximate।

Hinge loss (SVM-এর):

  • $\max(0, 1 - y_i z_i)$।
  • 0/1-এর tightest convex upper bound (in some sense)।
  • $y_i z_i \geq 1$-এ ০ — sparse gradient → support vector property।
  • Probability output দেয় না — শুধু margin score।

Logistic loss (cross-entropy):

  • $\log(1 + e^{-y_i z_i})$।
  • সর্বত্র smooth, gradient সর্বদা non-zero।
  • Probabilistically interpreted — MLE-এর সাথে consistent।
  • Output: $\sigma(z) \in (0,1)$ — calibrated probability।

Squared loss (rare for classification):

  • $(1 - y_i z_i)^2$।
  • সঠিকভাবে far classify হওয়া point-এও penalty দেয় — "অতি-আত্মবিশ্বাসী" হলে penalty।
  • Outlier-এ অত্যন্ত sensitive। Classification-এ rare।

কখন কোনটা?

  • Calibrated probability দরকার (medical risk, insurance pricing): logistic।
  • Clean side decision (binary go/no-go), কম outlier sensitivity: hinge / SVM।
  • Outlier robustness + প্রবল signal: Huber-like loss বা hinge।
  • Multi-class: cross-entropy (softmax) industry default।
  • Imbalanced: focal loss (Lin et al., ২০১৭) — hinge/CE-এর modified।

Bangladesh fintech example:

  • bKash fraud — probability output দরকার (rule: > ০.৮ → manual review, > ০.৯৫ → block) → logistic / XGBoost।
  • SMS spam — শুধু yes/no → hinge SVM ভাল কাজ।
  • brac credit risk — calibrated, regulator-explainable → logistic।

Modern view (deep learning):

  • Cross-entropy almost universal — softmax + log-likelihood।
  • Hinge/SVM — ভাল baseline, কিন্তু DL-এ কম common (যদিও কিছু work এ Crammer-Singer hinge ব্যবহৃত)।
  • Focal, contrastive, triplet — task-specific loss-এর ঢেউ।

মূল উপলব্ধি: "Best loss" নেই — task-এর জন্য best loss আছে। 0/1 loss সবসময় target কিন্তু optimize করা যায় না, surrogate লাগে। প্রতিটি surrogate-এর নিজস্ব geometric/probabilistic interpretation। Loss চয়ন একটি modeling decision — কোনো default নেই।

প্র ০৩ আপনি grid search করছেন $C \in \{0.001, 0.01, 0.1, 1, 10, 100\}$। কীভাবে বুঝবেন যে best $C$ pick হয়েছে — শেষ বা মাঝে? পরবর্তী পদক্ষেপ?

Grid search-এর interpretation — production ML-এর প্রতিদিনের কাজ। ভুল interpretation = ভুল model।

(১) যদি best CV score মাঝে আসে:

  • উদাহরণ: $C=1$-এ ০.৮৫, পাশের $C=0.1$ ও $C=10$-এ ০.৮২।
  • "Plateau" pattern। আপনি local optimum-এ আছেন — finer grid করুন: $C \in \{0.3, 0.5, 1, 2, 3, 5\}$।
  • সাধারণত ভাল sign — model parameter sensitive কিন্তু স্থিতিশীল।

(২) যদি best score boundary-এ:

  • $C=100$ best — মানে আরও বড় $C$ আরও ভাল হতে পারে।
  • Grid extend করুন: $C \in \{100, 300, 1000\}$।
  • $C=0.001$ best হলে — grid কমান।
  • সাবধান: $C \to \infty$ মানে hard-margin-এর কাছে — overfit risk। Validation curve check করুন।

(৩) Validation curve plot:

  • X-axis: $\log(C)$। Y-axis: train accuracy ও CV accuracy।
  • Train ও CV-র gap বাড়ছে $C$-এর সাথে = overfit signal।
  • Train-CV একসাথে নিচু = underfit; train-CV একসাথে উঁচু এবং gap কম = good।

(৪) Bias-variance interpretation:

  • ছোট $C$ → high bias, low variance। Underfit।
  • বড় $C$ → low bias, high variance। Overfit।
  • Sweet spot — minimum CV error।

(৫) Common mistakes:

  • Test set দিয়ে $C$ tune — data leakage। CV বা separate validation set ব্যবহার।
  • Single CV fold-এর variance ignore — অন্তত ৫-fold।
  • Random search vs grid — high-dim hyperparameter space-এ random often better (Bergstra-Bengio, ২০১২)।
  • Standardization ভুলে যাওয়া — SVM scale-sensitive।

(৬) Beyond grid search:

  • Random search: log-uniform sampling — দ্রুত।
  • Bayesian optimization: Optuna, Hyperopt — past trial থেকে শেখে।
  • Halving search: sklearn-এর successive halving — early stopping ভিত্তিক।
  • Multi-metric: accuracy + recall + latency budget একসাথে।

(৭) Domain knowledge:

  • Fraud detection — recall priority। $C$ এমন বাছুন যেখানে recall@threshold ভাল।
  • Medical screening — false negative cost বেশি — hinge loss-এ class_weight এর সাথে combine।

মূল উপলব্ধি: Grid search একটি tool — judgment নয়। Validation curve plot করুন, train-CV gap দেখুন, edge-case ভাবুন। "Best $C$" নয়, "stable $C$" বাছুন — যেখানে minor data shift-এ performance stable।

প্র ০৪ আপনি ১ মিলিয়ন SMS spam classify করছেন। SVM, Naive Bayes, না Logistic Regression — কোনটি বাছবেন? কেন?

Text classification — SVM-এর historic strongholds-এর একটি। কিন্তু আজকের scale-এ choice trickier।

Setup বুঝুন:

  • ১M training, ৫০-১০০K vocab (TF-IDF), sparse high-dim feature।
  • Bilingual — বাংলা + ইংরেজি (Robi/GP/Bkash spam)।
  • Class imbalance (5-10% spam)।
  • Latency: < ১০ ms (real-time blocking)।
  • Retrain frequency: weekly (new spam patterns)।

Naive Bayes (Multinomial):

  • ✅ Train ও inference দু'টোই lightning fast — single pass।
  • ✅ Probability output naturally।
  • ✅ Online update সহজ — count-ভিত্তিক।
  • ❌ "Naive" assumption (feature independence) — context miss।
  • ❌ Imbalanced data-এ poor calibration।

Linear SVM:

  • ✅ TF-IDF + Linear SVM — text classification-এ ১৫ বছর gold standard।
  • ✅ Sparse feature handle করে exceptionally।
  • ✅ LinearSVC dual=False বা SGDClassifier(loss="hinge") — ১M scale-এ scalable।
  • ✅ High-dim (১০০K feature) issue নেই।
  • ❌ Probability পেতে Platt — extra step।
  • ❌ Concept drift-এ retrain লাগে।

Logistic Regression:

  • ✅ Probability native, calibrated।
  • ✅ SGDClassifier(loss="log") — same scaling।
  • ✅ L2 + L1 (Elastic Net) — feature selection।
  • ✅ Online learning (warm start)।
  • ~ SVM-এর কাছাকাছি accuracy — অনেক benchmark-এ tied।

আমার production choice:

  • Tier 1 (production): SGDClassifier(loss="log", alpha=1e-5) — calibrated probability + scalable।
  • Tier 2 (challenger): LinearSVC — A/B test।
  • Naive Bayes: baseline + cold-start (নতুন campaign)।
  • fastText / DistilBERT: long-term plan যদি বাংলা text-এ accuracy push চাই।

Implementation tips:

  • HashingVectorizer (memory-friendly) vs TfidfVectorizer।
  • Bigram + unigram — context কিছুটা ধরে।
  • Bangla normalization — punctuation, যুক্ত-অক্ষর regex।
  • Class_weight="balanced" — minority class boost।
  • Threshold tuning — default ০.৫ নয়, precision-recall curve থেকে।

আজকের real-world (২০২৪+) choice:

  • Mid-scale, latency-budget — Linear SVM/SGD এখনো competitive।
  • High-budget — fine-tuned BERT (multilingual)।
  • Adversarial robustness — ensemble (SVM + neural)।

মূল উপলব্ধি: Text classification-এ Linear SVM আজও defensible choice — কিন্তু sole reason হিসেবে "best accuracy" নয়, বরং সরলতা, scalability, interpretability, retrain cost-এর balance। Bangladesh-এর mobile operator scale-এ — সিদ্ধান্ত শুধু accuracy থেকে নয়, infrastructure-ও থেকে।

অনুশীলন

  1. হিসাব করুন: point $\mathbf{x}_i$-এ $y_i = +1$, $\mathbf{w}^\top \mathbf{x}_i + b = 0.3$। $\xi_i$ minimum কত? Hinge loss-এ contribution?
    • $y_i z_i = 1 \cdot 0.3 = 0.3$।
    • Constraint: $y_i z_i \geq 1 - \xi_i$ → $0.3 \geq 1 - \xi_i$ → $\xi_i \geq 0.7$।
    • Minimum: $\xi_i = 0.7$।
    • Hinge loss = $\max(0, 1 - 0.3) = 0.7$ — ঠিক slack-এর সমান।
    • Interpretation: point margin-এ ঢুকে আছে কিন্তু সঠিক side-এ।
  2. NumPy-তে চেষ্টা: overlap-যুক্ত data-এ $C$-এর প্রভাব plot করুন।
    import numpy as np
    from sklearn.svm import SVC
    from sklearn.datasets import make_blobs
    from sklearn.model_selection import cross_val_score
    
    X, y = make_blobs(n_samples=300, centers=2,
                      cluster_std=2.0, random_state=0)
    
    Cs = [0.01, 0.1, 1, 10, 100]
    for C in Cs:
        s = cross_val_score(SVC(C=C, kernel="linear"),
                            X, y, cv=5).mean()
        print(f"C={C:>6}: CV acc = {s:.3f}")

    সাধারণত $C=1$ বা $10$-এ peak, edges-এ পড়ে যায়।

  3. ভাবুন: bKash fraud detection-এ class imbalance ১:১০,০০০। কোন hyperparameter সবার আগে tune করবেন এবং কেন?
    • সর্বপ্রথম: class_weight বা per-class $C$ — minority class-এর penalty বাড়ানো না হলে $C$ tuning meaningless।
    • দ্বিতীয়: threshold (probability cutoff)। Default ০.৫ কখনই imbalanced-এ ভাল না।
    • তৃতীয়: $C$ — class_weight ফিক্স করার পর।
    • Metric: accuracy নয়, PR-AUC বা recall@precision=0.9।
    • SMOTE বা undersampling — alternative হিসেবে A/B test।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? Google Colab ব্যবহার করুন।
পূর্ববর্তী পাঠ
পাঠ ২৭ · SVM theory