Soft-margin SVM
এই পাঠে যা শিখবেন
- কেন 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-এ পারফরম্যান্স পড়ে।
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।
৩ · 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)।
৬ · scikit-learn — হাতে-কলমে
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}")
৭ · 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 ৯৯.৯৯%। সমাধান:
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$ কেন "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।
- ✅
LinearSVCdual=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-ও থেকে।
অনুশীলন
-
হিসাব করুন: 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-এ।
-
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-এ পড়ে যায়।
-
ভাবুন: 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-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ২৯ · Kernel trick পরবর্তী পাঠ Non-linear boundary দরকার? Kernel দিয়ে data-কে high-D-এ পাঠান — গণিত ছাড়াই।
- পাঠ ২৭ · SVM theory আগের পাঠ Hard-margin SVM-এর ভিত্তি — maximum margin ও support vectors।
- পাঠ ১৫ · Ridge ও Lasso এই পাঠের সাথে সম্পর্কিত SVM-এর $\frac{1}{2}\|\mathbf{w}\|^2$ আসলে L2 regularization — Ridge-এর ভাই।
- সব AI Courses ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps।