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

ওভারফিটিং এবং আন্ডারফিটিং (Overfitting & Underfitting)

গোল্ডিলকস এবং তিনটি মডেল — একটি খুব সাধারণ, একটি অনেক জটিল, আর অন্যটি একদম পারফেক্ট
underfitting:আন্ডারফিটিং (Underfitting) · মডেলটি খুব বেশি সাধারণ বা সিম্পল (simple) হয় · যার ফলে এটি প্যাটার্নগুলো ধরতে পারে নাoverfitting:ওভারফিটিং (Overfitting) · মডেলটি খুব বেশি জটিল (complex) হয় · এটি প্যাটার্ন বোঝার বদলে অপ্রয়োজনীয় জিনিসগুলোও মুখস্থ করে ফেলেjust right:একদম পারফেক্ট (Just right) · এটি নতুন ডেটায় ভালো করতে পারে · এতে বায়াস (bias) এবং ভ্যারিয়েন্স (variance) এর মধ্যে একটি সুন্দর ব্যালেন্স থাকে

আপনার কি গোল্ডিলকস (Goldilocks)-এর সেই গল্পের কথা মনে আছে? যেখানে একটি পোরিজ বা জাউ খুব গরম ছিল, একটি খুব ঠান্ডা ছিল, এবং শেষেরটি একদম ঠিকঠাক বা পারফেক্ট ছিল। মেশিন লার্নিংয়ে মডেলগুলোর ক্ষেত্রেও ঠিক একই রকম সমস্যা দেখা যায়।

ধরা যাক, আপনি একটি ইতিহাসের পরীক্ষার জন্য পড়াশোনা করছেন:

  • শিক্ষার্থী A শুধু বইয়ের অধ্যায়গুলোর বা চ্যাপ্টারের নাম পড়েই তার পড়া শেষ করল। "১৯৭১ সালে কিছু একটা হয়েছিল... বাংলাদেশ, তাই না?" এটি খুব বেশি ভাসা ভাসা বা সাধারণ একটি পড়া — এই শিক্ষার্থীটি মূলত পড়ায় আন্ডারফিট (underfitted) করেছে।
  • শিক্ষার্থী B বইয়ের প্রতিটি শব্দ বা লাইন একেবারে অন্ধের মতো মুখস্থ করেছে, এমনকি সে বইয়ের পৃষ্ঠার নম্বর এবং ভুল বানানগুলোও মুখস্থ করে ফেলেছে। এখন পরীক্ষায় যদি একটু ঘুরিয়ে প্রশ্ন করা হয়, তবে সে আর কিছুই লিখতে পারবে না। সে মূলত পড়ায় ওভারফিট (overfitted) করেছে — অর্থাৎ সে বিষয়টি বোঝার বদলে কেবল মুখস্থ করেছে।
  • শিক্ষার্থী C বইয়ের মূল থিমগুলো, এর পেছনের কারণ এবং ফলাফলগুলো খুব ভালোভাবে বুঝেছে এবং সে যেকোনো নতুন প্রশ্নে এই লার্নিংগুলো প্রয়োগ করতে পারবে। তার এই পড়াটি একদম পারফেক্ট (Just right)

ঠিক একইভাবে আপনার মেশিন লার্নিং মডেলটিকেও এই শিক্ষার্থী C-এর মতো হতে হবে।

আন্ডারফিটিং (Underfitting): "আমি তেমন একটা চেষ্টাই করিনি"

একটি আন্ডারফিটিং (underfitting) মডেল খুবই সাধারণ বা সিম্পল (simple) হয়, যার কারণে এটি ডেটার ভেতরের প্যাটার্নগুলো ঠিকমতো ধরতে পারে না। এটি ট্রেইনিং ডেটা এবং টেস্ট ডেটা উভয় ক্ষেত্রেই খুব খারাপ পারফর্ম বা কাজ করে।

একটি ডেটাসেট যার ডেটাগুলো স্পষ্টতই বাঁকানো (curves), তার মধ্যে একটি সোজা লাইন টানা বা ফিট করার কথা চিন্তা করুন। ওই সোজা লাইনটি যেমন ট্রেইনিং পয়েন্টগুলোর সাথে মিলবে না, ঠিক তেমনি এটি নতুন কোনো পয়েন্ট বা ডেটার সাথেও মিলবে না।

