পাঠ ৩০ · ৪৫-এর মধ্যে · মডিউল ৪

SVR — রিগ্রেশনের জন্য SVM

Support Vector Regression — ε-insensitive loss
৭ মিনিট পড়া মাঝারি · Intermediate sklearn

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

  • SVR-এর intuition — ε-tube ও কেন এটা OLS থেকে আলাদা
  • ε-insensitive loss — সংজ্ঞা, geometric meaning
  • Primal optimization formulation — slack দু'দিকে ($\xi^+, \xi^-$)
  • scikit-learn-এ SVR ও LinearSVR — কোথায় কোনটা
  • Bangladesh real-estate price prediction — case study

১ · Regression-এ SVM কেন?

Linear regression (L09) MSE minimize করে — প্রতিটি error-কে square করে penalty। ছোট error-কেও penalty, বড় error-কে অনেক বেশি penalty। সমস্যা — outlier-এ super sensitive, এবং noisy data-তে boundary বিকৃত।

SVR-এর philosophy ভিন্ন: ছোট error চিন্তা করো না। যদি prediction true value-র কাছে ($\varepsilon$-এর মধ্যে) থাকে — fully OK, কোনো penalty নেই। শুধু বড় error-এই penalize করো — এবং সেটাও linearly (square নয়), outlier-প্রতিরোধী।

SVR-এর intuition

Regression line-এর চারপাশে একটি $\varepsilon$-চওড়া "tube" কল্পনা করুন। Tube-এর ভেতরে যত point — সবাই "ভালো", কোনো cost নেই। Tube-এর বাইরে যেগুলো — সেগুলোই support vector, এবং $\xi$ slack যোগ করে কতটা বাইরে তা মাপা হয়। আমাদের লক্ষ্য — সবচেয়ে সরু/সমতল function (ছোট $\|\mathbf{w}\|$) এবং কম violation।

২ · ε-insensitive loss

Loss function:

$$L_\varepsilon(y, \hat{y}) = \max(0, \; |y - \hat{y}| - \varepsilon)$$

তিন অঞ্চল:

  • $|y - \hat{y}| \leq \varepsilon$ → loss = 0 (tube-এর ভেতরে)।
  • $y - \hat{y} > \varepsilon$ → loss = $y - \hat{y} - \varepsilon$ (উপরে বেশি)।
  • $\hat{y} - y > \varepsilon$ → loss = $\hat{y} - y - \varepsilon$ (নিচে বেশি)।

MSE বনাম ε-insensitive — দু'টি ভিন্ন philosophy:

  • MSE: "smaller residual is always better" — perfectionist।
  • ε-insensitive: "good enough is good enough" — pragmatist।

৩ · Primal optimization

প্রতিটি point-এ দু'টি slack — উপরে এবং নিচের violation আলাদা ($\xi_i^+, \xi_i^- \geq 0$):

$$\min_{\mathbf{w}, b, \boldsymbol{\xi}^\pm} \;\; \frac{1}{2}\|\mathbf{w}\|^2 + C \sum_i (\xi_i^+ + \xi_i^-)$$

$$\text{s.t. } \;\; \begin{cases} y_i - (\mathbf{w}^\top \mathbf{x}_i + b) \leq \varepsilon + \xi_i^+ \\ (\mathbf{w}^\top \mathbf{x}_i + b) - y_i \leq \varepsilon + \xi_i^- \\ \xi_i^+, \xi_i^- \geq 0 \end{cases}$$

এটি ঠিক classification SVM-এর mirror। Dual form-এ data শুধু dot-product হিসেবে আসে — তাই kernel trick (L29) প্রযোজ্য। কেবল tube-এর বাইরের point-গুলো support vector — বাকিদের $\alpha = 0$।

