Foundationsপড়তে ৬ মিনিট লাগবে

ট্রেইন-টেস্ট স্প্লিট (Train-Test Split)

বাসার কাজ বা হোমওয়ার্ক দিয়ে প্র্যাকটিস করানো এবং নতুন প্রশ্ন দিয়ে পরীক্ষা নেওয়া — এ কারণেই আপনার ডেটাকে আলাদা করা বা স্প্লিট (split) করা খুবই জরুরি
training set:ট্রেইনিং সেট (Training set) · যেখান থেকে মডেল নিজে নিজে শেখেtest set:টেস্ট সেট (Test set) · যার মাধ্যমে মডেলের পরীক্ষা নেওয়া হয় বা গ্রেড দেওয়া হয়typical split:সাধারণ স্প্লিট বা বিভাজন (Typical split) · ৮০% ট্রেইন (train) · ২০% টেস্ট (test)

ধরা যাক, একজন শিক্ষক হিসেবে আপনি ফাইনাল পরীক্ষার প্রশ্ন বানাচ্ছেন। পুরো সেমিস্টার ধরে আপনি আপনার শিক্ষার্থীদের ১০০টি প্র্যাকটিস প্রবলেম বা সমস্যা সমাধান করতে দিয়েছেন। এখন পরীক্ষার দিন চলে এসেছে।

আপনি কি পরীক্ষায় সেই একই রেগুলার ১০০টি প্রশ্ন দেবেন? অবশ্যই না! কারণ সেগুলোর উত্তর যে কেউ না বুঝেই কেবল মুখস্থ করে ফেলতে পারে এবং পরীক্ষায় ভালো গ্রেড পেতে পারে। এর মাধ্যমে আপনার শিক্ষার্থীদের আসল জ্ঞান বা লার্নিং কোনোভাবেই পরীক্ষা করা হবে না।

এর বদলে, আপনি নিশ্চয়ই সম্পূর্ণ নতুন কিছু প্রশ্ন বানাবেন, যেগুলো মূলত ওই একই বিষয়ের ওপর ভিত্তি করে তৈরি হবে, কিন্তু আগের হোমওয়ার্কের মতো হুবহু এক হবে না। এতে করে যদি কোনো শিক্ষার্থী সত্যিই বিষয়টি মাথায় গেঁথে নিতে পারে (কেবল উত্তর মুখস্থ করা নয়), তবে সে নতুন প্রশ্নেও ঠিকই ভালো করতে পারবে।

আর ঠিক এ কারণেই আমরা মেশিন লার্নিংয়ে ডেটাকে ভাগ করে নিই বা স্প্লিট (split) করি। এখানকার ট্রেইনিং সেট (training set) হলো সেই হোমওয়ার্কের বা প্র্যাকটিসের মতো — মডেল যার মাধ্যমে প্র্যাকটিস করে নিজে থেকে শেখে। আর টেস্ট সেট (test set) হলো সেই ফাইনাল পরীক্ষার মতো — যার মাধ্যমে মডেল আগে কখনো দেখেনি এমন নতুন কোনো ডেটায় কতটা ভালো করতে পারে তার পরীক্ষা নেওয়া হয়।

মডেল কেন সবগুলো ডেটার ওপরে একসাথে ট্রেইন করতে পারে না?

আপনি যদি ট্রেইনিংয়ের সময় মডেলটিকে সবগুলো ডেটা দেখতে দেন, তবে মডেলটি কি সত্যিই এর ভেতরের আসল প্যাটার্নগুলো শিখছে নাকি কেবল উত্তরগুলো মুখস্থ করে নিচ্ছে, তা জানার কোনো উপায় আপনার কাছে থাকবে না। এমন ক্ষেত্রে, এটি ট্রেইনিং ডেটায় ৯৯% স্কোর করতে পারে, কিন্তু বাস্তব জীবনের নতুন কোনো ডেটায় এটি একেবারেই চরমভাবে ফেল করবে।

তাই ডেটার একটি নির্দিষ্ট পরিমাণ অংশ (টেস্ট সেট) আলাদা করে রাখার মাধ্যমে, আপনি এর ওপর মডেলটির একটি সঠিক গ্রেড বা মূল্যায়ন করতে পারেন। যেহেতু মডেলটি এই সমস্ত নতুন উদাহরণগুলো এর আগে কখনো দেখেনি, তাই এই টেস্ট সেটে সে কতটা ভালো বা খারাপ করছে, তা দেখলেই আপনি বুঝতে পারবেন যে বাস্তব জীবনে সে কেমন ফলাফল দেবে।

সাধারণ স্প্লিট বা বিভাজন (The typical split)

এটিতে মূলত সবচেয়ে বেশি ৮০/২০ স্প্লিট (80/20 split)-এর নিয়ম ব্যবহার করা হয়:

  • এর ৮০% ডেটা → ট্রেইনিং সেটের (training set) জন্য রাখা হয় (অর্থাৎ হোমওয়ার্কের জন্য)
  • বাকি ২০% ডেটা → টেস্ট সেটের (test set) জন্য রাখা হয় (অর্থাৎ পরীক্ষার জন্য)

