এই পর্বে যা করবেন
- একটি পরিকল্পনা ধরে অনুশীলন করা: এক ভাগ করে, খাতায় কারণসহ উত্তর, ভুলের খাতা আর বিরতি দিয়ে ফেরা
- বাদ দেওয়ার পদ্ধতিতে উত্তর বের করা, আর প্রতিটি distractor-এর পেছনের ভুল ধারণা চেনা
- NumPy-র shape, axis আর view, pandas 3-এর Copy-on-Write আর
strdtype-এর কোড পড়ে আউটপুট বলা - Bayes, metric, search আর gradient-এর ছোট হিসাব খাতায় দ্রুত করা
- Version-নির্ভর আচরণ (NumPy 2, pandas 3, scikit-learn 1.8) পুরোনো টিউটোরিয়ালের উত্তর থেকে আলাদা করা
- ঘড়ি ধরে মিশ্র মহড়া দিয়ে নিজের প্রস্তুতি মাপা আর দুর্বল মডিউলে ফেরা
১ · কীভাবে অনুশীলন করবেন — প্রশ্নের ধরন, বাদ দেওয়া আর সময়
এই পাতা বিশ্ববিদ্যালয়ের Artificial Intelligence, Machine Learning বা Data Science কোর্সের পরীক্ষা, চাকরির লিখিত পরীক্ষা, ডেটা বা ML ইন্টারভিউর আগের ঝালাই, আর নিজের দক্ষতা মাপার জন্য। এ ধরনের প্রশ্ন প্রায়ই আসে, তবে নিজের পরীক্ষার ধরন আলাদা হতে পারে। AI আর ডেটার MCQ-তে নম্বর বেশি হারায় একটি শব্দ এড়িয়ে যাওয়ায়: “train-এ” না “test-এ”, “axis=0” না “axis=1”, “P(A | B)” না “P(B | A)”, “pandas 2” না “pandas 3”. ভুল অপশনগুলো জেনেশুনে বানানো, আর এই কোর্সের প্রশ্নে সেগুলো ঘুরেফিরে কয়েকটি চেনা ভুল ধারণা থেকেই আসে।
কীভাবে অনুশীলন করবেন · ছয়টি ধাপ
- একবারে একটি ভাগ: পুরো পাতা একটানা নয়; দিনে একটি বা দুটি বিষয়ভাগ, প্রতিটিতে ১৮টির মতো প্রশ্ন। শুরুতে “যে পর্বগুলো ঝালিয়ে নেবেন” বাক্সে চোখ বুলিয়ে নিন।
- চাপার আগে খাতায় লিখুন: অপশন আর এক লাইনের কারণ, যেমন “slice মানে view, তাই মূল array বদলায়”. কারণ লিখতে না পারলে উত্তর ঠিক হলেও নিজের হিসাবে ভুল গুনুন।
- কোড পড়ার প্রশ্নে লাইন ধরে অবস্থা লিখুন: প্রতিটি লাইনের পরে shape, dtype বা মান কী, খাতায় একটি ছোট টেবিলে। মাথায় হিসাব রাখলে ঠিক এখানেই ভুল হয়।
- ভুল হলে নিয়মটি লিখুন: ভুলের খাতায় প্রশ্ন নয়, নিয়ম: “groupby-র mean NaN বাদ দিয়ে গড় করে”. তারপর ব্যাখ্যায় দেওয়া পর্বে ফিরে সেই অংশ পড়ুন, আর দরকার হলে কোডটি নিচের Python block-এ চালিয়ে দেখুন।
- বিরতি দিয়ে ফিরুন: ১, ৩ আর ৭ দিন পরে শুধু ভুল প্রশ্নগুলো আবার করুন, অপশন পড়ার আগেই উত্তর বলে।
- শেষে ঘড়ি ধরে মিশ্র মহড়া: সব ভাগ শেষ হলে অংশ ৯-এর ১৬টি প্রশ্ন ২০ মিনিটে করুন। প্রশ্নগুলো নতুন আর এলোমেলো, তাই আগের অপশন মনে থাকার সুবিধা নেই।
অনুশীলনের চক্র
Practice loop: answer on paper first, log the rule behind each mistake, revisit after spaced intervals
প্রশ্নের পাঁচ ছাঁচ
| ধরন | উদাহরণ | কৌশল |
|---|---|---|
| মনে রাখা | Dartmouth, PEAS, STRIPS, demographic parity | সংজ্ঞার একটি চাবি-শব্দ ধরুন: “কে কী মাপে”, “কোন অংশে পড়ে” |
| বোঝা | BFS কেন সবচেয়ে কম ধাপের পথ দেয়, Naive Bayes কেন “naive” | নিয়মটি নিজের ভাষায় এক বাক্যে বলুন; না পারলে পর্বে ফিরুন |
| কোড পড়ে আউটপুট | sum(axis=0), slice আর view, groupby, merge | লাইন ধরে shape, dtype আর মান খাতায় লিখুন |
| ছোট হিসাব | Bayes-এর posterior, precision, A*-এর f, gradient-এর এক ধাপ | আগে সূত্র আর একক, তারপর সংখ্যা; শেষে উত্তরটি বাস্তবসম্মত কি না দেখুন |
| পরিস্থিতি | Leakage, কোন metric, কোন chart, drift হলে কী করবেন | আগে পরিস্থিতির নাম দিন: “এটি leakage”, “এটি বিরল শ্রেণি” |
কৌশল ১ · বাদ দেওয়ার পদ্ধতি — একটি metric-এর প্রশ্ন ধাপে ধাপে
সঠিক উত্তর সরাসরি খোঁজার চেয়ে ভুল অপশন বাদ দেওয়া প্রায়ই সহজ। নিচের প্রশ্নে প্রতিটি ভুল অপশন একটি সংজ্ঞা দিয়ে কাটুন। Precision আর recall-এর পূর্ণ আলোচনা পর্ব ৬০-এ।
- সংজ্ঞা
TP ÷ ?আগে লিখুন - Accuracy?
খ বাদআলাদা মাপ - আবার accuracy
ঘ বাদ০.২০ precision - উল্টো?
গ বাদদুটি মাপ গুলিয়েছে - উত্তর
কসংখ্যায় মিলিয়ে
ভুয়া-অর্ডার model-এর recall 0.90, precision 0.20. ব্যবসার ভাষায় এর অর্থ কী? ক) প্রায় সব ভুয়া অর্ডার ধরা পড়ে, কিন্তু সতর্কবার্তার বেশির ভাগই সৎ অর্ডারে খ) model 90% সময় সঠিক গ) ভুয়া অর্ডারের 20% ধরা পড়ে ঘ) model-এর accuracy 0.20
recall = TP ÷ (TP + FN) আসল ভুয়ার কত ভাগ ধরা পড়ল accuracy = (TP + TN) ÷ সব সব অর্ডারের কত ভাগ ঠিক → recall 0.90 মানে “90% সময় সঠিক” নয়
precision = TP ÷ (TP + FP) সতর্কবার্তার কত ভাগ সত্যি 0.20 এই মাপের মান, accuracy-র নয় → ঘ খাটে না
“ভুয়ার 20% ধরা পড়ে” মানে recall = 0.20 কিন্তু recall আসলে 0.90 → গ precision আর recall উল্টে ফেলেছে
১,০০০ অর্ডার, ১০০টি ভুয়া TP 90 FN 10 FP 360 TN 540 recall = 90 ÷ 100 = 0.90 precision = 90 ÷ 450 = 0.20 accuracy = 630 ÷ 1000 = 0.63
- আগে সংজ্ঞা লিখুন। Recall-এর হর আসল positive (TP + FN), precision-এর হর model-এর বলা positive (TP + FP). দুটি মাপ একই TP থেকে, শুধু হর আলাদা।
- Recall accuracy নয়। ০.৯০ বলে আসল ভুয়া অর্ডারের ৯০% ধরা পড়ে, সব অর্ডারের ৯০% সঠিক নয়। তাই খ বাদ।
- Precision-ও accuracy নয়। ০.২০ হলো সতর্কবার্তার ভেতরে সত্যিকারের ভুয়ার ভাগ, পুরো ডেটার সঠিকতা নয়। তাই ঘ বাদ।
- গ দুটি মাপ উল্টে ফেলেছে। “ভুয়ার কত ভাগ ধরা পড়ল” recall-এর প্রশ্ন, যার মান ০.৯০. এই অদলবদলই এই বিষয়ের সবচেয়ে চেনা distractor.
- উত্তর ক, সংখ্যা দিয়ে মিলিয়ে। ১,০০০ অর্ডারের ১০০টি ভুয়া ধরলে TP ৯০, FN ১০, FP ৩৬০, TN ৫৪০: recall ০.৯০, precision ০.২০, আর accuracy ০.৬৩. প্রতিটি ভুল অপশন একটি আলাদা ভুল ধারণা থেকে বানানো, ভালো distractor-এর এটিই চিহ্ন।
এই পাতার যেকোনো আউটপুটের প্রশ্ন নিজে চালিয়ে দেখতে চাইলে নিচের block-এর কোড মুছে প্রশ্নের কোড বসিয়ে চালান। এখানে আছে ওপরের ধাপ ৫-এর হিসাব, NumPy দিয়ে। প্রথমবার চালালে ব্রাউজারে Python আর NumPy নামতে কয়েক সেকেন্ড লাগতে পারে; scikit-learn-এর প্রশ্নে প্রথম run-এ আরও বেশি, প্রায় ১০ সেকেন্ড।
import numpy as np
y_true = np.array([1] * 100 + [0] * 900) # ১,০০০ অর্ডারের ১০০টি আসলে ভুয়া
y_pred = np.array([1] * 90 + [0] * 10 + [1] * 360 + [0] * 540)
tp = int(((y_true == 1) & (y_pred == 1)).sum())
fn = int(((y_true == 1) & (y_pred == 0)).sum())
fp = int(((y_true == 0) & (y_pred == 1)).sum())
tn = int(((y_true == 0) & (y_pred == 0)).sum())
print("TP FN FP TN:", tp, fn, fp, tn)
print("recall =", tp / (tp + fn))
print("precision =", tp / (tp + fp))
print("accuracy =", (tp + tn) / len(y_true))
print("সতর্কবার্তার মধ্যে সৎ অর্ডার:", fp, "of", tp + fp)আসল আউটপুট:
TP FN FP TN: 90 10 360 540
recall = 0.9
precision = 0.2
accuracy = 0.63
সতর্কবার্তার মধ্যে সৎ অর্ডার: 360 of 450
৪৫০টি সতর্কবার্তার ৩৬০টিই সৎ অর্ডারে, অথচ ১০০টি ভুয়ার ৯০টি ধরা পড়েছে। একই model-এর recall বেশি আর precision কম হতে পারে, কারণ দুটির হর আলাদা। এখানে int(...) দেওয়া হয়েছে যাতে ছাপা সংখ্যা সাধারণ Python int হয়; NumPy 2-এ NumPy scalar list বা tuple-এর ভেতরে np.int64(90) রূপে ছাপা হয়।
কৌশল ২ · Version-নির্ভর প্রশ্নে পুরোনো টিউটোরিয়ালের উত্তরই ফাঁদ
লাইব্রেরির আচরণ version-এ বদলায়, আর পুরোনো ব্লগ বা AI-এর উত্তর প্রায়ই আগের নিয়ম বলে। প্রশ্নে version লেখা থাকলে সেটিই আসল তথ্য। এই কোর্সের run-এ যা দেখা গেছে, তার কয়েকটি:
| টুল | পুরোনো ধারণা | কোর্সের version-এ |
|---|---|---|
| NumPy 2 | np.float_, np.NaN, np.int চলে | এসব পুরোনো নাম নেই, তাই AttributeError; scalar ছাপা হয় np.float64(1.5) রূপে (পর্ব ১৩) |
| NumPy | Default int সবখানে একই | সাধারণ 64-bit ডেস্কটপে int64, পাতার ভেতরের Python (32-bit WebAssembly)-এ int32; আকার আর overflow-এর প্রশ্নে dtype স্পষ্ট লিখুন (পর্ব ১৩) |
| pandas 3 | লেখার কলামের dtype object | Default dtype এখন str (পর্ব ২০) |
| pandas 3 | df[mask]['col'] = 0 মূল টেবিল বদলায় | Copy-on-Write একমাত্র আচরণ; chained assignment-এ মূল টেবিল বদলায় না, df.loc[mask, 'col'] = 0 লিখুন (পর্ব ২২) |
| scikit-learn 1.8 | LogisticRegression(multi_class=..., penalty=None) | multi_class আর নেই; penalty দিলে সতর্কবার্তা, তাই penalty-হীন ফিটে বড় C (পর্ব ৫৯) |
| matplotlib | বাংলা ফন্ট দিলেই বাংলা ঠিক | 3.10 পর্যন্ত কার-চিহ্ন আর যুক্তাক্ষর ভাঙে; 3.11 থেকে text shaping এসেছে (পর্ব ২৮) |
Version না লেখা থাকলে সাধারণ, স্থির নিয়মটি বাছুন (যেমন “test set শুধু শেষে একবার”), আর এমন অপশন এড়িয়ে চলুন যা শুধু একটি পুরোনো version-এ সত্য ছিল।
কৌশল ৩ · Base rate আগে, শতাংশ পরে
সম্ভাবনা আর metric-এর প্রায় সব ফাঁদ এক জায়গায়: ঘটনাটি কত বিরল, তা ভুলে যাওয়া। ১% ভুয়া অর্ডারের ডেটায় “সবাই সৎ” বলা model-এর accuracy ৯৯%, অথচ একটিও ভুয়া ধরে না (accuracy paradox, পর্ব ৬০)। একইভাবে ভালো detector-এর সতর্কবার্তার বেশির ভাগও সৎ অর্ডারে পড়তে পারে, যদি ভুয়া খুব বিরল হয় (base-rate fallacy, পর্ব ৫০)। সংখ্যা এলে ১,০০০ বা ১০,০০০ জনের একটি কাল্পনিক দল ধরে গুনুন: শতাংশের চেয়ে গোনা সংখ্যায় ভুল কম হয়।
কৌশল ৪ · Negative marking আর সময়
ধরা যাক ঠিক হলে +১, ভুলে −০.২৫. চার অপশনে অন্ধ আন্দাজের গড় লাভ +০.০৬২৫; একটি নিশ্চিতভাবে বাদ দিলে প্রায় +০.১৬৭; দুটি বাদ দিলে +০.৩৭৫. তাই একটিও বাদ দিতে পারলে আন্দাজ লাভজনক। কত কাটে বা আদৌ কাটে কি না, তা পরীক্ষাভেদে আলাদা; নিজের পরীক্ষার নিয়ম দেখে নিন।
সময় ভাগ করুন দুই দফায়: প্রথমে ধারণার প্রশ্ন; কোড পড়া বা হিসাব লাগলে চিহ্ন দিয়ে এগিয়ে যান। পরে চিহ্নিতগুলো, খাতায় প্রতিটি ধাপ লিখে।
চৌদ্দটি বড় ফাঁদ
| ফাঁদ | ভুল ধারণা | সঠিক কথা |
|---|---|---|
| Axis | “axis=0 মানে প্রতিটি সারির যোগ” | axis=0 সারির মাত্রা ভেঙে দেয়, তাই প্রতিটি কলামের একটি ফল (পর্ব ১৬) |
| View | “Slice মানে নতুন copy” | সাধারণ slice NumPy-তে view, তাই মূল array বদলায়; fancy index copy দেয় (পর্ব ১৪) |
| loc আর iloc | “দুটোতেই শেষ সীমা বাদ” | loc-এর label slice শেষ সীমা রাখে, iloc বাদ দেয় (পর্ব ২২) |
| Merge | “Merge-এ সারি কখনো বাড়ে না” | ডান টেবিলে key দুবার থাকলে সারি গুণ হয় (পর্ব ২৫) |
| Chart | “Bar-এর axis যেকোনো জায়গা থেকে শুরু করা যায়” | Bar-এর দৈর্ঘ্যই মান, তাই শূন্য থেকে; কাটা axis পার্থক্য ফোলায় (পর্ব ৩২) |
| Correlation | “Correlation বেশি, তাই একটি অন্যটির কারণ” | তৃতীয় কোনো কারণ দুটিকেই চালাতে পারে (পর্ব ৩৭) |
| A* | “যেকোনো heuristic দিলেই সেরা পথ” | সেরা পথের নিশ্চয়তা চাইলে admissible heuristic (পর্ব ৪১) |
| Logic | “A → B আর B সত্য, তাই A সত্য” | এটি বৈধ যুক্তি নয়; modus ponens চায় A সত্য (পর্ব ৪৫) |
| Bayes | “P(A | B) আর P(B | A) একই” | Base rate ছাড়া একটি থেকে অন্যটি পাওয়া যায় না (পর্ব ৫০) |
| Leakage | “পুরো ডেটায় scale করে তারপর ভাগ” | আগে ভাগ, তারপর শুধু train-এ fit; pipeline এটি নিশ্চিত করে (পর্ব ৫৬, পর্ব ৬৪) |
| Metric | “Accuracy ৯৯%, তাই model দারুণ” | বিরল শ্রেণিতে precision, recall আর baseline দেখুন (পর্ব ৬০) |
| Test set | “Test দেখে threshold ঠিক করি” | বাছাই validation বা CV-তে; test শুধু শেষে একবার (পর্ব ৬৬, পর্ব ৭৩) |
| LLM | “আত্মবিশ্বাসী আর সাবলীল, তাই সঠিক” | LLM পরের token অনুমান করে; বানানো তথ্যও সাবলীল শোনায় (hallucination, পর্ব ৭০) |
| Fairness | “জেলার কলাম মুছেছি, তাই পক্ষপাত নেই” | অন্য কলাম proxy হয়ে একই তথ্য বয়ে আনে; দলভিত্তিক metric মাপুন (পর্ব ৭২) |
এই পাতার প্রশ্নগুলো সম্পর্কে: প্রশ্নগুলো এই কোর্সের জন্য নতুন করে লেখা, এ ধরনের প্রশ্ন প্রায়ই আসে এমন ধারণা থেকে। কোনোটিই কোনো নির্দিষ্ট পরীক্ষা, বিশ্ববিদ্যালয় বা প্রতিষ্ঠানের আসল প্রশ্ন নয়। “বাজারঘর” একটি কাল্পনিক অনলাইন দোকান, আর সব টাকার অঙ্ক ও হার ধরে নেওয়া। কোড পড়ার প্রতিটি প্রশ্ন লেখার সময়ের version-এ (Python 3.14, NumPy 2.4.6, pandas 3.0.2, scikit-learn 1.8.0, matplotlib 3.10.8) একটি ডেস্কটপে চালিয়ে মেলানো; নতুন version-এ বদলাতে পারে। পূর্ণ সমাধানের numerical পর্ব ৭৫-এ; কারণসহ লিখিত উত্তর পর্ব ৭৭-এ, আর ইন্টারভিউর প্রশ্ন পর্ব ৭৮ ও ৭৯-এ।
২ · মডিউল ১ ও ২ — AI-এর মানচিত্র আর Python-এর কাজের পরিবেশ (৩৭টি প্রশ্ন)
মডিউল ১ — AI-এর মানচিত্র (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে সংজ্ঞা, agent-এর ধরন, ইতিহাসের সাল, AI-এর তিন পথ, শব্দের সীমানা আর সমস্যার ধরন থেকে। নম্বর বেশি হারায় Turing test বনাম rational agent গুলিয়ে ফেলায়, “Minsky neural network মেরে ফেলেছিলেন” ধরনের মিথে, “A* মানেই machine learning” ভাবায়, আর baseline না দেখে accuracy-কে ভালো বলায়; ঝালিয়ে নিন পর্ব ০১, পর্ব ০২ আর পর্ব ০৫.
- পর্ব ০১ · AI কী আর পর্ব ০২ · AI-এর ইতিহাস — rational agent, PEAS, Turing test, AI winter, perceptron
- পর্ব ০৩ · AI-এর তিন পথ আর পর্ব ০৪ · AI, ML, DL আর Generative AI — symbolic AI, connectionism, bitter lesson, discriminative model, foundation model
- পর্ব ০৫ · AI কোন সমস্যা সমাধান করে আর পর্ব ০৬ · বাস্তবে AI — baseline, proxy target, distribution shift, shortcut learning, feedback loop
(সহজ) এই কোর্স AI-কে যে দৃষ্টিভঙ্গি থেকে দেখে, তাতে একটি agent “rational” বলা হয় কখন?
- যখন তার আচরণ মানুষের থেকে আলাদা করা যায় না
- যখন সে প্রতিটি কাজের আসল ফল আগে থেকে জানে
- যখন তার ভেতরে neural network থাকে
- যখন সে জানা তথ্য দিয়ে প্রত্যাশিত performance measure সবচেয়ে বাড়ায় এমন কাজ বাছে
(সহজ) বাজারঘরের একটি ডেলিভারি-রোবটের PEAS বর্ণনায় “GPS, ক্যামেরা আর দূরত্ব মাপার যন্ত্র” কোন অংশে পড়ে?
- Sensors
- Environment
- Actuators
- Performance measure
(মাঝারি) একটি vacuum agent-এর নিয়ম নিচের Python function-এ লেখা। কোডটি কী ছাপবে?
def agent(loc, status):
if status == "Dirty":
return "Suck"
return "Right" if loc == "A" else "Left"
percepts = [("A", "Dirty"), ("A", "Clean"), ("B", "Clean")]
print([agent(*p) for p in percepts])
- TypeError, কারণ function দুটি argument চায়
- ['Suck', 'Right', 'Left']
- ['Suck', 'Left', 'Right']
- ['Suck', 'Suck', 'Left']
(মাঝারি) একটি table-driven agent প্রতি ধাপে ৩ রকম percept পেতে পারে আর মোট ৩ ধাপ চলে। ১, ২ আর ৩ দৈর্ঘ্যের প্রতিটি সম্ভাব্য percept sequence-এর জন্য একটি সারি রাখলে টেবিলে কতটি সারি লাগবে?
- ৩৯
- ২৭
- ৯
- ১২
(মাঝারি) দুটি রুটই সময়মতো ক্রেতার কাছে পৌঁছায়, কিন্তু একটিতে খরচ বেশি আর সময় কম, অন্যটিতে খরচ কম আর সময় বেশি। এই দুইয়ের মধ্যে ভালোটি বাছতে কমপক্ষে কোন ধরনের agent লাগে?
- Goal-based agent
- Simple reflex agent
- Utility-based agent
- Model-based reflex agent
(মাঝারি) John Searle-এর Chinese Room যুক্তি মূলত কী দাবি করে?
- চীনা ভাষা যন্ত্রের পক্ষে অনুবাদ করা অসম্ভব
- বাইরে থেকে সঠিক উত্তর দেওয়াও যন্ত্রের পক্ষে অসম্ভব
- শুধু চিহ্নের নিয়ম মানা থেকে অর্থ বোঝা আসে না
- Turing test পাস করলেই যন্ত্র বোঝে বলে ধরা যায়
(সহজ) “Artificial intelligence” কথাটি প্রথম লিখিতভাবে কোথায় এসেছে বলে সাধারণত ধরা হয়?
- Ada Lovelace-এর নোটে
- ১৯৫৫ সালের Dartmouth গবেষণা-প্রস্তাবে
- Turing-এর ১৯৫০ সালের প্রবন্ধে
- ১৯৭৩ সালের Lighthill রিপোর্টে
(মাঝারি) Minsky আর Papert-এর ১৯৬৯ সালের Perceptrons বই সম্পর্কে কোন বক্তব্যটি সবচেয়ে নির্ভুল?
- বইটিতে প্রথম backpropagation প্রকাশিত হয়
- এক-স্তরের perceptron-এর গাণিতিক সীমা দেখায়, বহুস্তরের network অসম্ভব প্রমাণ করে না
- বইটি প্রমাণ করে, কোনো neural network কখনো XOR শিখতে পারবে না
- বইটিতেই perceptron প্রথম প্রস্তাবিত হয়
(মাঝারি) একটি single-layer perceptron (step function সহ) input (0,0), (0,1), (1,0), (1,1)-এ যথাক্রমে 0, 1, 1, 0 উত্তর কেন শিখতে পারে না?
- দুই শ্রেণি একটি সরল রেখা দিয়ে আলাদা করা যায় না
- যথেষ্ট epoch চালানো হয়নি
- Learning rate খুব বড়
- মাত্র চারটি উদাহরণ, ডেটা খুব কম
(সহজ) “AI winter” কথাটির সবচেয়ে উপযুক্ত অর্থ কোনটি?
- শীতকালে হার্ডওয়্যার ঠান্ডা রাখার সমস্যা
- প্রত্যাশা পূরণ না হওয়ায় AI-এর অর্থায়ন ও আগ্রহ কমে যাওয়ার সময়
- যে সময়ে AI নিয়ে সব গবেষণা পুরোপুরি বন্ধ ছিল
- Perceptron-এর ভুলের একটি গাণিতিক নাম
(মাঝারি) একটি নিয়ম “late” শব্দ পেলেই বার্তাকে অভিযোগ বলে। “late holeo somossa nai”-কে এটি অভিযোগ বলল, আর “jinish ekhono pai ni”-কে বলল অভিযোগ নয়। নিয়মভিত্তিক পথের কোন দুর্বলতা এখানে দেখা যাচ্ছে?
- Feedback loop
- Overfitting
- ভঙ্গুরতা: নিয়মের বাইরের প্রকাশে ভুল
- Hallucination
(কঠিন) Refund-এর সিদ্ধান্তে ভুলের দাম বেশি, নীতি প্রায়ই বদলায়, আর ক্রেতাকে কারণ জানাতে হয়। তবে ক্রেতার লেখা বার্তা থেকে অভিযোগের ধরন বোঝাও দরকার। কোন নকশা সবচেয়ে যুক্তিসংগত?
- পুরো সিদ্ধান্ত একটি বড় neural network-এর হাতে
- সব কিছু হাতে লেখা চাবি-শব্দের নিয়মে
- লেখা বোঝায় শেখা model, আর refund-এর নীতি স্পষ্ট নিয়মে
- “Bitter lesson” মেনে নিয়ম পুরো বাদ দেওয়া
(সহজ) ঢাকার রাস্তার map-এ A* search দিয়ে সবচেয়ে ছোট পথ খোঁজা একটি প্রোগ্রাম কোন শ্রেণিতে পড়ে?
- Machine learning, কারণ এটি সেরা পথ খুঁজে পায়
- Generative AI
- Deep learning
- AI, কিন্তু machine learning নয়
(মাঝারি) Discriminative আর generative model-এর মূল পার্থক্য কোনটি?
- শুধু generative model classification করতে পারে
- Generative model মানেই বড় neural network
- Discriminative model label ছাড়া শেখে
- Discriminative শেখে P(y∣x); generative শেখে P(x∣y) আর P(y)
(মাঝারি) একটি দোকানের ১,০০০টি অর্ডারের মধ্যে ৪০টি ফেরত এসেছে। একটি model “ফেরত আসবে কি না” অনুমানে ৯৫% accuracy পেল। কোন সিদ্ধান্তটি সবচেয়ে সঠিক?
- সবাইকে “ফেরত আসবে না” বললেই ৯৬%, তাই model baseline-এর চেয়েও খারাপ
- ৯৫% খুব ভালো, model চালু করা যায়
- আন্দাজে ৫০% হয়, তাই model অনেক ভালো
- ভারসাম্যহীন ডেটায় accuracy হিসাবই করা যায় না
(কঠিন) অর্ডার দেওয়ার মুহূর্তে “এই অর্ডার দেরিতে পৌঁছাবে কি না” অনুমানের model বানানো হচ্ছে। কোন feature রাখলে target leakage হবে?
- ডেলিভারির পরে ক্রেতা কতবার অভিযোগ করেছেন
- পার্সেলের ওজন
- ক্রেতার জেলা
- অর্ডারের সপ্তাহের দিন
(মাঝারি) একটি ডেলিভারি-দেরির model এক জেলায় ৮৭% accuracy দিল, কিন্তু অন্য জেলায় চালু করার পর ৬২%. কোডে কোনো বাগ নেই। সবচেয়ে সম্ভাব্য কারণ কী?
- Model hallucinate করছে
- কেউ adversarial example পাঠাচ্ছে
- Random seed বদলে গেছে
- নতুন জেলার ডেটার বণ্টন বা সম্পর্ক আলাদা, অর্থাৎ distribution shift
(কঠিন) মাছের ছবি দেখে “তাজা” বা “বাসি” বলা একটি model-এর training accuracy ৯৬%, কিন্তু নতুন বিক্রেতাদের ছবিতে ৫৫%. দেখা গেল “ছবিতে বরফ আছে” feature-এর ওজন সবচেয়ে বেশি। এটি কোন সমস্যা, আর প্রথম প্রতিকার কী?
- Concept drift; প্রতি মাসে আবার training
- Shortcut learning; বরফের সঙ্গে মিল ভাঙে এমন ছবি যোগ করা
- Model ছোট; আরও বড় network নেওয়া
- Underfitting; আরও epoch চালানো
মডিউল ২ — Python দিয়ে AI-এর কাজের পরিবেশ (১৯টি প্রশ্ন)
এখানে প্রশ্ন আসে environment, notebook, ডেটার Python, ফাইলের format আর পুনরুৎপাদনযোগ্যতা থেকে। নম্বর বেশি হারায় “pip install করেছি, তবু ModuleNotFoundError”, notebook-এর লুকানো state, mutable default, CSV-র quote, বাংলা লেখার byte আর normalization, আর “seed দিলেই সব হুবহু” ভাবায়; ঝালিয়ে নিন পর্ব ০৭, পর্ব ১০ আর পর্ব ১২.
- পর্ব ০৭ · AI-এর জন্য Python আর পর্ব ০৮ · Jupyter notebook — virtual environment, uv, lockfile, wheel tag, kernel, hidden state
- পর্ব ০৯ · ডেটার জন্য Python আর পর্ব ১০ · ডেটার ফাইল — mutable default argument, generator, CSV quoting, mojibake, NFC, Parquet
- পর্ব ১১ · AI কোডে পরিচ্ছন্নতা আর পর্ব ১২ · পুনরুৎপাদনযোগ্য প্রকল্প — pure function, type hint, assertion, SHA-256, DVC
(সহজ) একজন terminal-এ pip install pandas চালিয়ে “Successfully installed” দেখলেন, কিন্তু python analysis.py চালাতেই এলো ModuleNotFoundError: No module named 'pandas'. সবচেয়ে সম্ভাব্য কারণ কী?
- Install-এর সময় ইন্টারনেট কেটে গিয়েছিল
- pandas Python 3.14 সমর্থন করে না
- Import-এ লিখতে হয়
import Pandas - pip একটি Python-এ বসিয়েছে, আর python চালাচ্ছে আরেকটি Python
(মাঝারি) একটি ফাইলের নাম numpy-2.4.6-cp314-cp314-win_amd64.whl. এটি কোথায় সরাসরি ইনস্টল হবে?
- যেকোনো OS-এ, শুধু Python 3.14 হলেই
- CPython 3.13 বা তার নতুন যেকোনো version-এ
- শুধু compiler থাকলে, কারণ এটি সোর্স কোড
- CPython 3.14, ৬৪-বিট Windows-এ
(মাঝারি) pip freeze > requirements.txt-এর তুলনায় uv-এর uv.lock কোন তথ্য বাড়তি রাখে?
- প্রকল্পের সব Python কোডের কপি
- ফাইলের hash, কোন package কার কারণে এসেছে, আর অন্য OS-এর ফাইলের তথ্য
- PyPI-র login password
- শুধু package-এর হুবহু version, যা requirements.txt-এ থাকে না
(মাঝারি) কেউ pyproject.toml-এ একটি নতুন package যোগ করেছেন, কিন্তু uv lock চালাননি। এখন CI-তে uv sync --locked চালালে কী হবে?
- Lockfile হালনাগাদ দরকার বলে error দিয়ে থামবে
- নীরবে lockfile হালনাগাদ করে নতুন package বসাবে
- নতুন package বাদ দিয়ে বাকিগুলো বসাবে
- Python-এর version নামিয়ে আনবে
(সহজ) Jupyter notebook-এ একটি code cell-এর পাশে In [7] লেখা থাকলে ৭ কী বোঝায়?
- Kernel চালুর পর সপ্তমবার কোড চালানোর সময় cell-টি শেষবার চলেছিল
- এই cell-টি এ পর্যন্ত সাতবার চালানো হয়েছে
- Notebook-এ ওপর থেকে এটি সপ্তম cell
- Cell-এর output-এ সাতটি লাইন আছে
(মাঝারি) একটি notebook-এ rate = 0.2 লেখা cell চালানোর পর মুছে ফেলা হলো, কিন্তু পরের cell rate ব্যবহার করে আর ঠিক ফল দেখাচ্ছে। নতুন kernel-এ jupyter nbconvert --execute দিয়ে notebook চালালে কী হবে?
- আগের মতোই ঠিক ফল আসবে
- Jupyter মুছে ফেলা cell আবার চালিয়ে নেবে
- NameError: name 'rate' is not defined দিয়ে থেমে যাবে
- rate-এর মান 0 ধরে চালাবে
(মাঝারি) venv activate না করে চালু করা একটি Jupyter kernel-এ !pip install tabulate লেখার পরও import tabulate কাজ করছে না। সবচেয়ে ভালো সমাধান কোনটি?
- একই
!pip installআবার চালানো - %pip install tabulate দিয়ে বসিয়ে kernel restart করা
- import-এ নাম বদলে
import Tabulateলেখা - পুরো কম্পিউটার restart করা
(সহজ) নিচের Python কোড কী ছাপবে?
from collections import Counter
rows = [{"district": "ঢাকা", "taka": 500},
{"district": "খুলনা", "taka": 300},
{"district": "ঢাকা", "taka": 200}]
c = Counter(r["district"] for r in rows)
print(c.most_common(1))
- [('ঢাকা', 2)]
- {'ঢাকা': 2}
- [('ঢাকা', 700)]
- [('ঢাকা', 2), ('খুলনা', 1)]
(মাঝারি) একটি generator expression দুবার যোগ করলে নিচের কোড কী ছাপবে?
g = (x * 2 for x in [1, 2, 3])
print(sum(g), sum(g))
- TypeError
- 12 12
- 12 0
- 6 6
(মাঝারি) দামের list সাজানোর এই কোড কী ছাপবে?
prices = [300, 100, 200]
r = prices.sort()
print(r, prices)
- [100, 200, 300] [300, 100, 200]
- [100, 200, 300] [100, 200, 300]
- None [300, 100, 200]
- None [100, 200, 300]
(কঠিন) def f(x, acc=[]): acc.append(x); return len(acc). এরপর f(1), f(2) চালিয়ে print(f(3)) দিলে কী ছাপা হবে, আর কেন?
- 1, কারণ প্রতিবার acc খালি থেকে শুরু হয়
- TypeError, কারণ default-এ list দেওয়া যায় না
- 3, কারণ function x-কেই ফেরত দেয়
- 3, কারণ সব call একই default list ভাগ করে
(মাঝারি) Python-এর csv module দিয়ে পড়লে নিচের কোড কী ছাপবে?
import csv, io
line = '7,"Mirpur, Dhaka",450\n'
row = next(csv.reader(io.StringIO(line)))
print(len(row), row[1])
- 4 "Mirpur
- 3 Mirpur, Dhaka
- 3 "Mirpur, Dhaka"
- 1 7,"Mirpur, Dhaka",450
(সহজ) “দাম” শব্দে তিনটি Unicode code point (দ, া, ম). Python 3-এ len("দাম") আর UTF-8-এ encode করা byte-এর সংখ্যা কত?
- ৯ আর ৯
- ২ আর ৬
- ৩ আর ৯
- ৩ আর ৩
(কঠিন) “য়”-এর দুটি রূপ নিয়ে নিচের কোড কী ছাপবে? (0x09DF হলো এক code point-এর য়, আর 0x09AF + 0x09BC হলো য + নুক্তা।)
import unicodedata as ud
a = chr(0x09AF) + chr(0x09BC)
b = chr(0x09DF)
print(a == b, ud.normalize("NFC", a) == ud.normalize("NFC", b))
- UnicodeDecodeError
- True True
- False False
- False True
(মাঝারি) একটি ফাইল খুলে বাংলার জায়গায় দেখা গেল বাজার. সবচেয়ে সম্ভাব্য কারণ কী?
- UTF-8-এ লেখা বাংলা cp1252 বা Latin-1 ধরে পড়া হয়েছে
- কম্পিউটারে বাংলা font নেই
- NFC-র বদলে NFD normalization
- ফাইলের byte নষ্ট হয়ে গেছে
(মাঝারি) নিচের কোড সাধারণ Python দিয়ে চালালে কী হবে?
def paisa_to_taka(paisa: int) -> int:
return paisa / 100
print(paisa_to_taka(250))
- TypeError, কারণ ফেরত মান int নয়
- 2.5
- 2
- 2.5, সঙ্গে একটি Warning
(কঠিন) ব্যবহারকারীর পাঠানো CSV-তে দাম ঋণাত্মক হলে কাজ থামাতে হবে, আর production-এ Python কখনো কখনো -O দিয়ে চালানো হয়। কোন পদ্ধতি নির্ভরযোগ্য?
- assert (df['price_taka'] >= 0).all()
- Function-এ
price: inttype hint দেওয়া - if (df['price_taka'] < 0).any(): raise ValueError(...)
- ঋণাত্মক পেলে print দিয়ে সতর্ক করে এগিয়ে যাওয়া
(মাঝারি) একই ডেটা আর model দিয়ে train_test_split(..., random_state=None) তিনবার চালিয়ে accuracy এলো 0.87, 0.87 আর 0.84. সবচেয়ে সঠিক ব্যাখ্যা আর প্রতিকার কোনটি?
- scikit-learn-এ বাগ আছে; version বদলানো
- প্রতিবার আলাদা সারি test-এ গেছে; seed ঠিক করে দেওয়া
- ডেটা ফাইল প্রতিবার বদলে যাচ্ছে
- সবচেয়ে বড় মান 0.87 রিপোর্ট করা
(মাঝারি) বাজারঘরের দলের কাছে ১৮০ MB-এর একটি review ডেটা ফাইল আছে, যা প্রতি মাসে নতুন version পায়, আর কোন experiment কোন version-এ চলেছিল তা মনে রাখতে হবে। কোন পদ্ধতি সবচেয়ে উপযুক্ত?
- প্রতি মাসে ফাইলটি সরাসরি Git-এ commit করা
- ফাইলের নামে তারিখ লিখে shared folder-এ রাখা
- DVC বা Git LFS দিয়ে Git-এ শুধু hash-যুক্ত pointer রাখা
- Python-এর hash() দিয়ে ফাইলের নাম বানানো
৩ · মডিউল ৩ ও ৪ — NumPy আর pandas (৩৬টি প্রশ্ন)
মডিউল ৩ — NumPy, সংখ্যার array (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে shape, dtype, axis, view বনাম copy আর broadcasting-এর নিয়ম থেকে, আর প্রায় অর্ধেক প্রশ্নই ছোট কোড পড়ে আউটপুট বলার। নম্বর বেশি হারায় axis-এর দিক উল্টো ভাবায়, slice-কে copy ভাবায়, ছোট dtype-এর নীরব overflow-এ আর NumPy 2-এ মুছে যাওয়া পুরোনো নামে। ঝালিয়ে নিন পর্ব ১৪, পর্ব ১৫ আর পর্ব ১৬.
- পর্ব ১৩ · NumPy array, পর্ব ১৪ · Indexing আর slicing আর পর্ব ১৫ · Vectorization আর broadcasting — ndarray, dtype, type promotion, view, fancy indexing, broadcasting
- পর্ব ১৬ · গাণিতিক কাজ আর random আর পর্ব ১৭ · NumPy-তে linear algebra — axis, ufunc, NaN, dot product, norm
- পর্ব ১৮ · ছবি মানেই array আর পর্ব ১৯ · NumPy-র গতি — pixel, grayscale, stride, row-major, np.vectorize
(সহজ) বাজারঘরের ৩টি জেলা আর ৪টি দিনের অর্ডার একটি array-তে। নিচের কোড কী ছাপবে?
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a.sum(axis=0))
- [12 15 18 21]
- 66
- [ 6 22 38]
- [[12 15 18 21]]
(সহজ) ১০ লাখ দামের যোগফল NumPy array-তে Python list-এর loop-এর চেয়ে অনেক দ্রুত হয়। এর মূল কারণ কোনটি?
- Array সংখ্যাগুলো সংকুচিত করে রাখে, তাই পড়তে কম সময় লাগে
- NumPy নিজে থেকেই হিসাব GPU-তে পাঠায়
- এক dtype-এর সংখ্যা টানা মেমরিতে থাকে, আর হিসাব চলে compiled loop-এ
- প্রতিটি কাজ সবসময় সব CPU core-এ ভাগ হয়ে চলে
(সহজ) একটি array-র প্রতি দ্বিতীয় ঘর শূন্য করা হলো। নিচের কোড কী ছাপবে?
import numpy as np
a = np.arange(6)
b = a[::2]
b[:] = 0
print(a)
- [0 1 0 3 0 5]
- [0 0 0 3 4 5]
- ValueError
- [0 1 2 3 4 5]
(মাঝারি) List দিয়ে index করে দুটি ঘর নেওয়া হলো। নিচের কোড কী ছাপবে?
import numpy as np
a = np.arange(6)
c = a[[0, 2]]
c[0] = 99
print(a[0], c[0])
- 0 99
- 99 99
- 0 0
- IndexError
(মাঝারি) np.ones((3, 4)) + np.ones(3) চালালে কী হয়?
- Shape (3, 4)-এর একটি array, সব ঘরে 2.0
- প্রথম ৩টি কলামে যোগ হয়, শেষ কলাম বদলায় না
- NumPy নিজে transpose করে shape (4, 3)-এর ফল দেয়
- ValueError: shape (3,4) আর (3,) broadcast হয় না
(মাঝারি) NumPy-তে A-এর shape (4, 1, 3) আর B-এর shape (2, 1). A + B-এর ফলের shape কী?
- ValueError
- (4, 2, 3)
- (2, 4, 3)
- (4, 1, 3)
(কঠিন) NumPy 2.4-এ নিচের কোড কী ছাপবে?
import numpy as np
a = np.array([200, 100], dtype=np.uint8)
print(a.sum(), (a + a)[0])
- 44 144
- 300 144
- 300 400
- 44 400
(মাঝারি) প্রতিটি সারি থেকে সেই সারির গড় বাদ দেওয়ার আগে একজন shape দেখলেন। নিচের কোড কী ছাপবে?
import numpy as np
x = np.arange(6).reshape(2, 3)
print(x.mean(axis=1, keepdims=True).shape, x.mean(axis=1).shape)
- (1, 3) (3,)
- (2, 1) (2, 1)
- () ()
- (2, 1) (2,)
(সহজ) একটি 2 × 2 matrix-কে নিজের সঙ্গে গুণ করা হলো। নিচের কোড কী ছাপবে?
import numpy as np
A = np.array([[1, 2], [3, 4]])
print(A @ A)
- [[ 5 11]
[11 25]] - [[ 1 4]
[ 9 16]] - [[2 4]
[6 8]] - [[ 7 10]
[15 22]]
(মাঝারি) ডেলিভারি-সময়ের একটি array-তে একটি ঘর ফাঁকা। নিচের কোড কী ছাপবে?
import numpy as np
x = np.array([1.0, np.nan, 3.0])
print(x.sum(), np.nansum(x), np.isnan(x).sum())
- 4.0 4.0 1
- nan nan 1
- nan 4.0 1
- nan 4.0 0
(কঠিন) NumPy 2.4-এ নিচের কোড চালালে কী হবে?
import numpy as np
a = np.array([10, 20], dtype=np.int8)
print(a + 200)
- [210 220], dtype int16-এ উঠে
- [-46 -36], কোনো warning ছাড়া
- OverflowError
- [210 220] আর একটি RuntimeWarning
(মাঝারি) একটি AI সহকারী পুরোনো টিউটোরিয়াল থেকে np.zeros(3, dtype=np.int) লিখে দিল। NumPy 2.4-এ এটি চালালে কী হবে, আর ঠিক করার উপায় কী?
- ঠিকঠাক চলে, শুধু একটি DeprecationWarning দেখায়
- ImportError; numpy আবার install করতে হবে
- float64-এর array তৈরি হয়, কারণ np.zeros-এর default float
- AttributeError; লিখতে হবে int বা np.int64
(কঠিন) Shape (200, 30)-এর একটি C-order float64 array a. a.strides আর a.T.strides যথাক্রমে কী?
- (30, 1) আর (1, 30)
- (240, 8) আর (8, 240)
- (8, 1600) আর (1600, 8)
- (240, 8) আর (240, 8)
(সহজ) ৭২০ পিক্সেল উঁচু আর ১২৮০ পিক্সেল চওড়া একটি RGB ছবি uint8 থেকে float32-এ রূপান্তর করা হলো। নতুন array কত বাইট নেবে?
- 3,686,400
- 2,764,800
- 22,118,400
- 11,059,200
(মাঝারি) একটি ছোট RGB ছবির array থেকে লাল channel নেওয়া হলো। নিচের কোড কী ছাপবে?
import numpy as np
img = np.zeros((4, 6, 3), dtype=np.uint8)
print(img[:, :, 0].shape, img.nbytes)
- (4, 6, 1) 72
- (4, 6) 24
- (4, 6) 72
- (6, 4) 72
(মাঝারি) একজন সহকর্মী বললেন, “Python function-টিকে np.vectorize দিয়ে মুড়ে দিলেই সেটি C-এর গতিতে চলবে।” কোন কথাটি সঠিক?
- এটি broadcasting-এর সুবিধা দেয়, কিন্তু ভেতরে প্রতিটি উপাদানে function ডাকে, তাই গতি প্রায় loop-এর মতো
- ঠিক বলেছেন; np.vectorize function-টিকে compiled ufunc-এ রূপান্তর করে
- এটি কাজটি সব CPU core-এ ভাগ করে দেয়
- NumPy 2-এ np.vectorize মুছে ফেলা হয়েছে
(মাঝারি) একটি function প্রতিবার ডাকা হলে ভেতরে np.random.default_rng(42).integers(1, 7, 3) দিয়ে তিনটি “লুডুর দান” তৈরি করে। Function-টি পরপর দুবার ডাকলে কী দেখা যাবে?
- সংখ্যাগুলো 1 থেকে 7-এর মধ্যে, 7 সহ
- প্রতিবার আলাদা সংখ্যা, কারণ সময় ধরে seed বদলায়
- দুবারই হুবহু একই তিনটি সংখ্যা
- দ্বিতীয়বার ValueError, কারণ একই seed দুবার দেওয়া যায় না
(কঠিন) একটি বড় C-order 2-D float64 array a থেকে col = a[:, 5] নেওয়া হলো। কোন কথাটি সঠিক?
- এটি একটি নতুন copy, তাই col বদলালে a বদলায় না
- এটি একটি view, কিন্তু non-contiguous
- এর shape (n, 1), কারণ কলাম সবসময় 2-D থাকে
- এটি একটি view, আর মেমরিতে টানা (contiguous)
মডিউল ৪ — pandas, টেবিলের ডেটা (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে label আর অবস্থানের পার্থক্য, ফাঁকা ঘর, groupby, merge আর তারিখের হিসাব থেকে, আর pandas 3-এর দুটি বড় বদল প্রায় প্রতিটি কোড-প্রশ্নে লুকিয়ে থাকে: Copy-on-Write আর লেখার কলামের str dtype. নম্বর বেশি হারায় loc-এর slice-এ শেষ মান বাদ ভাবায়, chained assignment-এ, merge-এর পর সারি বাড়ায় আর খালি মাসকে বাদ ভাবায়। ঝালিয়ে নিন পর্ব ২২, পর্ব ২৪ আর পর্ব ২৫.
- পর্ব ২০ · pandas-এর শুরু, পর্ব ২১ · ডেটা পড়া আর লেখা আর পর্ব ২২ · বাছাই আর filter — Series, DataFrame, index alignment, string dtype, loc, iloc, Copy-on-Write
- পর্ব ২৩ · ডেটা পরিষ্কার, পর্ব ২৪ · Groupby আর aggregation আর পর্ব ২৫ · Merge, join আর reshape — missing value, split-apply-combine, transform, left join, pivot table
- পর্ব ২৬ · Time series আর পর্ব ২৭ · বড় ডেটায় pandas — resampling, rolling window, aware datetime, categorical dtype, chunk
(সহজ) Label আর অবস্থান ধরে slice. নিচের কোড কী ছাপবে?
import pandas as pd
s = pd.Series([10, 20, 30], index=["a", "b", "c"])
print(s.loc["a":"b"].sum(), s.iloc[0:1].sum())
- 10 10
- 30 30
- 30 10
- 60 10
(মাঝারি) pandas 3.0-তে নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"qty": [1, 3], "ship": [0, 0]})
sub = df[df["qty"] > 2]
sub["ship"] = 1
print(df["ship"].tolist(), sub["ship"].tolist())
- [0, 0] [1]
- একটি SettingWithCopyWarning, তারপর [0, 1] [1]
- [0, 0] [0]
- [0, 1] [1]
(সহজ) pandas 3-এ df-এর যেসব সারিতে qty 2-এর বেশি, সেখানে ship কলামে 1 বসাতে হবে, মূল df-এই। কোন লেখাটি কাজ করে?
- sub = df[df["qty"] > 2]; sub["ship"] = 1
- df[df["qty"] > 2]["ship"] = 1
- df["ship"][df["qty"] > 2] = 1
- df.loc[df["qty"] > 2, "ship"] = 1
(সহজ) pandas 3.0-এ, একটি 64-bit ল্যাপটপে, নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"district": ["ঢাকা", "খুলনা"], "n": [1, 2]})
print(df["district"].dtype, df["n"].dtype)
- object int64
- str int64
- string int64
- category int64
(মাঝারি) তিনটি রেটিংয়ের একটি ফাঁকা। নিচের কোড কী ছাপবে?
import pandas as pd
s = pd.Series([1, None, 3])
print(s.mean(), s.count(), s.size)
- 1.3333333333333333 2 3
- 2.0 2 3
- nan 2 3
- 2.0 3 3
(মাঝারি) জেলাভিত্তিক বিক্রির যোগ। নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"district": ["ঢাকা", "খুলনা", "ঢাকা"],
"amount": [100, 50, 300]})
r = df.groupby("district")["amount"].sum()
print(r.index.tolist(), r.tolist())
- ['ঢাকা', 'খুলনা'] [400, 50]
- ['ঢাকা', 'খুলনা', 'ঢাকা'] [100, 50, 300]
- ['খুলনা', 'ঢাকা'] [50, 400]
- ['খুলনা', 'ঢাকা'] [50, 300]
(মাঝারি) ডান টেবিলে একটি key দুবার আছে। নিচের কোড কী ছাপবে?
import pandas as pd
left = pd.DataFrame({"k": [1, 2, 3]})
right = pd.DataFrame({"k": [1, 1, 4], "v": ["x", "y", "z"]})
print(len(left.merge(right, on="k")),
len(left.merge(right, on="k", how="left")))
- 3 3
- 2 3
- 2 4
- 1 3
(মাঝারি) দুই দিনের চলমান যোগ। নিচের কোড কী ছাপবে?
import pandas as pd
print(pd.Series([2, 4, 6, 8]).rolling(2).sum().tolist())
- [2.0, 6.0, 10.0, 14.0]
- [nan, nan, 12.0, 18.0]
- [6.0, 10.0, 14.0]
- [nan, 6.0, 10.0, 14.0]
(কঠিন) pandas 3.0-তে নিচের কোড কী ছাপবে?
import pandas as pd
idx = pd.to_datetime(["2026-01-05", "2026-01-20", "2026-03-02"])
s = pd.Series([1, 2, 3], index=idx)
print(s.resample("ME").sum().tolist())
- [3, 0, 3]
- [3, 3]
- [3, nan, 3]
- [1, 2, 3]
(মাঝারি) একই (জেলা, মাস) জোড়া দুবার আছে। নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"d": ["ঢাকা", "ঢাকা", "খুলনা"],
"m": ["Jan", "Jan", "Jan"], "v": [10, 20, 5]})
t = df.pivot_table(index="d", columns="m", values="v")
print(t.loc["ঢাকা", "Jan"])
- 30
- ValueError
- 15.0
- 10
(মাঝারি) দুটি Series-এর index আলাদা। নিচের কোড কী ছাপবে?
import pandas as pd
a = pd.Series([1, 2, 3])
b = pd.Series([10, 20, 30], index=[1, 2, 3])
print((a + b).tolist())
- [11, 22, 33]
- [1.0, 12.0, 23.0, 30.0]
- [nan, 12.0, 23.0, nan]
- ValueError
(সহজ) একজন df.to_csv("orders.csv") দিয়ে ফাইল লিখে পরে pd.read_csv("orders.csv") দিয়ে পড়লেন। শুরুতে একটি বাড়তি কলাম Unnamed: 0 দেখা গেল। কারণ আর সমাধান কী?
- ফাইলের encoding ভুল; encoding="utf-8-sig" দিয়ে পড়লে যাবে
- to_csv index-ও লিখেছে; লেখার সময় index=False বা পড়ার সময় index_col=0
- CSV-তে একটি ফাঁকা কলাম আছে; dropna(axis=1) দিলেই হবে
- read_csv সবসময় একটি সারি-নম্বরের কলাম যোগ করে
(মাঝারি) ঢাকার একটি সারিতে মান ফাঁকা। নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"d": ["ঢাকা", "ঢাকা", "খুলনা"],
"x": [1.0, None, 4.0]})
print(df.groupby("d").size().tolist(),
df.groupby("d")["x"].count().tolist())
- [1, 2] [1, 1]
- [2, 1] [1, 1]
- [1, 2] [1, 2]
- [1, 1] [1, 1]
(মাঝারি) প্রতিটি অর্ডারের পাশে তার জেলার মোট বিক্রি বসাতে হবে। নিচের কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({"d": ["ঢাকা", "খুলনা", "ঢাকা"],
"amt": [100, 50, 300]})
print(df.groupby("d")["amt"].transform("sum").tolist())
- [50, 400]
- [400, 50, 400]
- [400, 50]
- [100, 50, 300]
(মাঝারি) ১ জানুয়ারি ভোরে ঢাকার একটি সময় UTC-তে নেওয়া হলো। নিচের কোড কী ছাপবে?
import pandas as pd
t = pd.Timestamp("2026-01-01 05:30").tz_localize("Asia/Dhaka")
print(t.tz_convert("UTC"))
- 2026-01-01 11:30:00+00:00
- 2026-01-01 05:30:00+00:00
- 2026-01-01 05:30:00+06:00
- 2025-12-31 23:30:00+00:00
(কঠিন) বাজারঘরের গ্রাহক-তালিকার CSV-তে phone কলামে 01712345678-এর মতো নম্বর। pd.read_csv দিয়ে পড়ার পর নম্বরগুলোর শুরুর 0 উধাও, আর কলামটি int64. সবচেয়ে ভালো সমাধান কোনটি?
- পড়ার সময় dtype={'phone': str} দেওয়া
- পড়ার পর astype(str) করে সামনে "0" জুড়ে দেওয়া
- dtype={'phone': float} দিয়ে পড়া
- encoding="utf-8-sig" দিয়ে পড়া
(কঠিন) একটি বড় CSV দুটি chunk-এ পড়া হলো। প্রথম chunk-এ ৪০টি অর্ডার, গড় ডেলিভারি ৩.০ দিন; দ্বিতীয়টিতে ১০টি অর্ডার, গড় ৮.০ দিন। সব অর্ডারের সঠিক গড় ডেলিভারি কত দিন?
- ৫.৫
- ৩.০
- ৭.০
- ৪.০
(মাঝারি) ৫০ লাখ সারির একটি অর্ডার-টেবিলে মেমরি কমাতে একটি লেখার কলামকে category করতে চান। কোন কলামে সবচেয়ে বেশি লাভ আশা করা যায়?
- অর্ডার নম্বর (প্রতিটি সারিতে আলাদা)
- জেলার নাম (৬৪টি আলাদা মান)
- গ্রাহকের লেখা রিভিউ
- পয়সায় দাম (পূর্ণসংখ্যা)
৪ · মডিউল ৫ ও ৬ — Visualization আর AI-এর গণিত (৩৬টি প্রশ্ন)
মডিউল ৫ — ডেটা দেখা: visualization আর সৎ chart (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে Figure আর Axes-এর গঠন, প্রশ্ন অনুযায়ী chart বাছাই, seaborn-এর দুই স্তর, Plotly কখন কাজে আসে আর কোন chart চোখকে ঠকায়। নম্বর বেশি হারায় plt.subplots-এর ফেরত দেওয়া জিনিসে, কাটা axis-এর হিসাবে আর দুই axis-এর chart-কে প্রমাণ ভাবায়। ঝালিয়ে নিন পর্ব ২৮, পর্ব ২৯ আর পর্ব ৩২.
- পর্ব ২৮ · matplotlib-এর শুরু আর পর্ব ২৯ · কোন chart কখন — Figure, Axes, object-oriented API, box plot, small multiples
- পর্ব ৩০ · seaborn আর পর্ব ৩১ · Interactive chart — figure-level function, FacetGrid, hue, Plotly Express, tooltip
- পর্ব ৩২ · সৎ chart — lie factor, dual axis, viridis, diverging palette, alt text
(সহজ) matplotlib-এ Figure আর Axes-এর সম্পর্ক কোনটি?
- Figure পুরো ক্যানভাস, আর Axes তার ভেতরের একটি plot-এর ঘর
- একটি Axes-এর ভেতরে কয়েকটি Figure থাকে
- Axes মানে x-অক্ষ আর y-অক্ষের মধ্যে যেকোনো একটি
- দুটি একই object-এর দুই নাম
(মাঝারি) matplotlib 3.10-এ নিচের কোড কী ছাপবে?
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 3)
print(type(axes).__name__, axes.shape)
- Figure (2, 3)
- list (3, 2)
- ndarray (2, 3)
- ndarray (6,)
(মাঝারি) fig, axes = plt.subplots(1, 3) চালানোর পর axes.shape কত? (matplotlib 3.10, অন্য কোনো argument নেই)
- (1, 3)
- (3, 1)
- shape নেই, কারণ axes একটি Axes
- (3,)
(মাঝারি) একটি figure-এর figsize=(5, 3) ইঞ্চি আর dpi=120. bbox_inches ছাড়া PNG হিসেবে সংরক্ষণ করলে ছবি কত pixel হবে?
- 600 × 360
- 500 × 300
- 360 × 600
- 125 × 123
(সহজ) বাজারঘরের ৫০০টি অর্ডারের ডেলিভারি-দিন (১ থেকে ৭) দেখে জানতে চান: বেশির ভাগ অর্ডার কত দিনে আসে, আর লম্বা লেজ আছে কি না। প্রথমে কোন chart?
- Pie chart
- প্রতিটি দিনে একটি bin দিয়ে histogram
- অর্ডার নম্বর ধরে line chart
- দিন বনাম দিনের scatter
(মাঝারি) ১২টি জেলার মাসিক মোট বিক্রি তুলনা করতে হবে, আর জেলার নাম বেশ লম্বা। পাঠক যেন সহজে কে বড়, কে ছোট পড়তে পারেন। কোনটি সবচেয়ে ভালো?
- ১২ ভাগের pie chart
- বড় থেকে ছোট সাজানো আড়াআড়ি bar
- জেলাগুলোকে x-অক্ষে রেখে line chart
- বর্ণানুক্রমে সাজানো খাড়া bar
(মাঝারি) দুটি bar-এর মান ৬০ আর ৭৫, কিন্তু y-axis শুরু হয়েছে ৫০ থেকে। Tufte-এর সংজ্ঞায় (ছবির আপেক্ষিক পরিবর্তন ÷ ডেটার আপেক্ষিক পরিবর্তন) lie factor কত?
- ২.৫
- ১
- ৬
- ১.২৫
(মাঝারি) ডেলিভারি-দিনের ডেটায় Q1 = 3 আর Q3 = 7. Tukey-র 1.5 × IQR নিয়মে box plot-এ কোন মানটি আলাদা বিন্দু (outlier) হিসেবে আঁকা হবে?
- −2
- 14
- 12
- 13
(মাঝারি) একটি chart-এ বাঁ y-axis-এ মাসিক বিক্রি, ডান y-axis-এ অনলাইন বিজ্ঞাপনের খরচ; দুটি রেখা প্রায় একসঙ্গে ওঠানামা করছে। একজন বললেন, “বিজ্ঞাপনই বিক্রি বাড়াচ্ছে, ছবিই প্রমাণ।” সবচেয়ে সঠিক জবাব কোনটি?
- দুই রেখা মিলেছে, তাই কারণ প্রমাণিত
- রেখার রং আলাদা করলেই chart সৎ হবে
- দুটিকে log scale-এ নিলে প্রমাণ পাকা হবে
- স্কেল ইচ্ছামতো বাছা যায়; আলাদা প্যানেলে দেখুন, আর মিল মানেই কারণ নয়
(সহজ) মানচিত্রে প্রতিটি থানার অর্ডারের ঘনত্ব (০ থেকে বেশি) রং দিয়ে দেখাতে হবে, আর কিছু পাঠক রঙকানা। কোন রঙের ধারা সবচেয়ে উপযুক্ত?
- viridis-এর মতো sequential ধারা
- jet (রংধনু)
- লাল-সাদা-নীল diverging ধারা
- প্রতিটি থানার জন্য আলাদা উজ্জ্বল রং
(সহজ) পাঁচ জেলার বিক্রির শতাংশ পরিবর্তন −২৭% থেকে +৭১%. একটি heatmap-এ এমনভাবে রং দিতে চান যাতে বাড়া আর কমা চোখে আলাদা হয়। কোনটি ঠিক?
- viridis, সবচেয়ে ছোট মান থেকে বড় মান পর্যন্ত
- শুধু ধূসরের এক ধারা
- jet, কারণ বেশি রং মানে বেশি তথ্য
- শূন্যকে মাঝ ধরে diverging ধারা
(কঠিন) seaborn 0.13.2-এ নিচের কোড কী ছাপবে? df-এর pay কলামে তিনটি আলাদা মান: COD, bKash, card.
g = sns.displot(data=df, x="taka", col="pay")
print(type(g).__name__, g.axes.shape)
- Axes (1, 3)
- FacetGrid (1, 3)
- Figure (3,)
- FacetGrid (3, 1)
(কঠিন) একটি জেলার ডেলিভারি-দিনের নমুনা ৪০ থেকে বেড়ে ৪০০ হলো, ডেটার ছড়ানো একই রকম। seaborn-এর barplot-এ errorbar=("ci", 95) আর errorbar="sd"-এর দাগে কী ঘটার কথা?
- SD সরু হয়, CI একই থাকে
- দুটিই প্রায় তিন গুণ সরু হয়
- CI প্রায় তিন গুণ সরু হয়, SD প্রায় একই থাকে
- কিছুই বদলায় না, কারণ ছড়ানো একই
(মাঝারি) একটি DataFrame-এ rating কলামে ১ থেকে ৫ পূর্ণসংখ্যা (int). sns.scatterplot(data=df, x="days", y="taka", hue="rating")-এ পাঁচটি স্পষ্ট আলাদা রং চান। কী করবেন?
- hue বাদ দিয়ে size ব্যবহার
- rating-কে category (বা str) বানিয়ে hue-তে দেওয়া
- x আর y জায়গা বদল
- কিছুই না, int-এ seaborn নিজেই পাঁচটি আলাদা রং দেয়
(মাঝারি) Plotly 7.1-এ অর্ডারের একটি scatter HTML ফাইলে বাইরে পাঠানো হবে। DataFrame-এ ক্রেতার ফোন নম্বরের কলাম আছে, আর hover_data={"phone": False} দেওয়া হয়েছে। সবচেয়ে নিরাপদ কাজ কোনটি?
- Chart বানানোর আগেই DataFrame থেকে phone কলাম বাদ দেওয়া
- include_plotlyjs বন্ধ করা
- যা আছে তাই যথেষ্ট, tooltip-এ তো দেখা যায় না
- Figure-এর আকার ছোট করা
(সহজ) কোন ক্ষেত্রে interactive chart (hover, zoom) স্থির ছবির চেয়ে সবচেয়ে বেশি কাজে আসে?
- ছাপা PDF রিপোর্টের একটি chart
- মিটিংয়ের slide-এ একটি মূল সংখ্যা দেখানো
- বিশ্লেষক যখন হাজারখানেক অর্ডার ঘেঁটে কোন বিন্দু কোন অর্ডার তা খুঁজছেন
- Screen reader ব্যবহারকারীর জন্য একমাত্র উপায় হিসেবে
(কঠিন) চারটি ডেটাসেটের x আর y-এর গড়, variance, correlation আর regression রেখা দুই দশমিক পর্যন্ত হুবহু এক। এ থেকে কোন সিদ্ধান্ত সবচেয়ে সঠিক?
- চারটির সম্পর্কের আকার একই
- একই linear model চারটিতেই সমান ভালো খাটবে
- আকার আলাদা হতে পারে, তাই প্রতিটির scatter দেখা দরকার
- Correlation-এর হিসাবে ভুল হয়েছে
(মাঝারি) একটি chart দেখাচ্ছে ঢাকার মোট বিক্রি সিলেটের ছয় গুণ, শিরোনাম “ঢাকার ক্রেতারা বেশি খরচ করেন”. ঢাকায় ক্রেতাও প্রায় ছয় গুণ। কী সমস্যা?
- Bar-এর বদলে pie দরকার ছিল
- Bar-এর রং আলাদা নয়
- শুধু y-axis শূন্য থেকে শুরু হয়নি
- মোট দেখিয়ে প্রতি-ক্রেতার দাবি; ক্রেতাপিছু বিক্রি দেখানো উচিত
মডিউল ৬ — AI-এর গণিত (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে ছোট হিসাব আর NumPy-র এক-দুই লাইনের কোড থেকে: dot product, norm, cosine, derivative, gradient descent-এর এক ধাপ, conditional probability, binomial আর normal, গড় বনাম median, correlation আর entropy. নম্বর বেশি হারায় gradient-এর চিহ্নে, np.var আর pandas-এর var-এর ddof-এ, “correlation শূন্য মানে সম্পর্ক নেই” ভাবায় আর bit বনাম nat গুলিয়ে ফেলায়। ঝালিয়ে নিন পর্ব ৩৩, পর্ব ৩৪, পর্ব ৩৭ আর পর্ব ৩৮.
- পর্ব ৩৩ · Vector আর similarity আর পর্ব ৩৪ · Derivative আর gradient descent — dot product, norm, cosine similarity, gradient, learning rate
- পর্ব ৩৫ · AI-এর জন্য সম্ভাবনা আর পর্ব ৩৬ · Distribution আর sampling — conditional probability, independent event, binomial distribution, normal distribution
- পর্ব ৩৭ · ডেটার পরিসংখ্যান আর পর্ব ৩৮ · Entropy আর information — ddof, standard error, CLT, entropy, cross-entropy, KL divergence
(সহজ) NumPy 2-এ নিচের কোড কী ছাপবে?
import numpy as np
a = np.array([2, -1, 3])
b = np.array([4, 5, -1])
print(a @ b)
- [ 8 -5 -3]
- 8
- 0
- 16
(মাঝারি) নিচের কোড কী ছাপবে?
import numpy as np
p = np.array([0.25, 0.25, 0.25, 0.25])
print(-(p * np.log2(p)).sum())
- 1.0
- 0.25
- 4.0
- 2.0
(সহজ) নিচের কোড কী ছাপবে?
import numpy as np
v = np.array([3, 4])
print(np.linalg.norm(v), np.linalg.norm(v, ord=1))
- 7.0 5.0
- 5.0 7.0
- 25.0 7.0
- 5.0 5.0
(মাঝারি) ক্রেতা ক মাসে কেনেন [চাল ২ কেজি, ডাল ১ কেজি], ক্রেতা খ [চাল ২০ কেজি, ডাল ১০ কেজি]. দুজনের vector নিয়ে কোনটি সত্য?
- Cosine similarity 0.1, কারণ খ দশ গুণ বেশি কেনেন
- Cosine similarity 1, আর Euclidean দূরত্বও 0
- দুটি vector লম্ব, তাই cosine 0
- Cosine similarity 1, কিন্তু Euclidean দূরত্ব বড় (প্রায় 20.12)
(কঠিন) p = (0.5, 0.5) আর q = (0.9, 0.1). bit-এ KL(p ‖ q) প্রায় 0.737 আর KL(q ‖ p) প্রায় 0.531. এ থেকে কোন সিদ্ধান্ত সঠিক?
- দুটি মান সমান হওয়ার কথা, তাই হিসাবে ভুল
- KL সমমিত নয়, তাই এটি আসল দূরত্বের মাপ নয়
- যেকোনো এক দিকে KL ঋণাত্মক হতে পারে
- দুটি distribution-এ ফল দুটি, তাই KL সবসময় 0
(সহজ) f(x) = x² + 3x হলে x = 2-এ derivative f′(2) কত?
- 7
- 10
- 4
- 13
(মাঝারি) Loss L(w) = (w − 4)², এখন w = 1, learning rate η = 0.25. Gradient descent-এর এক ধাপ পরে w কত?
- 2.5
- 7.0
- 4.0
- −0.5
(কঠিন) L(w) = (w − 3)², শুরু w = 0. Learning rate η = 1.0 দিয়ে gradient descent চালালে কী ঘটে?
- এক ধাপেই w = 3-এ পৌঁছে থেমে যায়
- ধীরে ধীরে 3-এর দিকে এগোয়
- 0 আর 6-এর মধ্যে দোলে, কখনো থামে না
- প্রতি ধাপে আরও দূরে সরে যায়
(মাঝারি) একটি অর্ডারের আসল লেবেল 1 (ফেরত এসেছে), আর model বলেছিল P(1) = 0.25. log2 নিয়ে এই অর্ডারের cross-entropy (log loss) কত bit?
- 0.25 bit
- 0.415 bit
- 4 bit
- 2 bit
(মাঝারি) বাজারঘরের ৪০০টি অর্ডারের ১৬০টি ঢাকার; ঢাকার ২৪টি দেরিতে পৌঁছেছে, আর সব মিলিয়ে দেরি ৬০টি। P(দেরি | ঢাকা) কত?
- ০.৩৭৫
- ০.৪০
- ০.০৬
- ০.১৫
(মাঝারি) P(A) = 0.3, P(B) = 0.5 আর P(A ∩ B) = 0.15. A আর B সম্পর্কে কোনটি সঠিক?
- এরা mutually exclusive
- এরা independent, আর P(A ∪ B) = 0.8
- এরা independent, আর P(A ∪ B) = 0.65
- এরা dependent, কারণ ছেদ শূন্য নয়
(মাঝারি) চারটি অর্ডার, প্রতিটি আলাদাভাবে ০.৫ সম্ভাবনায় bKash-এ পরিশোধ হয়। ঠিক দুটি bKash-এ হওয়ার সম্ভাবনা কত?
- 0.5
- 0.375
- 0.25
- 0.0625
(সহজ) দৈনিক অর্ডার মোটামুটি normal, μ = ৫০, σ = ১০. ৬৮–৯৫–৯৯.৭ নিয়মে প্রায় কত শতাংশ দিনে অর্ডার ৩০ থেকে ৭০-এর মধ্যে?
- প্রায় ৯৫%
- প্রায় ৬৮%
- প্রায় ৯৯.৭%
- প্রায় ৫০%
(সহজ) পাঁচটি অর্ডারের দাম (শত টাকায়) নিচে। কোডটি কী ছাপবে?
import numpy as np
x = [1, 2, 3, 4, 100]
print(np.mean(x), np.median(x))
- 22.0 50.5
- 3.0 22.0
- 22.0 3.0
- 2.5 3.0
(কঠিন) NumPy 2 আর pandas 3-এ নিচের কোড কী ছাপবে?
import numpy as np, pandas as pd
x = [1, 3, 5]
print(round(np.var(x), 3), pd.Series(x).var())
- 2.667 4.0
- 2.667 2.667
- 4.0 2.667
- 4.0 4.0
(কঠিন) নিচের কোড কী ছাপবে?
import numpy as np
x = np.array([-2, -1, 0, 1, 2])
print(np.corrcoef(x, x**2)[0, 1])
- 1.0
- 0.0
- nan
- -1.0
(মাঝারি) বাজারঘরের ডেটায় যেসব সপ্তাহে ছাতা বেশি বিক্রি হয়, সেসব সপ্তাহে ডেলিভারিও বেশি দেরি হয় (correlation ০.৬). একজন প্রস্তাব দিলেন ছাতা বিক্রি বন্ধ করলে ডেলিভারি দ্রুত হবে। সবচেয়ে যুক্তিসংগত ব্যাখ্যা কী?
- Correlation ০.৬ বড়, তাই ছাতাই দেরির কারণ
- বর্ষা দুটিকেই বাড়ায়; এটি একটি confounder-এর ফল
- দেরিই ছাতা বিক্রি বাড়ায়
- Correlation হিসাবে নিশ্চয়ই ভুল হয়েছে
(মাঝারি) ৩৬টি অর্ডারের নমুনায় ডেলিভারি-সময়ের SD ১২ ঘণ্টা। গড়ের standard error কত, আর SE অর্ধেক করতে মোটামুটি কতটি অর্ডার লাগবে?
- SE 2; ১৪৪টি
- SE 2; ৭২টি
- SE 12; ১৪৪টি
- SE 0.33; ৭২টি
৫ · মডিউল ৭ ও ৮ — Search, যুক্তি, জ্ঞান আর পরিকল্পনা (৩৬টি প্রশ্ন)
মডিউল ৭ — Search দিয়ে সমস্যা সমাধান (১৮টি প্রশ্ন)
সমস্যাকে state আর action-এ সাজানো, অন্ধ আর heuristic search, খেলার গাছ, constraint আর local search. নম্বর বেশি হারায় “BFS সবসময় সবচেয়ে ছোট পথ দেয়”, “greedy আর A* একই” আর “alpha-beta উত্তর বদলায়” ধরনের ভুলে, আর ছোট graph-এ হাতে trace করতে গিয়ে। ঝালিয়ে নিন পর্ব ৪০, পর্ব ৪১ আর পর্ব ৪২.
- পর্ব ৩৯ · সমস্যাকে search হিসেবে দেখা আর পর্ব ৪০ · অন্ধ search — state space, branching factor, frontier, uniform-cost search
- পর্ব ৪১ · Heuristic আর A* আর পর্ব ৪২ · খেলার search — admissible heuristic, consistent heuristic, minimax, alpha-beta pruning
- পর্ব ৪৩ · Constraint satisfaction আর পর্ব ৪৪ · Local search — forward checking, MRV, local maximum, simulated annealing, fitness function
(সহজ) একটি search problem-এর formulation লিখছেন: রাইডার মিরপুর থেকে মতিঝিল যাবেন। নিচের কোনটি search problem-এর অংশ নয়?
- Goal test
- Transition model
- Path cost
- Learning rate
(মাঝারি) একটি search tree-তে প্রতিটি node-এর ঠিক ৩টি সন্তান (b = 3). Root-কে depth 0 ধরলে depth 4 পর্যন্ত পূর্ণ গাছে root-সহ মোট কয়টি node?
- 121
- 81
- 364
- 12
(মাঝারি) নিচের Python কোড কী ছাপবে?
from collections import deque
g = {'S': ['A', 'B'], 'A': ['C', 'D'], 'B': ['D', 'G'],
'C': [], 'D': ['G'], 'G': []}
q, seen, order = deque(['S']), {'S'}, []
while q:
n = q.popleft(); order.append(n)
for m in g[n]:
if m not in seen:
seen.add(m); q.append(m)
print(''.join(order))
- SACDBG
- SABCDDG
- SBGDAC
- SABCDG
(মাঝারি) ডেলিভারি রুট খুঁজতে একটি genetic algorithm-এ প্রতিটি সম্ভাব্য রুট একটি individual. কোন অংশ ঠিক করে কোন রুট পরের প্রজন্মে বাবা-মা হওয়ার বেশি সুযোগ পাবে?
- Mutation
- Fitness function, তার ভিত্তিতে selection
- Crossover
- Temperature schedule
(মাঝারি) দুই-মুখী রাস্তা আর খরচ: S–A 2, S–B 4, A–B 1, A–G 7, B–G 3. শুরু S, লক্ষ্য G. Uniform-cost search কোন পথ আর খরচ দেবে?
- S → A → B → G, খরচ 6
- S → B → G, খরচ 7
- S → A → G, খরচ 9
- S → A → B → G, খরচ 5
(মাঝারি) Breadth-first search সম্পর্কে কোন বাক্যটি সঠিক? (b = branching factor, d = সবচেয়ে অগভীর লক্ষ্যের গভীরতা)
- যেকোনো ওজনের রাস্তায় সবচেয়ে কম খরচের পথ দেয়
- Memory লাগে মাত্র O(bd)
- অসীম গভীর শাখায় আটকে গিয়ে incomplete হতে পারে
- সব ধাপের খরচ সমান হলে সেরা পথ দেয়, কিন্তু memory O(bd)
(মাঝারি) একটি ধাঁধার সমাধান কত গভীরে আছে জানা নেই, প্রতিটি ধাপের খরচ সমান, আর যন্ত্রের memory খুব কম। কোন অন্ধ search সবচেয়ে মানানসই?
- Breadth-first search
- Iterative deepening DFS
- সাধারণ depth-first search
- একটি নির্দিষ্ট সীমার depth-limited search
(সহজ) তিনটি node-এর আসল সেরা বাকি খরচ h*(A) = 5, h*(B) = 3, h*(C) = 0 (C লক্ষ্য)। চারটি heuristic-এর মান (A, B, C) ক্রমে দেওয়া। কোনটি admissible?
- h = (6, 2, 0)
- h = (5, 4, 0)
- h = (4, 3, 0)
- h = (3, 3, 1)
(কঠিন) এক-মুখী রাস্তা আর খরচ: S→A 1, S→B 4, A→B 2, A→G 12, B→G 5. Heuristic: h(S) = 7, h(A) = 6, h(B) = 4, h(G) = 0. A* (f = g + h) কোন ক্রমে node expand করবে আর কোন পথ দেবে?
- S, B, G; পথ S → B → G, খরচ 9
- S, A, B, G; পথ S → A → B → G, খরচ 8
- S, A, G; পথ S → A → G, খরচ 13
- S, A, B, B, G; পথ S → A → B → G, খরচ 7
(মাঝারি) একই graph: এক-মুখী রাস্তা S→A 1, S→B 4, A→B 2, A→G 12, B→G 5; h(S) = 7, h(A) = 6, h(B) = 4, h(G) = 0. Greedy best-first search (f = h) কোন পথ দেবে?
- S → B → G, খরচ 9
- S → A → B → G, খরচ 8
- S → A → G, খরচ 13
- কোনো পথ পায় না
(কঠিন) একটি graph-এ A→B রাস্তার খরচ 2, h(A) = 6, h(B) = 3. শুধু এই তথ্য থেকে নিশ্চিতভাবে কী বলা যায়?
- Heuristic-টি admissible নয়
- এই রাস্তায় heuristic-টি consistent
- এই রাস্তায় consistency ভাঙে, কারণ 6 > 2 + 3
- h(B)-র মান বেশি, তাই B-তে বাড়িয়ে বলা হচ্ছে
(মাঝারি) খেলার গাছে root MAX, তার তিনটি MIN সন্তান। বাঁ থেকে ডানে MIN সন্তানদের leaf: [4, 8, 6], [7, 3, 9], [5, 6, 10]. Root-এর minimax মান কত?
- 5
- 10
- 3
- 4
(কঠিন) একই গাছ: root MAX, MIN সন্তানদের leaf বাঁ থেকে ডানে [4, 8, 6], [7, 3, 9], [5, 6, 10]. Alpha-beta বাঁ থেকে ডানে চালালে কোন leaf মোটেই দেখা হয় না?
- কোনো leaf বাদ যায় না
- তৃতীয় শাখার 6 আর 10
- দ্বিতীয় শাখার 3 আর 9
- শুধু দ্বিতীয় শাখার 9
(মাঝারি) একজন বললেন, “Alpha-beta কিছু শাখা না দেখেই বাদ দেয়, তাই মাঝে মাঝে minimax-এর চেয়ে খারাপ চাল বাছে।” কোন উত্তরটি সঠিক?
- ঠিক বলেছেন, কাটা শাখায় ভালো চাল থাকতে পারে
- শুধু খারাপ move ordering-এ ভুল চাল আসে
- Alpha-beta আনুমানিক, তাই ছোট ভুল স্বাভাবিক
- ভুল; root-এর মান একই, শুধু কম node দেখা হয়
(সহজ) পরীক্ষার রুটিনকে CSP হিসেবে লিখছেন: প্রতিটি পরীক্ষা একটি variable, আর একই শিক্ষার্থীর দুটি পরীক্ষা একই slot-এ হতে পারবে না। এখানে domain কোনটি?
- শিক্ষার্থীদের তালিকা
- দুটি পরীক্ষা একই slot-এ না হওয়ার নিয়ম
- সম্ভাব্য সময়-slot-এর সেট
- সব পরীক্ষার তালিকা
(মাঝারি) Map coloring-এ P-র প্রতিবেশী Q আর R. এখনকার domain: Q = {লাল, সবুজ}, R = {লাল}. P = লাল বসানোর পর forward checking কী করবে?
- R-এর domain খালি হওয়ায় এখনই P = লাল বাতিল করবে
- পরের variable-এ যাবে, R-এ পৌঁছে ভুলটি ধরবে
- MRV দিয়ে R বেছে লাল বসাবে
- Q-এর domain খালি হয়েছে বলে থামবে
(মাঝারি) খরচ কমানোর simulated annealing-এ তাপমাত্রা T = 10, আর একটি চালে খরচ বাড়ে Δ = 5. চালটি গ্রহণের সম্ভাবনা কত? (e ≈ 2.718)
- 1, খারাপ চালও সবসময় নেওয়া হয়
- প্রায় 0.607
- প্রায় 0.135
- 0.5
(সহজ) ডেলিভারি রুটের খরচ কমাতে hill climbing একই শুরুর রুট থেকে বারবার চালানো হচ্ছে, আর প্রতিবার একই মাঝারি মানের রুটে থামছে। সবচেয়ে সহজ উন্নতি কোনটি?
- শুধু অনেক ভালো প্রতিবেশী নেওয়ার নিয়ম আরও কড়া করা
- একই শুরু থেকে আরও অনেকবার চালানো
- এলোমেলো ভিন্ন শুরু থেকে বারবার চালানো (random restart)
- Frontier queue আরও বড় করা
মডিউল ৮ — জ্ঞান, যুক্তি আর পরিকল্পনা (১৮টি প্রশ্ন)
Propositional আর first-order logic, rule-based system, knowledge graph আর STRIPS planning. নম্বর বেশি হারায় “A → B মিথ্যা হয় A মিথ্যা হলেই”, quantifier-এর সঙ্গে ভুল সংযোজক (∀-এর সঙ্গে ∧, ∃-এর সঙ্গে →), আর closed-world বনাম open-world গুলিয়ে ফেলায়। ঝালিয়ে নিন পর্ব ৪৫, পর্ব ৪৬ আর পর্ব ৪৯.
- পর্ব ৪৫ · Propositional logic আর পর্ব ৪৬ · First-order logic — truth table, entailment, CNF, resolution refutation, quantifier
- পর্ব ৪৭ · Rule-based আর expert system আর পর্ব ৪৮ · Knowledge graph — forward chaining, backward chaining, triple, open-world assumption
- পর্ব ৪৯ · Planning — STRIPS, precondition, frame problem, closed-world assumption
(সহজ) বাজারঘরের নিয়ম A → B, যেখানে A = “অর্ডার ৫০০ টাকার বেশি”, B = “কুপন পাবেন”। কোন অর্ডারে নিয়মটি ভাঙে, অর্থাৎ A → B মিথ্যা?
- ৮০০ টাকার অর্ডার, কুপন পাননি
- ৩০০ টাকার অর্ডার, কুপন পেয়েছেন
- ৮০০ টাকার অর্ডার, কুপন পেয়েছেন
- ৩০০ টাকার অর্ডার, কুপন পাননি
(মাঝারি) নিচের Python কোড কী ছাপবে?
from itertools import product
imp = lambda p, q: (not p) or q
rows = [(a, b, c) for a, b, c in product([True, False], repeat=3)
if imp(a, b) and imp(b, c)]
print(len(rows), (True, False, True) in rows)
- 8 False
- 4 False
- 6 False
- 4 True
(মাঝারি) Knowledge base KB = {A ∨ B, ¬A}. নিচের কোন বাক্যটি KB থেকে entail হয় (KB ⊨ α)?
- A
- B
- ¬B
- A ∧ B
(সহজ) কোন বাক্যটি valid, অর্থাৎ প্রতিটি model-এ সত্য?
- A ∧ ¬A
- A → B
- A ∨ B
- (A ∧ B) → A
(মাঝারি) A → (B ∧ C) বাক্যটির সঠিক CNF রূপ কোনটি?
- (¬A ∨ B) ∧ (¬A ∨ C)
- (A ∨ B) ∧ (A ∨ C)
- ¬A ∨ B ∨ C
- ¬A ∧ B ∧ C
(কঠিন) KB-র clause {¬P, Q} আর {P}. Resolution refutation দিয়ে KB ⊨ Q প্রমাণ করতে কোন পথ সঠিক?
- KB-তে {Q} যোগ করে খালি clause খোঁজা
- সব model-এর truth table বানিয়ে মেলানো
- {¬Q} যোগ করে resolve করতে করতে খালি clause পাওয়া
- {¬Q} যোগ করে দেখানো যে খালি clause কখনো আসে না
(মাঝারি) নিয়ম: “বৃষ্টি হলে delivery দেরি হয়।” আজ delivery দেরি হয়েছে। একজন সিদ্ধান্ত নিলেন, “তাহলে আজ বৃষ্টি হয়েছে।” এই যুক্তি সম্পর্কে কোনটি সঠিক?
- এটি modus ponens, তাই sound
- Sound, কারণ বৃষ্টিতে দেরির সম্ভাবনা বেশি
- Sound নয়; ফল থেকে কারণে উল্টো যাওয়া হয়েছে
- এটি contrapositive, তাই সমতুল্য
(কঠিন) “কোনো একজন গ্রাহক সব পণ্য কিনেছেন” বাক্যের সঠিক first-order logic রূপ কোনটি?
- ∃x (Customer(x) → ∀y (Product(y) → Bought(x, y)))
- ∃x (Customer(x) ∧ ∀y (Product(y) → Bought(x, y)))
- ∀y (Product(y) → ∃x (Customer(x) ∧ Bought(x, y)))
- ∃x (Customer(x) ∧ ∀y (Product(y) ∧ Bought(x, y)))
(মাঝারি) ¬∀x (Rice(x) → Cheap(x)) বাক্যের সমতুল্য রূপ কোনটি?
- ∀x ¬(Rice(x) → Cheap(x))
- ∀x (Rice(x) → ¬Cheap(x))
- ∃x (Rice(x) → ¬Cheap(x))
- ∃x (Rice(x) ∧ ¬Cheap(x))
(কঠিন) একটি ছোট জগতে গ্রাহক {A, B}, পণ্য {p, q}; অর্ডার শুধু Ordered(A, p), Ordered(B, p) আর Ordered(B, q). x গ্রাহকের ওপর আর y পণ্যের ওপর চলে। কোন বাক্যটি এই জগতে মিথ্যা?
- ∀x ∀y Ordered(x, y)
- ∃y ∀x Ordered(x, y)
- ∀y ∃x Ordered(x, y)
- ∀x ∃y Ordered(x, y)
(মাঝারি) নিচের forward chaining কোড কী ছাপবে?
rules = [({'A', 'B'}, 'C'), ({'C', 'D'}, 'E'),
({'B'}, 'D'), ({'E', 'F'}, 'G')]
facts = {'A', 'B'}
changed = True
while changed:
changed = False
for cond, concl in rules:
if cond <= facts and concl not in facts:
facts.add(concl); changed = True
print(sorted(facts - {'A', 'B'}))
- ['C']
- ['C', 'D']
- ['C', 'D', 'E', 'G']
- ['C', 'D', 'E']
(সহজ) বাজারঘরের rule base-এ শত শত নিয়ম আছে, কিন্তু checkout-এর সময় system-কে শুধু একটি প্রশ্নের উত্তর দিতে হয়: “এই অর্ডারে ফ্রি delivery প্রযোজ্য কি না?” কোন inference পদ্ধতি বেশি মানানসই?
- Backward chaining, লক্ষ্য থেকে পিছিয়ে
- প্রতিবার পুরো truth table বানানো
- Forward chaining, সব fact থেকে সব সিদ্ধান্ত
- Hill climbing
(সহজ) একটি expert system-এর কোন অংশ working memory-র fact-এর সঙ্গে নিয়ম মিলিয়ে কোন নিয়ম চলবে ঠিক করে আর চালায়?
- Knowledge base (rule base)
- Working memory
- Explanation facility
- Inference engine
(সহজ) “রুমানা ঢাকায় থাকেন” তথ্যটি knowledge graph-এর একটি triple হিসেবে লিখলে কোনটি সঠিক?
- (Rumana, livesIn, Dhaka)
- (livesIn, Rumana, Dhaka)
- (Dhaka, Rumana, livesIn)
- (Rumana, Dhaka, livesIn)
(মাঝারি) একটি ছোট knowledge graph Python-এর triple তালিকায় রাখা। নিচের query কোড কী ছাপবে?
triples = [('P1', 'type', 'Phone'), ('P2', 'type', 'Charger'),
('P3', 'type', 'Phone'), ('P1', 'brand', 'Kodom'),
('P3', 'brand', 'Shimul'), ('P2', 'brand', 'Kodom')]
phones = {s for s, p, o in triples if p == 'type' and o == 'Phone'}
ans = sorted(s for s, p, o in triples
if p == 'brand' and o == 'Kodom' and s in phones)
print(ans)
- ['P1', 'P2']
- ['P1']
- ['P1', 'P3']
- []
(মাঝারি) কোন পরিস্থিতিতে closed-world assumption (যা লেখা নেই, তা মিথ্যা) সবচেয়ে যুক্তিসংগত?
- Web থেকে জোড়া একটি knowledge graph-এ কারও জন্মস্থান নেই, তাই তিনি কোথাও জন্মাননি
- অংশীদারের ফাইলে একটি ফোনের নাম নেই, তাই ফোনটি কোথাও বিক্রি হয় না
- বাজারঘরের নিজের অর্ডার টেবিলে আজ কোনো সারি নেই, তাই আজ অর্ডার হয়নি
- SPARQL ASK false দিলে, RDF graph-এ তথ্যটি সবসময় মিথ্যা
(মাঝারি) STRIPS-এ state s = {at(rider,hub), at(p2,hub), free(bag)}. Action pick(p2): pre = {at(rider,hub), at(p2,hub), free(bag)}, add = {in(p2,bag)}, del = {at(p2,hub), free(bag)}. প্রয়োগের পর নতুন state কী?
- {at(rider,hub), at(p2,hub), free(bag), in(p2,bag)}
- Action প্রযোজ্য নয়, state একই থাকে
- {in(p2,bag)}
- {at(rider,hub), in(p2,bag)}
(মাঝারি) STRIPS-এ একটি action শুধু তার add আর delete list-এর fact বদলায়; বাকি সব fact নিজে থেকেই আগের মতো থাকে। এই নিয়ম মূলত কোন সমস্যা সহজ করে?
- Horizon effect
- Local maximum
- Frame problem
- Occurs check
৬ · মডিউল ৯ ও ১০ — অনিশ্চয়তা আর ডেটা থেকে শেখা (৩৬টি প্রশ্ন)
মডিউল ৯ — অনিশ্চয়তার সঙ্গে যুক্তি (১৮টি প্রশ্ন)
Bayes-এর হালনাগাদ, Naive Bayes, Bayesian network, Markov chain ও HMM আর utility দিয়ে সিদ্ধান্ত। নম্বর বেশি হারায় base rate ভুলে যাওয়ায়, P(E | H) আর P(H | E) গুলিয়ে ফেলায়, transition matrix-এর সারি-কলাম উল্টে ফেলায় আর expected value-কে expected utility ভাবায়। ঝালিয়ে নিন পর্ব ৫০, পর্ব ৫২ আর পর্ব ৫৪.
- পর্ব ৫০ · Bayes-এর উপপাদ্য আর পর্ব ৫১ · Naive Bayes — Bayes-এর উপপাদ্য, base rate fallacy, likelihood ratio, Beta distribution, Laplace smoothing
- পর্ব ৫২ · Bayesian network আর পর্ব ৫৩ · Markov chain আর HMM — Bayesian network, conditional independence, explaining away, transition matrix, HMM, Viterbi
- পর্ব ৫৪ · অনিশ্চয়তায় সিদ্ধান্ত — expected utility, MDP, discount factor
(মাঝারি) বাজারঘরের ১% অর্ডার ভুয়া। একটি detector ভুয়া অর্ডারের ৯০% ধরে, আর সৎ অর্ডারের ৫%-কেও ভুল করে চিহ্নিত করে। একটি অর্ডার চিহ্নিত হলো। সেটি আসলে ভুয়া হওয়ার সম্ভাবনা প্রায় কত?
- ০.৯০
- ০.৯৫
- প্রায় ০.১৫
- প্রায় ০.৫০
(মাঝারি) একটি অনুমানের prior odds ১ : ৯. একটি প্রমাণের likelihood ratio (অনুমানের পক্ষে) ৩. প্রমাণের পর অনুমানটির সম্ভাবনা কত?
- ০.৭৫
- ০.৩০
- ০.৩৩
- ০.২৫
(কঠিন) একটি পণ্য নিয়ে দুটি নেতিবাচক review এসেছে, কিন্তু দ্বিতীয়টি প্রথমটির হুবহু কপি, অন্য অ্যাকাউন্ট থেকে। একজন analyst দুটিকে স্বাধীন প্রমাণ ধরে Bayes দিয়ে পরপর দুবার হালনাগাদ করলেন। ফলাফল সম্পর্কে কোনটি সবচেয়ে সঠিক?
- ফল ঠিক আছে, শুধু ক্রম উল্টালে বদলাবে
- Posterior প্রকৃত মানের চেয়ে কম আসবে
- একই প্রমাণ দুবার গোনায় posterior বেশি আত্মবিশ্বাসী হবে
- Prior বড় করলেই ভুল শুধরে যাবে
(মাঝারি) একটি নতুন পণ্যের ফেরতের হার θ-এর prior সমতল Beta(1, 1). ২০টি অর্ডারে ৬টি ফেরত এসেছে। Posterior আর তার গড় কত?
- Beta(7, 15), গড় প্রায় ০.৩১৮
- Beta(6, 14), গড় ০.৩০
- Beta(15, 7), গড় প্রায় ০.৬৮২
- Beta(7, 21), গড় ০.২৫
(সহজ) একটি Markov decision process (MDP) বর্ণনা করতে নিচের কোনটি লাগে না?
- Transition সম্ভাবনা P(s′ | s, a)
- প্রতিটি state-এর জন্য সঠিক action-এর label-সহ training ডেটা
- Reward function
- Discount factor γ
(সহজ) Naive Bayes classifier-এর “naive” অনুমানটি বাংলা SMS-এর ক্ষেত্রে আসলে কী বলে?
- spam আর ham-এর prior সমান
- শ্রেণি জানা থাকলে শব্দগুলো পরস্পর স্বাধীন
- শ্রেণি না জেনেও সব শব্দ পরস্পর স্বাধীন
- বার্তায় শব্দের ক্রম অনুযায়ী সম্ভাবনা গোনা হয়
(মাঝারি) একটি multinomial Naive Bayes-এ ham শ্রেণিতে মোট ৫০টি token, আর vocabulary-তে ৫০টি আলাদা শব্দ। “কুপন” শব্দটি ham-এ ৪ বার এসেছে। Laplace (add-one) smoothing-এ P(কুপন | ham) কত?
- ০.০৫
- ০.০৮
- ০.০৪
- প্রায় ০.০৯৮
(মাঝারি) নিচের Python কোড কী ছাপবে?
import math
p = [0.01] * 200
prod = 1.0
for x in p: prod *= x
print(prod, round(sum(math.log(x) for x in p), 1))
- 1e-400 -921.0
- 0.0 921.0
- 0.0 -921.0
- OverflowError
(কঠিন) চারটি হ্যাঁ/না চলক নিয়ে একটি Bayesian network: A আর B-এর কোনো parent নেই, C-এর parent A ও B, আর D-এর parent C. CPT-গুলোতে মোট কতটি স্বাধীন সংখ্যা লাগে, আর পুরো joint table-এ কতটি লাগত?
- ৮ আর ১৫
- ৪ আর ১৬
- ৮ আর ১৬
- ১৬ আর ১৫
(মাঝারি) একটি Bayesian network-এ তীর Complaint ← Late → BadReview (fork). অর্ডার দেরি হয়েছে কি না (Late) জানা আছে। এখন Complaint আর BadReview-এর সম্পর্ক কী?
- সবসময় নির্ভরশীল, কারণ একই কারণ থেকে আসে
- Late জানলে তারা নির্ভরশীল হয়ে যায়
- Late জানা থাকলে তারা শর্তসাপেক্ষে স্বাধীন
- Complaint সরাসরি BadReview ঘটায়
(কঠিন) বৃষ্টি আর রাইডার সংকট পরস্পর স্বাধীন, আর দুটিই অর্ডার দেরির কারণ (Rain → Late ← Shortage). একটি অর্ডার দেরি হয়েছে জানার পর খবর এল, সেদিন রাইডার সংকট ছিল। বৃষ্টি হওয়ার সম্ভাবনা কী হবে?
- একই থাকবে, কারণ বৃষ্টি আর সংকট স্বাধীন
- বাড়বে, কারণ দুটি খারাপ খবর একসাথে আসে
- শূন্য হয়ে যাবে
- কমবে, কারণ সংকটই দেরির ব্যাখ্যা দিয়ে দেয়
(মাঝারি) একটি Markov chain-এর transition matrix-এর প্রতিটি সারি এখনকার অবস্থা। নিচের NumPy কোড কী ছাপবে?
import numpy as np
P = np.array([[0.8, 0.2], [0.3, 0.7]])
v = np.array([0.5, 0.5])
print(v @ P)
- [0.5 0.5]
- [[0.4 0.1] [0.15 0.35]]
- [0.8 0.2]
- [0.55 0.45]
(মাঝারি) একটি Markov chain-এ P = [[0.6, 0.4], [0.2, 0.8]] (সারি = এখনকার অবস্থা)। অবস্থা ১ থেকে শুরু করলে ঠিক ২ ধাপ পরে আবার অবস্থা ১-এ থাকার সম্ভাবনা কত?
- ০.৩৬
- ০.৪৪
- ০.৬০
- ০.৫২
(সহজ) একটি HMM-এ রাস্তার আসল ট্রাফিক (ফাঁকা, ভারী, জ্যাম) সরাসরি জানা যায় না; জানা যায় শুধু প্রতিটি ডেলিভারির সময় (দ্রুত, মাঝারি, দেরি)। এখানে কোনটি কী?
- ডেলিভারির সময় লুকানো অবস্থা, ট্রাফিক observation
- দুটিই observation, কিছু লুকানো নেই
- ট্রাফিকের বদল emission, ডেলিভারির সময় transition
- ট্রাফিক লুকানো অবস্থা, ডেলিভারির সময় observation
(মাঝারি) একটি HMM-এ দেখা ডেলিভারি-সময়ের ক্রম থেকে সবচেয়ে সম্ভাব্য লুকানো ট্রাফিক-অবস্থার একটি পুরো ক্রম বের করতে হবে। কোন algorithm?
- Forward algorithm
- Viterbi algorithm
- Baum–Welch
- Value iteration
(মাঝারি) বিকল্প A: ৫০% সম্ভাবনায় ০ টাকা, ৫০% সম্ভাবনায় ৩,৬০০ টাকা। বিকল্প B: নিশ্চিত ১,০০০ টাকা। একজনের utility U(x) = √x. Expected utility অনুযায়ী তিনি কোনটি বাছবেন?
- A, কারণ তার expected value ১,৮০০ টাকা
- A, কারণ √১৮০০ ≈ ৪২.৪ > ৩১.৬
- দুটিতে তিনি উদাসীন
- B, কারণ √১০০০ ≈ ৩১.৬ > ৩০
(মাঝারি) একটি MDP-তে γ = ০.৮. একটি agent পরপর তিন ধাপে reward ৫, ৫ আর ৫ পায় (প্রথমটি এখনই, γ⁰ = ১). মোট discounted return কত?
- ১৫
- ৯.৭৬
- ১২.২
- ৯
(মাঝারি) ঈদের মজুতের সিদ্ধান্তে তথ্য ছাড়া সেরা expected লাভ ৪২,০০০ টাকা। চাহিদা আগে নিশ্চিতভাবে জানা গেলে প্রত্যাশিত লাভ হতো ৫০,০০০ টাকা। একটি নিখুঁত পূর্বাভাসের জন্য সর্বোচ্চ কত টাকা দেওয়া যুক্তিসংগত?
- ৮,০০০ টাকা
- ৫০,০০০ টাকা
- ৪২,০০০ টাকা
- ০ টাকা, তথ্যের কোনো দাম নেই
মডিউল ১০ — ডেটা থেকে শেখা (১৮টি প্রশ্ন)
শেখার ধরন, ডেটা ভাগ ও leakage, k-NN, linear আর logistic regression, metric আর overfitting. নম্বর বেশি হারায় validation আর test-এর কাজ গুলিয়ে ফেলায়, ভাগের আগে scaling-এ, অসম ডেটায় accuracy-তে ভরসা করায় আর F1-কে সাধারণ গড় ভাবায়। ঝালিয়ে নিন পর্ব ৫৬, পর্ব ৬০ আর পর্ব ৬১.
- পর্ব ৫৫ · যন্ত্র কীভাবে শেখে আর পর্ব ৫৬ · Train, validation আর test — supervised learning, reinforcement learning, hyperparameter, validation set, data leakage
- পর্ব ৫৭ · k-Nearest Neighbors, পর্ব ৫৮ · Linear regression আর পর্ব ৫৯ · Logistic regression — k-NN, feature scaling, normal equations, sigmoid
- পর্ব ৬০ · মূল্যায়ন আর পর্ব ৬১ · Overfitting, bias আর variance — confusion matrix, F1, accuracy paradox, AUC, bias–variance, learning curve, Lasso
(সহজ) বাজারঘরের তিনটি কাজ: (ক) পুরোনো অর্ডারের আসল ডেলিভারি-মিনিট দেখে নতুন অর্ডারের মিনিট অনুমান, (খ) কোনো label ছাড়া ক্রেতাদের কেনার ধরন অনুযায়ী দলে ভাগ, (গ) একটি রাইডার-রুট agent চেষ্টা আর পুরস্কার থেকে ভালো রুট শেখে। এগুলো যথাক্রমে কোন ধরনের শেখা?
- supervised, unsupervised, reinforcement
- supervised, supervised, unsupervised
- unsupervised, supervised, reinforcement
- supervised, unsupervised, supervised
(সহজ) একটি k-NN classifier আর একটি linear regression model-এর মধ্যে কোনটি hyperparameter, অর্থাৎ training-এর আগে মানুষ ঠিক করে?
- Linear regression-এর ওজন w
- Linear regression-এর intercept b
- k-NN-এ রাখা training বিন্দুগুলো
- k-NN-এর প্রতিবেশীর সংখ্যা k
(সহজ) Train, validation আর test, এই তিন ভাগের মধ্যে কোনটি দিয়ে model আর hyperparameter বাছা হয়, আর কোনটি একেবারে শেষে একবার?
- Test দিয়ে বাছাই, validation শেষে একবার
- Validation দিয়ে বাছাই, test শেষে একবার
- Train দিয়ে বাছাই, test শেষে একবার
- দুটিই বারবার ব্যবহার করা যায়, পার্থক্য শুধু নামে
(মাঝারি) scikit-learn 1.8-এ নিচের কোড কী ছাপবে?
import numpy as np
from sklearn.model_selection import train_test_split
y = np.array([1] * 120 + [0] * 1080)
X = np.arange(1200).reshape(-1, 1)
_, _, _, y_te = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=0)
print(len(y_te), y_te.sum())
- 240 120
- 240 30
- 960 96
- 240 24
(মাঝারি) একজন analyst পুরো ডেটায় StandardScaler().fit_transform(X) চালিয়ে তারপর train আর test-এ ভাগ করলেন, আর test score রিপোর্ট করলেন। এর মূল সমস্যা আর সঠিক সমাধান কোনটি?
- Test-এর তথ্য scaler-এ ঢুকেছে; ভাগ আগে, Pipeline-এ scaler পরে
- Scaling পুরোপুরি বাদ দেওয়া
- কোনো সমস্যা নেই, শুধু একটু ধীর
- Train আর test-এ আলাদা আলাদা scaler fit করা
(কঠিন) দৈনিক বিক্রির পূর্বাভাসের জন্য ৮ দিনের ডেটা। নিচের কোড কী ছাপবে?
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
days = np.arange(1, 9)
for tr, te in TimeSeriesSplit(n_splits=3).split(days):
print(days[tr], days[te])
break
- [3 4 5 6 7 8] [1 2]
- [1 2] [3 4]
- [1 2 3 4 5 6] [7 8]
- [1 3 5 7] [2 4]
(মাঝারি) একটি query থেকে পাঁচটি training বিন্দুর দূরত্ব ও শ্রেণি, কাছ থেকে দূরে: 0.5 (A), 1.2 (B), 1.4 (B), 2.0 (A), 2.2 (A). ওজনহীন ভোটে k = 1, 3 আর 5-এ k-NN-এর উত্তর কী?
- A, A, A
- B, B, A
- A, B, A
- A, B, B
(মাঝারি) গ্রাহকের দুটি feature: অর্ডার সংখ্যা (0–8) আর গড় ঝুড়ি (200–3000 টাকা). Query গ্রাহক (2, 1000). P = (8, 1000) আর Q = (2, 1100). Scaling ছাড়া Euclidean দূরত্বে কোনটি কাছের প্রতিবেশী, আর কেন এটি সমস্যা?
- P, কারণ দূরত্ব ৬ বনাম ১০০; টাকার feature দূরত্ব দখল করেছে
- Q, কারণ তার অর্ডার সংখ্যা হুবহু এক
- দুটি সমান দূরে
- Scaling ছাড়া k-NN চলেই না, error দেয়
(সহজ) তিনটি অর্ডারের আসল ডেলিভারি-ঘণ্টা y = (3, 5, 7), আর একটি model-এর অনুমান ŷ = (2, 5, 9). Mean squared error (MSE) কত?
- −০.৩৩
- ১.০
- ৫.০
- প্রায় ১.৬৭
(কঠিন) Design matrix-এর প্রথম কলাম intercept-এর জন্য সব 1. NumPy 2-এ নিচের কোড কী ছাপবে?
import numpy as np
X = np.array([[1, 0], [1, 1], [1, 2]], dtype=float)
y = np.array([1, 3, 5], dtype=float)
w, *_ = np.linalg.lstsq(X, y)
print(np.round(w, 3))
- [2. 1.]
- [0. 2.]
- [1. 2.]
- LinAlgError
(মাঝারি) একটি logistic regression model একটি অর্ডারের জন্য z = 2 দিয়েছে। σ(z) = 1 ÷ (1 + e−z). Threshold 0.9 হলে সিদ্ধান্ত কী?
- ফেরত, কারণ z = 2 > 0.9
- ফেরত নয়, কারণ σ(2) ≈ 0.881 < 0.9
- ফেরত, কারণ σ(2) > 0.5
- ফেরত, কারণ σ(2) ≈ 0.98
(মাঝারি) scikit-learn 1.8-এ শুধু LogisticRegression() লিখে fit করলে model কী করে?
- C = 1.0-এর L2 regularization-সহ log loss কমায়
- L1 regularization দিয়ে অনেক ওজন শূন্য করে
- শুধু log loss কমায়, কোনো regularization নেই
- Mean squared error কমায়
(মাঝারি) একটি ভুয়া-অর্ডার detector-এর test confusion matrix (ভুয়া = positive): TN = 880, FP = 40, FN = 20, TP = 60. F1 score কত?
- ০.৬০
- ০.৬৭৫
- প্রায় ০.৬৬৭
- ০.৯৪
(সহজ) ৫০০টি অর্ডারের ৫টি ভুয়া। একটি “model” সব অর্ডারকে সৎ বলে, আর তার accuracy ০.৯৯. কোন মাপটি এক নজরে দেখাবে যে model আসলে কিছুই ধরছে না?
- Accuracy আরও দশমিক পর্যন্ত দেখা
- Specificity
- Training set-এর accuracy
- ভুয়া শ্রেণির recall
(মাঝারি) নিচের কোড কী ছাপবে?
from sklearn.metrics import roc_auc_score
print(roc_auc_score([0, 0, 1, 1], [0.1, 0.4, 0.35, 0.8]))
- 0.75
- 1.0
- 0.5
- 0.25
(মাঝারি) একটি বিন্দুতে একটি model-এর bias² = ৪, variance = ৬, আর noise-এর variance σ² = ১০. বর্গ-ভুলের bias–variance decomposition অনুযায়ী সেখানে নতুন পর্যবেক্ষণের প্রত্যাশিত বর্গ-ভুল কত, আর কোন অংশ কোনো model কমাতে পারে না?
- ১০; bias² কমানো যায় না
- ৩২; variance কমানো যায় না
- ২০; variance কমানো যায় না
- ২০; noise σ² কমানো যায় না
(কঠিন) একটি learning curve-এ training ডেটা ১০০ থেকে ২,০০০-এ বাড়ালে train MSE ৩ থেকে ধীরে ধীরে ১২-তে ওঠে, আর validation MSE ৬০ থেকে নেমে ২০-এ আসে; দুটির ফাঁক তখনো কমছে। Noise-এর আন্দাজ প্রায় ১০. সবচেয়ে যুক্তিসংগত পদক্ষেপ কোনটি?
- Model আরও জটিল করা, কারণ underfitting
- Train MSE বাড়ছে, তাই কোডে bug খোঁজা
- আরও ডেটা জোগাড় বা regularization বাড়ানো
- আর কিছু করার নেই, noise-এর সীমায় পৌঁছেছে
(মাঝারি) Ridge (L2) আর Lasso (L1) regularization-এর আচরণে মূল পার্থক্য কোনটি?
- Ridge অনেক ওজন ঠিক শূন্য করে; Lasso শুধু ছোট করে
- Lasso অনেক ওজন ঠিক শূন্য করে; Ridge ছোট করে, সাধারণত শূন্য নয়
- Ridge ওজন বড় করে, Lasso ছোট করে
- দুটিই test ডেটা দেখে ওজন ঠিক করে
৭ · মডিউল ১১ ও ১২ — scikit-learn-এর কাজের ধারা আর আধুনিক AI (৩৬টি প্রশ্ন)
মডিউল ১১ — scikit-learn আর পুরো কাজের ধারা (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে কাজের ক্রম থেকে: কখন test আলাদা করবেন, কোন রূপান্তর কী শেখে, pipeline-এর ভেতরে কোন ডাক কখন, আর একটি search-এ কতবার fit হয়। নম্বর বেশি হারায় পুরো ডেটায় scaler বা encoder fit করায়, handle_unknown ভুলে যাওয়ায়, refit-এর একটি fit না গোনায় আর বাংলা লেখার অদৃশ্য পার্থক্যে। ঝালিয়ে নিন পর্ব ৬২, পর্ব ৬৪ আর পর্ব ৬৬.
- পর্ব ৬২ · Exploratory data analysis আর পর্ব ৬৩ · Feature engineering — EDA, target leakage, robust scaling, one-hot encoding, target encoding
- পর্ব ৬৪ · scikit-learn pipeline আর পর্ব ৬৫ · Clustering আর PCA — Pipeline, ColumnTransformer, joblib, k-means, DBSCAN, explained variance ratio
- পর্ব ৬৬ · Model বাছাই আর পর্ব ৬৭ · বাংলা লেখার ডেটা — grid search, stratified k-fold, TF-IDF, NFC
(সহজ) বাজারঘরের ১৮ মাসের অর্ডার থেকে একটি model ভবিষ্যতের অর্ডারের ডেলিভারি দেরি হবে কি না অনুমান করবে। EDA শুরুর আগে প্রথম কাজ কোনটি?
- শেষ কয়েক মাসের অর্ডার test হিসেবে আলাদা করে তালাবন্ধ রাখা
- পুরো ডেটায়
describe()চালিয়ে সব কলামের গড় দেখা - ফাঁকা ঘরওয়ালা সব সারি মুছে ফেলা
- একটি model train করে দেখা কোন feature গুরুত্বপূর্ণ
(মাঝারি) ফেরতের model অর্ডারের মুহূর্তেই অনুমান করবে। EDA-তে দেখা গেল pickup_date (ফেরত পণ্য তুলে আনার তারিখ) ফাঁকা কি না, শুধু এটুকু দিয়েই ফেরত আর না-ফেরত অর্ডার প্রায় নিখুঁত আলাদা হয়। কী করা উচিত?
- কলামটি StandardScaler দিয়ে scale করে রাখা
- কলামটি বাদ দেওয়া, কারণ এর মান জানা যায় ফেরতের পরে; এটি target leakage
- ফাঁকা ঘরগুলো median দিয়ে ভরে রেখে দেওয়া
- সবচেয়ে শক্তিশালী feature হিসেবে রেখে দেওয়া
(মাঝারি) পাঁচটি অর্ডারের দাম, যার একটি অনেক বড়। RobustScaler-এর পর কী ছাপা হবে? (scikit-learn 1.8)
import numpy as np
from sklearn.preprocessing import RobustScaler
X = np.array([[50], [100], [150], [200], [1000]])
print(np.round(RobustScaler().fit_transform(X).ravel(), 2))
- [-1. -0.5 0. 0.5 8.5]
- [-0.71 -0.57 -0.42 -0.28 1.98]
- [-1. -0.5 0. 0.5 1. ]
- [0. 0.05 0.11 0.16 1. ]
(মাঝারি) Train-এ পরিশোধের তিন ধরন ছিল, prediction-এ এল নতুন “voucher”. নিচের কোড কী ছাপবে? (scikit-learn 1.8)
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
enc.fit([["cod"], ["bkash"], ["card"], ["cod"]])
print(enc.transform([["voucher"], ["card"]]).tolist())
- [[0.0, 0.0, 1.0], [0.0, 1.0, 0.0]]
- ValueError: Found unknown categories ['voucher']
- [[0.0, 0.0, 0.0, 1.0], [0.0, 1.0, 0.0, 0.0]]
- [[0.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
(সহজ) নিচের কোন রূপান্তর ডেটা থেকে কিছু শেখে, তাই শুধু train অংশে fit করতে হয়?
- ঘণ্টা থেকে sin আর cos বানানো
- np.log1p দিয়ে দামের log
- প্রতিটি রিভিউয়ের অক্ষর গোনা
- StandardScaler, যা গড় আর standard deviation হিসাব করে
(কঠিন) ঘণ্টা h-কে (sin(2πh/24), cos(2πh/24)) জোড়ায় রাখা হলো। রাত ১১টা (h = 23) আর মাঝরাত (h = 0)-এর মধ্যে Euclidean দূরত্ব প্রায় কত, আর কাঁচা ঘণ্টায় পার্থক্য কত?
- দুটিই 23
- প্রায় 0.261 আর 1
- প্রায় 0.261 আর 23
- প্রায় 2 আর 23
(কঠিন) প্রায় প্রতিটি মান একবার-দুবার আসে এমন customer_id কলামে কেউ পুরো train-এর ফেরতের গড় দিয়ে target encoding করলেন, প্রতিটি সারির নিজের label-সহ। Train AUC 0.96, test AUC 0.65. সবচেয়ে ভালো ব্যাখ্যা আর প্রতিকার কোনটি?
- Model underfit করছে, আরও জটিল model দরকার
- Test set ছোট, তাই AUC এলোমেলো; কিছু করার নেই
- ID কলামটি one-hot করলে সমস্যা মিটে যাবে
- Encoding নিজের সারির উত্তর দেখে ফেলেছে; cross-fitting করা TargetEncoder বা কলামটি বাদ দেওয়া
(সহজ) pipe = Pipeline([('imp', SimpleImputer()), ('sc', StandardScaler()), ('clf', LogisticRegression())]) আগেই train-এ fit করা আছে। এখন pipe.predict(X_new) ডাকলে ভেতরে কোন ক্রমে কী চলে?
- imp.fit_transform, sc.fit_transform, clf.predict
- শুধু clf.predict, কাঁচা X_new দিয়ে
- imp.transform, sc.transform, clf.predict
- সব ধাপ আবার fit, তারপর predict
(কঠিন) নিচের কোড কী ছাপবে, আর GridSearchCV-তে logistic regression-এর C বদলাতে param_grid-এর key কী হবে?
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = make_pipeline(StandardScaler(), LogisticRegression())
print(list(pipe.named_steps))
- ['standardscaler', 'logisticregression'] আর key 'logisticregression__C'
- ['StandardScaler', 'LogisticRegression'] আর key 'LogisticRegression.C'
- ['step0', 'step1'] আর key 'C'
- ['scaler', 'clf'] আর key 'clf__C'
(মাঝারি) নিচের কোড কী ছাপবে? (pandas 3, scikit-learn 1.8)
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
df = pd.DataFrame({
"price": [1200.0, 450.0, 3000.0, 800.0],
"items": [2, 1, 5, 1],
"district": ["Dhaka", "Sylhet", "Khulna", "Dhaka"],
"note": ["a", "b", "c", "d"],
})
ct = ColumnTransformer([
("num", StandardScaler(), ["price", "items"]),
("cat", OneHotEncoder(), ["district"]),
])
print(ct.fit_transform(df).shape)
- (4, 6)
- (4, 4)
- (4, 5)
- (4, 9)
(মাঝারি) scikit-learn 1.8-এ বানানো একটি pipeline joblib.dump দিয়ে রাখা হয়েছে। দলের একজন সেটি অন্য server-এ, পুরোনো একটি scikit-learn version-এ load করতে চান। সবচেয়ে সঠিক পরামর্শ কোনটি?
- joblib ফাইল version-নিরপেক্ষ, যেকোনো version-এ একই ফল দেয়
- ফাইলটি CSV-তে রূপান্তর করে পাঠানো
- Load করে warning এলে তা বন্ধ করে দেওয়া
- একই scikit-learn version pin করে খোলা, আর শুধু নিজের বা বিশ্বস্ত উৎসের ফাইল load করা
(মাঝারি) এক মাত্রার পাঁচটি বিন্দু 1, 3, 9, 11, 12; k = 2, শুরুর কেন্দ্র c1 = 1, c2 = 3. k-means-এর একটি assign আর একটি update ধাপের পর কেন্দ্র দুটি কত?
- c1 = 2, c2 ≈ 10.67
- c1 = 1, c2 = 3, কেন্দ্র বদলায় না
- c1 = 1, c2 = 8.75
- c1 = c2 = 7.2
(সহজ) চারটি scale করা কলামের covariance matrix-এর eigenvalue 5, 3, 1 আর 1. প্রথম দুটি principal component মিলে মোট variance-এর কত ভাগ ধরে?
- 80%
- 90%
- 50%
- 100%
(সহজ) বাজারঘরের ডেলিভারি ঠিকানার মানচিত্রে ঘন জায়গাগুলো বাঁকা, লম্বাটে আকারের, আর কিছু ঠিকানা একেবারে একা। কয়টি দল, তা আগে জানা নেই। কোন পদ্ধতি সবচেয়ে মানানসই?
- Ward linkage-এর agglomerative clustering, ৩টি দল
- DBSCAN
- PCA
- k-means, k = 3
(মাঝারি) একটি GridSearchCV-তে param_grid = {'clf__C': [0.1, 1, 10, 100], 'clf__class_weight': [None, 'balanced']}, cv=5, refit=True. মোট কতবার model fit হয়?
- 8
- 41
- 30
- 40
(মাঝারি) ১০০টি অর্ডারের মধ্যে ৫টি ফেরত। নিচের কোড কী ছাপবে? (scikit-learn 1.8)
import numpy as np
from sklearn.model_selection import StratifiedKFold
y = np.array([1] * 5 + [0] * 95)
X = np.zeros((100, 1))
skf = StratifiedKFold(n_splits=5)
print([int(y[te].sum()) for tr, te in skf.split(X, y)])
- [5, 0, 0, 0, 0]
- ValueError, কারণ ফেরতের সংখ্যা খুব কম
- [2, 1, 1, 1, 0]
- [1, 1, 1, 1, 1]
(মাঝারি) চারটি রিভিউয়ের একটি সংগ্রহে (n = 4) “ফেরত” শব্দটি শুধু একটি রিভিউতে আছে। scikit-learn-এর smooth_idf=True সূত্র idf = ln((1 + n)/(1 + df)) + 1 অনুযায়ী তার idf প্রায় কত?
- 2.386
- 1.916
- 0.916
- 1.0
(কঠিন) দুটি রিভিউ: “নতুন শাড়ি”, কিন্তু একটিতে ড় একক অক্ষর (U+09DC), অন্যটিতে ড আর nukta (U+09A1 U+09BC); পর্দায় হুবহু এক। কোনো normalization ছাড়া TfidfVectorizer(token_pattern=r'\S+') এই দুটিতে fit করলে vocabulary-তে কয়টি শব্দ থাকবে?
- 1
- 4
- 3; প্রতিকার আগে NFC normalization
- 2, কারণ TfidfVectorizer নিজেই Unicode normalize করে
মডিউল ১২ — আধুনিক AI: neural network, embedding, LLM আর pretrained model (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে neuron-এর হিসাব, স্তরের shape আর parameter গোনা, gradient-এর একটি ধাপ, cosine মিল, temperature আর context window থেকে, সঙ্গে pretrained model চালানোর ব্যবহারিক নিয়ম। নম্বর বেশি হারায় bias গুনতে ভুলে, gradient-এর চিহ্নে, softmax-এ exp বাদ দিয়ে আর “সাবলীল মানেই সত্য” ভাবায়। ঝালিয়ে নিন পর্ব ৬৮, পর্ব ৬৯, পর্ব ৭০ আর পর্ব ৭১.
- পর্ব ৬৮ · Neural network-এর ধারণা — perceptron, XOR, activation function, MLP, backpropagation, vanishing gradient
- পর্ব ৬৯ · Embedding আর vector search আর পর্ব ৭০ · LLM কীভাবে কাজ করে — embedding, cosine similarity, next-token prediction, temperature, context window, hallucination
- পর্ব ৭১ · Pretrained model ব্যবহার — transfer learning, model card, safetensors, Hugging Face Hub
(সহজ) একটি neuron-এর weight w = (2, −1), bias b = 0.5, আর activation হলো step: s = w·x + b > 0 হলে output 1, নইলে 0. Input x = (1, 3) হলে output কত?
- −0.5
- 1
- 0.5
- 0
(মাঝারি) একটি perceptron-এর w = (0, 1), b = 0, learning rate η = 1; নিয়ম “s = w·x + b > 0 হলে output 1”. উদাহরণ x = (1, 0), সঠিক উত্তর t = 1. Perceptron rule (w ← w + η(t − y)x, b ← b + η(t − y)) প্রয়োগের পর w আর b কত?
- w = (1, 1), b = 1
- w = (0, 1), b = 0, কিছু বদলায় না
- w = (1, 2), b = 1
- w = (−1, 1), b = −1
(সহজ) একটি মাত্র perceptron AND শিখতে পারে, কিন্তু XOR কখনো শেখে না, যত epoch-ই চালানো হোক। মূল কারণ কী?
- উদাহরণ মাত্র চারটি, ডেটা খুব কম
- XOR linearly separable নয়
- Learning rate খুব ছোট
- Step-এর বদলে sigmoid দিলেই শিখবে
(মাঝারি) একটি MLP-এ 784টি input, 128টি unit-এর একটি hidden layer আর 10টি output, প্রতিটি স্তরে bias সহ। মোট শেখার যোগ্য parameter কতটি?
- 101,632
- 101,770
- 1,003,520
- 100,480
(মাঝারি) ৩২টি উদাহরণের একটি mini-batch একটি ছোট network-এ যাচ্ছে। নিচের কোড কী ছাপবে? (NumPy 2)
import numpy as np
rng = np.random.default_rng(0)
X = rng.normal(size=(32, 64))
W1, b1 = rng.normal(size=(64, 16)), np.zeros(16)
W2, b2 = rng.normal(size=(16, 3)), np.zeros(3)
H = np.maximum(0, X @ W1 + b1)
print(H.shape, (H @ W2 + b2).shape)
- (64, 16) (16, 3)
- (16, 32) (3, 32)
- ValueError, কারণ b1-এর shape (16,) যোগ করা যায় না
- (32, 16) (32, 3)
(কঠিন) Sigmoid-এর derivative σ′(z) = σ(z)(1 − σ(z)). দশটি sigmoid স্তরের একটি network-এ পেছনে যাওয়ার পথে প্রতিটি স্তরে অন্তত এই একটি গুণক আসে। প্রথম স্তরে পৌঁছানো gradient-এ এই গুণকগুলোর গুণফল সর্বোচ্চ কত হতে পারে, আর এর নাম কী?
- 2.5; exploding gradient
- 0.25; প্রতিটি স্তরে একই থাকে
- প্রায় 9.5 × 10−7; vanishing gradient
- 1; কোনো সমস্যা নেই
(মাঝারি) Neural network-এর প্রশিক্ষণে backpropagation আসলে কী কাজ করে?
- Chain rule দিয়ে loss থেকে পেছনে গিয়ে সব weight-এর gradient হিসাব করে
- ভুল output-কে input-এ ফেরত পাঠিয়ে ডেটা ঠিক করে
- প্রতিটি weight একটু নেড়ে loss কতটা বদলায় তা আলাদা আলাদা মাপে
- মস্তিষ্কের neuron যেভাবে শেখে, হুবহু সেভাবে শেখায়
(মাঝারি) Loss L = (wx − y)2, যেখানে x = 2, y = 3, এখন w = 1, learning rate 0.1. Gradient descent-এর একটি ধাপের পর w কত?
- 0.6
- 1.4
- 1.2
- 1.5
(সহজ) দুটি রিভিউয়ের ছোট vector a = (1, 0, 1) আর b = (1, 1, 0). নিচের কোড কী ছাপবে?
import numpy as np
a = np.array([1, 0, 1]); b = np.array([1, 1, 0])
cos = a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(round(float(cos), 3))
- 0.0
- 0.5
- 0.707
- 1.0
(মাঝারি) চারটি নথির unit-length embedding আর একটি প্রশ্ন। নিচের কোড কোন দুটি নথির index ছাপবে? (NumPy 2)
import numpy as np
q = np.array([1.0, 0.0])
D = np.array([[0.6, 0.8], [1.0, 0.0], [0.0, 1.0], [0.8, 0.6]])
s = D @ q
print(np.argsort(-s)[:2])
- [1 0]
- [2 0]
- [3 1]
- [1 3]
(মাঝারি) ২,০০,০০০টি রিভিউ, প্রতিটির 768-মাত্রার float32 embedding. শুধু vector-গুলো memory-তে রাখতে কত লাগে? (1 MB = 106 byte)
- 614.4 MB
- 153.6 MB
- 1,228.8 MB
- প্রায় 4.9 GB
(সহজ) বাংলা রিভিউ খোঁজার জন্য intfloat/multilingual-e5-small embedding model বাছা হয়েছে। এর model card খোঁজার কাজে লেখাগুলোকে কীভাবে দিতে বলে?
- সব লেখা আগে ইংরেজিতে অনুবাদ করে দেওয়া
- Embedding কখনো normalize না করা
- প্রশ্নের আগে “query: ” আর নথির আগে “passage: ” জুড়ে দেওয়া
- সব লেখাকে ছোট হাতের অক্ষরে বদলানো
(কঠিন) পরের token-এর তিনটি logit (2, 1, 0). Temperature T = 0.5 দিয়ে sampling-এর সম্ভাবনা কী? নিচের কোড কী ছাপবে?
import numpy as np
def softmax(z):
e = np.exp(z - z.max())
return e / e.sum()
z = np.array([2.0, 1.0, 0.0])
print(np.round(softmax(z / 0.5), 3))
- [0.665 0.245 0.09 ]
- [0.667 0.333 0. ]
- [0.867 0.117 0.016]
- [0.506 0.307 0.186]
(সহজ) একটি LLM উত্তর লেখার প্রতিটি ধাপে আসলে কী তৈরি করে?
- পরের token-এর জন্য পুরো ভান্ডারের ওপর একটি সম্ভাবনা বণ্টন
- একটি database থেকে যাচাই করা সঠিক উত্তর
- পুরো উত্তর একবারে, একটি ধাপেই
- প্রশ্নের অর্থ বুঝে যুক্তি করে নেওয়া সিদ্ধান্ত
(কঠিন) একটি model-এর context window 8,192 token. System নির্দেশ 500, একটি বাংলা নীতির নথি 7,000 আর প্রশ্ন 200 token. উত্তরের জন্য সর্বোচ্চ কত token বাকি, আর লম্বা উত্তর দরকার হলে ভালো উপায় কী?
- 8,192, কারণ উত্তর context-এ গোনা হয় না
- 7,700
- 492; নথির প্রাসঙ্গিক অংশ বেছে দেওয়া
- সীমা নেই; model পুরোনো অংশ নিজে সংক্ষেপ করে মনে রাখে
(মাঝারি) বাজারঘরের একটি chatbot আত্মবিশ্বাসের সুরে বলল, “নীতির ধারা ৭.৩ অনুযায়ী ৬০ দিনে ফেরত দেওয়া যায়”, অথচ নীতিতে এমন কোনো ধারা নেই। এর সবচেয়ে সঠিক ব্যাখ্যা আর প্রতিকার কোনটি?
- Model ইচ্ছা করে মিথ্যা বলছে; তাকে সতর্ক করে দেওয়া
- Temperature 0 করলেই এমন ভুল বন্ধ হবে
- আরও বড় model নিলে এমন ভুল আর হবে না
- Hallucination; নীতির আসল অংশ উৎসসহ দিয়ে উত্তর মিলিয়ে দেখা
(মাঝারি) একটি pretrained embedding model-এর body freeze করে, তার 384-মাপের vector থেকে positive, neutral আর negative তিন শ্রেণির একটি linear head (bias সহ) শেখানো হলো। শেখার যোগ্য parameter কয়টি?
- 1,152
- 1,155
- 387
- পুরো model-এর সব parameter
(কঠিন) Hub-এর একটি অচেনা repository-তে শুধু pytorch_model.bin আছে। PyTorch 2.6 বা পরের version-এ torch.load করতেই “Weights only load failed” error এল। সবচেয়ে নিরাপদ পদক্ষেপ কোনটি?
- ফাইলের নাম বদলে
model.safetensorsকরে দেওয়া - Error মেনে weights_only=False দিয়ে খুলে নেওয়া
- PyTorch পুরোনো version-এ নামিয়ে খোলা
- weights_only=False না দিয়ে safetensors রূপ বা বিশ্বস্ত অন্য model খোঁজা
৮ · দায়িত্বশীল AI, ক্যাপস্টোন আর প্রকল্পের জীবনচক্র (৩৬টি প্রশ্ন)
মডিউল ১২ — দায়িত্বশীল AI-এর অভ্যাস: bias, গোপনীয়তা আর নথিপত্র (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে দলভিত্তিক মাপ, proxy, গোপনীয়তা, নথিপত্র আর deploy-এর পরের তত্ত্বাবধান থেকে। নম্বর বেশি হারায় demographic parity আর equal opportunity গুলিয়ে ফেলায়, অনুপাতের বদলে পার্থক্য হিসাব করায়, আর “নাম মুছলেই বেনামি” ভাবায়। ঝালিয়ে নিন পর্ব ৭২, সঙ্গে দায়ের প্রশ্নে পর্ব ০৬ আর লাইসেন্সের প্রশ্নে পর্ব ৭১.
- পর্ব ৭২ · দায়িত্বশীল AI-এর অভ্যাস — selection rate, demographic parity, equal opportunity, equalised odds, disparate impact, proxy
- পর্ব ৭২-এর গোপনীয়তা আর নথি — data minimisation, pseudonymisation, k-anonymity, differential privacy, model card, datasheet
- পর্ব ০৬ · বাস্তবে AI আর পর্ব ৭১ · Pretrained model ব্যবহার — automation bias, human-in-the-loop, label bias, incident response
(মাঝারি) বাজারঘরের “পরে টাকা দিন” model-এ দল ক-এর ২৫০টি আবেদনের ১৫০টি অনুমোদিত, দল খ-এর ২০০টির ৮৪টি। কম হারকে বেশি হার দিয়ে ভাগ করলে অনুপাত কত, আর চার-পঞ্চমাংশ নিয়মে কী ইঙ্গিত?
- ০.১৮; ফাঁক ছোট, তাই কোনো ইঙ্গিত নেই
- ১.৪৩; ১-এর বেশি, তাই ইঙ্গিত নেই
- ০.৭০; ০.৮-এর নিচে, তাই প্রাথমিক ইঙ্গিত আছে
- ০.৭০; ০.৫-এর ওপরে, তাই ইঙ্গিত নেই
(সহজ) Demographic parity কোন শর্ত চায়?
- যাঁরা সত্যিই যোগ্য, তাঁদের মধ্যে অনুমোদনের হার সমান
- সব দলে selection rate সমান, আসল ফল (y) যা-ই হোক
- একই score পেলে সব দলে সত্যি ভালো হওয়ার সম্ভাবনা সমান
- সব দলে মোট accuracy সমান
(মাঝারি) নিচের pandas 3 কোড কী ছাপবে?
import pandas as pd
df = pd.DataFrame({
"group": ["A", "A", "A", "A", "B", "B", "B", "B"],
"y": [1, 1, 0, 0, 1, 1, 1, 0],
"pred": [1, 1, 1, 0, 1, 0, 0, 0]})
tpr = df[df["y"] == 1].groupby("group")["pred"].mean()
print(tpr.round(2).to_dict())
- {'A': 0.75, 'B': 0.25}
- {'A': 0.5, 'B': 0.0}
- {'A': 1.0, 'B': 0.67}
- {'A': 1.0, 'B': 0.33}
(মাঝারি) Equalised odds আর equal opportunity-র মধ্যে পার্থক্য কী?
- Equal opportunity শুধু সমান TPR চায়; equalised odds সমান TPR আর সমান FPR দুটিই
- Equalised odds সমান selection rate চায়, equal opportunity সমান accuracy
- Equalised odds শুধু সমান TPR চায়; equal opportunity TPR আর FPR দুটিই
- কোনো পার্থক্য নেই, একই শর্তের দুটি নাম
(মাঝারি) একটি অনুমোদন model থেকে “জেলা” কলাম মুছে দেওয়া হলো। কিন্তু নদীচর জেলার প্রায় সব গ্রাহক area কোড ৫ বা ৬-এ থাকেন, অন্য জেলার প্রায় কেউ নন, আর area কোড feature হিসেবে রইল। দলভিত্তিক ফাঁক কেন প্রায় থেকেই গেল?
- কলামটি ঠিকমতো মোছা হয়নি
- Area কোড জেলার proxy হিসেবে কাজ করছে
- নমুনা খুব ছোট, ফাঁকটি কাকতালীয়
- Feature scaling না করায়
(কঠিন) দুই দলের base rate আলাদা, আর model নিখুঁত নয়। নিচের কোন কথাটি গাণিতিকভাবে সত্য?
- দুই দলে সমান PPV আর সমান FPR ও FNR একসঙ্গে রাখা যায় না
- Fairness অসম্ভব, তাই মাপার দরকার নেই
- শুধু demographic parity সবসময় রাখা যায়, বাকি সব অসম্ভব
- ভালো করে train করলে সব fairness সংজ্ঞা একসঙ্গে মানা যায়
(কঠিন) Chouldechova-র অভেদ: FPR = (p ÷ (1 − p)) × ((1 − PPV) ÷ PPV) × TPR, যেখানে p দলের base rate. একটি দলে p = ০.৫, PPV = ০.৮ আর TPR = ০.৮ হলে FPR কত?
- ০.২৫
- ০.৮০
- ০.২০
- প্রায় ০.০৬৭
(মাঝারি) গোপনীয়তার কারণে একজন প্রস্তাব দিলেন, ডেটাসেট থেকে protected attribute (যেমন জেলা) পুরোপুরি মুছে ফেলা হোক, মূল্যায়নের জন্যও রাখা হবে না। এর প্রধান সমস্যা কী?
- Model-এর train ধীর হয়ে যাবে
- কোনো সমস্যা নেই, এতে bias-ও চলে যাবে
- তখন দলভিত্তিক পক্ষপাত মাপাই যাবে না
- মোট accuracy আর মাপা যাবে না
(সহজ) “পরে টাকা দিন” সুবিধার ঝুঁকি-model-এর জন্য একজন প্রস্তাব দিলেন, গ্রাহকের ফোনের contact list আর সামাজিক মাধ্যমের প্রোফাইলও সংগ্রহ করা হোক, “পরে কাজে লাগতে পারে”। কোন নীতি এর বিরুদ্ধে যায়?
- Calibration
- Differential privacy
- k-anonymity
- Data minimisation
(সহজ) একটি অর্ডারের টেবিলে গ্রাহকের নামের বদলে “C-1042”-এর মতো কোড বসানো হলো; কোড থেকে নামের তালিকা বাজারঘরের কাছে আলাদা রাখা আছে। এটি কী?
- Anonymisation, তাই টেবিলটি আর ব্যক্তিগত ডেটা নয়
- Differential privacy
- Pseudonymisation; তালিকা বা অন্য তথ্য দিয়ে আবার চেনা সম্ভব
- Data minimisation
(মাঝারি) নিচের কোড একটি টেবিলের quasi-identifier (জেলা, বয়সের দল) ধরে k-anonymity মাপে। কী ছাপবে?
import pandas as pd
df = pd.DataFrame({
"district": ["ঢাকা", "ঢাকা", "ঢাকা", "খুলনা", "খুলনা", "সিলেট"],
"age": ["20-29", "20-29", "30-39", "20-29", "20-29", "30-39"]})
k = df.groupby(["district", "age"]).size().min()
print(k)
- 1
- 2
- 3
- 6
(কঠিন) লেবেল করতে বাইরে পাঠানোর আগে বাংলা রিভিউ থেকে ফোন নম্বর ঢাকতে নিচের Python কোড লেখা হলো। কী ছাপবে?
import re
text = "পণ্য পাইনি, ফোন দিন ০১৭১১২২৩৩৪৪ অথবা 01811223344"
masked = re.sub(r"[0-9]{11}", "<PHONE>", text)
print(masked)
- পণ্য পাইনি, ফোন দিন <PHONE> অথবা <PHONE>
- পণ্য পাইনি, ফোন দিন ০১৭১১২২৩৩৪৪ অথবা 01811223344
- UnicodeError
- পণ্য পাইনি, ফোন দিন ০১৭১১২২৩৩৪৪ অথবা <PHONE>
(কঠিন) একটি count (sensitivity ১) Laplace mechanism দিয়ে প্রকাশ করা হয়; শব্দের scale = sensitivity ÷ ε. ε ০.৫ থেকে কমিয়ে ০.২৫ করলে কী হয়?
- Scale ২ থেকে ১ হয়; ফল আরও নির্ভুল, গোপনীয়তাও বেশি
- Scale ২ থেকে ৪ হয়; গোপনীয়তা বাড়ে, গড় ভুল প্রায় দ্বিগুণ
- Scale ১৬ হয়
- Scale একই থাকে, শুধু budget বাঁচে
(সহজ) “Label কীভাবে তৈরি হয়েছে, কে সংগ্রহ করেছে, আর জানা সমস্যা কী (courier-এর দেরি গ্রাহকের দেরি হিসেবে লেখা)” — এই তথ্যের মূল জায়গা কোন নথি?
- শুধু model card
- ডেটাসেটের datasheet
- Incident note
- Lockfile
(মাঝারি) আপিলের পথে একজন কর্মী দিনে প্রায় ৫০০টি model-সিদ্ধান্ত দেখেন, আর তিন মাসে একবারও model-এর বিপরীতে যাননি। সবচেয়ে যুক্তিসংগত মূল্যায়ন কোনটি?
- Model নিখুঁত, তাই পর্যালোচনা বন্ধ করা যায়
- কর্মী বেশি, তাই নিয়মটি ঠিকই আছে
- সম্ভবত automation bias; তত্ত্বাবধান শুধু কাগজে, override-এর হার আর কাজের চাপ দেখা দরকার
- Model-এর threshold বাড়ানোই যথেষ্ট
(মাঝারি) একটি কেনা AI সেবা গ্রাহকের ঋণ-সুবিধা ভুলভাবে বাতিল করল। গ্রাহক অভিযোগ করলে দায় নিয়ে কোন অবস্থানটি সবচেয়ে যুক্তিসংগত?
- চালু করা প্রতিষ্ঠান দায় এড়াতে পারে না; আপিল, কারণ জানানো আর সংশোধন তার কাজ
- দায় model-এর, কারণ সিদ্ধান্ত model নিয়েছে
- দায় শুধু বিক্রেতা প্রতিষ্ঠানের
- Accuracy ৯৫% হলে কোনো দায় নেই
(সহজ) একটি sentiment model-এর card-এ licence-এর ঘর ফাঁকা, আর repository-তে কোনো LICENSE ফাইল নেই। বাজারঘর কি এটি ব্যবসায় ব্যবহার করতে পারে?
- না জেনে নয়; লাইসেন্স নেই মানে অনুমতি স্পষ্ট নয়, থেমে মালিক বা আইনজ্ঞের কাছে জানা দরকার
- হ্যাঁ, Hub-এ সবার জন্য খোলা, তাই ব্যবহার করা যায়
- হ্যাঁ, model-এর নাম উল্লেখ করলেই চলবে
- হ্যাঁ, যদি ওজন নিজের সার্ভারে রাখা হয়
(কঠিন) একটি অনুমোদন model-এর label “courier-এর টাকা জমার তারিখ সাত দিনের মধ্যে কি না” থেকে তৈরি, আর একটি জেলায় courier নিয়মিত দেরি করেন। মূল কারণ সারাতে কোন প্রতিকার সবচেয়ে সরাসরি?
- ওই জেলার জন্য আলাদা, নিচু threshold
- জেলা কলাম মুছে ফেলা
- আরও জটিল model, যেমন বড় gradient boosting
- Label-এর উৎস ঠিক করা: গ্রাহক কখন টাকা পাঠালেন, তা দিয়ে দেরি মাপা
মডিউল ১৩ — ক্যাপস্টোন আর AI প্রকল্পের জীবনচক্র (১৮টি প্রশ্ন)
এখানে প্রশ্ন আসে প্রকল্পের ক্রম, সৎ baseline, test-এর ব্যবহার, ভুলের ময়নাতদন্ত, আর deploy-এর পরের নজরদারি থেকে। নম্বর বেশি হারায় test দেখে model বদলানোয়, data drift আর concept drift গুলিয়ে ফেলায়, আর “সব সমস্যায় ML” ভাবায়। ঝালিয়ে নিন পর্ব ৭৩ আর পর্ব ৭৪.
- পর্ব ৭৩ · ক্যাপস্টোন — বাংলা পণ্য-রিভিউ থেকে পূর্ণ AI প্রকল্প — baseline, near-duplicate, time-based split, error analysis, bootstrap, recall@k
- পর্ব ৭৪ · AI প্রকল্পের জীবনচক্র — impact × feasibility, PSI, data drift, concept drift, shadow deployment, canary release, decision log
(সহজ) একটি রিভিউ-classifier প্রকল্পে ডেটার একটি সারিও দেখার আগে লেখা হলো: কোন metric, কোন দুটি baseline ছাড়াতে হবে, আর কোন তারিখের পরের ডেটা test. এত আগে লেখার মূল কারণ কী?
- ফল দেখে নিয়ম বদলানোর লোভ ঠেকাতে
- কোড দ্রুত চালানোর জন্য
- scikit-learn-এ fit-এর আগে এটি বাধ্যতামূলক
- কম ডেটায় কাজ সারতে
(মাঝারি) রিভিউয়ের ডেটায় প্রায় একই লেখার জোড়া খোঁজা হচ্ছে (অক্ষরের TF-IDF-এ cosine ≥ ০.৮৫)। নিচের কোন জোড়াকে near-duplicate হিসেবে বাদ দেওয়া সবচেয়ে যুক্তিসংগত?
- একই গ্রাহকের প্রায় একই দুটি রিভিউ, cosine ০.৯৬, এক সপ্তাহ ব্যবধানে
- দুজন আলাদা গ্রাহকের দুটি ভিন্ন অভিযোগ, cosine ০.৪
- একই গ্রাহকের দুটি আলাদা পণ্যের রিভিউ, cosine ০.৩
- দুজন আলাদা গ্রাহকের “rider bhai khub vodro”
(মাঝারি) নিচের কোড কী ছাপবে? (ছোট উদাহরণ, ৬টি “neg” আর ৪টি “pos”)
from sklearn.dummy import DummyClassifier
from sklearn.metrics import f1_score
y = ["neg"] * 6 + ["pos"] * 4
X = [[0]] * 10
p = DummyClassifier(strategy="most_frequent").fit(X, y).predict(X)
print(round(f1_score(y, p, average="macro", zero_division=0), 3))
- nan
- 0.6
- 0.75
- 0.375
(মাঝারি) একটি issue-classifier-এর test-এ confusion matrix (সারি = আসল, কলাম = অনুমান, ক্রম delivery, none, quality) নিচে দেওয়া। quality শ্রেণির precision আর recall কত?
delivery none quality
delivery 28 8 0
none 0 30 2
quality 0 1 21
- precision ০.৯১৩, recall ০.৯৫৫
- precision ১.০০০, recall ০.৭৭৮
- precision ০.৯৫৫, recall ০.৯১৩
- দুটিই ০.৮৭৮
(মাঝারি) Error analysis-এর loop কোন অনুমানের ওপর চালানো উচিত?
- Test set-এর অনুমানে, কারণ সেটিই আসল ছবি
- পুরো train-এ fit করে একই train-এর অনুমানে
- Train-এর out-of-fold (cross_val_predict) অনুমানে
- AI assistant-এর বানানো নতুন উদাহরণে
(মাঝারি) একটি sentiment model-এর out-of-fold ভুল ১১টির ৭টিই Latin হরফে লেখা বাংলা (Banglish) রিভিউ, অথচ ডেটার প্রায় ৪০% Banglish. পরের সবচেয়ে কাজের পদক্ষেপ কোনটি?
- লিপি ধরে আলাদা মাপা, আর Banglish-এর জন্য ডেটা বা feature-এর লক্ষ্যভেদী চেষ্টা
- Banglish রিভিউ ডেটা থেকে বাদ দেওয়া
- Test খুলে দেখা Banglish-এ কেমন করে
- শুধু max_iter বাড়ানো
(মাঝারি) Test-এ ৩৬টি ডেলিভারি-অভিযোগ আছে; ডেলিভারির recall ০.৭৭৮, আর ২,০০০ বার bootstrap করে ৯৫% CI [০.৬৩৪, ০.৯১২]. রিপোর্টে কোন কথাটি সবচেয়ে সৎ?
- ডেলিভারির recall ০.৭৭৮, এটিই model-এর স্থির মান
- Recall ০.৭৭৮, তবে ৩৬টি উদাহরণে অনিশ্চয়তা বড়: মোটামুটি ০.৬৩–০.৯১
- Bootstrap ভুল পদ্ধতি, কারণ model একবারই train হয়েছে
- Recall প্রায় ০.৯১, CI-র ওপরের প্রান্ত দেখুন
(মাঝারি) Test একবার খোলার পর দেখা গেল ডেলিভারির recall CV-র চেয়ে কম। দলের একজন বললেন, “threshold-টা test দেখে একটু বদলে আবার test-এ মাপি, তারপর সেই ফল রিপোর্টে দিই।” কোনটি ঠিক পথ?
- প্রস্তাবটি ঠিক; test-এ মানই আসল
- প্রথম ফলটিই রিপোর্ট; বদল validation-এ, আর নতুন না-দেখা ডেটায় পরে মাপা
- Test-কে train-এ মিশিয়ে পুরো ডেটায় আবার মাপা
- ফলটি রিপোর্ট থেকে বাদ দেওয়া, শুধু CV-র মান দেখানো
(মাঝারি) “মিলে যাওয়া পুরোনো রিভিউ” খোঁজায় একটি প্রশ্নের জন্য দেখানো ৩টি ফলের ২টি একই বিষয়ের। ওই বিষয়ের রিভিউ আছে মোট ৫টি, আর recall@3-এর ভাগফল min(৩, প্রাসঙ্গিকের সংখ্যা). এই প্রশ্নের recall@3 কত?
- ১.০০
- ০.৪০
- প্রায় ০.৬৭
- ০.৬০
(মাঝারি) বাংলা আর Banglish মেশানো রিভিউয়ে কাছের রিভিউ খুঁজতে শব্দের TF-IDF-এর চেয়ে অক্ষরের n-gram (char_wb, ২–৪) ভালো করল। সবচেয়ে সম্ভাব্য কারণ কী?
- অক্ষরের n-gram বাক্যের অর্থ বোঝে
- বানান-ভেদ আর Banglish-এ পুরো শব্দ না মিললেও অক্ষর-খণ্ড মেলে
- অক্ষরের vocabulary সবসময় ছোট, তাই দ্রুত
- অক্ষরের model বেশি ডেটায় train হয়েছিল
(সহজ) বাজারঘরের নীতি: “খোলা প্যাকেটের অন্তর্বাস ফেরত নয়।” ফেরতের অনুরোধ যাচাইয়ে এই নীতি প্রয়োগের সবচেয়ে উপযুক্ত সমাধান কোনটি?
- পুরোনো অনুরোধে একটি classifier train করা
- একটি ভাষা model দিয়ে প্রতিটি অনুরোধ বিচার করানো
- অনুরোধগুলো cluster করে দেখা
- একটি লিখিত নিয়ম (rule), ML নয়
(মাঝারি) Impact × feasibility ছকে অগ্রাধিকার = impact × feasibility. ফেরত-ঝুঁকির impact ৪.০, feasibility ৪.২৫; ঈদের চাহিদার impact ৪.৫, feasibility ৩.২৫. কোনটি আগে, আর কেন?
- ঈদের চাহিদা, কারণ impact বেশি
- দুটি সমান, তাই যেকোনোটি
- ফেরত-ঝুঁকি, ১৭.০ বনাম প্রায় ১৪.৬
- ফেরত-ঝুঁকি, কারণ যোগফল ৮.২৫ বনাম ৭.৭৫
(কঠিন) একটি feature-এর তিনটি bin-এ reference-এর ভাগ e = ০.৪, ০.৩, ০.৩, আর নতুন মাসে a = ০.৩, ০.৩, ০.৪. PSI = ∑ (a − e) × ln(a ÷ e) প্রায় কত, আর প্রচলিত হাতের নিয়মে কোন স্তর?
- ০.২০; নজরে রাখুন
- ০; কোনো পরিবর্তন নেই
- প্রায় ০.০৫৮; স্থির
- প্রায় ০.৩০; বড় পরিবর্তন
(মাঝারি) ঈদের মাসে অর্ডারের দামের PSI ০.২৭-এ উঠল, কিন্তু আগের মাসের দেরিতে আসা label দেখাচ্ছে accuracy প্রায় আগের মতোই। পরের মাসে PSI আবার ০.০১-এর ঘরে। এটি কী, আর কী করা উচিত?
- Concept drift; সঙ্গে সঙ্গে retrain
- PSI ভুল মাপ, তাই উপেক্ষা
- সঙ্গে সঙ্গে আগের model-এ rollback
- সাময়িক data drift; কারণ লিখে নজর রাখা, স্বয়ংক্রিয় retrain নয়
(সহজ) নতুন ফেরত-ঝুঁকি model প্রথমে কয়েক সপ্তাহ শুধু score লিখল, কারও সিদ্ধান্তে ব্যবহার হলো না। তারপর ১০% অর্ডারে সত্যিকারের সিদ্ধান্তে চালু হলো, আর সব ঠিক থাকায় ধাপে ধাপে বাড়ল। দ্বিতীয় ধাপটির নাম কী?
- Shadow deployment
- Batch scoring
- Rollback
- Canary release
(কঠিন) ঝুঁকিপূর্ণ অর্ডারে ফোন করলে কিছু গ্রাহক অর্ডার বাতিল করেন, তাই সেগুলো “ফেরত হতো কি না” আর জানা যায় না। পরের retrain-এ ভুল ছবি ঢোকা ঠেকাতে কী করা যায়?
- একটি ছোট এলোমেলো holdout-এ model প্রয়োগ না করা, আর প্রভাবিত সারি চিহ্নিত রাখা
- প্রতি সপ্তাহে retrain করা
- বাতিল অর্ডারগুলোকে “ফেরত হয়নি” ধরে নেওয়া
- Threshold নামিয়ে আরও বেশি অর্ডারে ফোন করা
(মাঝারি) Validation-এ নতুন model-এর AUC বেড়েছে। ব্যবস্থাপক জানতে চান, ফোনের খরচ ধরেও প্রতি ১০০ অর্ডারে ফেরতের খরচ সত্যিই কমবে কি না। এর সবচেয়ে নির্ভরযোগ্য উত্তর কীভাবে পাওয়া যায়?
- AUC বেড়েছে, তাই খরচ কমবেই
- A/B test: ঝুঁকিপূর্ণ অর্ডারের এলোমেলো অর্ধেকে ফোন, বাকিতে নয়, তারপর মোট খরচ তুলনা
- চালুর আগের আর পরের মাসের খরচ তুলনা
- Train set-এর accuracy দেখে
(সহজ) ছয় মাস পরে একজন নতুন সহকর্মী জানতে চাইলেন, “threshold ০.৬ কেন, আর কে ঠিক করেছিলেন?” এই উত্তর কোন নথিতে থাকার কথা?
- শুধু Git-এর commit message
- Datasheet
- uv.lock
- Decision log
৯ · মিশ্র মহড়া — ঘড়ি ধরে ১৬টি প্রশ্ন, সব মডিউল থেকে
সব মডিউল শেষ হলে এই অংশটি একটি ছোট মহড়া পরীক্ষা হিসেবে করুন। প্রশ্নগুলো ইচ্ছা করে এলোমেলো, কারণ আসল পরীক্ষায় NumPy-র পরেই Bayes, তারপর search আসতে পারে। ওপরের মডিউলের প্রশ্ন থেকে এগুলো আলাদা, তাই আগের অপশন মনে থাকার সুবিধা এখানে নেই।
- ঘড়ি ধরুন: ফোন বা ঘড়িতে ২০ মিনিটের টাইমার চালু করুন। প্রতি প্রশ্নে গড়ে সোয়া মিনিট, কোড পড়ার প্রশ্নে একটু বেশি।
- আগে খাতায়: ১ থেকে ১৬ নম্বর লিখে প্রতিটির পাশে অপশন আর এক লাইনের কারণ লিখুন। সময় শেষ হলে তবেই অপশন চাপুন।
- আটকালে এগিয়ে যান: চিহ্ন দিয়ে পরের প্রশ্নে যান, শেষে ফিরে আসুন।
- ফল পড়ুন এভাবে: ১৩ বা তার বেশি ঠিক হলে প্রস্তুতি ভালো; ৯ থেকে ১২ হলে ভুল প্রশ্নের পর্বগুলো ঝালিয়ে নিন; ৮ বা কম হলে আগে মডিউলভিত্তিক অংশগুলো আবার করুন। এই সীমা শুধু অনুশীলনের সুবিধার জন্য ধরা, কোনো পরীক্ষার মান নয়।
(সহজ) Alan Turing-এর প্রস্তাবিত “imitation game” বা Turing test আসলে কী যাচাই করে?
- যন্ত্রটি প্রশ্নগুলো সত্যিই বোঝে কি না
- যন্ত্রটি মানুষের চেয়ে কত দ্রুত হিসাব করে
- লেখা কথোপকথনে বিচারক যন্ত্রকে মানুষ থেকে আলাদা করতে পারেন কি না
- যন্ত্রের IQ স্কোর মানুষের সমান কি না
(কঠিন) NumPy 2.4-এ নিচের কোড কী ছাপবে?
import numpy as np
x = np.array([1.0, 2.0, 4.5]).max()
print(x, [x])
- 4.5 [4.5]
- 4.5 [np.float64(4.5)]
- np.float64(4.5) [np.float64(4.5)]
- 4.5 [array(4.5)]
(মাঝারি) বাজারঘরের বার্তার ২০% spam. “অফার” শব্দটি ৬০% spam-এ আর ১০% সাধারণ (ham) বার্তায় থাকে। একটি বার্তায় “অফার” আছে; বার্তাটি spam হওয়ার সম্ভাবনা কত?
- ০.১২
- প্রায় ০.৮৫৭
- ০.২
- ০.৬
(মাঝারি) বাজারঘরের একই ডেলিভারি-দিনের ডেটা ১ দিনের bin-এর histogram-এ দুটি চূড়া দেখায়, কিন্তু ৪ দিনের bin-এ একটি মসৃণ ঢাল। সবচেয়ে যুক্তিসংগত পদক্ষেপ কোনটি?
- কয়েকটি bin width আর ECDF দেখে ঠিক করা, দুই চূড়া আসল কি না
- ৪ দিনের bin-ই সঠিক, কারণ চওড়া bin বেশি নির্ভরযোগ্য
- Box plot-এ দুই চূড়া দেখা যায় না, তাই চূড়া দুটি ভুয়া
- ডেটায় ভুল আছে, তাই chart বাদ দিয়ে ডেটা আবার সংগ্রহ করা
(মাঝারি) scikit-learn 1.8-এ নিচের কোড কী ছাপবে?
import numpy as np
from sklearn.model_selection import train_test_split
X = np.arange(10).reshape(10, 1)
tr, te = train_test_split(X, test_size=0.25, random_state=0)
print(len(tr), len(te))
- 8 2
- 7 3
- 7.5 2.5
- ValueError
(মাঝারি) একই অর্থের একটি বাক্য ইংরেজিতে ১৪টি token, আর একটি tokenizer-এ বাংলায় ৬১টি token হলো। একটি LLM সেবা ব্যবহারে এর সরাসরি প্রভাব কী?
- বাংলায় token বেশি, তাই model বাংলা বেশি ভালো বোঝে
- কোনো প্রভাব নেই, কারণ দাম অক্ষর গুনে হয়
- একই কথায় খরচ বেশি হয়, আর context window দ্রুত ভরে যায়
- সব tokenizer-এ বাংলা সবসময় ঠিক চার গুণ token নেয়
(মাঝারি) একটি graph-এর প্রতিটি রাস্তার খরচ সমান, ১. এখানে uniform-cost search কোন অ্যালগরিদমের মতো আচরণ করে?
- Breadth-first search-এর মতো
- Depth-first search-এর মতো
- Greedy best-first search-এর মতো
- Hill climbing-এর মতো
(সহজ) pandas 3.0-তে নিচের কোড কী ছাপবে?
import pandas as pd
s = pd.Series(["ঢাকা", "খুলনা", "ঢাকা", "ঢাকা"])
print(s.value_counts().iloc[0], s.nunique())
- 2 3
- ঢাকা 2
- 4 2
- 3 2
(মাঝারি) বাজারঘর ডেলিভারির জন্য ক্রেতার ঠিকানা আর কেনার ইতিহাস সংগ্রহ করেছে। এখন সেই ডেটা দিয়ে বিজ্ঞাপনের লক্ষ্য ঠিক করার model বানাতে চায়। কোন নীতি প্রথমে প্রশ্ন তোলে?
- Demographic parity
- Purpose limitation
- k-anonymity
- Model card লেখা
(মাঝারি) k = 1-এর k-NN classifier-কে training ডেটাতেই মাপলে accuracy এলো ১.০ (সব বিন্দু আলাদা)। এ থেকে কোন সিদ্ধান্তটি সঠিক?
- Model নিখুঁত, নতুন ডেটাতেও একই ফল দেবে
- k = 1-ই এই ডেটার সেরা k
- স্কোরটি প্রায় কিছুই বলে না, কারণ প্রতিটি বিন্দুর নিকটতম প্রতিবেশী সে নিজেই
- ডেটায় কোনো noise নেই
(সহজ) একটি loss L(w)-এর derivative w = 3-এ +4. Learning rate η = 0.1 দিয়ে gradient descent-এর এক ধাপে w কোন দিকে যাবে?
- বাড়বে, 3 থেকে 3.4
- একই থাকবে
- দিক নির্ভর করে η-এর ওপর, তাই বলা যায় না
- কমবে, 3 থেকে 2.6
(সহজ) পাঁচটি propositional symbol (P, Q, R, S, T) নিয়ে একটি বাক্যের পূর্ণ truth table-এ কতটি সারি থাকে?
- ৩২
- ১০
- ২৫
- ১২০
(মাঝারি) মাছের চালানে পচা ব্যাচ ধরার একটি model. একটি পচা ব্যাচ ধরা না পড়লে ক্রেতা অসুস্থ হতে পারেন, আর ভুল সতর্কবার্তায় শুধু একবার হাতে পরীক্ষা লাগে। কোন metric-কে অগ্রাধিকার দেবেন?
- Precision
- Accuracy
- Recall
- Training loss
(সহজ) Python 3.14-এ নিচের কোড কী ছাপবে?
print(f"{1234.5:,.1f}")
- 1234.5
- 1,234.5
- 1,234.50
- 1.234,5
(মাঝারি) নতুন ফেরত-ঝুঁকি model canary ধাপে ১০% অর্ডারে চালু হলো। দুই সপ্তাহে ওই ১০%-এ ফেরতের খরচ আগের নিয়মের চেয়ে স্পষ্টভাবে বেড়েছে। পরের সঠিক পদক্ষেপ কোনটি?
- আরও ডেটার জন্য ১০০% অর্ডারে চালু করা
- Canary-র ডেটা দিয়ে সঙ্গে সঙ্গে retrain করে আবার চালানো
- খরচের নজরদারি বন্ধ করা, কারণ এটি সাময়িক
- Rollback করে আগের নিয়মে ফেরা, তারপর কারণ খোঁজা
(মাঝারি) NumPy 2-এ নিচের কোড কী ছাপবে?
import numpy as np
a = np.array([1, 2, 3])
b = np.array([[10], [20]])
c = a + b
print(c.shape, c[1, 2])
- (2, 3) 23
- (3, 2) 23
- ValueError
- (2, 3) 13
AI-এর যুগে — AI দিয়ে আরও MCQ বানান, কিন্তু উত্তর নিজে যাচাই করুন
AI assistant মুহূর্তে শত শত MCQ বানাতে পারে, কিন্তু ডেটা আর AI-এর প্রশ্নে সে প্রায়ই পুরোনো লাইব্রেরির আচরণকে “সঠিক” বলে, অস্তিত্বহীন function বা parameter লেখে, কোডের ভুল আউটপুট নিশ্চিত সুরে দেয়, অথবা একই প্রশ্নে দুটি সঠিক অপশন রাখে। pandas, NumPy আর scikit-learn দ্রুত বদলায়, আর AI-এর শেখা লেখার বড় অংশ পুরোনো টিউটোরিয়াল। তাই AI-এর বানানো প্রশ্ন অনুশীলনের ভালো কাঁচামাল, উত্তরপত্র নয়।
| AI-এর প্রচলিত ভুল | উদাহরণ | কীভাবে ধরবেন |
|---|---|---|
| পুরোনো API | pandas-এর append, np.float, LogisticRegression(multi_class=...) | নিজের version-এর অফিসিয়াল docs দেখুন; কোডটি চালান |
| বানানো function বা parameter | অস্তিত্বহীন argument, ভুল module-এর নাম | docs-এ খুঁজুন; help() দিয়ে signature দেখুন |
| ভুল আউটপুট, নিশ্চিত সুরে | axis-এর ফল, view বনাম copy, merge-এর সারি সংখ্যা | কোডটি নিজে চালিয়ে মেলান; ওপরের Python block-এই হয় |
| ভুল হিসাব | Bayes-এ base rate বাদ, precision আর recall অদলবদল | ১,০০০ জনের দল ধরে হাতে গুনে মেলান |
| Leakage-ভরা “সঠিক উত্তর” | পুরো ডেটায় scaling, test দেখে model বাছাই, train-এ মাপা metric | ভাগ আগে, fit শুধু train-এ, তুলনা baseline-এর পাশে |
| অতিরঞ্জন আর বানানো উৎস | “LLM বোঝে”, “অমুক পরীক্ষায় এসেছিল” | “বোঝে” বা “সবসময়” দেখলে সন্দেহ করুন; উৎস দেখাতে না পারলে দাবি বাদ |
নিচের প্রম্পটটি AI-কে নির্দিষ্ট version-এ প্রশ্ন বানাতে বলে, আর যাচাইয়ের উপায়ও চায়। প্রম্পটে কখনো আসল গ্রাহকের ডেটা, ফোন নম্বর বা ঠিকানা দেবেন না; বানানো কয়েকটি সারিই যথেষ্ট।
যাচাইয়ের চেকলিস্ট
কেন এই উত্তর ভুল? — রিভিশনের কৌশল আর বড় ধারণা
আগে নিজে ভাবুন, তারপর খুলে দেখুন।
প্র ০১এতগুলো প্রশ্ন দিয়ে কীভাবে রিভিশন করলে সবচেয়ে বেশি কাজে লাগে?
একটানা পড়ে যাওয়া, মানে প্রশ্ন দেখা, উত্তর চাপা আর এগোনো, সবচেয়ে কম কাজে লাগে। শেখার গবেষণায় বারবার কার্যকর পাওয়া গেছে দুটি অভ্যাস: নিজে থেকে মনে করা (active recall) আর বিরতি দিয়ে ফেরা (spaced repetition). এই পাতার কাঠামো এই দুটির জন্যই সাজানো: প্রতিটি অপশন চাপার আগে উত্তরটি নিজে বের করার সুযোগ, আর শেষে একটি নতুন মিশ্র মহড়া।
- এক ভাগ, পুরো মনোযোগ: একবারে একটি বিষয়ভাগ নিন। চাপার আগে খাতায় উত্তর আর এক লাইনের কারণ লিখুন, যেমন “axis=0, তাই প্রতি কলামে একটি যোগফল”. কারণ লিখতে না পারলে ঠিক হলেও ভুল গুনুন।
- ভুলের খাতা: প্রতিটি ভুলের পাশে প্রশ্ন নয়, নিয়মটি লিখুন: “loc-এর slice শেষ সীমা রাখে”. পরীক্ষায় একই নিয়ম অন্য সংখ্যায় আর অন্য কোডে আসে।
- ভুলের ধরন আলাদা গুনুন: ধারণায় ভুল মানে পর্বে ফেরা; কোড পড়ায় ভুল মানে ধীরে, লাইন ধরে অবস্থা লেখা; হিসাবে ভুল মানে সূত্র আর base rate আবার দেখা।
- কোড চালিয়ে দেখুন: আউটপুটের প্রশ্নে ভুল হলে কোডটি অংশ ১-এর Python block-এ বা নিজের যন্ত্রে চালান, তারপর একটি সংখ্যা বা একটি লাইন বদলে আবার চালান। নিজের চোখে দেখা ফল সহজে ভোলা যায় না।
- পর্বে ফিরুন: একটি ভাগে চারটির বেশি ভুল হলে তার পর্ব আবার পড়ুন। ১, ৩ আর ৭ দিন পরে শুধু ভুলগুলো করুন, অপশন পড়ার আগেই উত্তর বলে।
একটি বাস্তব সূচি এমন হতে পারে: দিনে একটি বা দুটি বিষয়ভাগ, ঘড়ি ধরে প্রতি প্রশ্নে এক মিনিট; এক সপ্তাহে চৌদ্দটি ভাগ শেষ। তারপর মিশ্র মহড়া, আর শেষে এলোমেলো ২০টি পুরোনো ভুল প্রশ্ন। পরীক্ষায় বিষয় মিশে আসে: একই প্রশ্নে pandas-এর groupby আর precision থাকতে পারে। এলোমেলো অনুশীলন কঠিন লাগে, তবে মনে থাকে বেশি।
দ্বিতীয়বারে স্কোর বাড়ে অপশন মনে থাকার জন্যও। তাই নিজেকে যাচাই করতে কোডের একটি সংখ্যা বা একটি সম্ভাবনা বদলে নিজের প্রশ্ন বানান, তারপর চালিয়ে বা হাতে গুনে মেলান।
মূল উপলব্ধি: প্রশ্ন নয়, পেছনের নিয়ম মনে রাখাই লক্ষ্য।
প্র ০২NumPy আর pandas-এর “আউটপুট বলুন” প্রশ্নে এত ভুল হয় কেন?
কারণ কোড দেখতে সাধারণ Python-এর মতো, কিন্তু চলে array আর table-এর নিজস্ব নিয়মে। প্রায় সব ভুল চারটি জায়গায় জমে: shape, axis, view বনাম copy, আর missing value.
Shape আর broadcasting: দুটি array-র shape ডান দিক থেকে মেলানো হয়; প্রতিটি জোড়ায় মান সমান বা একটি 1 হলে চলে। (3,) আর (2, 1) মিলে (2, 3), কিন্তু (3, 4) আর (3,) মেলে না, কারণ ডানের 4 আর 3 আলাদা। খাতায় দুটি shape ডান দিক মিলিয়ে লিখলে উত্তর সেকেন্ডে আসে (পর্ব ১৫)।
Axis: “axis=0 মানে সারি” মনে রাখলে ভুল হয়; বলুন “axis=0 মাত্রাটি ভেঙে যায়”. (3, 4) array-তে sum(axis=0) দেয় (4,), প্রতিটি কলামের যোগ। pandas-এ একই নিয়ম, তাই df.mean() প্রতিটি কলামের গড় দেয় (পর্ব ১৬, ২৪)।
View আর copy: NumPy-তে সাধারণ slice মূল ডেটার একটি জানালা, তাই সেখানে লিখলে মূল array বদলায়; boolean বা list দিয়ে index করলে copy আসে। pandas 3-এ নিয়ম সরল হয়েছে: Copy-on-Write একমাত্র আচরণ, তাই একটি DataFrame থেকে নেওয়া অংশে লিখলে মূলটি বদলায় না, আর df[mask]['col'] = 0-এর মতো chained assignment কাজ করে না, শুধু সতর্কবার্তা দেয়। মূল টেবিলে লিখতে df.loc[mask, 'col'] (পর্ব ১৪, ২২)।
NaN আর গণনা: NumPy-র sum একটি NaN পেলেই NaN দেয়, nansum বাদ দেয়; pandas-এর mean আর sum ডিফল্টে NaN বাদ দেয়। groupby-তে size সব সারি গোনে, count শুধু ফাঁকা নয় এমন মান। Merge-এ ডান টেবিলে key দুবার থাকলে সারি বাড়ে (পর্ব ১৬, ২৩, ২৪, ২৫)।
শেষ ফাঁদ ছাপার ধরন। NumPy 2 থেকে list-এর ভেতরে scalar ছাপা হয় np.float64(4.5) রূপে, আর pandas 3-এ লেখার কলামের dtype str. পুরোনো টিউটোরিয়ালে মুখস্থ করা ছাপ এখানে ভুল উত্তর হয়ে যায়।
মূল উপলব্ধি: প্রতিটি লাইনের পরে shape আর মান খাতায় লিখুন; মাথায় রাখবেন না।
প্র ০৩Version-নির্ভর প্রশ্নের প্রস্তুতি কীভাবে নেবেন, যখন লাইব্রেরি প্রতি বছর বদলায়?
Python-এর ডেটা লাইব্রেরি দ্রুত বদলায়, আর পরিবর্তনগুলো প্রায়ই ঠিক সেই জায়গায়, যেখানে MCQ বানানো সহজ। NumPy 2.0 (২০২৪) অনেক পুরোনো নাম সরিয়ে দিয়েছে: np.float_, np.NaN বা আরও পুরোনো np.int লিখলে এখন AttributeError. একই সঙ্গে scalar-এর ছাপ বদলেছে, তাই একটি list-এর ভেতরের মান এখন np.float64(1.5) রূপে আসে (পর্ব ১৩)।
pandas 3-এ দুটি বড় বদল। লেখার কলাম ডিফল্টে str dtype পায়, আর Copy-on-Write একমাত্র আচরণ। তাই পুরোনো ব্লগের df[df.qty > 2]['ship'] = 1 নীরবে কিছুই বদলায় না; ঠিক লেখা df.loc[df.qty > 2, 'ship'] = 1 (পর্ব ২০, ২২)। scikit-learn 1.8-এ LogisticRegression-এর multi_class parameter আর নেই, আর penalty দিলে সতর্কবার্তা আসে; এই কোর্স penalty-হীন ফিটের জন্য খুব বড় C ব্যবহার করে (পর্ব ৫৯)। matplotlib 3.10 পর্যন্ত বাংলা লেখার কার-চিহ্ন আর যুক্তাক্ষর ভাঙে; কোর্সের হিসাবে ৩.১১ থেকে text shaping এসেছে (পর্ব ২৮)।
আরেকটি সূক্ষ্ম ফাঁদ যন্ত্রভেদ। সাধারণ 64-bit ডেস্কটপে NumPy-র default int int64, কিন্তু ব্রাউজারের ভেতরের Python (32-bit WebAssembly)-এ int32. তাই nbytes বা overflow-এর প্রশ্নে dtype স্পষ্ট না থাকলে উত্তর যন্ত্রভেদে বদলায়; ভালো প্রশ্নে dtype লেখা থাকে।
প্রস্তুতির তিনটি অভ্যাস কাজে লাগে। প্রথম, প্রতিটি version-নির্ভর তথ্যের পাশে version লিখে রাখুন: “pandas 3: chained assignment কাজ করে না”. দ্বিতীয়, “কেন বদলাল” জানুন, তাহলে নতুন version-এও যুক্তি খাটবে; যেমন Copy-on-Write এসেছে, কারণ কোনটি view আর কোনটি copy, তা অনুমান করতে গিয়ে অনেকে নীরব ভুল করতেন। তৃতীয়, release notes আর migration guide পড়ার অভ্যাস করুন; পরীক্ষার বাইরেও এটিই আসল কাজ।
প্রশ্নে version না থাকলে এমন উত্তর বাছুন যা version-এর বাইরেও সত্য: ভাগ আগে, fit শুধু train-এ, test শুধু শেষে। আর কোনো অপশন শুধু পুরোনো টিউটোরিয়ালে সত্য মনে হলে, সেটিই সম্ভবত distractor.
মূল উপলব্ধি: Version-নির্ভর তথ্য version সহ মনে রাখুন; নীতিগুলো version ছাড়াই।
প্র ০৪সম্ভাবনা আর metric-এর প্রশ্নে base rate ভুলে যাওয়া এত বড় ফাঁদ কেন?
কারণ মানুষের অন্তর্দৃষ্টি শর্তের দিক উল্টে ফেলে। “ভুয়া অর্ডারের ৯০% detector ধরে” আর “detector যাকে ধরে তার ৯০% ভুয়া” শুনতে কাছাকাছি, কিন্তু প্রথমটি P(সতর্ক | ভুয়া), দ্বিতীয়টি P(ভুয়া | সতর্ক). দুটির মধ্যে সেতু Bayes-এর উপপাদ্য, আর সেই সেতুর একটি খুঁটি base rate, অর্থাৎ ঘটনাটি আগে থেকেই কত সাধারণ।
উপপাদ্যটির নাম Thomas Bayes-এর নামে; তাঁর মৃত্যুর পরে Richard Price ১৭৬৩ সালে লেখাটি প্রকাশ করেন, আর Laplace পরে একে সাধারণ রূপ দেন। মনোবিজ্ঞানে ১৯৭০-এর দশকে Kahneman আর Tversky-র কাজ থেকে “base-rate neglect” কথাটি পরিচিত হয়: মানুষ প্রায়ই নির্দিষ্ট প্রমাণে মন দেয়, আর ঘটনাটি কত বিরল, তা উপেক্ষা করে।
একটি উদাহরণে দেখুন। বাজারঘরের ২% অর্ডার ভুয়া; detector ভুয়ার ৯৫% ধরে, আর সৎ অর্ডারের ৪%-কেও ভুল করে চিহ্নিত করে। ১০,০০০ অর্ডারের দল ধরুন: ২০০টি ভুয়ার ১৯০টি ধরা পড়ে, আর ৯,৮০০টি সৎ অর্ডারের ৩৯২টি ভুল করে চিহ্নিত হয়। সতর্কবার্তা মোট ৫৮২টি, যার মাত্র ১৯০টি সত্যি, প্রায় ৩৩%. অর্থাৎ detector-টি “৯৫% ধরে” শোনালেও তার প্রতি তিনটি সতর্কবার্তার প্রায় দুটির পেছনে একজন সৎ ক্রেতা (পর্ব ৫০)।
Metric-এর ভাষায় এটিই precision-এর সমস্যা, আর accuracy-র গল্পও একই। ১% ভুয়ার ডেটায় “সবাই সৎ” বলা একটি অকেজো model-এর accuracy ৯৯%. তাই বিরল শ্রেণিতে accuracy-র বদলে precision, recall, PR curve আর একটি সরল baseline দেখতে হয় (পর্ব ৬০)। Naive Bayes-এর prior, ক্যাপস্টোনের “সবচেয়ে সাধারণ শ্রেণি” baseline, আর দায়িত্বশীল AI-তে দলভেদে আলাদা base rate থাকলে কেন সব fairness শর্ত একসঙ্গে মেলে না, সবই এই একই ধারণার রূপ (পর্ব ৫১, ৭৩, ৭২)।
পরীক্ষায় কৌশল একটিই: শতাংশ দেখলে আগে একটি কাল্পনিক দল ধরুন, ১,০০০ বা ১০,০০০ জন, তারপর চারটি ঘর (TP, FP, FN, TN) গুনে বসান। গোনা সংখ্যায় দিক উল্টানো কঠিন।
মূল উপলব্ধি: কোন শর্তে কোন সম্ভাবনা, আগে সেটি লিখুন; base rate ছাড়া উত্তর অসম্পূর্ণ।
প্র ০৫AI-এর ধারণা, ইতিহাস আর LLM-এর প্রশ্নে অতিরঞ্জিত অপশন কীভাবে চিনবেন?
AI নিয়ে লেখায় অতিরঞ্জন এত বেশি যে পরীক্ষার distractor বানাতে আলাদা কষ্ট লাগে না। তিন ধরনের চিহ্ন প্রায় সবসময় সন্দেহের যোগ্য।
“বোঝে” আর “ভাবে”: Turing ১৯৫০ সালে “যন্ত্র কি ভাবতে পারে” প্রশ্নের বদলে একটি আচরণের পরীক্ষা প্রস্তাব করেন, আর Searle-এর Chinese Room (১৯৮০) যুক্তি দেখায়, ঠিক উত্তর দেওয়া আর বোঝা এক জিনিস কি না, তা আজও বিতর্কের বিষয় (পর্ব ১)। LLM প্রতিটি ধাপে পরের token-এর সম্ভাবনা হিসাব করে; এর সাবলীল লেখা “বোঝার” প্রমাণ নয়, আর বানানো ধারা নম্বরও একই আত্মবিশ্বাসে আসতে পারে (পর্ব ৭০)। তাই “model বোঝে বলে ঠিক উত্তর দেয়” ধরনের অপশন প্রায় সবসময় ভুল।
পরম শব্দ: “সবসময়”, “কখনো না”, “নিশ্চিতভাবে”, “কলাম মুছলেই পক্ষপাত দূর”. বাস্তব AI-এর প্রায় প্রতিটি সত্য শর্তসাপেক্ষ: model নতুন জেলায় খারাপ করতে পারে (distribution shift), অন্য কলাম proxy হয়ে মোছা তথ্য ফিরিয়ে আনে, আর দুই দলের base rate আলাদা হলে calibration আর সমান error rate একসঙ্গে সাধারণত মেলে না; ২০১৬–১৭ সালে Kleinberg ও সহকর্মীরা আর Chouldechova আলাদাভাবে এই অসম্ভাব্যতা দেখান (পর্ব ৬, ৭২)।
ইতিহাসের সরল গল্প: “Minsky আর Papert-এর বই একাই neural network-এর গবেষণা থামিয়ে দেয়” বা “AI শীতকালের নির্দিষ্ট শুরুর তারিখ” ধরনের দাবি ইতিহাসবিদদের মধ্যে বিতর্কিত। নিরাপদ তথ্যগুলো বছরসহ মনে রাখুন: Dartmouth-এর প্রস্তাব ১৯৫৫, কর্মশালা ১৯৫৬; Rosenblatt-এর perceptron ১৯৫৮; backpropagation-এর জনপ্রিয়তা ১৯৮৬; AlexNet ২০১২; Transformer ২০১৭ (পর্ব ২)। যে অপশন একটি জটিল ইতিহাসকে এক কারণে বেঁধে দেয়, সেটি সাধারণত distractor.
উল্টো ফাঁদও আছে: “AI কিছুই পারে না” ধরনের হতাশ অপশনও ভুল। ঠিক উত্তর সাধারণত মাঝখানে: নির্দিষ্ট কাজে, নির্দিষ্ট ডেটায়, মাপা metric-এ ভালো, আর তার বাইরে সীমাবদ্ধ।
মূল উপলব্ধি: শর্তসহ, মাপা আর হেজ করা অপশনই সাধারণত সঠিক; পরম দাবি সাধারণত distractor.
শেষ ধাপ — ক্রম সাজান আর স্কোর দেখুন
উপরের সব MCQ শেষ করলে নিচে আপনার মোট স্কোর দেখাবে।
ক্রমএকটি ML প্রকল্পের ছয় ধাপ। আগে থেকে পরে সাজান (▲▼ চেপে সরান)
- প্রশ্ন, metric আর সফলতার মান ঠিক করা
- ডেটা train আর test-এ ভাগ, test সরিয়ে রাখা
- একটি সরল baseline মাপা
- Pipeline-এ feature আর model, cross-validation দিয়ে বাছাই
- বাছা model-কে test-এ একবার মূল্যায়ন
- চালু করা, drift-এর নজরদারি আর দরকারে rollback
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব শব্দ এখানে একসাথে:
মনে রাখুন
- কারণসহ উত্তর: চাপার আগে খাতায় অপশন আর এক লাইনের কারণ; ভুলের খাতায় প্রশ্ন নয়, নিয়ম।
- কোড পড়ায় লাইন ধরে অবস্থা: shape, dtype, axis, view বনাম copy; pandas 3-এ Copy-on-Write আর
strdtype, NumPy 2-এnp.float64(...)ছাপ। - Base rate আগে: P(A | B) আর P(B | A) আলাদা; বিরল শ্রেণিতে accuracy নয়, precision, recall আর baseline.
- ভাগ আগে, fit পরে: scaling, encoding আর বাছাই শুধু train-এ; test শুধু শেষে একবার।
- অতিরঞ্জিত অপশনে সন্দেহ: “বোঝে”, “সবসময়”, “কলাম মুছলেই পক্ষপাত নেই” ধরনের দাবি সাধারণত distractor.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৭৭ · লিখিত ও মৌখিক (ভাইভা) প্রশ্ন — AI-এর ধারণা, অ্যালগরিদম আর ডেটাপরবর্তী পর্বলিখিত প্রশ্নের model answer, pseudocode আর ভাইভার ছোট প্রশ্ন।
- AI-এর ভিত্তি আর Python for AI · কোর্স হোম৭৯টি পর্বপুরো কোর্সের রোডম্যাপ; পরের পর্ব ৭৭ · লিখিত ও মৌখিক (ভাইভা) প্রশ্ন।
- পর্ব ৬০ · মূল্যায়ন — accuracy, precision, recall, F1 আর ROCভিত্তিMetric-এর প্রশ্নে সবচেয়ে বেশি নম্বর হারানোর জায়গা।
- পর্ব ৫০ · Bayes-এর উপপাদ্যভিত্তিBase rate, likelihood আর posterior-এর হিসাব।
- পর্ব ৫৬ · Train, validation আর testভিত্তিLeakage-এর পরিস্থিতি চেনার মূল পর্ব।
- পর্ব ২২ · বাছাই আর filterভিত্তিloc, iloc, boolean mask আর pandas 3-এর Copy-on-Write.
- Python · MCQ প্রশ্নব্যাংকপাশের ট্র্যাকভাষার ভিত্তি, function, OOP আর file-এর MCQ.
- DSA · MCQ প্রশ্নব্যাংকপাশের ট্র্যাকGraph, BFS, DFS আর complexity-র MCQ.
- DBMS ও SQL · MCQ প্রশ্নব্যাংকপাশের ট্র্যাকSQL, join আর aggregation-এর MCQ, pandas-এর পাশাপাশি।