৪ · তিনটি hyperparameter

  • $C$ — regularization (classification SVM-এর মত): বড় $C$ = violation কঠোরভাবে penalize, model curve fit করতে বেশি চেষ্টা — overfit risk। ছোট $C$ = relaxed fit, smooth।
  • $\varepsilon$ — tube width: বড় $\varepsilon$ = tube wide, কম support vector, smooth model কিন্তু possibly underfit। ছোট $\varepsilon$ = প্রায় MSE-র মত, প্রতিটি point matter, কম noise tolerance।
  • $\gamma$ — RBF kernel width: L29-এর মত। বড় $\gamma$ = wiggly, ছোট $\gamma$ = smooth।

Heuristic: $\varepsilon$ data-এর scale-এর প্রায় ১০% — যেমন target-এর std-এর 0.1 গুণ। তারপর $C, \gamma$ grid search।

SVR — ε-tube এর ভেতরে penalty নেই x-axis: feature, y-axis: target ξ 2ε tube-এর ভেতরে (cost = 0) support vector (বাইরে)
SVR — regression line-এর চারপাশে ε-tube। Tube-এর ভেতরের point-এ কোনো cost নেই (নীল), বাইরের point-গুলোই support vector (সবুজ ring)। Slack $\xi$ পরিমাপ করে কতটা বাইরে।

৫ · scikit-learn-এ SVR — case study

ঢাকায় বাড়ির দাম prediction — area, age, location-score, bedroom থেকে। ৫০০ sample।

Python · sklearn
import numpy as np
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score

# synthetic Bangladesh house data (BDT lakh)
np.random.seed(0)
n = 500
area = np.random.uniform(800, 4000, n)         # sqft
age  = np.random.uniform(0, 30, n)             # years
loc  = np.random.uniform(1, 10, n)             # 1-10 score
bed  = np.random.choice([2, 3, 4], n)
X = np.column_stack([area, age, loc, bed])

# নন-লিনিয়ার পদ্ধতিতে দাম তৈরি (লাখে)
price = (0.05 * area
         - 0.5 * age
         + 8 * loc
         + 15 * bed
         + 0.0001 * area * loc
         + np.random.normal(0, 8, n))           # noise

# SVR pipeline — scaling অপরিহার্য
svr = make_pipeline(
    StandardScaler(),
    SVR(kernel="rbf", C=100, epsilon=2, gamma="scale")
)
scores = cross_val_score(svr, X, price, cv=5,
                         scoring="r2")
print(f"SVR (RBF) CV R² = {scores.mean():.3f} ± {scores.std():.3f}")

    
Output-এ R² সাধারণত ০.৭৫-০.৮৫ — interaction term (area × loc) থাকায় linear model পিছিয়ে পড়ে, RBF SVR ধরে। StandardScaler অপরিহার্য — feature-গুলোর scale ভিন্ন (area ১০০০, age ১০)। Without scaling — large-scale feature dominate করে।

৬ · ε ও C-এর প্রভাব দেখা

Python · sklearn
from sklearn.model_selection import GridSearchCV

param_grid = {
    "svr__C":       [1, 10, 100, 1000],
    "svr__epsilon": [0.5, 2, 5, 10],
    "svr__gamma":   ["scale", 0.01, 0.1],
}
gs = GridSearchCV(svr, param_grid, cv=5,
                  scoring="r2", n_jobs=-1)
gs.fit(X, price)
print(f"best params: {gs.best_params_}")
print(f"best R²: {gs.best_score_:.3f}")
print(f"#support vectors: {gs.best_estimator_[-1].support_.size} / {n}")

    
support_.size — মোট সংখ্যা training point-এর কত percent tube-এর বাইরে। ছোট $\varepsilon$ → বেশি SV, বড় $\varepsilon$ → কম SV (সবাই tube-এ ঢুকে যাচ্ছে)।

৭ · LinearSVR — large-scale

১০K-এর বেশি sample হলে kernel SVR ধীর। তখন:

Python · sklearn
from sklearn.svm import LinearSVR