অনেকেই আবার ৭০/৩০ বা ৯০/১০ স্প্লিটও ব্যবহার করে থাকেন — আসলে এর কোনো নির্দিষ্ট বা ম্যাজিক নম্বর নেই। তবে এদের সবার মূল উদ্দেশ্য বা আইডিয়া একটাই: আপনি আপনার বেশিরভাগ ডেটার ওপর মডেলকে ট্রেইন করাবেন এবং ডেটার বাকি একটি ছোট অংশ আলাদা করে রেখে তার ওপর এটিকে টেস্ট করাবেন বা পরীক্ষা করবেন।

সবচেয়ে জরুরি নিয়ম বা রুল: মডেলটিকে ট্রেইনিং করার সময় যেকোনো মূল্যে টেস্ট সেট থেকে দূরে রাখতে হবে। সে যেন কোনোভাবেই টেস্ট সেটের একটু অংশও না দেখতে পায়। যদি সে এটি দেখে ফেলে, তবে আপনার এই পুরো ট্রেইনিং বা মূল্যায়ন একেবারে জলে যাবে বা কোনো কাজেই আসবে না।

Sklearn (এসকেলার্ন) ব্যবহার করে ডেটা স্প্লিট করা (Splitting Data with sklearn)

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# স্যাম্পল বা সাধারণ ডেটাসেট
X = [
[6, 8], [2, 4], [7, 7], [1, 5],
[5, 6], [8, 9], [3, 3], [4, 7],
[9, 8], [2, 6], [6, 5], [7, 9],
]
y = [1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1] # pass/fail
# স্প্লিট: ৮০% ট্রেইন (train), ২০% টেস্ট (test)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(f"ট্রেইনিং স্যাম্পল (Training samples): {len(X_train)}")
print(f"টেস্ট স্যাম্পল (Test samples): {len(X_test)}")
# কেবলমাত্র ট্রেইনিং ডেটার (training data) ওপর ট্রেইন করা
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# টেস্ট ডেটার (test data) ওপর গ্রেড বা মূল্যায়ন করা (যা এটি আগে কখনোই দেখেনি!)
predictions = model.predict(X_test)
print(f"\nটেস্ট অ্যাকুরেসি বা সঠিক হওয়ার হার (Test accuracy): {accuracy_score(y_test, predictions):.0%}")
Output
ট্রেইনিং স্যাম্পল (Training samples): 9
টেস্ট স্যাম্পল (Test samples):     3

টেস্ট অ্যাকুরেসি বা সঠিক হওয়ার হার (Test accuracy): 67%

ডেটাগুলোকে শাফল (shuffle) বা ওলটপালট করতে ভুলবেন না!

যেকোনো ডেটা স্প্লিট করার বা ভাগ করার আগে, সেগুলোকে সবসময় রেন্ডমলি (randomly) শাফল (shuffle) করে বা ওলটপালট করে নেওয়া ভালো। কিন্তু কেন? ধরা যাক, আপনার ডেটাসেটটি আগে থেকেই একটি নির্দিষ্ট নিয়মে সাজানো আছে — যার প্রথম দিকের সবগুলো ডেটা হলো "পাস (pass)" এবং শেষের দিকের সবগুলো হলো "ফেল (fail)"। এখন আপনি যদি এর প্রথম ৮০% ডেটা ট্রেইনিংয়ের জন্য এবং শেষের ২০% ডেটা টেস্টিংয়ের জন্য নেন, তবে আপনার ট্রেইনিং সেটে কেবল পাস করা ডেটাগুলোই থাকবে এবং টেস্ট সেটে কেবল ফেল করা ডেটাগুলো থাকবে। এতে করে মডেলটি পুরোটাই ভুল কিছু শিখবে।

তাই ডেটাগুলোকে শাফল করে নিলে, আপনি নিশ্চিত হতে পারবেন যে আপনার ট্রেইনিং এবং টেস্ট সেটের দুটি অংশেই আপনার পুরো ডেটাসেটেরই একটি সমান এবং সঠিক প্রতিচ্ছবি (representative) রয়েছে।

ভ্যালিডেশন সেট: এর তৃতীয় অংশ (The validation set: a third piece)

বাস্তব জীবনে কাজ করার সময়, অনেকেই ডেটাকে মূলত তিনটি (three) ভাগে ভাগ করে থাকেন:

  • ট্রেইনিং সেট (Training set) (৬০-৭০%) — এটি ব্যবহার করে মূলত মডেলকে শেখানো হয় বা ট্রেইন করা হয়
  • ভ্যালিডেশন সেট (Validation set) (১৫-২০%) — এটি ব্যবহার করে মডেলটির বিভিন্ন সেটিংস ঠিক করা হয় এবং অন্য মডেলের সাথে এর তুলনা করা হয়
  • টেস্ট সেট (Test set) (১৫-২০%) — একে একেবারে সবার শেষের ফাইনাল পরীক্ষার জন্য ধরা ছোঁয়ার বাইরে রাখা হয়

