📋 বিষয়সূচী (Table of Contents)

01

Classification পরিচিতি

⏱ ~১০ মিনিট

Machine Learning আসলে কী?

ধরো, তুমি ছোটবেলায় বহুবার আম খেয়েছ। এখন তোমাকে চোখ বন্ধ করে শুধু গন্ধ শুঁকিয়ে বলা হলো — "এটা কাঁচা আম না পাকা আম?" তুমি সাথে সাথে বলে দিতে পারবে, কারণ তুমি আগে বহু আম খেয়ে একটা প্যাটার্ন (pattern) শিখে ফেলেছ। তোমাকে কেউ শেখায়নি "যদি গন্ধ এমন হয় তাহলে পাকা" — তুমি নিজে অভিজ্ঞতা থেকে শিখেছ।

Machine Learning হলো কম্পিউটারকে ঠিক এভাবেই — অনেক পুরনো উদাহরণ (ডেটা) দেখিয়ে একটা প্যাটার্ন শিখিয়ে দেওয়া, যাতে সে ভবিষ্যতে নতুন কিছু দেখলে নিজে থেকে সিদ্ধান্ত নিতে পারে। কেউ তাকে হাতে হাতে নিয়ম (rule) লিখে দেয় না — সে ডেটা থেকে নিয়মটা নিজেই বের করে।

Classification কী?

Classification মানে হলো — কোনো জিনিসকে দেখে তাকে আগে থেকে ঠিক করা কয়েকটা ক্যাটাগরির (category) মধ্যে একটাতে ফেলে দেওয়া। যেমন: ইমেইল দেখে বলা "এটা Spam নাকি Not Spam", অথবা রোগীর রিপোর্ট দেখে বলা "এই রোগী অসুস্থ নাকি সুস্থ"।

লক্ষ করো — এখানে উত্তরটা সবসময় একটা নির্দিষ্ট ক্যাটাগরি থেকে আসে (হ্যাঁ/না, এই ৩টার একটা ইত্যাদি) — কোনো সংখ্যা প্রেডিক্ট করা নয় (সেটাকে বলে Regression, আজকের ক্লাসের বিষয় না)।

কেন Classification গুরুত্বপূর্ণ?

আমাদের চারপাশের প্রায় প্রতিটা সিদ্ধান্ত-নেওয়ার সিস্টেম আসলে একটা Classification সমস্যা। ব্যাংক ঠিক করে কাকে লোন দেবে, ডাক্তার ঠিক করেন কে অসুস্থ, ইমেইল সার্ভার ঠিক করে কোনটা স্প্যাম — এই সবগুলো প্রতিদিন কোটি কোটি বার ম্যানুয়ালি করা সম্ভব না, তাই আমরা মেশিনকে শিখিয়ে দিই এই সিদ্ধান্তগুলো নিজে নিতে।

বাস্তব জীবনের Classification উদাহরণ
ক্ষেত্রইনপুট (যা দেখে সিদ্ধান্ত নেওয়া হয়)সম্ভাব্য ক্যাটাগরি
ইমেইল সিস্টেমইমেইলের লেখা, প্রেরকের ঠিকানাNot Spam / Spam
চিকিৎসারোগীর লক্ষণ, টেস্ট রিপোর্টDisease / Healthy
শিক্ষাপ্রতিষ্ঠানপড়াশোনার সময়, উপস্থিতি, আগের নম্বরPass / Fail
ব্যাংকিংআয়, ক্রেডিট হিস্টোরি, চাকরির ধরনLoan Approved / Loan Rejected
টেলিকম / ই-কমার্সব্যবহারের ধরন, অভিযোগ, বিলRetained Customer / Customer Churn
ক্লাসরুম অ্যাক্টিভিটি: শিক্ষার্থীদের জিজ্ঞেস করো — "তোমরা আজ সকালে বাসা থেকে বের হওয়ার আগে কী কী 'হ্যাঁ/না' সিদ্ধান্ত নিয়েছ?" (ছাতা নেব কিনা, রিকশা নেব নাকি হেঁটে যাব ইত্যাদি) — এগুলোও আসলে ছোট ছোট classification সিদ্ধান্ত। এটা বোঝালে বোঝা সহজ হয় যে আমরা প্রতিদিন অবচেতনভাবেই এই কাজ করি — মেশিনকে শুধু এটা সিস্টেমেটিক ভাবে শেখাতে হয়।
👉 আজকের ক্লাসে আমরা এমন একটা অ্যালগরিদম শিখব যেটা Probability (সম্ভাবনা) ব্যবহার করে এই classification-এর কাজটা করে — নাম তার Naive Bayes। কিন্তু তার আগে আমাদের Probability বুঝতে হবে, একদম শূন্য থেকে।
02

Probability বোঝা

⏱ ~২০ মিনিট

Probability কী?

Probability (সম্ভাবনা) মানে হলো — কোনো একটা ঘটনা ঘটার "সম্ভাবনা কতটুকু" তার একটা সংখ্যায় মাপ। এটা আমাদের বলে দেয় একটা জিনিস কতটা "নিশ্চিত" বা কতটা "অনিশ্চিত"।

যেমন, তুমি যদি বলো "আজ বৃষ্টি হতে পারে" — এই "হতে পারে" কথাটার পেছনে একটা মাত্রা আছে। আকাশ যদি কালো মেঘে ঢাকা থাকে, তাহলে বৃষ্টির সম্ভাবনা বেশি। আকাশ পরিষ্কার থাকলে সম্ভাবনা কম। Probability এই "কতটা বেশি বা কম" — সেটাকেই সংখ্যায় প্রকাশ করে।

কেন Probability দরকারি?

আমরা ভবিষ্যতে কী ঘটবে তা ১০০% নিশ্চিতভাবে জানতে পারি না। কিন্তু আমরা অতীতের অভিজ্ঞতা দিয়ে অনুমান করতে পারি — এবং এই অনুমানকে সংখ্যায় প্রকাশ করলে সিদ্ধান্ত নেওয়া অনেক সহজ হয়ে যায়। Machine Learning-এর অনেক অ্যালগরিদম, বিশেষ করে Naive Bayes, পুরোপুরি এই "সম্ভাবনার হিসাব" এর উপর দাঁড়িয়ে থাকে।

Probability-র স্কেল (0 থেকে 1)

Probability সবসময় ০ থেকে ১ এর মধ্যে থাকে (অথবা ০% থেকে ১০০%)।

P(Event) = (যত রকম উপায়ে ঘটনাটা ঘটতে পারে) ÷ (মোট সম্ভাব্য ফলাফলের সংখ্যা) P মানে Probability, Event মানে যে ঘটনার সম্ভাবনা বের করা হচ্ছে
Probability স্কেল বোঝা
মাননামউদাহরণ
0Impossible Event (অসম্ভব ঘটনা)একটা সাধারণ ডাইসে (dice) ৭ ওঠা
0.1 – 0.3Unlikely Event (অসম্ভাব্য)লটারি জেতা
0.5Fifty-Fiftyকয়েন টস করলে হেড ওঠা
0.7 – 0.9Likely Event (সম্ভাব্য)নিয়মিত পড়াশোনা করা ছাত্রের পাস করা
1Certain Event (নিশ্চিত ঘটনা)সূর্য পূর্ব দিকে ওঠা

উদাহরণ দিয়ে অনুশীলন

১. কয়েন টস (Tossing a Coin)

একটা কয়েনে দুইটা দিক থাকে — Head এবং Tail। তাই:

P(Head) = 1 ÷ 2 = 0.5   |   P(Tail) = 1 ÷ 2 = 0.5

২. ডাইস রোলিং (Rolling a Dice)

একটা ডাইসে ৬টা মুখ থাকে (1,2,3,4,5,6)। "৪ ওঠার" সম্ভাবনা কত?