# fast linear primal solver
linear_svr = make_pipeline(
    StandardScaler(),
    LinearSVR(C=1.0, epsilon=2.0, max_iter=10000)
)
scores = cross_val_score(linear_svr, X, price, cv=5, scoring="r2")
print(f"LinearSVR CV R² = {scores.mean():.3f}")

    

Linear-এ R² কম (interaction miss) কিন্তু training সেকেন্ডে। Million-row tabular regression-এ সাধারণত XGBoost ভাল — কিন্তু feature কম, smooth function চাইলে SVR shine।

৮ · কোথায় SVR best, কোথায় না

  • Best-fit: ছোট-মাঝারি sample (১০০-১০K), smooth target function, noisy data, robust outlier handling।
  • Avoid: million-row, very high-dim (text), strict latency budget, পূর্ণ probability distribution চাইলে।
  • Comparison: XGBoost — non-smooth steps; SVR — smooth curves। Calibrated regression — SVR + tube ভাল uncertainty proxy।
SVR-এ feature scaling না করলে কাজ করবে না — RBF kernel দূরত্ব ভিত্তিক। সবসময় StandardScaler বা MinMaxScaler pipeline-এ যোগ করুন। এটাই SVR-এর সবচেয়ে common bug।

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

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

প্র ০১ SVR-এর ε-insensitive loss-এর সাথে Huber loss-এর তুলনা কী? দু'টিই robust regression — কোথায় ভিন্ন?

Robust regression-এর জগতে দু'টিই বিখ্যাত — কিন্তু philosophy ও math ভিন্ন। তুলনাটা insightful।

OLS (squared loss):

  • $L = (y - \hat{y})^2$।
  • সবসময় penalty, ছোট error-এও।
  • Outlier squared হয়ে dominate করে।

Huber loss:

$$L_\delta(r) = \begin{cases} \tfrac{1}{2} r^2 & |r| \leq \delta \\ \delta(|r| - \tfrac{\delta}{2}) & |r| > \delta \end{cases}$$

  • ছোট error-এ quadratic (smooth, MLE-friendly)।
  • বড় error-এ linear (outlier-tolerant)।
  • $\delta$ — transition point।

ε-insensitive (SVR):

$$L_\varepsilon(r) = \max(0, |r| - \varepsilon)$$

  • $|r| \leq \varepsilon$-এ শূন্য — কোনো penalty নেই।
  • বাইরে linear।
  • $\varepsilon$ — "noise tolerance" zone।

মূল পার্থক্য:

  • Sparsity: SVR-এ tube-এর ভেতরে point-এর gradient = 0 → sparse support vector। Huber-এ সব point gradient রাখে।
  • Bias: SVR ε-tube zone-এ flat — ছোট fluctuation ignore। Huber smooth — ছোট fluctuation কিছুটা ধরে।
  • Hyperparameter meaning: Huber $\delta$ — outlier transition; SVR $\varepsilon$ — noise band।

কখন কোনটা?

  • Huber: standard regression + occasional outlier (financial returns, sensor reading)। Sparse solution চাই না।
  • SVR: structured noise expected (e.g., measurement precision $\pm \varepsilon$)। Sparse solution + kernel চাই।
  • Quantile loss: conditional quantile estimation (median, ৯০ percentile)।
  • L1 (MAE): robust + outlier-aware কিন্তু non-smooth এ optimization।

Practical:

  • sklearn — HuberRegressor, SVR, QuantileRegressor।
  • Comparison benchmark — ছোট data-এ tied; large data-এ Huber ভাল।
  • Kernel চাই → SVR-ই একমাত্র।

মূল উপলব্ধি: সব robust loss-এর core idea — "outlier-এ বেশি penalty দেওয়া বন্ধ করো"। কিন্তু কোথায় threshold আঁকি — Huber-এ smooth transition, SVR-এ flat zone। Choose by domain knowledge of noise structure।

