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
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-এ প্রায়ই হয়, আর এখান থেকে তিনটা শিক্ষা:
- একটা test score-এ ভাগ্য আছে। ১০০ জনের test set-এ কয়েকজন "অদ্ভুত" student পড়লেই score বদলে যায়। ভিন্ন ভিন্ন ২০ রকম split-এ গড় করলে model প্রায় ৮০% — baseline-এর চেয়ে সামান্য ভালো। (নিচে "বাস্তবে" অংশে নিজে চালিয়ে দেখো।)
- দুটো feature যথেষ্ট না। শুধু পড়ার সময় আর উপস্থিতি দিয়ে pass/fail আলাদা করা কঠিন — আরও feature লাগবে (আগের lesson-এর
make_features)। - 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-কে সীমা ছাড়া বাড়তে দিলে কী হয়:
সীমাহীন 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
students_clean.csv থেকে X (study_hours, attendance) আর y (passed)।
train_test_splitদিয়ে ভাগ করো: test 25%,random_state=42,stratify=yLogisticRegression()model train করো শুধু train অংশেtest_acc— test অংশে accuracy, 3 ঘর দশমিকে roundbaseline_acc— test অংশে "সবাই pass" বললে accuracy, 3 ঘর দশমিকে round
Quiz
Challenge
Challenge
Validation set দিয়ে সৎ model বাছাই
Decision tree-র max_depth কত হবে — 1 থেকে 10-এর মধ্যে বাছাই করতে হবে। কিন্তু test set দেখে বাছাই করলে test আর "অদেখা" থাকে না!
সঠিক পদ্ধতি — select_depth(X, y) function:
- প্রথমে test আলাদা করো:
train_test_split(X, y, test_size=0.2, random_state=0, stratify=y) - বাকি অংশ থেকে validation:
train_test_split(X_rest, y_rest, test_size=0.25, random_state=0, stratify=y_rest) - প্রতিটা depth (1–10):
DecisionTreeClassifier(max_depth=d, random_state=0)train-এ fit, validation-এ score - সবচেয়ে ভালো validation score-এর depth বাছো (সমান হলে ছোট depth)
- সেই depth দিয়ে train + validation একসাথে fit করে একবারই test-এ score
- Return:
{"best_depth": int, "val_scores": {depth: score}, "test_acc": float}
বাস্তবে কোথায় ব্যবহার হয়?
একটা ছোট dataset-এ test score নিজেই কতটা "ভাগ্যের" ওপর নির্ভর করে — ভিন্ন random_state-এ:
১০০ জনের 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 কমানো।