Train/Validation/Test বিভাজন
এই পাঠে যা শিখবেন
- কেন একটি সেট যথেষ্ট নয় — তিন সেট কেন
- সঠিক অনুপাত — ডেটার আকার অনুযায়ী
- Stratified, time-based, group-based split — কখন কোনটি
- scikit-learn-এ
train_test_splitব্যবহার - সাধারণ ভুল — যা ৫০% production AI ব্যর্থ করে
১ · কেন একটি সেট যথেষ্ট নয়
L02-এ আমরা দেখলাম — ERM training set-এ loss minimize করে। কিন্তু আমাদের আসল লক্ষ্য — generalization: নতুন ডেটায় কেমন কাজ করবে। সেটা মাপতে চাই — তাই কিছু ডেটা মডেলকে কখনও দেখাব না।
Train: মডেল-এর parameter (weight) এখানে শেখে।
Validation: hyperparameter (learning rate, depth, regularization) এখানে tune হয়।
Test: চূড়ান্ত performance estimate — একবার মাত্র, প্রকল্পের শেষে।
যদি শুধু train+test থাকে — আপনি validation-এর কাজে test ব্যবহার করবেন — অনেকবার "test"-এ feedback নিয়ে hyperparameter বদলাবেন — মূলত test-ও একটি training set হয়ে গেল। তাই production-এ surprises।
২ · অনুপাত — কত-কত
সাধারণ অনুপাত ডেটার আকার অনুযায়ী:
- ছোট (১K-১০K): ৬০/২০/২০ বা ৭০/১৫/১৫।
- মাঝারি (১০K-১০০K): ৭০/১৫/১৫ বা ৮০/১০/১০।
- বড় (১M+): ৯৮/১/১। ১% × ১M = ১০K, যথেষ্ট evaluation।
- ImageNet (১.৪M): validation = ৫০K (~৩.৫%), test = ১০০K।
যুক্তি — validation/test-এ statistical significance-এর জন্য কত sample দরকার সেটাই গুরুত্বপূর্ণ, percentage না। ১০K sample ৯৫% confidence-এ ±১% accuracy estimate দেয়।
৩ · Random split — সবচেয়ে সাধারণ
iid (independent and identically distributed) ডেটার জন্য — random shuffle এবং ভাগ:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
# 70/15/15 — দু'বার split
X_temp, X_te, y_temp, y_te = train_test_split(
X, y, test_size=0.15, random_state=42, stratify=y
)
X_tr, X_val, y_tr, y_val = train_test_split(
X_temp, y_temp, test_size=0.1765, random_state=42, stratify=y_temp
)
# 0.1765 = 15/85 — কারণ X_temp = 85% মূল
print(f"Train: {len(X_tr)}, Val: {len(X_val)}, Test: {len(X_te)}")
random_state=42 reproducibility-র জন্য — একই ভাগ প্রতিবার। stratify=y মানে — প্রতিটি class-এর অনুপাত train/val/test-এ একই থাকবে।
৪ · Stratified split — imbalanced ডেটায়
Fraud detection-এ ০.১% positive। Random split-এ test set-এ হয়তো একটিও fraud পড়বে না — মডেল evaluate করা যাবে না। Stratified splitStratified Splitপ্রতিটি split (train/val/test)-এ class-এর অনুপাত মূল ডেটার অনুপাতের সমান রাখা। imbalanced classification-এ অপরিহার্য। প্রতিটি split-এ class proportion বজায় রাখে।
Multi-class বা imbalanced binary — সবসময় stratify=y দিন।
৫ · Time-based split — temporal ডেটায়
Stock price, user behavior, weather — সময়ের সাথে correlated। Random split = future data train-এ ঢুকবে — time leakage। সঠিক পদ্ধতি — chronological split:
- Train: প্রথম ৭০% (সবচেয়ে পুরোনো)।
- Validation: পরের ১৫%।
- Test: শেষ ১৫% (সবচেয়ে নতুন)।
এটাই simulate করে "মডেল আজ deploy হলে কেমন কাজ করবে"।
৬ · Group-based split — leakage এড়াতে
Medical imaging — একই রোগীর ১০টি X-ray। Random split-এ একই রোগীর কিছু image train-এ, কিছু test-এ — মডেল রোগীকে "চিনে ফেলবে," disease না। সঠিক — group-aware split (সব images of one patient → এক set-এ)।
scikit-learn-এ — GroupShuffleSplit।
৭ · ৫টি সাধারণ ভুল
- Test set repeatedly use: "৫টি মডেল চেষ্টা করলাম, যেটা test-এ ভাল সেটাই deploy" — এটাই overfitting to test।
- Stratify ভুলে যাওয়া — imbalanced data-এ।
- Time-series-এ random split — future leakage।
- Group-aware না করা — patient/user repeat থাকলে।
- Train data-এ scaling fit করে test-এ apply না করা — সঠিক pattern: train-এ fit, test-এ শুধু transform। L08 ও L42-এ pipeline দিয়ে এটা automatic।
৮ · কখন cross-validation দরকার
ডেটা ছোট হলে — single train/val split unstable estimate। ১০-fold cross-validation (L05) — train-এ ১০ বার মডেল train, প্রতিবার ভিন্ন validation fold। ছোট ডেটায় robust performance estimate।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ একজন junior ML engineer বলছেন: "আমি train/test ৮০/২০ করেছি, validation কেন দরকার? আমি train-এ fit, test-এ accuracy পরীক্ষা — কাজ শেষ।" — এই argument-এর তিনটি practical সমস্যা ব্যাখ্যা করুন।
এটি একটি classic mistake। প্রকৃতপক্ষে, validation না থাকা = ML project-এর সবচেয়ে সাধারণ failure mode।
সমস্যা ১: Hyperparameter tuning overfitting
- Engineer Decision Tree চেষ্টা করল — depth=৩, ৫, ১০, ২০।
- প্রতিবার test-এ accuracy দেখল।
- "সবচেয়ে ভাল" depth বেছে নিল।
- সমস্যা — এই process-এ test set effectively training set হয়ে গেল।
- Test accuracy ৯৪% হলেও, production-এ ৮৭% — কারণ test-এ overfit।
সমস্যা ২: Model selection bias
- Logistic Regression, Decision Tree, Random Forest, XGBoost চেষ্টা।
- প্রতিবার test-এ score।
- "XGBoost জিতল" — কিন্তু randomness-এর কারণে XGBoost just lucky হতে পারে।
- Validation set থাকলে — model selection validation-এ; final estimate test-এ।
সমস্যা ৩: Early stopping impossible
- Neural network train করছেন — ১০০ epoch।
- Train loss কমছে, কিন্তু কখন overfit শুরু?
- Validation loss দেখে stop — sans validation এই decision সম্ভব না।
- Test-এ check = test contaminated।
সঠিক workflow:
- Train: weight শেখা।
- Validation: hyperparameter tune, model select, early stopping।
- Test: শুধু এক বার, project-এর শেষে — production estimate।
বিকল্প — যখন ডেটা ছোট:
- Cross-validation (L05) — train-এর ভেতরেই k-fold।
- এতে validation কার্যকরভাবে train-এ থাকে — test alongé রাখা যায়।
মূল উপলব্ধি: Validation একটি luxury নয়, একটি methodological necessity। এই সেট ছাড়া — আপনার test estimate অর্থহীন।
প্র ০২ আপনি Bkash transaction ডেটা পেয়েছেন — ২০২২-এর ১২ মাস। কীভাবে split করবেন? Random split-এ কী সমস্যা?
এটি একটি classic time-series ডেটা — random split severely misleading হবে।
Random split-এর সমস্যা:
- Test-এ ফেব্রুয়ারির data, train-এ অগাস্টের data — মানে future train-এ ঢুকল।
- মডেল "সময়" শিখছে না — শুধু same-period pattern memorize।
- Production-এ ২০২৬-এ deploy — যা ডেটায় কখনও দেখেনি — accuracy নাটকীয়ভাবে কমবে।
- "১০০% accuracy in lab, 30% in production" — এই ছাঁচের bug।
Specific time leakage examples:
- ঈদের আগের সপ্তাহ — অস্বাভাবিক transaction। Random split-এ এটি train ও test দু'টোয় — overfitting।
- একজন user-এর জানুয়ারি transaction train-এ — মার্চের transaction test-এ। মডেল user-কে "চিনে" — generalization নয়।
সঠিক approach — Temporal split:
- Train: জানু-অগাস্ট (৮ মাস, ৬৭%)।
- Validation: সেপ্টেম্বর-অক্টোবর (২ মাস, ১৭%)।
- Test: নভেম্বর-ডিসেম্বর (২ মাস, ১৭%)।
আরও sophisticated — Walk-forward validation:
- Train: জানু-জুন → Test: জুলাই
- Train: জানু-জুলাই → Test: অগাস্ট
- ...continuing
- Production deployment-এর near-perfect simulation।
- Concept drift handle করতে পারে।
Group split দরকার?
- Personalized fraud — হ্যাঁ, একই user multiple sets-এ ছড়ানো ঝুঁকি।
- Combination — temporal + group: প্রথম ৮ মাসের users train, পরের users test।
Production reality check:
- প্রতি মাসে retrain — কারণ fraud pattern বদলে যায় (concept drift)।
- শুধু temporal split যথেষ্ট নয় — production monitoring দরকার।
- "Statistical drift" alert system।
মূল উপলব্ধি: "Random shuffle" ML-এর default — কিন্তু প্রতিটি default-এর underlying assumption থাকে। iid (independent, identically distributed) — যেটা time-series মানে না।
প্র ০৩ Imbalanced ডেটায় (positive class ১%) random split-এর কী সমস্যা? Stratified split কীভাবে সমাধান? এবং stratified-ও কখন যথেষ্ট নয়?
Imbalanced ML — production-এর সবচেয়ে সাধারণ ও কঠিন challenge। Fraud, disease, churn — সবই imbalanced।
Random split-এর সমস্যা:
- ১০,০০০ sample, ১০০ positive (১%)।
- Random ৮০/১০/১০ split — sometimes test-এ ০টি positive!
- Variance বিশাল — এক run-এ ২ positive, পরের run-এ ১৫।
- Performance estimate unreliable।
Stratified split — সমাধান:
- প্রতিটি class-এর % প্রতিটি set-এ একই রাখা।
- ১% positive — train, val, test সবকটিতে ১%।
- Test set-এ guaranteed ১০টি positive (১০০০-এর ১%)।
- scikit-learn-এ
stratify=y।
Stratified-ও যখন যথেষ্ট নয়:
(১) Multi-attribute stratification:
- Just class না — region × class proportion preserve দরকার।
- ঢাকা ৭০%, চট্টগ্রাম ২০%, অন্যান্য ১০% — splits-এ এই proportion রাখা।
MultilabelStratifiedKFoldবা manual stratification।
(২) Extreme imbalance (০.০১%):
- ১M sample, ১০০ fraud — even stratified test-এ মাত্র ১০ fraud (১% × ১০০)।
- Statistical significance impossible।
- সমাধান — stratified k-fold, multiple random seeds, large test set।
(৩) Imbalance + small data:
- ৫০০ sample, ১০ positive — split-এর পর প্রতি set-এ ১-২ positive।
- Stratified k-fold + leave-one-out।
(৪) Imbalance + temporal:
- সাম্প্রতিক fraud pattern আলাদা — শুরুর fraud test-এ irrelevant।
- Need: chronological split এর সাথে stratified-style minimum sample guarantee।
- Adaptive sampling।
সম্পর্কিত কৌশল:
- SMOTE (L43): synthetic minority oversampling — train-এ apply। Test-এ কখনো না।
- Class weights: minority class-কে বেশি weight loss-এ।
- Threshold tuning: default 0.5-এর জায়গায় optimize।
Critical mistake:
- Test set-এ SMOTE — synthetic data-এ evaluate, fake performance।
- Test always representative of real production distribution।
মূল উপলব্ধি: Imbalance — single technique-এর সমস্যা নয়। Splitting + sampling + loss function + threshold — multi-pronged approach।
প্র ০৪ "Data Leakage" কী? পাঁচ ধরনের সাধারণ leakage describe করুন — প্রতিটি কীভাবে প্রতিরোধ?
Data leakage — production AI-র সর্বোচ্চ ব্যর্থতার কারণ। Lab-এ ৯৯%, production-এ ৬০% — সাধারণত কোনো না কোনো leakage।
সংজ্ঞা: Training-এ এমন তথ্য যা আসলে production prediction time-এ পাওয়া যায় না।
(১) Target Leakage:
- উদাহরণ: Predicting cancer; feature-এ "received chemotherapy"। Chemo লাগে cancer-এর কারণে — circular।
- পরীক্ষা: Production-এ এই feature কি সত্যিই available prediction-এর আগে?
- প্রতিরোধ: Strict timeline analysis — feature কখন collected, label কখন known।
(২) Train-Test Contamination:
- উদাহরণ: Whole dataset-এ scaling fit, তারপর split। Test-এর mean/std train-এ ঢুকল।
- পরীক্ষা: কোনো preprocessing কি split-এর আগে?
- প্রতিরোধ: scikit-learn Pipeline (L42) — fit train-এ, transform test-এ।
(৩) Time Leakage:
- উদাহরণ: Stock prediction-এ random split; future test → past train।
- পরীক্ষা: Train-এ যদি timestamps test-এর চেয়ে later থাকে।
- প্রতিরোধ: Chronological split।
(৪) Group Leakage:
- উদাহরণ: Same patient multiple X-rays — train ও test দু'টোতে।
- পরীক্ষা: Test-এর কোনো user/patient/group কি train-এও আছে?
- প্রতিরোধ: GroupShuffleSplit।
(৫) Label Leakage in features:
- উদাহরণ: Sales prediction; feature "next month sales"-এর variant।
- পরীক্ষা: Suspiciously high accuracy (>৯৫%)। Feature importance analysis।
- প্রতিরোধ: Domain expert review; feature derivation auditing।
আরও দু'টি subtle:
- Order-based leakage: Sorted ডেটায় random split — অপ্রত্যাশিত pattern।
- Aggregate leakage: Train-এর mean feature হিসেবে — যদি test-এর data মিশ্রিত।
Detection workflow:
- Train accuracy ≈ test accuracy + suspiciously high → leakage suspect।
- Feature importance — top feature কি timing-related?
- Adversarial validation — train ও test combine, classifier "from-train-or-test" predict। ৫০% accuracy = no leak; ৯০% = severe distribution shift।
Real-world cost:
- Kaggle-এ "winning" solutions কখনো কখনো leakage-based — disqualified।
- Production deploy → instant failure → trust loss।
মূল উপলব্ধি: Leakage technique-এর ভুল না, mindset-এর ভুল। প্রতিটি feature-এর জন্য জিজ্ঞাসা — "production-এ prediction time-এ এটি কি available?"
অনুশীলন
-
হিসাব: ১০,০০০ sample-এর ৭০/১৫/১৫ split। Train, Val, Test-এ কতগুলো?
Train = ৭,০০০, Val = ১,৫০০, Test = ১,৫০০।
-
scikit-learn: উপরের code চালান। Stratify ছাড়া vs সাথে — class proportion compare করুন।
import numpy as np print("Train:", np.bincount(y_tr)) print("Val: ", np.bincount(y_val)) print("Test: ", np.bincount(y_te))Stratify-এ proportion সমান, ছাড়া — variance। Iris balanced বলে পার্থক্য কম। Imbalanced data-এ পার্থক্য বিশাল।
-
চিন্তা: তিনটি scenario — কোন split চাইবেন?
- (ক) Email spam — ১M ইমেইল
- (খ) ঢাকার আগামী সপ্তাহের আবহাওয়া পূর্বাভাস — ১০ বছরের ডেটা
- (গ) Hospital readmission prediction — ৫০০ রোগীর প্রতিজনের ৫টি visit
- (ক) Stratified random split (spam imbalanced)। ৯৮/১/১।
- (খ) Time-based split — কখনো random না।
- (গ) Group-based split — পেশেন্ট group। Random হলে leakage।
আরও পড়ুন
- পাঠ ০৪ · Bias-Variance ট্রেডঅফ পরবর্তী পাঠ Train/test gap-এর গাণিতিক ব্যাখ্যা।
- পাঠ ০২ · ERM ও Hypothesis class আগের পাঠ Empirical risk-এর ভিত্তি।
- পাঠ ০৫ · Cross-validation এই পাঠের সাথে সম্পর্কিত Single split-এর alternative — k-fold পদ্ধতি।
- AI Foundations · L27 · ডেটাসেট প্রাসঙ্গিক ভাল ডেটার বৈশিষ্ট্য ও Data Leakage বিস্তারিত।