প্র ০২ Bangladesh real-estate price prediction-এ SVR বনাম XGBoost বনাম random forest — কোনটা বাছবেন এবং কেন?

Real-estate ML — Bangladesh-এ এক growing sector (Bproperty, bikroy, lankabangla)। তিনটি model-এর strengths এই context-এ আলাদা।

Setup:

  • ~১০-৫০K listings (small relative to global)।
  • ২০-৫০ feature (area, location, age, amenities, parking, generator)।
  • Mixed numeric + categorical (location pincode, condition)।
  • Heavy long-tail price distribution — Banani $4 cr বনাম savar $30 lakh।
  • Missing value common (age unknown, exact location)।

SVR (RBF):

  • ✅ Smooth function — area-এর প্রতি বৃদ্ধির সাথে দাম-এর smooth relation।
  • ✅ Robust outlier — kashmiri rich neighborhood prices distort করে না।
  • ❌ ১০K-এর বেশি — slow।
  • ❌ Categorical encoding extra step (one-hot)।
  • ❌ Missing value handle করে না — pre-imputation দরকার।
  • ❌ Feature importance — interpretation কঠিন।

Random Forest:

  • ✅ Mixed type natively।
  • ✅ Missing value built-in (some libs)।
  • ✅ Feature importance easy।
  • ❌ Step-wise prediction — smooth area→price relation discrete হয়।
  • ❌ Extrapolation poor — training-এ যে দাম দেখেনি, predict করতে পারে না।

XGBoost:

  • ✅ State-of-art tabular performance।
  • ✅ Missing value সরাসরি handle।
  • ✅ Categorical (with care) — LightGBM further-better।
  • ✅ SHAP-এ interpretation।
  • ✅ Scalable — million row সম্ভব।
  • ~ Step-wise prediction (RF-এর মত)।
  • ~ Extrapolation issue।

আমার production recommendation:

  • Tier 1: XGBoost — primary scoring engine।
  • Tier 2: SVR — smooth output, post-processing/calibration।
  • Stacking: XGB + SVR + linear → meta-learner।
  • Log-target: $\log(\text{price})$ regression — heavy tail handle।

Bangladesh-specific tricks:

  • Location embedding — train থেকে neighborhood code → 8-D embedding।
  • Geo-distance feature — Banani থেকে দূরত্ব।
  • Time feature — listing month/year (inflation)।
  • Property type interaction — flat vs apartment vs land।

Validation strategy:

  • Time-based split (train old, test recent) — actual deployment scenario।
  • Geographic split (Dhaka train, Chittagong test) — generalization।
  • Stratified by price band — high-end, mid, low।

Metric:

  • MAPE (mean absolute percentage error) — heavy tail-এ ভাল।
  • R² — overall fit।
  • Per-segment error — high-end vs low-end accuracy আলাদা rapport।

মূল উপলব্ধি: Real-estate-এ XGBoost likely champion, SVR challenger। কিন্তু সব data-এ same answer নয় — পরিস্কার EDA, log-transform, time-validation — model choice-এর চেয়ে এদেরই বেশি impact। Model selection শুধু একটা decision; pipeline overall সাফল্য নির্ধারণ করে।

প্র ০৩ $\varepsilon$ বড় করলে support vector কমে — কেন? এটাই কি সবসময় ভাল?

চমৎকার পর্যবেক্ষণ — $\varepsilon$-এর সাথে SV count-এর সম্পর্কের পেছনে SVR-এর geometric soul।

Mechanism:

  • $\varepsilon$ = tube-এর width।
  • Tube-এর ভেতরে point-এর slack $\xi = 0$ — কোনো constraint binding না — $\alpha = 0$ — non-SV।
  • Tube-এর বাইরে point-এর $\xi > 0$ — constraint active — $\alpha > 0$ — SV।
  • $\varepsilon$ যত বড় → tube যত wide → বেশি point ভেতরে → কম SV।