P(4) = 1 ÷ 6 ≈ 0.166 (প্রায় ১৬.৬%)

৩. তাস থেকে কার্ড তোলা (Drawing a Card)

৫২টা তাসের একটা প্যাকেটে ৪টা স্যুট (Heart, Spade, Club, Diamond), প্রতিটাতে ১৩টা করে কার্ড। একটা "Heart" কার্ড ওঠার সম্ভাবনা:

P(Heart) = 13 ÷ 52 = 0.25 (২৫%)

৪. বৃষ্টির পূর্বাভাস (Rain Prediction)

ধরো, গত ১০ দিনের মধ্যে ৩ দিন বৃষ্টি হয়েছে। তাহলে সাধারণভাবে (শুধু এই ডেটার ভিত্তিতে):

P(Rain) = 3 ÷ 10 = 0.3 (৩০%)

৫. পরীক্ষায় পাস করা (Student Passing an Exam)

গত ৫ বছরে একটা ক্লাসে ৪০ জনের মধ্যে ৩৬ জন পাস করেছে:

P(Pass) = 36 ÷ 40 = 0.9 (৯০%)
বোঝার কৌশল: Probability মানে শুধু একটা ভগ্নাংশ (fraction) — "যা চাচ্ছি তা কতবার ঘটেছে" ভাগ "মোট কতবার সুযোগ ছিল"। এটাই পুরো ভিত্তি — বাকি সবকিছু এই সহজ ধারণার উপর দাঁড়িয়ে থাকবে।

Certain vs Impossible

সূর্য পশ্চিমে অস্ত যাবেCertain (P=1)
মানুষ পানি ছাড়া বাঁচবেImpossible (P=0)

Likely vs Unlikely

নিয়মিত পড়ুয়া ছাত্রের পাসLikely (P বেশি)
না পড়েই A+ পাওয়াUnlikely (P কম)
03

Conditional Probability

⏱ ~১৫ মিনিট

Conditional Probability কী?

এখন পর্যন্ত আমরা যে probability বের করেছি সেটা ছিল "একা একা" — অন্য কোনো তথ্য ছাড়া। কিন্তু বাস্তবে আমরা প্রায়ই বলি — "যদি এটা সত্যি হয়, তাহলে ওটার সম্ভাবনা কত?" এটাকেই বলে Conditional Probability — মানে একটা শর্ত (condition) দেওয়ার পরের সম্ভাবনা।

P(A | B) = "B ঘটেছে জেনে A ঘটার সম্ভাবনা" এখানে " | " চিহ্নটা পড়া হয় "given" — অর্থাৎ "যদি জানা থাকে যে..."

উদাহরণ ১: বৃষ্টি হলে ছাতা নেওয়া

সাধারণভাবে কারো ছাতা নেওয়ার সম্ভাবনা হয়তো ৩০%। কিন্তু যদি আমরা জানি যে আজ বৃষ্টি হচ্ছে, তাহলে ছাতা নেওয়ার সম্ভাবনা হুট করে বেড়ে যায় — ধরো ৯০%। এটাই হলো:

P(ছাতা নেওয়া | বৃষ্টি হচ্ছে) = 0.9

লক্ষ করো — শর্তটা (বৃষ্টি হচ্ছে) যোগ হওয়ায় সম্ভাবনাটা সম্পূর্ণ বদলে গেছে। এটাই Conditional Probability-র মূল শক্তি — নতুন তথ্য পেলে আমরা আমাদের অনুমান আপডেট করি।

উদাহরণ ২: পড়াশোনা করলে পাস করা

ছোট একটা ডেটাসেট — ২০ জন ছাত্রের তথ্য
Studied (পড়েছে)Didn't Study (পড়েনি)মোট
Pass12214
Fail156
মোট13720
P(Pass | Studied) = 12 ÷ 13 ≈ 0.92 (৯২%)

অর্থাৎ, যে ছাত্র পড়াশোনা করেছে তার পাস করার সম্ভাবনা প্রায় ৯২% — যেখানে সামগ্রিকভাবে (না জেনে) পাসের সম্ভাবনা ছিল মাত্র 14÷20 = 70%। "পড়াশোনা করেছে" এই তথ্যটা যোগ হওয়ায় সম্ভাবনা বদলে গেল।

উদাহরণ ৩: বিজ্ঞাপনে ক্লিক করার পর কেনা

Clicked AdDidn't Click
Bought405
Didn't Buy1045
P(Bought | Clicked Ad) = 40 ÷ (40+10) = 0.8 (৮০%)

ভিজ্যুয়াল বোঝাপড়া: Probability Tree

নিচের গাছের মতো ডায়াগ্রামে দেখো — প্রথমে ভাগ হচ্ছে "পড়েছে/পড়েনি" দিয়ে, তারপর প্রতিটা শাখা আবার ভাগ হচ্ছে "Pass/Fail" দিয়ে। এটাই Conditional Probability-র ভিজ্যুয়াল রূপ:

সব ছাত্র (20 জন) 65% পড়েছে 35% পড়েনি Pass (92%) Fail (8%) Pass (29%) Fail (71%)
👉 এই "শাখা ভাগ হয়ে যাওয়ার" ধারণাটাই পরবর্তী পার্টে Bayes' Theorem বুঝতে সাহায্য করবে, কারণ Bayes' Theorem আসলে এই গাছটাকে "উল্টো দিক থেকে" পড়ার একটা পদ্ধতি।
04

Bayes' Theorem

⏱ ~২০ মিনিট

কেন Bayes' Theorem দরকার হলো?

আগের পার্টে আমরা দেখেছি P(Pass | Studied) — মানে "পড়েছে জেনে পাসের সম্ভাবনা"। কিন্তু বাস্তব জীবনে অনেক সময় আমরা উল্টোটা জানতে চাই। যেমন:

এই প্রশ্নগুলোর ধরনটা লক্ষ করো — আমরা "ফলাফল" জেনে "কারণ" এর সম্ভাবনা বের করতে চাইছি। এটা করতে গেলে আমাদের P(A|B) থেকে P(B|A) এ যাওয়ার একটা পথ দরকার। ঠিক এই কাজটাই করে Bayes' Theorem — এটা একটা সম্ভাবনাকে "উল্টে" দিয়ে অন্য দিক থেকে হিসাব করার সূত্র।

গল্প দিয়ে বোঝা: ধরো, তোমার এক বন্ধু বলল, "আজ আমার বাসায় ছাতা আছে দেখেছি।" তুমি সাথে সাথে ভাবলে — "তাহলে নিশ্চয়ই গতকাল বৃষ্টি হয়েছিল বা হবে বলে ধারণা করেছিল।" খেয়াল করো — তুমি একটা "প্রমাণ" (ছাতা থাকা) দেখে "কারণ" (বৃষ্টির সম্ভাবনা) সম্পর্কে অনুমান করলে। এটাই Bayes' Theorem-এর মূল ধারণা — নতুন প্রমাণ (evidence) দেখে পুরনো বিশ্বাসকে (belief) আপডেট করা।

Bayes' Theorem — সূত্র

P(A | B) = [ P(B | A) × P(A) ] ÷ P(B)

প্রতিটা অংশের মানে

টার্মনামমানে
P(A)Prior Probabilityকোনো প্রমাণ দেখার আগেই A ঘটার সম্ভাবনা (আগের অভিজ্ঞতা থেকে)
P(B | A)Likelihoodযদি A সত্যি হয়, তাহলে B (প্রমাণ) দেখা যাওয়ার সম্ভাবনা
P(B)Evidenceসামগ্রিকভাবে B ঘটার সম্ভাবনা (সব ক্ষেত্রে মিলিয়ে)
P(A | B)Posterior ProbabilityB প্রমাণ দেখার পর A ঘটার (আপডেট করা) সম্ভাবনা — এটাই আমাদের উত্তর
সহজ কথায়: Prior = আগে যা বিশ্বাস করতাম, Likelihood = নতুন প্রমাণ কতটা মানানসই, Evidence = normalizing factor (সব মিলিয়ে ঠিক অনুপাতে আনা), Posterior = প্রমাণ দেখার পর নতুন বিশ্বাস।

ধাপে ধাপে উদাহরণ: রোগ নির্ণয় টেস্ট

ধরো, একটা রোগ জনসংখ্যার মধ্যে খুবই বিরল — মাত্র ১%। একটা টেস্ট আছে যেটা:

প্রশ্ন: একজনের টেস্ট পজিটিভ এসেছে। তার আসলেই রোগ থাকার সম্ভাবনা কত? — অনেকেই ভুল করে বলে ৯০%, কিন্তু Bayes' Theorem দিয়ে হিসাব করলে দেখা যায় বাস্তব উত্তর অনেক কম।

ধাপ ১ — মান বসানো
P(Disease) — Prior0.01
P(No Disease)0.99
P(Positive | Disease) — Likelihood0.90
P(Positive | No Disease) — False Positive Rate0.05
ধাপ ২ — Evidence P(Positive) বের করা
P(Positive) = P(Positive|Disease)×P(Disease) + P(Positive|No Disease)×P(No Disease)
= (0.90 × 0.01) + (0.05 × 0.99)
= 0.009 + 0.0495 = 0.0585
ধাপ ৩ — Bayes' Theorem প্রয়োগ
P(Disease | Positive) = (0.90 × 0.01) ÷ 0.0585 = 0.009 ÷ 0.0585 ≈ 0.154 (১৫.৪%)
গুরুত্বপূর্ণ শিক্ষা: টেস্ট পজিটিভ আসলেও রোগ থাকার সম্ভাবনা মাত্র ~১৫%, ৯০% না! কারণ রোগটা এত বিরল (মাত্র ১%) যে সামান্য False Positive হারও অনেক বড় প্রভাব ফেলে। এটাই দেখায় কেন শুধু Likelihood দেখলেই হয় না — Prior (আগের বিশ্বাস) কেও হিসাবে আনতে হয়। এটাই Bayes' Theorem-এর আসল শক্তি।

ভিজ্যুয়াল: ১০,০০০ মানুষের ডায়াগ্রামে

ধরো ১০,০০০ জন মানুষ আছে। ১% রোগী মানে ১০০ জনের রোগ আছে, ৯৯০০ জনের নেই।

রোগ আছে (100 জন)রোগ নেই (9900 জন)মোট পজিটিভ
টেস্ট পজিটিভ90 (90%)495 (5%)585
টেস্ট নেগেটিভ1094059415
P(Disease | Positive) = 90 ÷ 585 ≈ 0.154 (একই উত্তর — এভাবে গণনা করলে সহজে চোখে দেখা যায়)

🔬 Interactive — Medical Test (Bayes' Theorem)

Slider চালান — P(Disease|Positive) live হিসাব দেখুন

Posterior P(Disease|+): 15.4%

টেস্ট positive ≠ 90% রোগ নিশ্চিত — Prior (বিরল রোগ) গুরুত্বপূর্ণ!

05

Naive Bayes কী?

⏱ ~১৫ মিনিট

"Bayes" নামটা কেন?

আমরা এইমাত্র যে Bayes' Theorem শিখলাম — Naive Bayes অ্যালগরিদম হুবহু এই সূত্রটাই ব্যবহার করে classification করার জন্য। তাই নামের মধ্যে "Bayes" আছে।

"Naive" নামটা কেন?

"Naive" শব্দের বাংলা মানে "সরলমনা" বা "অতি সরলীকৃত"। এই অ্যালগরিদম একটা বড় ধরে নেওয়া (assumption) করে — যে, একটা জিনিসের সবগুলো ফিচার (feature/বৈশিষ্ট্য) একে অপরের থেকে সম্পূর্ণ স্বাধীন (independent), একটা আরেকটাকে প্রভাবিত করে না।

বাস্তবে এটা প্রায়ই সত্যি হয় না — তাই এই ধরে নেওয়াটাকে "সরলমনা" বা "naive" বলা হয়। কিন্তু মজার ব্যাপার হলো, এই সরলীকরণ করা সত্ত্বেও অ্যালগরিদমটা বাস্তবে খুব ভালো কাজ করে!

Feature Independence বোঝার সহজ উদাহরণ

মুভি বেছে নেওয়ার গল্প: ধরো, তুমি একটা মুভি দেখবে কিনা তা ঠিক করছ তিনটা জিনিস দেখে — Genre (Action/Comedy), Rating (High/Low), আর Language (Bangla/English)। Naive Bayes ধরে নেয় যে, মুভিটার Genre জানা থাকলে সেটা Rating সম্পর্কে কিছু বলে না, এবং Rating জানা থাকলে সেটা Language সম্পর্কে কিছু বলে না — প্রতিটা ফিচার আলাদা আলাদা ভাবে সিদ্ধান্তে প্রভাব ফেলে, একে অপরের সাথে যুক্ত হয়ে নয়।

বাস্তবে হয়তো Action মুভির সাথে English ভাষার একটা সম্পর্ক থাকতে পারে (correlation) — কিন্তু Naive Bayes এই সম্পর্কটা উপেক্ষা করে প্রতিটা ফিচারকে আলাদা আলাদাভাবে বিবেচনা করে। এই সরলীকরণের কারণেই হিসাব করাটা অনেক দ্রুত এবং সহজ হয়ে যায়।

Naive Bayes-এর ধরে নেওয়া (Assumption) বনাম বাস্তবতা
বিষয়Naive Bayes কী ধরে নেয়বাস্তবে কী হয়
ফিচারগুলোর সম্পর্কএকদম স্বাধীন, একে অপরকে প্রভাবিত করে নাঅনেক সময় ফিচারগুলো একে অপরের সাথে সম্পর্কিত থাকে
ফলাফলের উপর প্রভাবপ্রতিটা ফিচার আলাদাভাবে posterior probability-তে যোগ হয়বাস্তবে প্রভাব যৌথ (joint) হতে পারে
ফলাফল কেমন হয়সরলীকরণ সত্ত্বেও, বেশিরভাগ ক্ষেত্রে দারুণ কার্যকরটেক্সট ক্লাসিফিকেশনের মতো ক্ষেত্রে বিশেষভাবে ভালো কাজ করে
👉 এখন আমরা জানি: Naive = সরল ধারণা (ফিচার independence), Bayes = Bayes' Theorem ব্যবহার। এই দুটো মিলিয়েই Naive Bayes Classifier। পরের পার্টে আমরা দেখব এটা ধাপে ধাপে ঠিক কীভাবে কাজ করে।
06

Naive Bayes কীভাবে কাজ করে

⏱ ~২০ মিনিট

সম্পূর্ণ ওয়ার্কফ্লো

Dataset → Prior → Likelihood → Bayes → Posterior → Prediction। নিচের ★ Pipeline Visual-এ প্রতিটি ধাপ live দেখুন।

উদাহরণ: Spam Email Detection (ম্যানুয়াল হিসাব)

ধরো আমাদের কাছে ৮টা পুরনো ইমেইলের একটা ছোট ডেটাসেট আছে:

ছোট Email ডেটাসেট
#ইমেইলে "Free" শব্দ আছে?ইমেইলে "Offer" শব্দ আছে?ক্লাস
1হ্যাঁহ্যাঁSpam
2হ্যাঁনাSpam
3হ্যাঁহ্যাঁSpam
4নানাNot Spam
5নাহ্যাঁNot Spam
6নানাNot Spam
7হ্যাঁনাSpam
8নাহ্যাঁNot Spam

নতুন ইমেইল: যেখানে "Free" আছে, কিন্তু "Offer" নেই। এটা কি Spam নাকি Not Spam?

ধাপ ১ — Prior Probability
P(Spam) = 4/8 = 0.5   |   P(Not Spam) = 4/8 = 0.5
ধাপ ২ — Likelihood হিসাব (প্রতিটা ফিচার আলাদাভাবে)
শর্তSpam-এর মধ্যেNot Spam-এর মধ্যে
P(Free = হ্যাঁ | Class)4/4 = 1.00/4 = 0.0
P(Offer = না | Class)2/4 = 0.52/4 = 0.5
একটা সমস্যা: P(Free=হ্যাঁ | Not Spam) = 0 হওয়ায় পুরো হিসাবটাই শূন্য হয়ে যাবে! এটাকে বলে Zero Probability Problem। বাস্তবে এটা সমাধানের জন্য Laplace Smoothing ব্যবহার করা হয় (প্রতিটা কাউন্টে ছোট একটা সংখ্যা +1 যোগ করা) — এই কৌশলটা লাইভ কোডিং সেশনে ব্যবহার করে দেখানো হবে।
ধাপ ৩ — Bayes' Theorem প্রয়োগ (proportional আকারে)

যেহেতু সব ক্লাসের জন্য P(Evidence) একই থাকে, তাই তুলনা করার সময় সেটা বাদ দিয়ে শুধু নিচেরটুকু হিসাব করলেই চলে:

Score(Spam) ∝ P(Spam) × P(Free=হ্যাঁ|Spam) × P(Offer=না|Spam)
= 0.5 × 1.0 × 0.5 = 0.25

Score(Not Spam) ∝ P(Not Spam) × P(Free=হ্যাঁ|Not Spam) × P(Offer=না|Not Spam)
= 0.5 × 0.0 × 0.5 = 0.0   (Laplace Smoothing ছাড়া)
ধাপ ৪ — Posterior Probability ও তুলনা

Score(Spam) = 0.25 যেটা Score(Not Spam) = 0.0 এর চেয়ে বড়। তাই:

চূড়ান্ত সিদ্ধান্ত: এই ইমেইলটি SPAM হিসেবে ধরা হবে ✅
👉 লক্ষ করো — Naive Bayes আসলে প্রতিটা ক্লাসের জন্য একটা "স্কোর" বের করে, যেটা আসলে Bayes' Theorem-এরই সরলীকৃত রূপ (প্রতিটা ফিচারের likelihood-কে একে অপরের সাথে গুণ করে দেওয়া, কারণ আমরা independence ধরে নিয়েছি)। এরপর যে ক্লাসের স্কোর সবচেয়ে বেশি, সেটাই final prediction।

Pipeline Visual — Spam Email NB

⏱ Interactive · Step by Step

এক লাইনে পুরো গল্প

Training emails → Prior P(Spam) → Likelihood P(feature|class) → Score = Prior × ∏ Likelihood → Posterior normalize → Predict class।

Naive Bayes ML Pipeline — Step by Step
পরের ধাপ চাপুন — canvas + math formula একসাথে দেখুন (অথবা নম্বরে click করুন)
Data8 emails
PriorP(C)
LikelihoodP(f|C)
Score∏ × Prior
PosteriorP(C|x)
ClassPrediction
Query Free: Offer: α=0 হলে zero probability দেখাবে · α=1 Laplace smoothing
ধাপ ১: Training Data ৮টি ইমেইল — লাল = Spam, সবুজ = Not Spam
ধাপ1 / 6
Score(Spam)
Score(Not Spam)
P(Spam|x)
Prediction

💡 এক লাইনে মনে রাখো

Prior × Likelihood₁ × Likelihood₂ → Score → Normalize → Posterior → argmax = Prediction

07

Naive Bayes-এর প্রকারভেদ

⏱ ~১৫ মিনিট

Gaussian Naive Bayes

যখন ফিচারগুলো সংখ্যাসূচক (numerical) এবং তা মোটামুটি একটা normal distribution (ঘণ্টার আকৃতির curve) অনুসরণ করে, তখন Gaussian Naive Bayes ব্যবহার করা হয়। যেমন — উচ্চতা, ওজন, তাপমাত্রা, বয়স ইত্যাদি।

ব্যবহার: Iris ফুলের species prediction (পাপড়ির length/width দিয়ে), মেডিকেল ডেটাতে রক্তচাপ/সুগার লেভেল দিয়ে prediction।

Multinomial Naive Bayes

যখন ফিচার হলো "কোনো কিছুর সংখ্যা কতবার ঘটেছে" (count/frequency) — বিশেষ করে টেক্সট ডেটা-তে একটা শব্দ কতবার এসেছে। এটাই সবচেয়ে বেশি ব্যবহৃত হয় Text Classification-এ।

ব্যবহার: Spam Detection (ইমেইলে শব্দের ফ্রিকোয়েন্সি), News Category Classification, Sentiment Analysis।

Bernoulli Naive Bayes

যখন ফিচার শুধু Binary (0/1, Yes/No) — অর্থাৎ একটা জিনিস "আছে কি নেই" সেটাই গুরুত্বপূর্ণ, কতবার আছে সেটা না। যেমন — একটা নির্দিষ্ট শব্দ ইমেইলে "আছে" (1) নাকি "নেই" (0)।

ব্যবহার: ছোট টেক্সট ডকুমেন্টে শব্দের presence/absence দেখে classification, স্প্যাম ফিল্টার যেখানে শুধু নির্দিষ্ট কিছু কিওয়ার্ডের উপস্থিতি ম্যাটার করে।

তিন ধরনের Naive Bayes — তুলনা
ধরনডেটার ধরনউদাহরণ ফিচারমূল ব্যবহার
GaussianContinuous Numericalউচ্চতা, তাপমাত্রাসেন্সর/মেডিকেল ডেটা
MultinomialCount/Frequencyশব্দের সংখ্যাটেক্সট ও স্প্যাম ক্লাসিফিকেশন
BernoulliBinary (0/1)শব্দের উপস্থিতি/অনুপস্থিতিছোট টেক্সট ডকুমেন্ট
08

সুবিধা ও সীমাবদ্ধতা

⏱ ~১০ মিনিট

🔧 Laplace Smoothing — Live Demo

Part 6-এ P(Free=হ্যাঁ|Not Spam)=0 সমস্যা দেখেছ। ★ Pipeline Visual-এ Laplace α slider চালিয়ে zero probability কীভাবে fix হয় তা live দেখুন।

✅ সুবিধা

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

⚠️ সীমাবদ্ধতা

Independence Assumptionফিচারগুলো স্বাধীন ধরে নেয়, যা বাস্তবে সবসময় সত্যি না
Assumption ভাঙলে পারফরম্যান্স কমেফিচারের মধ্যে শক্তিশালী সম্পর্ক থাকলে ভুল প্রেডিকশন হতে পারে
জটিল সম্পর্ক ধরতে পারে নাফিচারগুলোর মধ্যে জটিল, non-linear সম্পর্ক বোঝাতে দুর্বল
উদাহরণ দিয়ে বোঝা: ধরো একটা ডেটাসেটে "বৃষ্টি" এবং "রাস্তা ভেজা" দুটো আলাদা ফিচার হিসেবে আছে। বাস্তবে এই দুটো একে অপরের সাথে খুব ঘনিষ্ঠভাবে সম্পর্কিত (বৃষ্টি হলে রাস্তা ভিজবেই)। Naive Bayes এই সম্পর্কটা উপেক্ষা করে দুটোকেই আলাদা প্রমাণ হিসেবে গণনা করবে — ফলে একই তথ্য দুইবার গোনা হয়ে যেতে পারে এবং প্রেডিকশন কিছুটা "ওভার-কনফিডেন্ট" হয়ে যেতে পারে।
09

বাস্তব প্রয়োগ (Applications)

⏱ ~১০ মিনিট
প্রয়োগক্ষেত্রব্যাখ্যা
Spam Email Detectionজিমেইলের মতো সার্ভিসে ইমেইলের শব্দ বিশ্লেষণ করে স্প্যাম ফিল্টার করা
News Classificationএকটা নিউজ আর্টিকেল Sports/Politics/Tech কোন ক্যাটাগরির তা নির্ণয়
Sentiment Analysisএকটা রিভিউ বা কমেন্ট Positive/Negative/Neutral কিনা নির্ণয়
Language Detectionএকটা টেক্সট কোন ভাষায় লেখা তা চিহ্নিত করা
Medical Diagnosisলক্ষণ দেখে রোগ থাকার সম্ভাবনা অনুমান করা
Product Recommendationগ্রাহকের আচরণ দেখে পণ্য পছন্দ হওয়ার সম্ভাবনা অনুমান
Fake News Detectionএকটা খবরের লেখার ধরন দেখে সেটা fake না real তা নির্ণয়
👉 লক্ষ করো — এর মধ্যে বেশিরভাগ প্রয়োগই টেক্সট বেসড। এটাই Naive Bayes-এর সবচেয়ে বড় শক্তির জায়গা: প্রচুর শব্দ/ফিচার থাকলেও এটা দ্রুত ও কার্যকরভাবে কাজ করতে পারে।
10

Google Colab কোডিং সেশন

⏱ লাইভ প্র্যাকটিস

উদাহরণ ১: Student Pass/Fail Prediction

ফিচার: Study Hours, Attendance, Previous Marks   |   টার্গেট: Pass (1) / Fail (0)

Step 1 — Import করা (Colab-এর প্রথম সেল)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
(কোনো আউটপুট নেই — এটা শুধু লাইব্রেরি লোড করছে)

লাইন বাই লাইন ব্যাখ্যা: pandas ডেটা টেবিল হ্যান্ডেল করতে ব্যবহার হয়, numpy সংখ্যা নিয়ে কাজ করার জন্য, sklearn.model_selection থেকে ডেটা ভাগ করার ফাংশন, GaussianNB হলো আমাদের numerical ফিচারের জন্য উপযুক্ত Naive Bayes মডেল, আর শেষের অংশটা মডেল কতটা ভালো তা মাপার জন্য।

কমন ভুল: import না করে সরাসরি GaussianNB() ব্যবহার করার চেষ্টা করা — এতে NameError আসবে। সবসময় প্রথমে import সেল রান করতে হবে।
Step 2 — ডেটাসেট তৈরি করা
data = {
    'Study_Hours': [1, 2, 3, 4, 5, 6, 7, 8, 2, 6],
    'Attendance':  [40, 50, 55, 60, 70, 80, 85, 95, 45, 75],
    'Previous_Marks': [30, 40, 35, 50, 60, 65, 70, 90, 38, 68],
    'Result': [0, 0, 0, 1, 1, 1, 1, 1, 0, 1]
}
df = pd.DataFrame(data)
df.head()
Study_Hours Attendance Previous_Marks Result 0 1 40 30 0 1 2 50 40 0 2 3 55 35 0 3 4 60 50 1 4 5 70 60 1

ব্যাখ্যা: df.head() ডিফল্টভাবে প্রথম ৫টা সারি দেখায়, যাতে আমরা ডেটার গঠন বুঝতে পারি রান করার আগেই।

Step 3 — Train-Test Split
X = df[['Study_Hours', 'Attendance', 'Previous_Marks']]
y = df['Result']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)
print("Train size:", X_train.shape, "Test size:", X_test.shape)
Train size: (7, 3) Test size: (3, 3)

ব্যাখ্যা: X হলো ফিচারগুলো (independent variables), y হলো টার্গেট (dependent variable)। test_size=0.3 মানে ৩০% ডেটা টেস্টিং-এর জন্য আলাদা রাখা হচ্ছে, আর random_state=42 নিশ্চিত করে যে প্রতিবার একই ভাগ হবে (reproducibility)।

কমন ভুল: পুরো ডেটাসেট দিয়েই ট্রেইন করে সেই একই ডেটা দিয়ে টেস্ট করা — এতে মডেলের real performance বোঝা যায় না, কারণ মডেল আগে থেকেই সেই ডেটা "মুখস্থ" করে ফেলেছে।

Step 4 — মডেল ট্রেইন করা
model = GaussianNB()
model.fit(X_train, y_train)
print("মডেল ট্রেইনিং সম্পন্ন ✅")
মডেল ট্রেইনিং সম্পন্ন ✅

ব্যাখ্যা: .fit() মেথডটাই আসল "শেখার" কাজ করে — এটা ট্রেনিং ডেটা থেকে প্রতিটা ক্লাসের Prior এবং প্রতিটা ফিচারের mean/variance হিসাব করে রাখে (Gaussian distribution ফিট করার জন্য)।

Step 5 — প্রেডিকশন করা
predictions = model.predict(X_test)
print("Predictions:", predictions)
print("Actual:     ", y_test.values)
Predictions: [1 0 1] Actual: [1 0 1]
Step 6 — Probability সহ প্রেডিকশন
probs = model.predict_proba(X_test)
print(probs)
[[0.02 0.98] [0.91 0.09] [0.05 0.95]]

ব্যাখ্যা: প্রতিটা সারিতে দুইটা সংখ্যা — প্রথমটা "Fail (0)" হওয়ার সম্ভাবনা, দ্বিতীয়টা "Pass (1)" হওয়ার সম্ভাবনা। যোগফল সবসময় 1.0 হবে। এটাই আসলে আমাদের হাতে-কলমে হিসাব করা Posterior Probability — শুধু sklearn নিজে নিজে করে দিচ্ছে।

Step 7 — মডেল ইভ্যালুয়েশন
print("Accuracy:", accuracy_score(y_test, predictions))
print("\nConfusion Matrix:\n", confusion_matrix(y_test, predictions))
Accuracy: 1.0 Confusion Matrix: [[1 0] [0 2]]
Best Practice: এত ছোট ডেটাসেটে (মাত্র ১০টা row) Accuracy 1.0 আসাটা স্বাভাবিক কিন্তু বিভ্রান্তিকর — বাস্তব প্রজেক্টে সবসময় বড় ও বৈচিত্র্যময় ডেটাসেট ব্যবহার করতে হবে, নাহলে মডেল ওভারফিট (overfit) করবে।

উদাহরণ ২: Spam Email Detection (টেক্সট ক্লাসিফিকেশন)

Step 1 — ডেটাসেট তৈরি
emails = [
    "Win a free lottery now",
    "Limited offer just for you, claim free gift",
    "Meeting scheduled for tomorrow at 10am",
    "Please review the attached project report",
    "You have won a free prize, click here",
    "Let's discuss the client requirements",
    "Free money guaranteed, act now",
    "Reminder: submit your assignment by Friday"
]
labels = [1, 1, 0, 0, 1, 0, 1, 0]  # 1 = Spam, 0 = Not Spam
(কোনো আউটপুট নেই — শুধু ডেটা তৈরি হলো)
Step 2 — Text Cleaning (বেসিক)
import re

def clean_text(text):
    text = text.lower()
    text = re.sub(r'[^a-z\s]', '', text)
    return text

cleaned_emails = [clean_text(e) for e in emails]
print(cleaned_emails[0])
win a free lottery now

ব্যাখ্যা: lower() সব অক্ষরকে ছোট হাতের করে দেয় (যাতে "Free" ও "free" একই শব্দ হিসেবে গণ্য হয়), আর re.sub সংখ্যা/বিশেষ চিহ্ন সরিয়ে শুধু অক্ষর রাখে।

Step 3 — Vectorization (CountVectorizer)
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(cleaned_emails)
print(vectorizer.get_feature_names_out())
print(X.toarray())
['act' 'assignment' 'at' 'attached' 'by' ... 'you'] [[0 0 0 0 0 1 0 1 1 0 0 ...] ...]

ব্যাখ্যা: কম্পিউটার টেক্সট বোঝে না, শুধু সংখ্যা বোঝে। CountVectorizer প্রতিটা ইমেইলকে একটা সংখ্যার তালিকায় (vector) রূপান্তর করে, যেখানে প্রতিটা কলাম একটা শব্দ এবং মান হলো সেই শব্দটা কতবার এসেছে।

Step 4 — Train-Test Split ও মডেল ট্রেইনিং
from sklearn.naive_bayes import MultinomialNB

X_train, X_test, y_train, y_test = train_test_split(
    X, labels, test_size=0.25, random_state=1
)

nb_model = MultinomialNB()
nb_model.fit(X_train, y_train)
MultinomialNB()

ব্যাখ্যা: এখানে MultinomialNB ব্যবহার হয়েছে (GaussianNB না), কারণ আমাদের ফিচার হলো "শব্দ কতবার এসেছে" — যা count-based ডেটা, numerical measurement না।

Step 5 — প্রেডিকশন ও Probability
new_email = ["Claim your free prize today"]
cleaned_new = [clean_text(e) for e in new_email]
new_vector = vectorizer.transform(cleaned_new)

prediction = nb_model.predict(new_vector)
probability = nb_model.predict_proba(new_vector)

print("Prediction (1=Spam, 0=Not Spam):", prediction)
print("Probability [Not Spam, Spam]:", probability)
Prediction (1=Spam, 0=Not Spam): [1] Probability [Not Spam, Spam]: [[0.12 0.88]]
Step 6 — মডেল ইভ্যালুয়েশন
test_predictions = nb_model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, test_predictions))
print(classification_report(y_test, test_predictions))
Accuracy: 1.0 precision recall f1-score support 0 1.00 1.00 1.00 1 1 1.00 1.00 1.00 1
কমন বিগিনার ভুল:
  • নতুন ডেটার উপর fit_transform() ব্যবহার করা (উচিত শুধু transform(), কারণ vectorizer আগেই ট্রেনিং ডেটা দিয়ে "শেখা" হয়ে গেছে)
  • Text cleaning না করে সরাসরি raw টেক্সট vectorize করা — এতে "Free" এবং "free" আলাদা শব্দ হিসেবে গণ্য হবে
  • ছোট ডেটাসেটে (মাত্র ৮টা ইমেইল) পাওয়া Accuracy কে বাস্তব পারফরম্যান্স মনে করা
Best Practices: সবসময় random_state ফিক্স করে রাখো (reproducibility-র জন্য), বড় ডেটাসেটে Stopwords বাদ দাও, TF-IDF ব্যবহার করে দেখো (CountVectorizer-এর চেয়ে প্রায়ই ভালো ফলাফল দেয়), এবং সবসময় Accuracy-র পাশাপাশি Precision/Recall/F1 দেখো।
11

মডেল ইভ্যালুয়েশন

⏱ ~১০ মিনিট

Confusion Matrix — বোঝার আগে ইনটুইশন

ধরো, তুমি একজন শিক্ষক এবং তোমার মডেল প্রতিটা ছাত্রকে "Pass" বা "Fail" বলে ভবিষ্যদ্বাণী করছে। এখন চারটা সম্ভাবনা হতে পারে:

মডেল বলল "Pass" (Positive)মডেল বলল "Fail" (Negative)
আসলে Pass ছিলTrue Positive (TP) ✅False Negative (FN) ❌
আসলে Fail ছিলFalse Positive (FP) ❌True Negative (TN) ✅

মেট্রিক্স — ইনটুইশন আগে, ফর্মুলা পরে

Accuracy — "মোট কতটা ঠিক বলেছে"

Accuracy = (TP + TN) ÷ (TP + TN + FP + FN)

Precision — "যতগুলো Positive বলেছে, তার মধ্যে কতগুলো আসলেই Positive ছিল"

Precision = TP ÷ (TP + FP)

যেমন — স্প্যাম ফিল্টারে Precision কম হলে ভালো ইমেইলও স্প্যাম বলে ফেলে দেবে (বিরক্তিকর!)।

Recall — "যতগুলো আসলেই Positive ছিল, তার মধ্যে কতগুলো ধরতে পেরেছে"

Recall = TP ÷ (TP + FN)

যেমন — রোগ নির্ণয়ে Recall কম হলে অনেক আসল রোগীকে "সুস্থ" বলে মিস করে ফেলবে (বিপজ্জনক!)।

F1 Score — Precision ও Recall-এর ব্যালেন্স

F1 = 2 × (Precision × Recall) ÷ (Precision + Recall)
👉 কোনটা বেশি গুরুত্বপূর্ণ তা নির্ভর করে সমস্যার উপর। রোগ নির্ণয়ে Recall বেশি গুরুত্বপূর্ণ (একজন রোগীকেও মিস করা যাবে না), স্প্যাম ফিল্টারে Precision বেশি গুরুত্বপূর্ণ (ভালো ইমেইল ভুলবশত স্প্যাম বলা যাবে না)।
12

অন্য অ্যালগরিদমের সাথে তুলনা

⏱ ~১০ মিনিট
Naive Bayes vs জনপ্রিয় অন্যান্য অ্যালগরিদম
বিষয়Naive BayesLogistic RegressionDecision TreeKNNSVM
গতি⚡ খুব দ্রুতদ্রুতমাঝারিপ্রেডিকশনে ধীরবড় ডেটায় ধীর
টেক্সট ডেটায় পারফরম্যান্স✅ চমৎকারভালোমাঝারিদুর্বলভালো
প্রয়োজনীয় ডেটার পরিমাণকম হলেও চলেমাঝারিমাঝারিবেশিমাঝারি-বেশি
ফিচার সম্পর্ক ধরার ক্ষমতা❌ দুর্বল (independence ধরে নেয়)মাঝারি✅ ভালোভালো✅ ভালো
ইন্টারপ্রিটেশন সহজ?মোটামুটি সহজসহজ✅ সবচেয়ে সহজমাঝারিকঠিন

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

13

কমন বিগিনার ভুল

⏱ Discussion
ভুল ১: Probability কে Prediction ভাবা
অনেকে ভাবে "0.8 probability মানে ৮০% নিশ্চিত সঠিক" — কিন্তু এটা মডেলের নিজের বিশ্বাসের মাত্রা, বাস্তব সঠিকতার গ্যারান্টি না। মডেল ভুলও করতে পারে উচ্চ probability সহ।
ভুল ২: Feature Independence-কে ভুল বোঝা
অনেকে মনে করে "independence" মানে ফিচারগুলো একে অপরের সাথে কোনোভাবেই সম্পর্কিত না বাস্তবে — আসলে এটা শুধু অ্যালগরিদমের একটা সরলীকৃত ধারণা (assumption), বাস্তব সত্য না।
ভুল ৩: ভুল ধরনের Naive Bayes ব্যবহার করা
Numerical ডেটায় MultinomialNB ব্যবহার করা বা Text ডেটায় GaussianNB ব্যবহার করা — এতে ভুল ফলাফল আসতে পারে। ডেটার ধরন অনুযায়ী সঠিক variant বাছাই করতে হবে।
ভুল ৪: Text Preprocessing ভুলে যাওয়া
Lowercase না করা, punctuation না সরানো, stopwords বাদ না দেওয়া — এতে "Free" আর "free" আলাদা ফিচার হিসেবে গণ্য হবে এবং মডেল দুর্বল হবে।
ভুল ৫: Predicted Probability ভুল ব্যাখ্যা করা
predict_proba() এর আউটপুট দেখে সরাসরি "মডেল ৯৫% sure" বলে দাবি করা, অথচ ছোট/imbalanced ডেটাসেটে এই probability সবসময় নির্ভরযোগ্য নাও হতে পারে (calibration প্রয়োজন হতে পারে)।
14

এন্ড-টু-এন্ড ম্যানুয়াল উদাহরণ

⏱ Hands-on

ক্লাসিক "Play Cricket?" ডেটাসেট — আবহাওয়া দেখে সিদ্ধান্ত নেওয়া হবে ক্রিকেট খেলা হবে কিনা।

Weather ডেটাসেট (১৪টা দিনের রেকর্ড)
#WeatherTemperatureHumidityPlay Cricket?
1SunnyHotHighNo
2SunnyHotHighNo
3OvercastHotHighYes
4RainyMildHighYes
5RainyCoolNormalYes
6RainyCoolNormalNo
7OvercastCoolNormalYes
8SunnyMildHighNo
9SunnyCoolNormalYes
10RainyMildNormalYes
11SunnyMildNormalYes
12OvercastMildHighYes
13OvercastHotNormalYes
14RainyMildHighNo

প্রশ্ন: নতুন দিন — Weather=Sunny, Humidity=Normal — এই দিনে কি ক্রিকেট খেলা হবে?

ধাপ ১ — Prior Probability
P(Yes) = 9/14 ≈ 0.643   |   P(No) = 5/14 ≈ 0.357
ধাপ ২ — Likelihood হিসাব
শর্তYes-এর মধ্যেNo-এর মধ্যে
P(Sunny | Class)2/9 ≈ 0.2223/5 = 0.6
P(Normal Humidity | Class)6/9 ≈ 0.6671/5 = 0.2
ধাপ ৩ — Score হিসাব (Naive Bayes formula প্রয়োগ)
Score(Yes) = P(Yes) × P(Sunny|Yes) × P(Normal|Yes)
= 0.643 × 0.222 × 0.667 ≈ 0.0952

Score(No) = P(No) × P(Sunny|No) × P(Normal|No)
= 0.357 × 0.6 × 0.2 ≈ 0.0428
ধাপ ৪ — Normalize (ঐচ্ছিক, বোঝার জন্য)
P(Yes | evidence) = 0.0952 ÷ (0.0952 + 0.0428) ≈ 0.69 (৬৯%)
P(No | evidence) = 0.0428 ÷ (0.0952 + 0.0428) ≈ 0.31 (৩১%)
চূড়ান্ত সিদ্ধান্ত: Score(Yes) > Score(No), তাই প্রেডিকশন — Play Cricket = YES ✅ (আত্মবিশ্বাস ~৬৯%)
15

মিনি বিজনেস প্রজেক্ট

⏱ Case Study
বিজনেস স্টোরি: "MailSecure" নামের একটা ইমেইল সার্ভিস প্রোভাইডার চায় প্রতিদিন আসা লক্ষ লক্ষ ইমেইলকে স্বয়ংক্রিয়ভাবে Spam এবং Not Spam এ ভাগ করে দিতে, যাতে ব্যবহারকারীরা শুধু গুরুত্বপূর্ণ ইমেইল দেখতে পায়।

ধাপ ১: Data Understanding

টিম প্রথমে বোঝে — তাদের কাছে কী ডেটা আছে (পুরনো ইমেইলগুলো, যেগুলো ব্যবহারকারীরা আগে ম্যানুয়ালি স্প্যাম হিসেবে চিহ্নিত করেছে), এবং কী কী ফিচার ব্যবহারযোগ্য (subject line, body text, sender domain)।

ধাপ ২: Text Cleaning

সব ইমেইল lowercase করা হয়, বিশেষ চিহ্ন সরানো হয়, HTML ট্যাগ থাকলে সরানো হয়, এবং common stopwords ("the", "is", "a" ইত্যাদি) বাদ দেওয়া হয় যাতে মূল অর্থবহ শব্দগুলো নজরে আসে।

ধাপ ৩: Feature Extraction

TF-IDF Vectorizer ব্যবহার করে প্রতিটা ইমেইলকে সংখ্যার vector-এ রূপান্তর করা হয়, যেখানে প্রতিটা শব্দের গুরুত্ব শুধু ফ্রিকোয়েন্সি না, বরং সেই শব্দ কতটা "distinctive" (অন্যান্য ডকুমেন্টের তুলনায় বিরল ও গুরুত্বপূর্ণ) তার ভিত্তিতে ওজন পায়।

ধাপ ৪: Train Naive Bayes

যেহেতু ফিচারগুলো word-frequency ভিত্তিক, তাই MultinomialNB ব্যবহার করা হয়। ডেটা Train ও Test সেটে ভাগ করে মডেল ট্রেইন করা হয়।

ধাপ ৫: Prediction ও Evaluation

Test সেটে Accuracy, Precision, Recall, F1 মাপা হয়। এখানে Precision-কে বেশি গুরুত্ব দেওয়া হয় — কারণ ভুলবশত একটা গুরুত্বপূর্ণ ইমেইলকে Spam বলে ফেলা (False Positive) ব্যবহারকারীর জন্য অনেক বেশি ক্ষতিকর তুলনায় একটা স্প্যাম ইমেইল Inbox-এ চলে আসার চেয়ে।

ধাপ ৬: Business Insights

16

রিভিশন সেকশন

⏱ শেষ ২৫ মিনিট

📌 Quick Revision Notes

🎤 Viva Questions

V1: Naive Bayes-কে কেন "Naive" বলা হয়?
কারণ এটা ধরে নেয় সবগুলো ফিচার একে অপরের থেকে সম্পূর্ণ স্বাধীন, যা বাস্তবে সবসময় সত্যি নয় — এই সরলীকৃত ধারণাকেই "naive" বলা হয়।
V2: Prior আর Posterior Probability-র মধ্যে পার্থক্য কী?
Prior হলো কোনো প্রমাণ দেখার আগের বিশ্বাস, আর Posterior হলো প্রমাণ দেখার পর আপডেট করা বিশ্বাস।
V3: Zero Probability Problem কী এবং এর সমাধান কী?
ট্রেনিং ডেটায় কোনো ফিচার-ক্লাস কম্বিনেশন একেবারেই না থাকলে likelihood 0 হয়ে পুরো গণনা 0 হয়ে যায়। সমাধান হলো Laplace (Additive) Smoothing — প্রতিটা গণনায় ছোট একটা সংখ্যা যোগ করা।

💼 Interview Preparation (Top Questions)

Q1: Naive Bayes কী এবং এটা কীভাবে কাজ করে?
এটা একটা probabilistic classification অ্যালগরিদম যা Bayes' Theorem ব্যবহার করে প্রতিটা ক্লাসের posterior probability হিসাব করে এবং সর্বোচ্চ probability-র ক্লাসকে prediction হিসেবে বেছে নেয়, ফিচার independence ধরে নিয়ে।
Q2: কেন একে "Naive" বলা হয়?
কারণ এটা অবাস্তবভাবে ধরে নেয় যে সবগুলো ফিচার একে অপরের থেকে স্বাধীন।

ফলো-আপ: "এই assumption ভাঙলে কী হয়?" — মডেলের probability estimate কম নির্ভরযোগ্য হতে পারে, যদিও classification decision প্রায়ই ঠিক থাকে।
Q3: Prior, Likelihood, Evidence, এবং Posterior Probability ব্যাখ্যা করো।
Prior = আগের অভিজ্ঞতা থেকে সম্ভাবনা, Likelihood = ক্লাস জানা থাকলে প্রমাণ দেখার সম্ভাবনা, Evidence = সামগ্রিক normalizing factor, Posterior = সব মিলিয়ে চূড়ান্ত আপডেটেড সম্ভাবনা।
Q4: Zero Frequency Problem কীভাবে সমাধান করবে?
Laplace Smoothing ব্যবহার করে — প্রতিটা কাউন্টে একটা ছোট সংখ্যা (সাধারণত 1) যোগ করে দেওয়া হয় যাতে কোনো probability একেবারে শূন্য না হয়।
Q5: Gaussian, Multinomial, ও Bernoulli Naive Bayes-এর মধ্যে পার্থক্য কী?
Gaussian ব্যবহার হয় continuous numerical ডেটায়, Multinomial ব্যবহার হয় count/frequency ডেটায় (যেমন টেক্সট), আর Bernoulli ব্যবহার হয় binary (0/1) ফিচারে।
Q6: Naive Bayes টেক্সট ক্লাসিফিকেশনে এত ভালো কাজ করে কেন?
টেক্সট ডেটায় অনেক ফিচার (শব্দ) থাকে এবং Naive Bayes দ্রুত ও কার্যকরভাবে হাই-ডাইমেনশনাল ডেটা হ্যান্ডেল করতে পারে, এমনকি independence assumption পুরোপুরি সত্যি না হলেও।
Q7: Naive Bayes-এর প্রধান সীমাবদ্ধতা কী?
Feature Independence Assumption বাস্তবে প্রায়ই ভাঙে, এবং এটা জটিল non-linear সম্পর্ক ধরতে পারে না।
Q8: Naive Bayes কি Imbalanced ডেটাসেটে ভালো কাজ করে?
Prior probability সরাসরি ক্লাস ফ্রিকোয়েন্সি থেকে আসে বলে ইমব্যালান্সড ডেটায় মডেল majority class-এর দিকে ঝুঁকে যেতে পারে; সমাধান হিসেবে resampling বা class weighting ব্যবহার করা যায়।
Q9: Naive Bayes কি missing value হ্যান্ডেল করতে পারে?
সরাসরি না, তবে সাধারণত missing ফিচারটাকে গণনা থেকে বাদ দিয়ে বাকি ফিচার দিয়ে probability হিসাব করা যায় (implementation-নির্ভর)।
Q10: CountVectorizer এবং TF-IDF-এর পার্থক্য কী?
CountVectorizer শুধু শব্দের কাঁচা সংখ্যা গোনে, আর TF-IDF শব্দের গুরুত্বকেও বিবেচনা করে — যে শব্দ সব ডকুমেন্টে বারবার আসে তার ওজন কমিয়ে দেয়, আর distinctive শব্দের ওজন বাড়িয়ে দেয়।
Q11: Naive Bayes কি Overfitting করে?
সাধারণত Naive Bayes-এর সরলতার (high bias, low variance) কারণে Overfitting তুলনামূলক কম হয়, তবে খুব ছোট ও noisy ডেটাসেটে এটাও ঘটতে পারে।
Q12: predict() এবং predict_proba()-র মধ্যে পার্থক্য কী?
predict() শুধু চূড়ান্ত ক্লাস লেবেল দেয়, আর predict_proba() প্রতিটা ক্লাসের posterior probability (দশমিক মান) দেয়, যেখান থেকে predict() সর্বোচ্চটা বেছে নেয়।
Q13: Naive Bayes Regression-এর জন্য ব্যবহার করা যায় কি?
না, এটা মূলত একটা classification অ্যালগরিদম; সরাসরি continuous সংখ্যা predict করার জন্য ডিজাইন করা হয়নি।
Q14: Practical Scenario: একটা কোম্পানি চায় গ্রাহকের রিভিউ থেকে Positive/Negative Sentiment বের করতে, কিন্তু তাদের কাছে মাত্র ২০০টা লেবেলড রিভিউ আছে। Naive Bayes কি উপযুক্ত পছন্দ?
হ্যাঁ — Naive Bayes ছোট ডেটাসেটেও তুলনামূলক ভালো কাজ করে এবং টেক্সট ডেটায় শক্তিশালী, তাই এটা একটা ভালো বেসলাইন মডেল হতে পারে এই পরিস্থিতিতে।
Q15: Naive Bayes-এ Feature Scaling দরকার হয় কি?
সাধারণত না — Gaussian Naive Bayes প্রতিটা ফিচারের নিজস্ব mean/variance ব্যবহার করে হিসাব করে বলে normalization/standardization বাধ্যতামূলক নয়, যদিও কখনো কখনো numerical stability-র জন্য সাহায্য করতে পারে।

📝 MCQs with Answers

১. Naive Bayes কোন থিওরির উপর ভিত্তি করে তৈরি?

  1. A) Central Limit Theorem
  2. B) Bayes' Theorem
  3. C) Pythagoras Theorem
  4. D) Law of Large Numbers

২. টেক্সট ক্লাসিফিকেশনের জন্য সাধারণত কোন Naive Bayes variant ব্যবহার হয়?

  1. A) Gaussian
  2. B) Multinomial
  3. C) Bernoulli
  4. D) Polynomial

৩. Probability-র মান কোন সীমার মধ্যে থাকে?

  1. A) -1 থেকে 1
  2. B) 0 থেকে 100
  3. C) 0 থেকে 1
  4. D) 1 থেকে 10

৪. Zero Probability সমস্যার সমাধান কী?

  1. A) Feature Scaling
  2. B) Laplace Smoothing
  3. C) PCA
  4. D) Cross Validation

৫. Naive Bayes-এর মূল "সরলীকৃত" ধারণা (assumption) কোনটা?

  1. A) সব ডেটা normal distribution অনুসরণ করে
  2. B) সব ফিচার একে অপরের থেকে স্বাধীন
  3. C) সব ক্লাসের সংখ্যা সমান
  4. D) সব ফিচার numerical হতে হবে

৬. Gaussian Naive Bayes কোন ধরনের ডেটার জন্য?

  1. Binary text features
  2. Continuous numerical features
  3. Image pixels only
  4. Time series only

৭. predict_proba() কী দেয়?

  1. শুধু class label
  2. প্রতিটি class-এর posterior probability
  3. Feature importance
  4. Loss value

৮. Bernoulli Naive Bayes-এ ফিচার কেমন?

  1. Continuous
  2. Word count frequency
  3. Binary presence/absence (0/1)
  4. Categorical only

🏫 Classroom Exercises

  1. একটা কয়েন ২ বার টস করলে দুইবারই Head আসার probability ম্যানুয়ালি হিসাব করো।
  2. Part 3-এর "পড়াশোনা vs পাস" টেবিলে Attendance যোগ করে নতুন একটা conditional probability টেবিল বানাও।
  3. Part 6-এর Spam Email উদাহরণে Laplace Smoothing (+1) যোগ করে নতুন করে Score(Spam) এবং Score(Not Spam) হিসাব করো।
  4. Part 14-এর Weather ডেটাসেটে নতুন একটা query চালাও: Weather=Overcast, Humidity=High — প্রেডিকশন কী হবে?

🏠 Homework Assignment

টাস্ক: নিজের একটা ছোট ডেটাসেট (১৫-২০টা সারি) তৈরি করো যেখানে অন্তত ৩টা ফিচার এবং একটা Binary টার্গেট থাকবে (যেমন — "Restaurant Recommend করবে কিনা: Price, Taste, Location দেখে")। তারপর:

  1. Prior Probability হাতে হিসাব করো
  2. Likelihood টেবিল বানাও
  3. একটা নতুন উদাহরণের জন্য ম্যানুয়ালি Posterior Probability হিসাব করো
  4. Google Colab-এ sklearn দিয়ে একই কাজ কোড করে ফলাফল মিলিয়ে দেখো