আন্ডারফিটিংয়ের কিছু লক্ষণ:

  • ট্রেইনিং অ্যাকুরেসি বা সঠিক হওয়ার হার অনেক কম থাকা
  • টেস্ট অ্যাকুরেসি বা সঠিক হওয়ার হারও অনেক কম থাকা
  • সমস্যা সমাধানের জন্য মডেলটি "খুবই বোকা (too dumb)" বা অনুপযুক্ত হওয়া

এর সাধারণ কারণগুলো:

  • মডেলটি অনেক বেশি সাধারণ হওয়া (যেমন কোনো নন-লিনিয়ার বা আঁকাবাঁকা সমস্যার জন্য লিনিয়ার বা সোজা লাইন মডেল ব্যবহার করা)
  • মডেলে পর্যাপ্ত পরিমাণে ফিচার (features) না থাকা
  • খুব বেশি রেগুলারাইজেশন (regularization) থাকা (আমরা এটি সম্পর্কে পরে জানব)
  • মডেলটিকে পর্যাপ্ত সময় ধরে ট্রেইন করানো বা শেখানো না হওয়া

ওভারফিটিং (Overfitting): "আমি পুরো বই মুখস্থ করেছি"

একটি ওভারফিটিং (overfitting) মডেল অনেক বেশি জটিল বা কমপ্লেক্স (complex) হয়। এটি ট্রেইনিং ডেটাগুলোকে পারফেক্টভাবে বা নিখুঁতভাবে শিখে বা মুখস্থ করে ফেলে — এমনকি এটি এর ভেতরের বিভিন্ন নয়েজ বা রেন্ডম জিনিসগুলোকেও শিখে ফেলে, যেগুলো মূলত কোনো কাজের প্যাটার্ন নয়। এরপর যখন মডেলটিকে নতুন কোনো ডেটা দেওয়া হয়, তখন এটি মারাত্মকভাবে ব্যর্থ হয়, কারণ ট্রেইনিংয়ের ওই রেন্ডম জিনিসগুলো নতুন ডেটায় কোনোভাবেই কাজ করে বা মেলে না।

ট্রেইনিংয়ের প্রতিটি পয়েন্টকে ছোঁয়ার জন্য একটি এলোমেলো বা আঁকাবাঁকা রেখা ফিট করার কথা চিন্তা করুন। এটি কাগজে দেখতে একদম নিখুঁত মনে হলেও, এটি মূলত আসল প্যাটার্ন (signal) খোঁজার বদলে এর চারপাশের অপ্রয়োজনীয় জিনিসগুলোকে (noise) ধরে রেখেছে।

ওভারফিটিংয়ের কিছু লক্ষণ:

  • ট্রেইনিং অ্যাকুরেসি বা সঠিক হওয়ার হার অনেক বেশি থাকা (অনেক সময় প্রায় নিখুঁত বা ১০০% থাকে)
  • টেস্ট অ্যাকুরেসি এর তুলনায় অনেক কম থাকা
  • ট্রেইন এবং টেস্ট স্কোরের মধ্যে বিশাল পার্থক্য থাকা

এর সাধারণ কারণগুলো:

  • মডেলটি অনেক বেশি জটিল হওয়া (মডেলে খুব বেশি প্যারামিটার (parameters) থাকা)
  • মডেলটিকে শেখানোর জন্য পর্যাপ্ত ট্রেনিং ডেটা (training data) না থাকা
  • মডেলটিকে অনেক বেশি সময় ধরে ট্রেইন করা
  • কোনো রেগুলারাইজেশন (regularization) না থাকা

ওভারফিট এবং আন্ডারফিটকে কাজ করতে দেখা (Seeing Overfit vs. Underfit in Action)

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# আসল প্যাটার্ন: y = 2x + নয়েজ (noise)
np.random.seed(42)
X = np.random.uniform(0, 10, 20).reshape(-1, 1)
y = 2 * X.ravel() + np.random.normal(0, 2, 20)
# স্প্লিট (Split) বা ভাগ করা
X_train, X_test = X[:15], X[15:]
y_train, y_test = y[:15], y[15:]
# মডেল ১: অনেক বেশি সাধারণ বা সিম্পল (ধ্রুবক বা constant — ডিগ্রি 0)
from sklearn.dummy import DummyRegressor
simple = DummyRegressor(strategy='mean')
simple.fit(X_train, y_train)
print("=== আন্ডারফিটিং (Underfitting) (এটি কেবল গড় বা mean প্রেডিক্ট করছে) ===")
print(f"ট্রেইন এরর বা ভুল (Train error): {mean_squared_error(y_train, simple.predict(X_train)):.1f}")
print(f"টেস্ট এরর বা ভুল (Test error): {mean_squared_error(y_test, simple.predict(X_test)):.1f}")
# মডেল ২: একদম পারফেক্ট বা জাস্ট রাইট (ডিগ্রি 1 — লিনিয়ার বা সোজা)
right = LinearRegression()
right.fit(X_train, y_train)
print("\n=== একদম পারফেক্ট (Just Right) (লিনিয়ার) ===")
print(f"ট্রেইন এরর বা ভুল (Train error): {mean_squared_error(y_train, right.predict(X_train)):.1f}")
print(f"টেস্ট এরর বা ভুল (Test error): {mean_squared_error(y_test, right.predict(X_test)):.1f}")
# মডেল ৩: অনেক বেশি জটিল বা কমপ্লেক্স (ডিগ্রি 15 পলিনোমিয়াল (polynomial))
poly = PolynomialFeatures(degree=15)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
complex_model = LinearRegression()
complex_model.fit(X_train_poly, y_train)
print("\n=== ওভারফিটিং (Overfitting) (ডিগ্রি-15 পলিনোমিয়াল) ===")
print(f"ট্রেইন এরর বা ভুল (Train error): {mean_squared_error(y_train, complex_model.predict(X_train_poly)):.1f}")
print(f"টেস্ট এরর বা ভুল (Test error): {mean_squared_error(y_test, complex_model.predict(X_test_poly)):.1f}")
Output
=== আন্ডারফিটিং (Underfitting) (এটি কেবল গড় বা mean প্রেডিক্ট করছে) ===
ট্রেইন এরর বা ভুল (Train error): 36.2
টেস্ট এরর বা ভুল (Test error):  32.8

=== একদম পারফেক্ট (Just Right) (লিনিয়ার) ===
ট্রেইন এরর বা ভুল (Train error): 3.4
টেস্ট এরর বা ভুল (Test error):  4.1

=== ওভারফিটিং (Overfitting) (ডিগ্রি-15 পলিনোমিয়াল) ===
ট্রেইন এরর বা ভুল (Train error): 0.0
টেস্ট এরর বা ভুল (Test error):  9847.3

Key Metrics

🧊 আন্ডারফিটিং (Underfitting)
মডেলটি খুব বেশি সাধারণ বা সিম্পল — যার কারণে এটি ট্রেইনিং ডেটাগুলোকেও ঠিকমতো শিখতে পারে না
ট্রেইন স্কোর কম, টেস্ট স্কোর কম হাই বায়াস (High bias)
🔥 ওভারফিটিং (Overfitting)
এটি ট্রেইনিং ডেটাগুলোকে একেবারে মুখস্থ করে ফেলে, কিন্তু নতুন ডেটায় সে ফেল করে
ট্রেইন স্কোর বেশি, টেস্ট স্কোর কম হাই ভ্যারিয়েন্স (High variance)
✅ গুড ফিট (Good Fit)
মডেলটি আসল প্যাটার্নগুলো শিখেছে যা সে সব ধরনের নতুন ডেটায় কাজে লাগাতে পারে
ট্রেইন স্কোর বেশি, টেস্ট স্কোর বেশি ব্যালেন্সড (Balanced)
📏 গ্যাপ বা পার্থক্য (The Gap)
ছোট পার্থক্য = ভালো। বড় পার্থক্য = ওভারফিটিং।
ট্রেইন স্কোর - টেস্ট স্কোর কি ডায়াগনস্টিক (Key diagnostic)

কীভাবে আন্ডারফিটিং (underfitting) ঠিক করবেন

  • আরও জটিল বা কমপ্লেক্স মডেল ব্যবহার করুন — লিনিয়ার বা সোজা মডেল থেকে পলিনোমিয়ালে (polynomial) বদলান, অথবা শ্যালো ট্রি (shallow tree) থেকে আরও ডিপার বা গভীর ট্রি (deeper tree)-তে যান
  • আরও নতুন ফিচার (features) যোগ করুন — মডেলকে কাজ করার জন্য আরও বেশি তথ্য দিন
  • রেগুলারাইজেশন (regularization) কমান — মডেলটিকে আরও বেশি ফ্লেক্সিবল (flexible) বা পরিবর্তনের সুযোগ দিন
  • বেশি সময় ধরে ট্রেইন করুন — কারণ মডেলটি হয়তো এখনও পুরোপুরি শেখার সময় পায়নি

কীভাবে ওভারফিটিং (overfitting) ঠিক করবেন

  • আরও বেশি ট্রেইনিং ডেটা (training data) যোগাড় করুন — ১০০টি উদাহরণের চেয়ে ১,০০,০০০টি উদাহরণ মুখস্থ করা অনেক বেশি কঠিন
  • আরও সাধারণ বা সিম্পল (simpler) মডেল ব্যবহার করুন — প্যারামিটার (parameters) কম থাকার মানে হলো মুখস্থ করার সুযোগও কমে যাওয়া
  • রেগুলারাইজেশন (regularization) ব্যবহার করুন — খুব বেশি জটিল মডেলগুলোকে আটকাতে বা পেনাল্টি (penalize) দিতে L1, L2, বা ড্রপআউট (dropout)-এর মতো পদ্ধতিগুলো ব্যবহার করুন
  • আর্লি স্টপিং (Early stopping) বা দ্রুত থামানো — মডেলটি ডেটা মুখস্থ করা শুরু করার আগেই এর ট্রেইনিং থামিয়ে দিন
  • ক্রস-ভ্যালিডেশন (Cross-validation) — মডেলের পারফরম্যান্স সম্পর্কে আরও ভালোভাবে জানতে, ডেটাকে একাধিকবার ট্রেইন/টেস্ট ভাগে স্প্লিট করে এর মূল্যায়ন করুন

বায়াস-ভ্যারিয়েন্স ট্রেডঅফ (The bias-variance tradeoff)

এই সমস্যাটির একটি সুন্দর গালভরা নাম রয়েছে: বায়াস-ভ্যারিয়েন্স ট্রেডঅফ (bias-variance tradeoff)

  • বায়াস (Bias) = আপনার মডেলের নিয়ম বা বাধ্যবাধকতাগুলোর কারণে এটি কতগুলো প্যাটার্ন ধরতে ব্যর্থ হচ্ছে (অর্থাৎ আন্ডারফিটিং)
  • ভ্যারিয়েন্স (Variance) = বিভিন্ন ডেটায় ট্রেইন হওয়ার কারণে মডেলের প্রেডিকশনগুলো বা কাজগুলো কতটা পরিবর্তন হচ্ছে (অর্থাৎ ওভারফিটিং)

মূলত মডেলের ভালো ফলাফলের জন্য এই দুটিই কম হওয়া প্রয়োজন, কিন্তু এক্ষেত্রে একটি কমাতে গেলে অন্যটি বেড়ে যেতে পারে। তাই এই দুটির মাঝামাঝি একটি ভালো ব্যালেন্স বা অবস্থাই হলো আমাদের আসল লক্ষ্য.

Note: এখানে একটি সহজ নিয়ম বা রুল অব থাম্ব (rule of thumb) হলো: যদি আপনার ট্রেইনিং স্কোর আপনার টেস্ট স্কোরের চেয়ে অনেক বেশি হয়, তবে আপনার মডেলটি ওভারফিটিং (overfitting) করছে। আর যদি উভয় স্কোরই কম হয়, তবে এটি আন্ডারফিটিং (underfitting) করছে। তাই প্রথমে খুব সাধারণ বা সিম্পল মডেল দিয়ে শুরু করুন, তারপর ধীরে ধীরে (gradually) এর জটিলতা বাড়ান এবং যখনই টেস্ট স্কোর কমতে শুরু করবে ঠিক তখনই মডেলটির ট্রেইনিং থামিয়ে দিন — এমনকি যদি এর ট্রেইনিং স্কোর ঠিক ওই সময় বাড়তেও থাকে।

ছোট কুইজ

আপনার মডেল ট্রেইনিং ডেটায় ৯৯% অ্যাকুরেসি (accuracy) বা সঠিক হওয়ার হার দেখাচ্ছে, কিন্তু টেস্ট ডেটায় সেটি মাত্র ৫২%। এর মানে আসলে কী?
Challenge

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

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