Model Deploymentপড়তে ৮ মিনিট লাগবে

মডেল ইভ্যালুয়েশন বা মূল্যায়ন (Model Evaluation)

অ্যাকুরেসি বা নির্ভুলতাই সবকিছু নয় — আসুন আরও ভালোভাবে আরওসি (ROC), এইউসি (AUC), এফ১ (F1) সম্পর্কে জেনে নিই
accuracy:সোজা মনে হলেও ইমব্যালেন্সড ডেটার (imbalanced data) ক্ষেত্রে এটি বিভ্রান্তিকর হতে পারে বা ভুল পথে নিতে পারেROC-AUC:থ্রেশহোল্ডের ওপর নির্ভর করে না (Threshold-independent) · অনেক মজবুত ও রোবাস্ট মেট্রিক (robust metric)F1 score:প্রিসিশন (precision) এবং রিকলকে (recall) ব্যালেন্সড বা সমতায় নিয়ে আসে

ধরা যাক, একটি ফ্রি ক্লিনিকের একজন ডাক্তার বছরে ১,০০০ জন রোগী দেখেন। এদের মধ্যে মাত্র ১০ জনের আসলেই একটি বিরল রোগ বা রেয়ার ডিজিজ (rare disease) আছে। একদিন, সেই ক্লিনিকে রোগ শনাক্ত করার জন্য একটি নতুন এআই ডায়াগনস্টিক টুল (AI diagnostic tool) আনা হলো। ডাক্তারটি ১,০০০ জন রোগীর ওপরই এই টুলটি চালালেন, এবং টুলটি একটি ফলাফল ঘোষণা করলো: "এখানকার কারোই কোনো রোগ নেই!"

অ্যাকুরেসি (Accuracy) বা নির্ভুলতা? ৯৯%। বেশ দারুণ বা ইমপ্রেসিভ খবর, তাই না?

কিন্তু এটি আসলে সেই ১০ জন মানুষকেই মিস করেছে বা ধরতে পারেনি, যাদের আসলেই এই রোগটি ছিল। ফলে ওই ১০ জন রোগী এ কথা ভেবেই ক্লিনিক থেকে বেরিয়ে যাবেন যে তারা একেবারে সুস্থ। এই মডেলটি ৯৯% অ্যাকুরেট হলেও, এটি বাস্তবে ১০০% ইউজলেস বা পুরোপুরি অকেজো

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

অ্যাকুরেসির বাইরেও আরও যা কিছু আছে: দ্য মেট্রিকস টুলকিট (Beyond accuracy: the metrics toolkit)

প্রিসিশন ও রিকল (Precision & Recall)

  • প্রিসিশন (Precision): মডেলটি যাদের অসুস্থ (sick) হিসেবে অ্যালার্ম দিয়েছে বা ফ্ল্যাগ করেছে, তাদের মধ্যে ঠিক কতজন আসলেই অসুস্থ ছিলেন? (অ্যালার্মের মান বা কোয়ালিটি)
  • রিকল (Recall): আসলেই অসুস্থ থাকা সকল রোগীদের মধ্যে, এই মডেলটি ঠিক কতজনকে ধরতে পেরেছে? (কভারেজ)

এফ১ স্কোর (F1 Score)

এটি প্রিসিশন (precision) এবং রিকল-এর (recall) হারমোনিক মিন (harmonic mean)। এর যে কোনো একটি কম হলেই, এটি আপনাকে কড়া পেনাল্টি (penalty) দেয়। উদাহরণস্বরূপ, যদি কোনো মডেলের ৯৯% প্রিসিশন কিন্তু মাত্র ১% রিকল থাকে, তবে এর সাধারণ গড়ের (average) মতো ৫০% হওয়ার বদলে, এটি মূলত ~০.০২ এফ১ (F1) স্কোর পায়।

আরওসি কার্ভ এবং এইউসি (ROC Curve & AUC)

বেশিরভাগ ক্লাসিফায়ারগুলোই শুধু "হ্যাঁ/না (yes/no)"-তে উত্তর দেয় না — এর বদলে এগুলো একটি সম্ভাবনা বা প্রবাবিলিটি (probability) (যেমন: "রোগ হওয়ার ৭৮% (78%) সম্ভাবনা রয়েছে") হিসেবে এর উত্তর বা আউটপুটগুলো দেয়। আপনি যখন ডিসিশন থ্রেশহোল্ডটিকে (decision threshold) ০% থেকে ১০০%-এ নিয়ে যান, তখন এর ট্রু পজেটিভ রেট (True Positive Rate) বনাম ফলস পজেটিভ রেটের (False Positive Rate) প্লটগুলো ঠিক কীরকম দেখায়, এখানকার আরওসি কার্ভটি (ROC curve) মূলত সেটিই নির্দেশ করে।

