Practical MLপড়তে ৭ মিনিট লাগবে

ক্রস-ভ্যালিডেশন (Cross-Validation)

প্রতিটি ফোল্ডে (fold) টেস্ট করুন, যাতে কোনো ডেটাই নষ্ট না হয়
k-fold CV:k বার ট্রেইন করা হয় · এটি অনেক বেশি নির্ভরযোগ্য অনুমানholdout split:১ বার ট্রেইন করা হয় · অনেক দ্রুত কাজ করে, তবে খুব একটা রিলায়েবল বা ভরসায়োগ্য নয়leave-one-out:n বার ট্রেইন করা হয় · সবচেয়ে নিখুঁত তবে অত্যন্ত ধীরগতির

ভাবুন তো, একটি ম্যাজিক বা জাদুর শো-এর জন্য কিছু জাদুকর রিহার্সেল (rehearsal) করছে। তারা নিজেদের মধ্যে খুব সৎ একটি প্রতিক্রিয়া বা ফিডব্যাক (feedback) চায়, কিন্তু প্রতিদিন বাইরে থেকে কোনো বিচারক নিয়ে আসা তাদের পক্ষে সম্ভব নয়। তাই তারা একটি চমৎকার বুদ্ধি বের করলো: প্রতিটি রিহার্সেলে, তাদের মধ্য থেকে একজন কেবল বসে বসে দেখবে, আর বাকিরা জাদুর কৌশল দেখাবে। সোমবারে হয়তো একজন দেখবে, মঙ্গলবারে আরেকজন, আর বুধবারে ভিন্ন আরেকজন।

এভাবে পুরো সপ্তাহ শেষে, সবাই অন্তত একবার দর্শক হিসেবে এবং বাকি সময়গুলো মূলত জাদুকর হিসেবে পারফর্ম করতে পারবে। এর ফলে তারা বিভিন্ন দৃষ্টিভঙ্গি থেকে একে অপরের কৌশল নিয়ে অনেক ভালো ফিডব্যাক পাবে এবং এখানে কারও একার মতামতই সবকিছুর ওপর প্রভাব ফেলতে পারবে না।

সংক্ষেপে ক্রস-ভ্যালিডেশন (cross-validation) জিনিসটি মূলত ঠিক এমনভাবেই কাজ করে। এক্ষেত্রে আপনার মডেলটিকে কেবল ডেটার একটি অংশের ওপর টেস্ট বা পরীক্ষা না করে, আপনি মূলত এটিকে কয়েকটি অংশে ভাগ করে টেস্ট করেন, যাতে প্রতিটি ডেটা পয়েন্টই কোনো না কোনো সময় টেস্ট সেটে (test set) যাওয়ার সুযোগ পায়

একটি সিঙ্গেল বা সাধারণ ট্রেনিট/টেস্ট স্প্লিট (single train/test split)-এর সমস্যা

আপনি যখন আপনার ডেটাকে ৮০/২০ (80/20)-এ ভাগ করেন, তখন আপনি মূলত বিশ্বাস করে নেন যে আপনি যে ২০% বেছে নিয়েছেন তা সম্পূর্ণ ডেটার প্রতিনিধিত্ব (representative) করবে। কিন্তু যদি দুর্ভাগ্যবশত সবচেয়ে সহজ উদাহরণগুলো টেস্ট সেটে গিয়ে পড়ে? তাহলে হয়তো আপনার মডেলটিকে দেখে অনেক দারুণ মনে হবে — কিন্তু এটি আসলে সম্পূর্ণ মিথ্যে একটি ফলাফল দেবে। আবার যদি সবচেয়ে কঠিন উদাহরণগুলো টেস্ট সেটে চলে যায়? তখন আপনার মডেলটি আসলেই ভালো হওয়া সত্ত্বেও সেটিকে দেখে একেবারে বাজে মনে হবে।

