SVR — রিগ্রেশনের জন্য SVM
এই পাঠে যা শিখবেন
- 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-প্রতিরোধী।
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।
৫ · scikit-learn-এ SVR — case study
ঢাকায় বাড়ির দাম prediction — area, age, location-score, bedroom থেকে। ৫০০ sample।
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}")
StandardScaler অপরিহার্য — feature-গুলোর scale ভিন্ন (area ১০০০, age ১০)। Without scaling — large-scale feature dominate করে।
৬ · ε ও C-এর প্রভাব দেখা
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 ধীর। তখন:
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।
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 করার সুযোগ আছে।
অনুশীলন
-
হিসাব করুন: $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।
-
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 ১ লাগে।
-
ভাবুন: 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-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ৩১ · K-Means Clustering পরবর্তী পাঠ M5 শুরু — unsupervised learning, কোনো label ছাড়া structure।
- পাঠ ২৯ · Kernel trick আগের পাঠ SVR-এও সব kernel কাজ করে — non-linear regression।
- পাঠ ০৯ · Linear Regression এই পাঠের সাথে সম্পর্কিত SVR বনাম OLS — দু'টি ভিন্ন regression philosophy।
- সব AI Courses ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps।