Chapter 11 of 18
Measuring whether an LSTM actually learned what you wanted
ট্রেনিং লস ক্রমাগত হ্রাস পাওয়া কেবল এটাই প্রমাণ করে যে মডেলটি কোনো না কোনো প্যাটার্ন শিখছে। কিন্তু এটি নিজে থেকে কখনো বলে না যে মডেলটি বাস্তব জীবনে সত্যিই কতটা দরকারী, কিংবা আপনার সুনির্দিষ্ট লক্ষ্য অর্জনের জন্য দুটি মডেলের মধ্যে কোনটি বেশি ভালো। এই চ্যাপ্টারে আমরা এমন কিছু ইভ্যালুয়েশন মেট্রিক্স (evaluation metrics) তৈরি ও আলোচনা করব যা আমাদের বাস্তব প্রজেক্ট চ্যাপ্টারের মডেলগুলোকে নিখুঁতভাবে যাচাই করতে সাহায্য করবে — যার মধ্যে ক্লাসিফিকেশন মেট্রিক্স, রিগ্রেশন মেট্রিক্স এবং টাইম সিরিজের বিশেষ ফোরকাস্টিং মেট্রিক্স অন্তর্ভুক্ত থাকবে।
ধরা যাক, একটি বাইনারি ক্লাসিফায়ার (binary classifier) ইনপুটের সাপেক্ষে প্রবাবিলিটি বা সম্ভাবনা আউটপুট দেয়, যা একটি নির্দিষ্ট থ্রেশহোল্ড (সাধারণত ০.৫) দ্বারা বাইনারি লেবেল -এ রূপান্তর করা হয় এবং আসল লেবেল -এর সাথে তুলনা করা হয়।
প্রতিটি ক্লাসিফিকেশন মেট্রিক মূলত চারটি গণনার ওপর ভিত্তি করে তৈরি (যাকে Confusion Matrix বলা হয়):
| টার্ম / শব্দ | অর্থ | বাস্তব উদাহরণ (স্প্যাম ফিল্টার) |
|---|---|---|
| True Positive (TP) | প্রেডিকশন ১, বাস্তবেও ১ | স্প্যাম ইমেইলকে স্প্যাম হিসেবে শনাক্ত করা — সঠিক |
| True Negative (TN) | প্রেডিকশন ০, বাস্তবেও ০ | ভালো ইমেইলকে ইনবক্সে ঢুকতে দেওয়া — সঠিক |
| False Positive (FP) | প্রেডিকশন ১, বাস্তবে ০ | ভালো ইমেইলকে ভুল করে স্প্যাম ফোল্ডারে পাঠানো — ভুল |
| False Negative (FN) | প্রেডিকশন ০, বাস্তবে ১ | স্প্যাম ইমেইল ভুল করে ইনবক্সে চলে আসা — ভুল |
যদি আপনার ডেটাসেটে কেবল ১% ট্রানজেকশন জালিয়াতি বা ফ্রড (fraud) হয়, তবে একটি মডেল যদি চোখ বন্ধ করে সব ট্রানজেকশনকেই "সঠিক বা নট-ফ্রড" বলে দেয়, তবে সেটির Accuracy কিন্তু ৯৯% দেখাবে অথচ সে একটি জালিয়াতিও ধরতে পারেনি। যখন ক্লাসগুলো অসামঞ্জস্যপূর্ণ (imbalanced data) হয় — যা ফ্রড ডিটেকশন, মেডিকেল ডায়াগনোসিস কিংবা বিরল ঘটনা শনাক্তকরণের ক্ষেত্রে খুবই সাধারণ — তখন Accuracy পরিহার করে Precision, Recall, F1-score কিংবা AUC-কে বেশি প্রাধান্য দিন।
Precision, Recall এবং F1-score প্রতিটিই একটি নির্দিষ্ট ডিসিশন থ্রেশহোল্ডের (decision threshold) ওপর নির্ভর করে। অন্যদিকে, ROC কার্ভ প্রতিটি সম্ভাব্য থ্রেশহোল্ডের জন্য True Positive Rate বনাম False Positive Rate-এর গ্রাফ তৈরি করে, এবং AUC (Area Under the Curve) ওই সম্পূর্ণ কার্ভটিকে ০ থেকে ১-এর মধ্যকার একটি একক সংখ্যায় প্রকাশ করে।
AUC-এর প্রবাবিলিস্টিক ব্যাখ্যা: এর অর্থ হলো, মডেলটি একটি র্যান্ডম পজিটিভ উদাহরণকে একটি র্যান্ডম নেগেটিভ উদাহরণের চেয়ে বেশি স্কোর বা অগ্রাধিকার দেওয়ার সম্ভাবনা কতটুকু। AUC ০.৫ হওয়ার অর্থ হলো র্যান্ডম অনুমানের সমান; এবং ১.০ হওয়ার অর্থ হলো নিখুঁতভাবে দুটি ক্লাস আলাদা করতে পারা।
from sklearn.metrics import (accuracy_score, precision_score,
recall_score, f1_score, roc_auc_score)
y_true = [1, 0, 1, 1, 0, 1, 0, 0]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0]
y_prob = [0.9, 0.2, 0.8, 0.4, 0.3, 0.7, 0.6, 0.1] # প্রেডিক্টেড প্রবাবিলিটি
print("Accuracy: ", accuracy_score(y_true, y_pred))
print("Precision:", precision_score(y_true, y_pred))
print("Recall: ", recall_score(y_true, y_pred))
print("F1-score: ", f1_score(y_true, y_pred))
print("AUC: ", roc_auc_score(y_true, y_prob))টাইম সিরিজ পূর্বাভাসের ক্ষেত্রে যেখানে মডেল কন্টিনিউয়াস বা দশমিক সংখ্যা আউটপুট দেয়, সেখানে ব্যবহৃত মেট্রিকসমূহ:
| মেট্রিক | আউটলায়ারের প্রতি সংবেদনশীল? | একক সহজে বোঝা যায়? | কখন ব্যবহার করবেন... |
|---|---|---|---|
| MAE | না | হ্যাঁ (টার্গেটের সমান) | যখন আপনি চান ছোট-বড় সব ভুলকে সমান গুরুত্ব দিতে |
| MSE | হ্যাঁ (প্রচণ্ড) | না (বর্গাকার বা স্কয়ার) | যখন আপনি বড় ভুলগুলোকে খুব কঠোরভাবে শাস্তি দিতে চান |
| RMSE | হ্যাঁ | হ্যাঁ (টার্গেটের সমান) | যখন আপনি MSE-এর কঠোরতা চান কিন্তু আসল ইউনিটে দেখতে চান |
| R² | মাঝারি | কোনো একক নেই (0 থেকে 1) | যখন আপনি ভিন্ন স্কেলের ডেটাসেটের মডেলের পারফরম্যান্স তুলনা করতে চান |
MAPE সূত্রে আসল মান দিয়ে ভাগ করা হয়। যদি আপনার ডেটাতে কোনো আসল মান ০ বা তার খুব কাছাকাছি থাকে (যেমন কোনো পণ্যের শূন্য সেলস), তবে MAPE অসীম বা জ্যোতির্বৈজ্ঞানিক রকমের বড় হয়ে যায়। সেই ক্ষেত্রে অবশ্যই SMAPE বা MAE ব্যবহার করবেন।
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
y_true = np.array([100, 150, 120, 180, 200])
y_pred = np.array([105, 145, 125, 175, 195])
mae = mean_absolute_error(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
r2 = r2_score(y_true, y_pred)
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
print(f"MAE: {mae:.2f}, RMSE: {rmse:.2f}, R²: {r2:.4f}, MAPE: {mape:.2f}%")| কাজের ধরণ | প্রধান মেট্রিক (Primary) | সহকারী মেট্রিক (Secondary) |
|---|---|---|
| বাইনারি ক্লাসিফিকেশন (ব্যালেন্সড) | Accuracy অথবা F1-score | AUC-ROC |
| বাইনারি ক্লাসিফিকেশন (ইম্বালেন্সড) | F1-score অথবা AUC-ROC | Precision ও Recall আলাদাভাবে |
| মাল্টি-ক্লাস ক্লাসিফিকেশন | Macro F1-score | Confusion Matrix |
| রিগ্রেশন / ফোরকাস্টিং | RMSE অথবা MAE | R² অথবা MAPE |
| ফোরকাস্টিং (শূন্যের কাছাকাছি মান যুক্ত) | MAE অথবা SMAPE | RMSE |
মেশিন লার্নিংয়ের প্রতিটি গবেষণাপত্রে অন্তত একটি মেট্রিক এই চ্যাপ্টার থেকে ব্যবহৃত হয়। আপনার কাজের জন্য সঠিক মেট্রিকটি বেছে নিতে পারা — এবং কেন অন্যান্য মেট্রিক ব্যবহার করলে তা বিভ্রান্তিকর হতো তা ব্যাখ্যা করতে পারা — বাস্তব প্রজেক্ট বা ইন্টারভিউ বোর্ডে আপনার গভীর মেশিন লার্নিং দক্ষতার একটি অন্যতম শক্তিশালী পরিচয়।