তাই একটি সিঙ্গেল স্প্লিট হলো অনেকটা কেবল একজন মানুষকে আপনার রেস্টুরেন্ট নিয়ে রিভিউ বা মতামত দিতে বলার মতো। তিনি হয়তো এটি খুব পছন্দ করতে পারেন, আবার খুব অপছন্দও করতে পারেন — অর্থাৎ একজনের মতামতের ওপর আসলে ভরসা করা যায় না।

কে-ফোল্ড ক্রস-ভ্যালিডেশন (K-Fold Cross-Validation)

এর সমাধান হলো এটি। আপনার ডেটাকে k সংখ্যক সমান অংশে (যাদেরকে ফোল্ড বা fold বলা হয়) ভাগ করুন। এরপর:

  1. ফোল্ড ১-কে টেস্ট সেট হিসেবে ব্যবহার করুন, আর ফোল্ড ২-৫-এ ট্রেইন করুন
  2. ফোল্ড ২-কে টেস্ট সেট হিসেবে ব্যবহার করুন, আর ফোল্ড ১, ৩-৫-এ ট্রেইন করুন
  3. ফোল্ড ৩-কে টেস্ট সেট হিসেবে ব্যবহার করুন, আর ফোল্ড ১-২, ৪-৫-এ ট্রেইন করুন
  4. ...এভাবে প্রতিটি ফোল্ড একবার টেস্ট সেট হিসেবে কাজ না করা পর্যন্ত চলতে থাকুন

এখন আপনার কাছে k সংখ্যক আলাদা অ্যাকুরেসি স্কোর (accuracy scores) থাকবে। সবগুলোর গড় বা এভারেজ বের করুন, এবং এটি আপনার মডেলের পারফরম্যান্স সম্পর্কে অনেক বেশি নির্ভরযোগ্য বা রিলায়েবল (reliable) একটি ধারণা বা অনুমান দিতে পারবে।

অ্যাকশনে কে-ফোল্ড ক্রস-ভ্যালিডেশন (K-Fold Cross-Validation in Action)

from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# চমৎকার একটি ডেটাসেট (classic dataset) লোড করা
X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier(random_state=42)
# ৫-ফোল্ড ক্রস-ভ্যালিডেশন (5-fold cross-validation)
scores = cross_val_score(model, X, y, cv=5)
print(f"ফোল্ড এর স্কোরগুলো (Fold scores): {scores}")
print(f"গড় বা মিন অ্যাকুরেসি (Mean accuracy): {scores.mean():.3f}")
print(f"স্ট্যান্ডার্ড ডেভিয়েশন (Std deviation): {scores.std():.3f}")
# একটি সাধারণ বা সিঙ্গেল 80/20 স্প্লিটের চেয়ে এটি অনেক বেশি নির্ভরযোগ্য!
Output
ফোল্ড এর স্কোরগুলো (Fold scores): [0.97 0.97 0.90 0.97 0.93]
গড় বা মিন অ্যাকুরেসি (Mean accuracy): 0.947
স্ট্যান্ডার্ড ডেভিয়েশন (Std deviation): 0.030

ক্রস-ভ্যালিডেশনের ধরন (Flavors of cross-validation)

  • ৫-ফোল্ড বা ১০-ফোল্ড সিভি (5-Fold or 10-Fold CV) — এটি সবচেয়ে সাধারণ। এতে সময় এবং নির্ভরযোগ্যতার মধ্যে খুব ভালো একটি ব্যালেন্স বা ভারসাম্য থাকে।
  • লিভ-ওয়ান-আউট বা LOO (Leave-One-Out) — এখানে প্রতিটি স্যাম্পল নিজেই একেকটি ফোল্ড হিসেবে কাজ করে। এটি সবচেয়ে নিখুঁত ফলাফল দিলেও এটি অনেক বড় ডেটাসেটের জন্য মারাত্মক ধীরগতির (আপনাকে n সংখ্যক আলাদা আলাদা মডেল ট্রেইন করতে হয়!)।
  • স্ট্র্যাটিফাইড কে-ফোল্ড (Stratified K-Fold) — এটি নিশ্চিত করে যে প্রতিটি ফোল্ডে যেন ক্লাসগুলোর অনুপাত একই থাকে। আপনার ডেটা যদি ইমব্যালেন্সড বা ভারসাম্যহীন হয় (যেমন: ৯৫% স্ক্যাম নয়, ৫% স্ক্যাম-এর মতো), তবে এটি ব্যবহার করা খুবই জরুরি।

