পাঠ ০৩ · ৪৫-এর মধ্যে · মডিউল ১
Home / AI Courses / Machine Learning / Train/Val/Test

Train/Validation/Test বিভাজন

Train/validation/test split
৬ মিনিট পড়া শুরু · Beginner scikit-learn কোডসহ

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

  • কেন একটি সেট যথেষ্ট নয় — তিন সেট কেন
  • সঠিক অনুপাত — ডেটার আকার অনুযায়ী
  • 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 এবং ভাগ:

Python · scikit-learn
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।

Train / Validation / Test — ৩টি কাজ, ৩টি সেট পুরো ডেটাসেট (১০০%) Train · 70% parameter (weight) শেখানো Val · 15% tune Test · 15% final ⚠️ কোন সেট কখন Train প্রতি epoch-এ model.fit(X_train, y_train) backprop · gradient update Validation tune করা চলাকালে learning rate, depth ইত্যাদি early stopping Test (sacred) শুধু একবার — শেষে production-এর simulation এতে tune করবেন না!
প্রতিটি সেট ভিন্ন কাজে ব্যবহৃত। Test set "sacred" — পুনরায় ব্যবহারে generalization estimate ভঙ্গ।

৭ · ৫টি সাধারণ ভুল

  1. Test set repeatedly use: "৫টি মডেল চেষ্টা করলাম, যেটা test-এ ভাল সেটাই deploy" — এটাই overfitting to test।
  2. Stratify ভুলে যাওয়া — imbalanced data-এ।
  3. Time-series-এ random split — future leakage।
  4. Group-aware না করা — patient/user repeat থাকলে।
  5. 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।

"Test set" production-এর simulation। আপনি ১০টি ভিন্ন hyperparameter চেষ্টা করে test-এ test করলে — production-এ accuracy অবশ্যই কম হবে। এই rule ভঙ্গ = #1 reason ML project ব্যর্থ।

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

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

প্র ০১ একজন 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?"

অনুশীলন

  1. হিসাব: ১০,০০০ sample-এর ৭০/১৫/১৫ split। Train, Val, Test-এ কতগুলো?

    Train = ৭,০০০, Val = ১,৫০০, Test = ১,৫০০।

  2. 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-এ পার্থক্য বিশাল।

  3. চিন্তা: তিনটি scenario — কোন split চাইবেন?
    • (ক) Email spam — ১M ইমেইল
    • (খ) ঢাকার আগামী সপ্তাহের আবহাওয়া পূর্বাভাস — ১০ বছরের ডেটা
    • (গ) Hospital readmission prediction — ৫০০ রোগীর প্রতিজনের ৫টি visit
    • (ক) Stratified random split (spam imbalanced)। ৯৮/১/১।
    • (খ) Time-based split — কখনো random না।
    • (গ) Group-based split — পেশেন্ট group। Random হলে leakage।

আরও পড়ুন

কোড রানার কাজ না করলে? Google Colab ব্যবহার করুন।
পূর্ববর্তী পাঠ
পাঠ ০২ · ERM ও Hypothesis class