Limit cases:

  • $\varepsilon = 0$: প্রতিটি point exact-এ থাকতে হবে → প্রায় সবাই SV।
  • $\varepsilon \to \infty$: সব point ভেতরে → SV = 0 → trivial constant prediction।

SV count-এর implication:

(১) Computational cost:

  • Inference cost ∝ #SV।
  • কম SV = fast inference।
  • Embedded deployment-এ critical।

(২) Memory:

  • Model file size ∝ #SV (কারণ প্রতিটি SV-এর coordinate save দরকার)।
  • ৩০K SV vs ৩০০ SV — drastic difference।

(৩) Generalization:

  • Vapnik bound — SV-এর fraction-এর সাথে sample-out-of-bag error সম্পর্ক।
  • কম SV = better generalization (in theory)।

(৪) Robustness:

  • Wide tube = noise tolerance বেশি।
  • Outlier impact কম।

"বেশি $\varepsilon$ সবসময় ভাল" — না!

কেন:

  • খুব বড় $\varepsilon$ → underfit। প্রকৃত relationship-এর fluctuation miss।
  • Bias বাড়ে — "good enough" এর threshold বেশি।
  • Application-এ accuracy demand match হবে না।

$\varepsilon$ choosing rule of thumb:

  • Target value-এর std-এর ১০% — Cherkassky-Ma (২০০৪) heuristic।
  • Domain knowledge — measurement precision (sensor noise, expert agreement)।
  • CV grid search — log-scale {0.01, 0.1, 1, 10}-এ best।

Real-estate example:

  • Target = price in lakh BDT, std = 50।
  • Heuristic: $\varepsilon \approx 5$ lakh — অর্থাৎ ±5 lakh-এর প্রকৃত prediction "perfect"।
  • Domain: Banani-এ ±5 lakh trivial, savar-এ ±5 lakh huge — তাই log-target-এ regression করলে $\varepsilon$ uniform meaningful।

Trade-off summary:

  • Small $\varepsilon$: precise, slow, overfit-prone।
  • Large $\varepsilon$: fast, smooth, underfit-prone।
  • Sweet spot: domain noise level-এর সাথে aligned।

মূল উপলব্ধি: $\varepsilon$ একটি principled compression knob — "কোন level-এর precision আসলে দরকার?" সেই প্রশ্নের answer। SVR অনন্য — সরাসরি measurement noise কে hyperparameter হিসেবে নেয়। অন্য কোনো algorithm এত cleanly এটা handle করে না।

প্র ০৪ SVR-এ uncertainty estimate পেতে চান। কীভাবে — যেহেতু output single point estimate?

চমৎকার production prompt — single point prediction-এ enough নয়, especially finance/health-এ। কিছু practical approach আছে।

(১) ε-tube as proxy interval:

  • Naive — prediction $\pm \varepsilon$।
  • Issue: $\varepsilon$ একটি training hyperparameter, calibrated probability নয়।
  • Coverage guarantee নেই।

(২) Bootstrap aggregation:

  • Training-এ ১০০ bootstrap sample → ১০০ SVR মডেল।
  • Test point-এ ১০০ prediction-এর mean = point estimate, std = uncertainty।
  • Cost: 100× training, 100× inference।

(৩) Quantile regression:

  • SVR-এর pinball loss variant — তাত্ত্বিক, sklearn-এ direct নেই।
  • Alternative: QuantileRegressor বা GBM-quantile।
  • Per-quantile (০.০৫, ০.৫, ০.৯৫) train → prediction interval।

(৪) Conformal prediction:

  • Modern, distribution-free framework (Vovk, ২০০৫; Angelopoulos-Bates, ২০২১)।
  • Calibration set-এ residual quantile → coverage guarantee।
  • SVR + conformal → "৯৫% interval" math-guaranteed।
  • Library: mapie, nonconformist।