কখন এটি ব্যবহার করবেন?

যখন আপনি মডেলগুলোর তুলনা (comparing models) করছেন বা হাইপারপ্যারামিটার টিউন (tuning hyperparameters) করছেন, তখন ক্রস-ভ্যালিডেশন (cross-validation) ব্যবহার করা খুবই জরুরি। যদি একটি সাধারণ বা সিঙ্গেল স্প্লিটের ক্ষেত্রে মডেল এ (Model A) ৯২% এবং মডেল বি (Model B) ৯১% পায়, তবে ওইটুকু পার্থক্য মূলত কোনো নয়েজের কারণেও হতে পারে। কিন্তু ৫টি ভিন্ন ভিন্ন ফোল্ডের সবকটিতেই যদি মডেল এ (Model A) ক্রমাগত মডেল বি-কে (Model B) হারিয়ে দেয়, তবে আপনি অনেক বেশি নিশ্চিত হতে পারবেন যে সত্যিই মডেল এ ভালো পারফর্ম করছে।

Note: ক্রস-ভ্যালিডেশন (Cross-validation) মূলত আপনাকে কোনো ভালো মডেল দেয় না — বরং এটি আপনার মডেলটি আসলে কতটা ভালো, তার একটি খুব ভালো অনুমান বা ধারণা (ESTIMATE) দেয়। একবার সবচেয়ে ভালো বা সঠিক পদ্ধতিটি বেছে নেওয়ার পর, আপনি পরবর্তীতে সেই মডেলটিকে পুনরায় সম্পূর্ণ ডেটার ওপর ট্রেইন করাতে পারেন।

Key Metrics

🔀 সিঙ্গেল বা একটিমাত্র ট্রেন/টেস্ট স্প্লিট (Single Train/Test Split)
অনেক দ্রুত হলেও এটি খুব একটা রিলায়েবল নয় বা নয়েজি (noisy) — এর ফলাফল মূলত র‍্যান্ডম স্প্লিটের ওপর নির্ভর করে
১× ট্রেইনিং (1× training) O(n)
📂 কে-ফোল্ড সিভি (k=5) (K-Fold CV (k=5))
manageable cost বা কম খরচের পাশাপাশি এটি অনেক রিলায়েবল বা নির্ভরযোগ্য অনুমান দেয়
৫× ট্রেইনিং (5× training) O(5n)
🔬 লিভ-ওয়ান-আউট সিভি (Leave-One-Out CV)
এটি সবচেয়ে নির্ভরযোগ্য, তবে ভীষণ ধীরগতির হতে পারে
n× ট্রেইনিং (n× training) O(n²)

ছোট কুইজ

৫-ফোল্ড ক্রস-ভ্যালিডেশনে (5-fold cross-validation), একটি মডেলকে কতবার ট্রেইন করা হয়?
Challenge

পড়া চালিয়ে যান

বায়াস বনাম ভ্যারিয়েন্স (Bias vs Variance)
খুব সাধারণ নাকি বেশি অগোছালো — এর মাঝামাঝি একটি পারফেক্ট জায়গা (sweet spot) খুঁজে বের করুন
মডেল ইভ্যালুয়েশন বা মূল্যায়ন (Model Evaluation)
অ্যাকুরেসি বা নির্ভুলতাই সবকিছু নয় — আসুন আরও ভালোভাবে আরওসি (ROC), এইউসি (AUC), এফ১ (F1) সম্পর্কে জেনে নিই
রেগুলারাইজেশন (Regularization)
মডেলটি যাতে সৎ থাকে সেজন্য এর কমপ্লেক্সিটিতে (complexity) পেনাল্টি (penalty) দেওয়া