এইউসি (AUC) বা এরিয়া আন্ডার দ্য কার্ভ (Area Under the Curve) মূলত এই আরওসি কার্ভটিকে একটি একক নম্বর বা সিঙ্গেল নাম্বার হিসেবে তুলে ধরে: যেখানে ১.০ = পারফেক্ট (perfect) বা নিখুঁত, এবং ০.৫ = রেন্ডম গেসিং (random guessing) বা অন্ধকারে ঢিল ছোঁড়া বোঝায়।

অ্যাকশনে কম্প্রিহেনসিভ বা আরও ডিটেইল মডেল ইভ্যালুয়েশন (Comprehensive Model Evaluation)

from sklearn.metrics import (
accuracy_score, precision_score, recall_score,
f1_score, roc_auc_score, classification_report
)
import numpy as np
# সিমুলেট করা: ১০০ জন রোগী, এবং ১০ জন আসলেই অসুস্থ
np.random.seed(42)
y_true = np.array([1]*10 + [0]*90)
# মডেল A: "কারোই কোনো রোগ নেই" (৯৯% অ্যাকুরেট হলেও এটি ইউজলেস অকেজো)
y_pred_a = np.zeros(100)
# মডেল B: ১০ জন রোগীর মধ্যে ৮ জনকে ধরেছে, কিন্তু ১৫ জন সুস্থ মানুষকেও অসুস্থ বলেছে
y_pred_b = np.zeros(100)
y_pred_b[:8] = 1 # ৮ জন রোগীকে ধরেছে
y_pred_b[15:30] = 1 # ১৫টি ফলস অ্যালার্ম (সুস্থ মানুষকে অসুস্থ বলা)
print("=== মডেল A: 'কারোই কোনো রোগ নেই' ===")
print(f"অ্যাকুরেসি বা নির্ভুলতা (Accuracy): {accuracy_score(y_true, y_pred_a):.2f}")
print(f"রিকল (Recall): {recall_score(y_true, y_pred_a):.2f}")
print(f"এফ১ (F1): {f1_score(y_true, y_pred_a):.2f}")
print("\n=== মডেল B: বেশিরভাগ রোগীকেই ধরেছে ===")
print(f"অ্যাকুরেসি বা নির্ভুলতা (Accuracy): {accuracy_score(y_true, y_pred_b):.2f}")
print(f"রিকল (Recall): {recall_score(y_true, y_pred_b):.2f}")
print(f"এফ১ (F1): {f1_score(y_true, y_pred_b):.2f}")
Output
=== Model A: 'Nobody is sick' ===
Accuracy: 0.90
Recall:   0.00
F1:       0.00

=== Model B: Catches most cases ===
Accuracy: 0.83
Recall:   0.80
F1:       0.52

সঠিক মেট্রিক বেছে নেওয়া (Choosing the right metric)

ব্যবহারের ক্ষেত্র (Use Case)প্রায়োরিটি বা অগ্রাধিকার (Priority)সেরা মেট্রিক (Best Metric)
স্প্যাম ফিল্টার (Spam filter)কখনোই আসল ইমেইলগুলো ব্লক না করাবেশি নিখুঁততা (High Precision)
ক্যান্সার শনাক্তকরণ (Cancer detection)কোনো ক্যান্সার রোগী যেন বাদ না পড়ে যায়হাই রিকল (High Recall)
ব্যালেন্সড ডেটাসেট (Balanced dataset)সামগ্রিক বা ওভারঅল পারফরম্যান্স (Overall performance)অ্যাকুরেসি (Accuracy) বা F1
ক্লাসিফায়ারগুলোর মধ্যে তুলনা করা (Comparing classifiers)থ্রেশহোল্ড স্বাধীন (Threshold-independent)ROC-AUC

থ্রেশহোল্ড ট্রেড-অফ (The threshold tradeoff)

বেশিরভাগ ক্লাসিফায়ার মূলত আপনাকে শুধু এর হওয়ার সম্ভাবনাটি (probability) জানিয়ে দেয়। এরপর এর কাট-অফ পয়েন্টটি কী হবে, তার সিদ্ধান্ত আপনাকেই নিতে হয়। আপনি কি এটি ৫০% (50%) এ সেট করবেন? সেটিই হলো এখানকার সাধারণ বা স্ট্যান্ডার্ড নিয়ম। আপনি কি সেটি ২০% এ নামিয়ে আনবেন? এতে আপনি অনেক বেশি আসল বা ট্রু-পজিটিভ রোগী ধরতে পারবেন ঠিকই, তবে এতে আপনার আগের চেয়ে বেশি ফলস অ্যালার্মও (false alarms) বেড়ে যাবে। একটি আরওসি কার্ভ বা গ্রাফ মূলত আপনাকে এখানকার সম্ভাব্য সব ধরনের ট্রেড-অফ (tradeoff) এবং থ্রেশহোল্ডগুলো (thresholds) দেখায়, যাতে করে আপনি নিজেই আপনার জন্য সবচেয়ে ভালো সিদ্ধান্তটি নিতে পারেন।

