মূল content-এ যাও

Machine Learning/ML-এর ভিত্তি/Lesson 04

Train/Test split ও first model

Model-কে অদেখা data-য় পরীক্ষা করা — train_test_split, stratify, প্রথম scikit-learn model, baseline-এর সাথে তুলনা, মুখস্থ (overfitting) ধরা, আর validation set দিয়ে সৎভাবে model বাছাই।

সময়
26 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

ধরো পরীক্ষার আগে তোমাকে প্রশ্নপত্রটাই দিয়ে দেওয়া হলো। তুমি ১০০ পেলে — কিন্তু তাতে কি প্রমাণ হলো তুমি বিষয়টা জানো? না, শুধু উত্তর মুখস্থ করেছো।

Model-এর ক্ষেত্রেও তাই। যে data দিয়ে শিখেছে, সেই data-য় পরীক্ষা নিলে সেটা মুখস্থের পরীক্ষা। আসল প্রশ্ন: নতুন, অদেখা data-য় কেমন করে?

সমাধান: data দুই ভাগ —

সব data (397 জন)
├── train (75%)  ──►  model এখান থেকে শেখে
└── test  (25%)  ──►  একদম শেষে, একবার, পরীক্ষার জন্য — শেখার সময় model কখনো দেখে না

কেন দরকার?

Production-এ model সবসময় নতুন data পায় — নতুন student, নতুন লেনদেন, নতুন email। Test set সেই ভবিষ্যতের একটা অনুকরণ। Test score-ই একমাত্র সৎ উত্তর "এই model আসল ব্যবহারে কতটা কাজ করবে"।

প্রথম scikit-learn model

main.py

scikit-learn-এর সব model একই তিন ধাপ:

Methodকাজ
model.fit(X_train, y_train)শেখা
model.predict(X_new)নতুন data-য় prediction
model.score(X_test, y_test)accuracy (classification) বা R² (regression)

Logistic regression কীভাবে কাজ করে — Classification module-এ বিস্তারিত। আপাতত এটা একটা "বাক্স" যেটা fit আর predict জানে।

একটা অস্বস্তিকর ফলাফল

সংখ্যাগুলো ভালো করে দেখো — এই split-এ model-এর test accuracy (~৬৮%) baseline (~৭৮%)-এর চেয়েও কম! কিছু না শিখে "সবাই pass" বললেই বেশি ঠিক হতো। এটা লুকানোর জিনিস না — real ML-এ প্রায়ই হয়, আর এখান থেকে তিনটা শিক্ষা:

  1. একটা test score-এ ভাগ্য আছে। ১০০ জনের test set-এ কয়েকজন "অদ্ভুত" student পড়লেই score বদলে যায়। ভিন্ন ভিন্ন ২০ রকম split-এ গড় করলে model প্রায় ৮০% — baseline-এর চেয়ে সামান্য ভালো। (নিচে "বাস্তবে" অংশে নিজে চালিয়ে দেখো।)
  2. দুটো feature যথেষ্ট না। শুধু পড়ার সময় আর উপস্থিতি দিয়ে pass/fail আলাদা করা কঠিন — আরও feature লাগবে (আগের lesson-এর make_features)।
  3. Accuracy হয়তো ভুল মাপকাঠি। আমাদের আসল লক্ষ্য ঝুঁকিতে থাকা student খোঁজা। Baseline ২২ জন fail করা student-এর একজনকেও ধরে না; model ধরেছে ৪ জনকে। Accuracy-তে model হারলো, কিন্তু আসল কাজে এগিয়ে। Classification module-এ এর সঠিক metric দেখবো — recall।

train_test_split-এর parameter

Parameterকেন
test_size=0.25কত ভাগ test-এ (সাধারণত 0.2–0.3)
random_state=42প্রতিবার একই ভাগ — reproducible
stratify=yদুই ভাগেই pass/fail-এর অনুপাত একই

মুখস্থ ধরা: overfitting

একটা decision tree-কে সীমা ছাড়া বাড়তে দিলে কী হয়:

main.py

সীমাহীন tree (None) train-এ প্রায় ১০০% — প্রায় প্রতিটা student-কে আলাদা করে মুখস্থ করেছে। কিন্তু test-এ অনেক খারাপ! এটাই overfitting: train আর test score-এর বিশাল ফারাক তার চিহ্ন।