(৫) Gaussian Process:

  • SVR-এর Bayesian "cousin"।
  • Kernel-based, native uncertainty।
  • Posterior std = uncertainty।
  • Cost: $O(n^3)$।

(৬) Deep ensembles:

  • SVR-নয়, but related — multiple model-এর variance।
  • NGBoost — gradient boosting + parametric distribution।

(৭) Heteroscedastic noise modeling:

  • প্রথম SVR — mean prediction।
  • দ্বিতীয় SVR — residual-এর magnitude predict।
  • Two-stage uncertainty।

Practical recommendation:

  • সরল, দ্রুত: bootstrap (১০-৫০ models)।
  • Theoretically clean: conformal prediction।
  • Bayesian: Gaussian process।
  • Production scale: gradient boosting quantile।

Bangladesh fintech context:

  • brac credit scoring — uncertainty দিয়ে human-loop trigger।
  • "Predict $50K ± 5K confident" vs "$50K ± 30K — escalate"।
  • Real-estate price — buyer/seller-এর জন্য range দেখানো ভাল।

মূল উপলব্ধি: Single point prediction অসম্পূর্ণ। Uncertainty quantification — production ML-এর neglected অর্ধেক। SVR direct দেয় না, কিন্তু wrapper দিয়ে fix করা যায়। Conformal prediction modern best-practice — Bangladesh ML community-এ এটা introduce করার সুযোগ আছে।

অনুশীলন

  1. হিসাব করুন: $y = 50$, $\hat{y} = 47$, $\varepsilon = 2$। ε-insensitive loss কত? $\hat{y} = 51$ হলে?
    • $\hat{y} = 47$: $|y - \hat{y}| = 3$, $\max(0, 3 - 2) = 1$।
    • $\hat{y} = 51$: $|y - \hat{y}| = 1$, $\max(0, 1 - 2) = 0$ (tube-এর ভেতরে)।
    • একই error-magnitude (১ vs ৩) — কিন্তু loss সম্পূর্ণ ভিন্ন। OLS-এ ১² = ১ ও ৩² = ৯ — দু'টোতেই penalty।
  2. NumPy-তে চেষ্টা: ε-insensitive loss function নিজে লিখুন এবং MSE-র সাথে compare।
    import numpy as np
    
    def epsilon_loss(y, y_hat, eps=1.0):
        return np.maximum(0, np.abs(y - y_hat) - eps)
    
    def mse_loss(y, y_hat):
        return (y - y_hat) ** 2
    
    y     = np.array([10, 10, 10, 10, 10])
    y_hat = np.array([8, 9, 10, 11, 13])
    
    print("residuals:", y - y_hat)
    print("ε-loss (ε=1):", epsilon_loss(y, y_hat, eps=1))
    print("MSE:        ", mse_loss(y, y_hat))

    Output দেখুন — residual ০ ও ১-এ ε-loss ০, কিন্তু MSE ১ লাগে।

  3. ভাবুন: Bangladesh-এ আম-এর harvest yield (kg/tree) prediction model — ৫০০ ফার্ম, ১৫টি feature (rainfall, fertilizer, age, variety...)। SVR না অন্য — কোনটি বাছবেন এবং কেন?
    • Sample size ছোট (৫০০): XGBoost overfit করতে পারে; SVR ভাল fit।
    • Feature মাঝারি (১৫): RBF kernel manageable।
    • Smooth physical relation: rainfall-এর সাথে yield smooth — SVR-এর strength।
    • Categorical (variety): one-hot encode, scaling-এর পর SVR ঠিকঠাক।
    • Recommendation: Tier 1 SVR-RBF; Tier 2 random forest comparison; ensemble for robustness।
    • Validation: regional split (Rajshahi vs Chapainawabganj) — generalization test।
    • Uncertainty: conformal prediction — farmer-কে range দিয়ে যেমন "১২০-১৪০ kg" পরামর্শ।

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

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