Note: সব সময় নিজেকে জিজ্ঞেস করুন: 'এ ধরনের যেকোনো একটি ভুল সিদ্ধান্তের জন্য আসলে ঠিক কী ধরনের মাশুল গুণতে হতে পারে?' যদি কোনো ফলস নেগেটিভের কারণে একটি জীবন চলে যায় (যেমন- ক্যান্সার ধরতে মিস করা) এবং একটি ফলস পজিটিভের কারণে হয়তো কেবল একটি ফোন কলের বেশি পয়সা কাটা যায় (অতিরিক্ত অ্যাপয়েন্টমেন্ট নেওয়া), তবে এমন ক্ষেত্রে আপনার উচিত সবটুকু ক্ষমতা দিয়ে কেবল এর রিকলটিকে (recall) সবচেয়ে বেশি গুরুত্ব দেওয়া — এমনকি এর জন্য আপনার প্রিসিশনের (precision) হার অনেক কমে গেলেও, আপনাকে সেটাই বেছে নিতে হবে।

Key Metrics

🎯 অ্যাকুরেসি (Accuracy)
তবে ইমব্যালেন্সড ক্লাসের ক্ষেত্রে এটি ভুল বা মিসলিডিং (Misleading) হতে পারে — তাই এটিকে কখনোই একক মেট্রিক হিসেবে ব্যবহার করবেন না
(TP+TN)/Total সহজ, মানুষের মতোই কাজ করে
⚖️ এফ১ (F1) স্কোর
ফলস পজিটিভ এবং ফলস নেগেটিভ — যেখানে দুটিরই সমান গুরুত্ব থাকে, সেখানে এটি ব্যবহার করতে পারেন
হারমোনিক মিন (Harmonic mean) এটি প্রিসিশন এবং রিকলকে ব্যালেন্স করে বা সমতায় নিয়ে আসে
📈 আরওসি-এইউসি (ROC-AUC)
সব ধরনের থ্রেশহোল্ডগুলোর ব্যাপারে різних ক্লাসিফায়ারগুলোর সাথে তুলনা করতে এটি সবচেয়ে বেশি ব্যবহৃত হয় ও সবচেয়ে ভালো কাজ করে
কার্ভ বা গ্রাফের নিচের অংশ বা এরিয়া (Area) থ্রেশহোল্ড স্বাধীন বা স্বয়ংসম্পূর্ণ (Threshold-independent)
📉 লগ লস (Log Loss)
যখন আপনি আপনার ক্যালিব্রেটেড প্রবাবিলিটি বা সাজানো সম্ভাবনাগুলো নিয়ে কাজ করতে চান, তখন এটি ব্যবহার করতে পারেন
সম্ভাবনা-ভিত্তিক (Probability-based) আত্মবিশ্বাসের সাথে দেওয়া ভুল উত্তরগুলোকে এটি জোরালো পেনাল্টি বা শাস্তি দেয়

ছোট কুইজ

একটি মডেল এমন কোনো ডেটাসেটে ৯৯% অ্যাকুরেসি বা নির্ভুলতা পেলো, যেখানে ৯৯% স্যাম্পল বা উদাহরণই হলো মূলত ক্লাস A (class A)। তাহলে এই মডেলটি কি আসলেই কোনো কাজের বা দরকারি?
Challenge

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

কনফিউশন ম্যাট্রিক্স (Confusion Matrix)
ট্রু পজিটিভস (True positives), ফলস অ্যালার্ম (false alarms) — অর্থাৎ যে বিষয়গুলো মাপা সবচেয়ে বেশি জরুরি
ক্রস-ভ্যালিডেশন (Cross-Validation)
প্রতিটি ফোল্ডে (fold) টেস্ট করুন, যাতে কোনো ডেটাই নষ্ট না হয়
মেশিন লার্নিং ফেয়ারনেস (ML Fairness)
বায়াসড (Biased) বা পক্ষপাতমূলক ইনপুট দিলে, এর প্রেডিকশন বা আউটপুটও বায়াসড (biased) আসবে