train ≈ test, দুটোই কম    ->  underfitting  (model খুব সরল)
train ≈ test, দুটোই ভালো  ->  ঠিকঠাক
train >> test             ->  overfitting   (model মুখস্থ করছে)

Validation set: সৎ বাছাই

উপরের table দেখে "সেরা depth" বাছতে ইচ্ছা করে। কিন্তু test score দেখে বাছাই করলে test আর অদেখা থাকে না — বাছাইয়ের প্রক্রিয়ায় test-এর তথ্য ঢুকে গেছে। সমাধান: তিন ভাগ —

সব data
├── train       (60%)  ──►  শেখা
├── validation  (20%)  ──►  model/setting বাছাই
└── test        (20%)  ──►  একদম শেষে, একবার

Challenge-এ ঠিক এই পদ্ধতি লিখবে। (Model Development module-এ এর আরও শক্তিশালী রূপ — cross-validation।)

Exercise

Exercise

প্রথম model

+20 XP

students_clean.csv থেকে X (study_hours, attendance) আর y (passed)।

  1. train_test_split দিয়ে ভাগ করো: test 25%, random_state=42, stratify=y
  2. LogisticRegression() model train করো শুধু train অংশে
  3. test_acc — test অংশে accuracy, 3 ঘর দশমিকে round
  4. baseline_acc — test অংশে "সবাই pass" বললে accuracy, 3 ঘর দশমিকে round
solution.py

Quiz

  1. Q1Model যে data দিয়ে train হয়েছে, সেই data-তেই accuracy মাপলে কী সমস্যা?
  2. Q2stratify=y কী করে?
  3. Q3১০টা model-এর মধ্যে test score দেখে সেরাটা বাছলে সমস্যা কী?
0/3 answered

Challenge

Challenge

Validation set দিয়ে সৎ model বাছাই

+50 XP

Decision tree-র max_depth কত হবে — 1 থেকে 10-এর মধ্যে বাছাই করতে হবে। কিন্তু test set দেখে বাছাই করলে test আর "অদেখা" থাকে না!

সঠিক পদ্ধতি — select_depth(X, y) function:

  1. প্রথমে test আলাদা করো: train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)
  2. বাকি অংশ থেকে validation: train_test_split(X_rest, y_rest, test_size=0.25, random_state=0, stratify=y_rest)
  3. প্রতিটা depth (1–10): DecisionTreeClassifier(max_depth=d, random_state=0) train-এ fit, validation-এ score
  4. সবচেয়ে ভালো validation score-এর depth বাছো (সমান হলে ছোট depth)
  5. সেই depth দিয়ে train + validation একসাথে fit করে একবারই test-এ score
  6. Return: {"best_depth": int, "val_scores": {depth: score}, "test_acc": float}
solution.py

বাস্তবে কোথায় ব্যবহার হয়?

একটা ছোট dataset-এ test score নিজেই কতটা "ভাগ্যের" ওপর নির্ভর করে — ভিন্ন random_state-এ:

main.py

১০০ জনের test set-এ শুধু ভাগ্যের কারণেই accuracy কয়েক শতাংশ ওঠানামা করে। তাই "আমার model ৮৪%, তোমারটা ৮২%" — ছোট data-য় এই পার্থক্য হয়তো অর্থহীন। Cross-validation lesson-এ এর সমাধান দেখবো।

Interview প্রশ্ন

  • Beginner: Train আর test set কেন আলাদা করা হয়?
  • Intermediate: Overfitting কীভাবে চিনবে? Train/validation/test তিন ভাগ কেন?
  • Advanced: Time-series data (যেমন stock price) random split করলে কী সমস্যা? কীভাবে ভাগ করবে?

এরপর কী?

🎉 ML-এর ভিত্তি module শেষ। তুমি এখন জানো ML কী, একটা project-এর পুরো চক্র, feature আর label বানানো, আর model-কে সৎভাবে পরীক্ষা করা।

পরের module: Regression — linear regression ভেতর থেকে, regression-এর metric (MAE, RMSE, R²), overfitting আর underfitting চোখে দেখা, আর regularization দিয়ে overfitting কমানো।