আপনি ভ্যালিডেশনকে প্র্যাকটিস এক্সাম (practice exams) হিসেবে মনে করতে পারেন। আপনি এটিকে ব্যবহার করে আপনার নিজের পড়ার রুটিন বা কৌশল বদলাতে পারেন, কিন্তু এর আসল পরীক্ষাটি (টেস্ট সেট) সবসময়ই আপনাকে অবাক করে দেয়। এটি মূলত আপনাকে দুর্ঘটনাবশত টেস্ট সেটের ওপর মডেলটিকে ওভারফিট (overfit) করা থেকে রক্ষা করে এবং নিশ্চিত করে যে মডেলটি কেবল টেস্ট সেটে ভালো করার জন্যই বারবার পরিবর্তন করা হচ্ছে না।

Note: ডেটা লিকেজ (Data leakage) হলো যেকোনো নতুন শিক্ষার্থীর করা ১ নম্বর বা সবচেয়ে বড় ভুলগুলোর মধ্যে একটি। এটি তখনই ঘটে যখন টেস্ট সেটের কোনো না কোনো ইনফরমেশন বা তথ্য ভুল করে ট্রেইনিংয়ের ডেটায় বা সেটে "লিক (leaks)" হয়ে যায় বা চলে আসে — যা অনেকটা ওই শিক্ষার্থীর আগেই পরীক্ষার প্রশ্নপত্র পাওয়ার মতোই ঘটনা। এর সবচেয়ে সাধারণ কারণগুলো হলো: প্রসেসিং শুরু করার আগেই ডেটা স্প্লিট না করা (যেমন পুরো ডেটাসেট ব্যবহার করে জিনিসগুলোকে নরমালাইজ (normalizing) করা), টাইম-সিরিজ (time-series) ডেটাগুলোকে সময়ের সিরিয়াল বা ক্রম ঠিক না রেখেই স্প্লিট করা অথবা একই ডেটা দুবার থাকার কারণে সেটি ট্রেইন এবং টেস্ট দুই জায়গাতেই চলে যাওয়া। তাই সব সময় সবচেয়ে প্রথমেই স্প্লিট করুন, এরপর প্রতিটি সেটকে আলাদাভাবে প্রসেস করুন।

সঠিক নিয়ম: আগে স্প্লিট করুন, এরপর প্রসেস করুন (The Right Way: Split THEN Preprocess)

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([[100, 3], [200, 6], [150, 4],
[300, 8], [250, 7], [120, 3]])
y = np.array([200, 400, 280, 550, 480, 220])
# ধাপ ১: সর্বপ্রথম স্প্লিট (Split) করুন
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# ধাপ ২: কেবল ট্রেইনিং ডেটার (training data) ওপরই স্ক্যালারকে ফিট (Fit scaler) করুন
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # fit + transform
X_test_scaled = scaler.transform(X_test) # transform only!
print("ট্রেইন মিন (Train mean):", X_train_scaled.mean(axis=0).round(2))
print("টেস্ট মিন (Test mean):", X_test_scaled.mean(axis=0).round(2))
print("\n(টেস্ট মিন [0,0] নয় — এবং এটিই সঠিক!)")
Output
ট্রেইন মিন (Train mean): [-0.  0.]
টেস্ট মিন (Test mean): [-0.63 -0.58]

(টেস্ট মিন [0,0] নয় — এবং এটিই সঠিক!)

ছোট কুইজ

কেন আমরা ডেটাকে আলাদা করে ট্রেইনিং এবং টেস্ট সেটে স্প্লিট বা ভাগ করি?
Challenge

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

মেশিন লার্নিং (Machine Learning) কী?
কম্পিউটারকে গতানুগতিক বা নির্দিষ্ট কোনো নিয়ম শেখানোর বদলে বিভিন্ন উদাহরণের সাহায্যে শেখানো
ফ্রিচার এবং লেবেল (Features & Labels)
রান্নার আইটেমগুলো হলো ফিচার আর খাবারের নামটি হলো লেবেল — আপনার মডেলকে শেখান যে তার কোন কোন উপাদানের দিকে নজর দিতে হবে এবং এর ওপর ভিত্তি করে কী অনুমান করতে হবে
ওভারফিটিং এবং আন্ডারফিটিং (Overfitting & Underfitting)
গোল্ডিলকস এবং তিনটি মডেল — একটি খুব সাধারণ, একটি অনেক জটিল, আর অন্যটি একদম পারফেক্ট
মেশিন লার্নিং (Machine Learning)-এর ধরনগুলো
তিনটি ক্লাসরুম ও তিনটি শেখার ধরন — সুপারভাইজড (supervised), আনসুপারভাইজড (unsupervised) এবং রিইনফোর্সমেন্ট (reinforcement)