এই পর্বে যা শিখবেন
- এই কোর্স কার জন্য, আর AI-এর ভিত্তি কোর্স থেকে কোন জ্ঞান সঙ্গে আনবেন; একটি ছোট পরীক্ষা দিয়ে নিজের প্রস্তুতি মাপা
- ১৪টি মডিউলের মানচিত্র, আর কোন মডিউল কোনটির ওপর দাঁড়িয়ে
- ML পদ্ধতির সাতটি বড় পরিবার, প্রতিটির মূল ধারণা, আর ডেটার আকার ও লক্ষ্য দেখে প্রার্থী বাছাইয়ের উপায়
- একই fold-এ তিন পরিবারের ন্যায্য তুলনা, decision boundary-র ছবি আর learning curve পড়া
- পাতার আর ডেস্কটপের টুল ও version, একটি পর্ব কীভাবে সাজানো, আর গণিতসহ কীভাবে পড়বেন
১ · এই কোর্স কার জন্য, আর সঙ্গে কী নিয়ে আসছেন
ধরুন আপনি বাজারঘরের (এই কোর্সের কাল্পনিক অনলাইন দোকান) ডেটা দলে যোগ দিলেন। প্রথম সপ্তাহেই তিনটি প্রশ্ন এলো: কোন গ্রাহক চলে যেতে পারেন, কোন জেলায় আগামী মাসে কত অর্ডার আসবে, আর বাংলা রিভিউগুলোতে মানুষ আসলে কী নিয়ে অভিযোগ করছেন। তিনটিই machine learning-এর প্রশ্ন, কিন্তু তিনটির জন্য তিন রকম model, তিন রকম মূল্যায়ন। একটি fit আর একটি predict জানলেই এখানে কাজ চলে না। কোন model কেন, কোন ধারণার ওপর দাঁড়িয়ে, কখন ভুল করে, আর নম্বরটি কতটা বিশ্বাসযোগ্য, সেটা বুঝতে হয়। এই কোর্সের কাজ সেটাই।
কোর্সটি কয়েক রকম পাঠকের কথা ভেবে লেখা:
- যাঁরা AI-এর ভিত্তি আর Python for AI কোর্স শেষ করেছেন, বা তার বিষয়গুলো জানেন, আর এখন machine learning-এর আসল গভীরতা চান।
- CSE, EEE, ICT বা পরিসংখ্যানের শিক্ষার্থী, যাঁরা Machine Learning, Pattern Recognition, Data Mining বা Data Science পড়ছেন।
- Data scientist, data analyst, ML engineer বা AI engineer পদের ইন্টারভিউ, আর IT officer-এর লিখিত পরীক্ষার প্রার্থী।
- কর্মরত developer, analyst আর গবেষক, যাঁরা কাজে ML ব্যবহার করেন আর ভিত্তি মজবুত করতে চান।
আগের কোর্স থেকে যা সঙ্গে আনছেন
AI-এর ভিত্তি কোর্সে যা শেখানো হয়েছে, এখানে তা আবার শেখানো হবে না; দরকার হলে এক-দুই লাইনে মনে করিয়ে লিংক দেওয়া হবে। সংক্ষেপে আপনার ঝুলিতে আছে:
- Python আর ডেটার টুল: uv আর venv (AI-এর ভিত্তি কোর্সের পর্ব ৭), NumPy-র shape, broadcasting আর random (পর্ব ১৩–১৯), pandas-এর groupby আর merge (পর্ব ২০–২৭), matplotlib আর seaborn (পর্ব ২৮–৩২)।
- গণিতের প্রথম ধাপ: vector, derivative আর gradient descent (AI-এর ভিত্তি কোর্সের পর্ব ৩৪), সম্ভাবনা, distribution, পরিসংখ্যান আর entropy (পর্ব ৩৫–৩৮), Bayes আর Naive Bayes (পর্ব ৫০–৫১)।
- ML-এর প্রথম পরিচয়: শেখা কী (পর্ব ৫৫), train/validation/test আর leakage (পর্ব ৫৬), k-NN, linear আর logistic regression (পর্ব ৫৭–৫৯), metric (পর্ব ৬০), overfitting আর bias–variance (পর্ব ৬১), EDA, feature engineering আর pipeline (পর্ব ৬২–৬৪), cross-validation আর tree-forest-boosting-এর প্রথম দেখা (পর্ব ৬৬), আর একটি পুরো প্রকল্পের জীবনচক্র (পর্ব ৭৪)।
এই কোর্সে Python ভাষা নিজে শেখানো হয় না; ভাষার জন্য আছে আলাদা Python প্রোগ্রামিং কোর্স। SQL লাগলে DBMS ও SQL, আর algorithm-এর জটিলতার হিসাব লাগলে DSA কোর্স পাশে খোলা রাখতে পারেন।
আগের কোর্স থেকে এই কোর্স আলাদা কোথায়
AI-এর ভিত্তি কোর্সে প্রশ্ন ছিল “কীভাবে চালাব?” এখানে প্রশ্ন “কেন কাজ করে, কখন করে না, আর কতটা নিশ্চিত?” আগে logistic regression-এর loss-কে আপনি ব্যবহার করেছেন; এখানে তার convexity প্রমাণ করবেন, আর দেখবেন কেন gradient descent তার একমাত্র সর্বনিম্ন বিন্দুতে পৌঁছায়। আগে random forest একটি প্রার্থী ছিল; এখানে দেখবেন কেন অনেক গাছের গড় variance কমায়, আর কেন out-of-bag error একটি বিনা খরচের validation. আগে নম্বর ছিল একটি সংখ্যা; এখানে নম্বরের সঙ্গে থাকবে তার অনিশ্চয়তা।
গাড়ি চালানো শেখা আর মেকানিক হওয়ার পার্থক্যের কথা ভাবুন। প্রথম কোর্সে আপনি রাস্তায় নেমেছেন, গিয়ার আর ব্রেক চিনেছেন। এখন ইঞ্জিনের ঢাকনা খোলার পালা। মেকানিক জানেন কোন শব্দের মানে কোন যন্ত্রাংশ, আর কোন পরিস্থিতিতে কোন গাড়ি ভালো চলে; ঢাকার জ্যামে আর মহাসড়কে একই গাড়ি একই রকম আচরণ করে না।
নিচের ডায়াগ্রামে পুরো পথটি ধাপে ধাপে দেখুন। “পরে” চাপুন।
- AI-এর ভিত্তি
৭৯ পর্বPython, ডেটা, প্রথম model - মডিউল ১
পর্ব ১–৫মানচিত্র ও তত্ত্ব - মডিউল ২–৪
পর্ব ৬–২২গণিতের ভিত - মডিউল ৫–৯
পর্ব ২৩–৪৯model-এর পরিবার - মডিউল ১০–১৩
পর্ব ৫০–৭২বাস্তবের সমস্যা - মডিউল ১৪
পর্ব ৭৩–৭৭পরীক্ষা ও ইন্টারভিউ
- ভিত্তি তৈরি। AI-এর ভিত্তি কোর্স আপনাকে দিয়েছে টুল (NumPy, pandas, scikit-learn), গণিতের প্রথম ধাপ আর ছয়-সাতটি প্রাথমিক model. এই কোর্স ধরে নেয় এগুলো আপনার হাতে আছে; পরের অংশের ছোট পরীক্ষায় নিজেই মিলিয়ে নিতে পারবেন।
- মডিউল ১: মানচিত্র আর শেখার তত্ত্ব। এই পর্ব, তারপর ব্যবসার প্রশ্নকে ML task বানানো (পর্ব ২), শেখা কেন সম্ভব তার তত্ত্ব (পর্ব ৩), পুনরুৎপাদনযোগ্য experiment (পর্ব ৪) আর label-এর মান (পর্ব ৫)। এগুলো সব model-এর জন্য সাধারণ।
- মডিউল ২–৪: গণিতের ভিত। Linear algebra (vector space, eigen, SVD), optimization (convexity, SGD, Adam, Newton, KKT) আর সম্ভাবনার model (MLE, MAP, GLM, bootstrap, model তুলনার পরীক্ষা)। পরের প্রতিটি model এই তিন ভাষায় কথা বলে, তাই এগুলো আগে।
- মডিউল ৫–৯: model-এর পরিবার। Linear model গভীরে, SVM আর kernel, tree আর ensemble, unsupervised learning, Bayesian ML. প্রতিটি পরিবারে আগে অন্তর্দৃষ্টি, তারপর derivation, তারপর scikit-learn বা ডেস্কটপের টুলে হাতে-কলমে।
- মডিউল ১০–১৩: বাস্তবের সমস্যা। Imbalanced ডেটা, time series, recommender, survival; ব্যাখ্যা, conformal prediction, distribution shift আর ন্যায্যতা; SQL, A/B test, causal inference; শেষে model serving, নজরদারি আর ক্যাপস্টোন।
- মডিউল ১৪: প্রস্তুতি। Numerical সমস্যা, MCQ, লিখিত ও ভাইভা প্রশ্ন, আর ইন্টারভিউয়ের coding ও ধারণার প্রশ্ন। বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষার আগে এখানে ঝালাই করবেন।
২ · নিজেকে যাচাই — শুরুর আগে একটি ছোট পরীক্ষা
নিচের আটটি প্রশ্ন কাগজ-কলমে করুন, তারপর উত্তর মেলান। প্রতিটির সঙ্গে লিংক আছে: ভুল হলে সেই পর্বটি একবার দেখে আসুন। ছয় বা তার বেশি ঠিক হলে সরাসরি এগোতে পারেন; চারের কম হলে AI-এর ভিত্তি কোর্সের মডিউল ৩, ৬ আর ১০ আগে ঝালিয়ে নেওয়া ভালো। এটা কোনো বাধা নয়, শুধু আপনার নিজের জন্য একটি মাপকাঠি।
- Shape আর axis:
a = np.arange(6).reshape(2, 3)হলেa.sum(axis=0)কী?[3 5 7]. a-এর সারি[0 1 2]আর[3 4 5]; axis=0 মানে সারি বরাবর নেমে যোগ, প্রতিটি কলামের একটি যোগফল। ভুল হলে AI-এর ভিত্তি কোর্সের পর্ব ১৬। - Broadcasting: shape (4, 3) থেকে shape (3,) বিয়োগ করলে ফল কী shape? আর shape (4,)?
(3,) হলে ফল (4, 3): ডান দিক থেকে মেলালে 3 আর 3 মেলে। (4,) হলে error, কারণ শেষ মাত্রা 3 আর 4 মেলে না, কোনোটি 1-ও নয়। প্রতিটি কলাম থেকে তার গড় বাদ দেওয়া (
X - X.mean(axis=0)) এই নিয়মেই চলে। দেখুন AI-এর ভিত্তি কোর্সের পর্ব ১৫। - Bayes: একটি রোগ ২% মানুষের। পরীক্ষা রোগীর ৯০% ক্ষেত্রে positive, সুস্থ মানুষের ৫% ক্ষেত্রে ভুল করে positive. Positive এলে রোগ থাকার সম্ভাবনা কত?
0.9 × 0.02 = 0.018; 0.05 × 0.98 = 0.049; উত্তর 0.018 / 0.067 ≈ ০.২৭। রোগ বিরল বলে বেশিরভাগ positive আসলে ভুল positive. দেখুন AI-এর ভিত্তি কোর্সের পর্ব ৫০।
- Gradient descent: f(w) = (w − 3)², শুরু w = 0, learning rate 0.1. এক ধাপ পরে w কত?
f′(w) = 2(w − 3), তাই w = 0-তে ঢাল −6. নতুন w = 0 − 0.1 × (−6) = ০.৬, সর্বনিম্ন বিন্দু ৩-এর দিকে। দেখুন AI-এর ভিত্তি কোর্সের পর্ব ৩৪।
- Metric: TP = 30, FP = 10, FN = 20. Precision আর recall কত?
Precision = 30 / (30 + 10) = ০.৭৫; recall = 30 / (30 + 20) = ০.৬০। Precision প্রশ্ন করে “যাদের positive বললাম, তাদের কতজন সত্যিই positive?”, recall প্রশ্ন করে “সত্যিকারের positive-দের কতজনকে ধরলাম?” দেখুন AI-এর ভিত্তি কোর্সের পর্ব ৬০।
- Leakage: একজন সহকর্মী পুরো ডেটায়
StandardScalerfit করে তারপর train আর test ভাগ করলেন। সমস্যা কী? - Overfitting: Train accuracy ০.৯৯, validation ০.৭০। কোন সমস্যা, আর দুটি প্রতিকার কী?
উচ্চ variance, অর্থাৎ overfitting: model train ডেটা মুখস্থ করেছে। প্রতিকার: model সরল করা বা regularization বাড়ানো (ridge-এর λ, গাছের গভীরতা কমানো), আর সম্ভব হলে আরও ডেটা। দেখুন AI-এর ভিত্তি কোর্সের পর্ব ৬১।
- Cross-validation: ২০% positive-এর ডেটায় সাধারণ k-fold-এর বদলে
StratifiedKFoldকেন, আর test set কতবার দেখা উচিত?Stratified ভাগে প্রতিটি fold-এ positive-এর অনুপাত প্রায় ২০% থাকে, তাই fold-এর score কম লাফায়। Test set শুধু একবার, সব বাছাই শেষে; বারবার দেখলে test নিজেই validation হয়ে যায়। দেখুন AI-এর ভিত্তি কোর্সের পর্ব ৬৬।
কোডে ঝালাই: আগে অনুমান, তারপর চালান
নিচের ব্লকে পাঁচটি ছোট লাইন। প্রতিটি লাইনের আউটপুট কী হবে, আগে কাগজে লিখুন, তারপর Run চাপুন। ব্লকটি এই পাতাতেই, আপনার ব্রাউজারে চলে (Pyodide: WebAssembly-তে compile করা আসল CPython). প্রথমবার Python আর scikit-learn নামতে প্রায় ১০ সেকেন্ড লাগতে পারে; পরের ব্লকগুলো দ্রুত চলে।
import sys
import numpy as np, pandas as pd, scipy, sklearn
from sklearn.metrics import precision_score, recall_score
from sklearn.preprocessing import StandardScaler
print("Python", sys.version.split()[0], "| numpy", np.__version__, "| pandas", pd.__version__,
"| scipy", scipy.__version__, "| sklearn", sklearn.__version__)
a = np.arange(6).reshape(2, 3)
print("1)", a.sum(axis=0), a.mean(axis=1)) # কোন axis-এ কী?
print("2)", (a - a.mean(axis=0)).shape, a.dtype) # broadcasting আর dtype
df = pd.DataFrame({"district": ["ঢাকা", "খুলনা", "ঢাকা", "সিলেট", "খুলনা"],
"orders": [3, 1, 5, 2, 4]})
print("3)", df.groupby("district")["orders"].mean().to_dict())
y_true = [1, 1, 1, 0, 0, 0, 0, 1]
y_pred = [1, 0, 1, 1, 0, 0, 0, 0]
print("4)", round(precision_score(y_true, y_pred), 3), recall_score(y_true, y_pred))
s = StandardScaler().fit(np.array([[1.0], [2.0], [3.0]]))
print("5)", s.transform([[4.0]]).ravel().round(3)) # sd কোন সূত্রে?আসল আউটপুট (ব্রাউজারের Python):
Python 3.14.2 | numpy 2.4.6 | pandas 3.0.2 | scipy 1.18.0 | sklearn 1.8.0
1) [3 5 7] [1. 4.]
2) (2, 3) int32
3) {'খুলনা': 2.5, 'ঢাকা': 4.0, 'সিলেট': 2.0}
4) 0.667 0.5
5) [2.449]
১) কলামের যোগফল [3 5 7], সারির গড় [1. 4.]। ২) shape (2, 3) বদলায় না; কিন্তু dtype int32! পাতার Python 32-bit WebAssembly-তে চলে, সেখানে NumPy-র default পূর্ণসংখ্যা int32; বেশিরভাগ 64-bit ডেস্কটপে একই লাইন int64 দেখায়। বড় গণনায় overflow-এর ঝুঁকি থাকলে dtype=np.int64 নিজে দিন। ৩) groupby চাবিগুলো সাজিয়ে দেয়; বাংলা শব্দ সাজে Unicode code point-এর ক্রমে (খ, ঢ, স)। ৪) TP = ২ (প্রথম আর তৃতীয়), FP = ১ (চতুর্থ), FN = ২ (দ্বিতীয় আর শেষ), তাই precision ২/৩ আর recall ২/৪। ৫) গড় ২, আর StandardScaler-এর sd n দিয়ে ভাগ করা (population sd), √(2/3) ≈ 0.816; তাই (4 − 2) / 0.816 ≈ 2.449. n − 1 দিয়ে ভাগ ভেবে থাকলে উত্তর হতো 2.0. পাঁচটির মধ্যে চারটি মিললে আপনি প্রস্তুত।
৩ · ১৪ মডিউলের মানচিত্র
নিচের মানচিত্রে ১৪টি মডিউল রঙ অনুযায়ী ছয়টি স্তরে ভাগ করা। ওপর থেকে নিচে পড়ুন: প্রতিটি স্তর আগের স্তরের ভাষা ব্যবহার করে। তবে পথটি পুরো সরলরেখা নয়। যেমন মডিউল ১২-এর SQL বা A/B test মডিউল ৬–৯ ছাড়াই পড়া যায়, আর মডিউল ১৪ যেকোনো সময় ঝালাইয়ের জন্য খুলতে পারেন।
মেশিন লার্নিং কোর্সের ১৪টি মডিউল
14 modules, 77 lessons, grouped into six layers
কয়েকটি নির্ভরতা মনে রাখার মতো। SVM-এর dual problem (পর্ব ২৮) বুঝতে Lagrange আর KKT (পর্ব ১৬) লাগবে। PCA থেকে recommender পর্যন্ত অনেক কিছু দাঁড়িয়ে আছে SVD-র ওপর (পর্ব ৯)। Gradient boosting (পর্ব ৩৫) আসলে function-এর জগতে gradient descent, তাই পর্ব ১৩ আগে পড়া থাকলে সহজ হবে। আর Bayesian linear regression (পর্ব ৪৫) পড়ার আগে multivariate Gaussian (পর্ব ১৯) জানা চাই।
এই কোর্সের পরে কী
এই কোর্সে neural network ইচ্ছা করেই খুব কম। ABCL TECH-এ নতুন করে তৈরি হতে থাকা পরের কোর্সগুলো সেই দিকগুলো নেবে: Deep Learning (network-এর training, CNN, RNN, Transformer, বড় model চালানো), NLP (ভাষার model আর বাংলা লেখার প্রক্রিয়া), Generative AI (LLM দিয়ে অ্যাপ, RAG, মূল্যায়ন), Computer Vision, Reinforcement Learning, MLOps (deploy, নজরদারি আর retrain-এর পুরো ব্যবস্থা), Data Engineering আর AI Ethics. এই কোর্সের গণিত, optimization আর মূল্যায়নের অভ্যাস সেগুলোর সবগুলোতে কাজে লাগবে।
৪ · ML পদ্ধতির পরিবার — কে কখন মানায়
শত শত অ্যালগরিদমের নাম শুনে ঘাবড়ানোর কারণ নেই। বেশিরভাগই অল্প কয়েকটি পরিবারের সদস্য, আর প্রতিটি পরিবারের একটি মূল অনুমান আছে: পৃথিবী দেখতে কেমন, সে বিষয়ে model আগে থেকে কী ধরে নেয়। এই আগাম অনুমানকে বলে inductive bias. কোন পরিবার আপনার ডেটায় ভালো করবে, তা অনেকটা নির্ভর করে তার inductive bias ডেটার আসল গঠনের সঙ্গে কতটা মেলে।
| পরিবার | মূল ধারণা | সাধারণত ভালো যখন | দুর্বল যখন | কোথায় |
|---|---|---|---|---|
| Linear (linear, logistic, GLM) | feature-গুলোর ওজনসহ যোগফল | ডেটা কম, feature অনেক, ব্যাখ্যা আর সম্ভাবনা দরকার | threshold আর interaction নিজে ধরে না | পর্ব ২০, ২৩–২৬ |
| Kernel (SVM, kernel ridge, GP) | মিল মাপার একটি kernel দিয়ে বাঁকা সীমানা | হাজার কয়েক সারি, মসৃণ সীমানা, সংখ্যার feature | লাখো সারি (খরচ প্রায় n² থেকে n³), scaling না করলে | পর্ব ২৭–৩১, ৪৬ |
| Tree আর ensemble (random forest, boosting) | হ্যাঁ/না প্রশ্নে ভাগ, অনেক গাছের মিলন | টেবিলের ডেটা, মেশানো feature, threshold আর interaction | খুব কম ডেটা, মসৃণ বা extrapolation দরকার | পর্ব ৩২–৩৮ |
| Probabilistic আর Bayesian | ডেটা কীভাবে তৈরি হলো তার একটি সম্ভাবনার model | অনিশ্চয়তা মাপা জরুরি, আগের জ্ঞান আছে | model-এর অনুমান ভুল হলে, বড় ডেটায় ধীর | পর্ব ১৮–২২, ৩৯, ৪৫–৪৯ |
| Unsupervised (clustering, density, PCA-র বাইরে) | label ছাড়া গঠন খোঁজা | দল খোঁজা, অস্বাভাবিক কিছু ধরা, মাত্রা কমানো | “ঠিক উত্তর” নেই, মূল্যায়ন কঠিন | পর্ব ৩৯–৪৪ |
| Time series | সময়ের ক্রম, trend, ঋতুচক্র | বিক্রি, চাহিদা, ট্রাফিকের পূর্বাভাস | এলোমেলো ভাগে মূল্যায়ন করলে ভবিষ্যৎ ফাঁস হয় | পর্ব ৫১–৫২ |
| Recommender | ক্রেতা × পণ্যের ফাঁকা matrix পূরণ | অনেক ক্রেতা, অনেক পণ্য, অন্তর্নিহিত পছন্দ | নতুন ক্রেতা বা পণ্য (cold start) | পর্ব ৯, ৫৩ |
টেবিলের “সাধারণত” শব্দটি গুরুত্বপূর্ণ। এগুলো প্রবণতা, নিয়ম নয়। No free lunch-এর ফলাফল বলে, সব সম্ভাব্য সমস্যার গড় নিলে কোনো শেখার পদ্ধতিই অন্যটির চেয়ে ভালো নয় (AI-এর ভিত্তি কোর্সের পর্ব ৫৫-এ এর পরিচয় আছে, আর পর্ব ৩ “শেখার তত্ত্ব”-এ আরও গভীরে)। বাস্তবের সমস্যা অবশ্য সব সম্ভাব্য সমস্যার গড় নয়; বাস্তবের ডেটার কিছু নিয়মিত গঠন থাকে, আর সেই গঠনের সঙ্গে মেলানোই model বাছাইয়ের শিল্প।
ডেটা আর লক্ষ্য দেখে প্রার্থী বাছাই
নতুন সমস্যায় সরাসরি সবচেয়ে জনপ্রিয় model-এ ঝাঁপ না দিয়ে কয়েকটি প্রশ্ন করুন। নিচের ডায়াগ্রামে বাজারঘরের churn সমস্যায় প্রশ্নগুলো একটি একটি করে চলছে। এখানে churn মানে: একজন গ্রাহক পরের ৬০ দিনে আর কোনো অর্ডার দেননি।
- Label?কী অনুমান
- আকারn, p, ধরন
- সম্পর্কসরল না বাঁকা
- লক্ষ্যmetric
- বাধাব্যাখ্যা, গতি
- তুলনাএকই fold
y = churn (০ বা ১) → supervised → binary classification
n = 800 গ্রাহক, p = 7 কলাম সব কলাম সংখ্যা, একটি টেবিল churn-এর হার প্রায় ২০%
৪৫ দিন চুপ → ঝুঁকি লাফিয়ে বাড়ে দেরি × অভিযোগ → একসঙ্গে খারাপ অর্ডার বাড়লে ঝুঁকি কমে
কাজ: কাকে আগে ফোন → ক্রম দরকার → ROC AUC সম্ভাবনা লাগলে → calibration
logistic : সরল, ব্যাখ্যা সহজ RBF SVM : মসৃণ বাঁকা সীমানা hist gb : threshold, interaction baseline : কিছু না শিখে কত?
একই StratifiedKFold(5) গড় ± ছড়ানো, fold ধরে পার্থক্য তারপর learning curve
- Label আছে? আমাদের কাছে গত মৌসুমের গ্রাহকদের ইতিহাস আছে, আর জানি কে পরে চলে গেছেন। তাই এটি supervised learning, দুই শ্রেণির classification. Label না থাকলে প্রশ্ন বদলে যেত, যেমন গ্রাহকদের দল খোঁজা (unsupervised).
- ডেটার আকার। ৮০০ সারি, ৭টি সংখ্যার কলাম: এটি ছোট-মাঝারি tabular data. n/p প্রায় ১১৪, তাই খুব নমনীয় model-ও খানিকটা চলবে, কিন্তু ৮০০-র ২০%, মাত্র ১৬০ জন churn; positive কম, তাই variance বেশি হবে। লেখা বা ছবি হলে পরিবারই আলাদা হতো।
- সম্পর্কের ধরন। ব্যবসার লোকেরা বলছেন, ছয় সপ্তাহের বেশি চুপ থাকলে গ্রাহক সাধারণত আর ফেরেন না, আর দেরিতে ডেলিভারির সঙ্গে অভিযোগ মিললে ঝুঁকি অনেক বাড়ে। এগুলো threshold আর interaction, যা গাছ নিজে ধরে, আর linear model-কে হাতে feature বানিয়ে দিতে হয়। অনুমান এখনো প্রমাণ নয়।
- লক্ষ্য আর metric. বাজারঘরের দল প্রতি সপ্তাহে সীমিত কয়েকজনকে ফোন করবে, তাই দরকার ঝুঁকি অনুযায়ী ক্রম। এর জন্য ROC AUC. Accuracy এখানে বিভ্রান্তিকর: সবাইকে “থাকবেন” বললেই ৮০%. সম্ভাবনার মান নিজেই কাজে লাগলে calibration লাগবে (পর্ব ২৬)।
- প্রার্থী। তিন পরিবার থেকে একজন করে: logistic (linear), RBF SVM (kernel), histogram gradient boosting (tree ensemble). সঙ্গে একটি baseline, যা কিছুই শেখে না; সেটি না হারালে বাকি সব অর্থহীন। ব্যাখ্যা আর গতির শর্ত এখনো কাউকে বাদ দেয় না।
- তুলনা। সবাইকে একই ৫টি stratified fold-এ মাপা হবে, গড়ের পাশে ছড়ানো আর fold ধরে পার্থক্যসহ। তারপর learning curve দেখে বোঝা যাবে ডেটা বাড়লে ক্রম বদলায় কি না। পরের অংশে ঠিক এটাই চালাবেন।
৫ · প্রথম তুলনা — বাজারঘরের churn-এ তিন পরিবার, একই fold-এ
ডেটা পুরো বানানো, seed 42 দিয়ে, যাতে সব পাঠক হুবহু একই সংখ্যা পান। ৮০০ জন কাল্পনিক গ্রাহক, সাতটি কলাম: কত মাস ধরে গ্রাহক (tenure), গত ৯০ দিনে অর্ডার, শেষ অর্ডারের পর কত দিন (recency), গড় বাস্কেট (টাকা), দেরিতে পৌঁছানো অর্ডারের ভাগ, অভিযোগের সংখ্যা, আর অ্যাপ ব্যবহার করেন কি না। Churn-এর পেছনের লুকোনো নিয়মও আমাদের লেখা: ৪৫ দিনের বেশি চুপ থাকলে ঝুঁকি লাফিয়ে বাড়ে, অর্ডার আর পুরোনো সম্পর্ক ঝুঁকি কমায়, অ্যাপ ব্যবহারকারীরা কম চলে যান, আর দেরি ও অভিযোগ একসঙ্গে থাকলে ঝুঁকি অনেক বাড়ে। তার ওপর এলোমেলোতা।
প্রত্যেক প্রার্থী একই StratifiedKFold-এর একই ৫টি ভাগে মাপা হয় (cross-validation, AI-এর ভিত্তি কোর্সের পর্ব ৬৬)। Logistic আর SVM দূরত্ব বা ওজনের মাপে সংবেদনশীল, তাই তাদের আগে standardization, pipeline-এর ভেতরে; গাছের তা লাগে না। কোনো model-এর সেটিং খোঁজা হয়নি, প্রায় সবই default: এটি প্রথম দেখা, প্রতিযোগিতা নয়।
import numpy as np, pandas as pd
from sklearn.model_selection import StratifiedKFold, cross_validate
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import HistGradientBoostingClassifier
rng = np.random.default_rng(42) # বাজারঘরের ৮০০ জন কাল্পনিক গ্রাহক
n = 800
tenure, orders = rng.integers(1, 49, n), rng.poisson(2.5, n) # কত মাসের গ্রাহক; ৯০ দিনে অর্ডার
recency = np.round(rng.exponential(30, n)) + 1 # শেষ অর্ডারের পর কত দিন
basket = np.round(rng.lognormal(7.0, 0.5, n), -1) # গড় বাস্কেট, টাকা
late, complaints = np.round(rng.beta(2, 6, n), 2), rng.poisson(0.4, n) # দেরির ভাগ; অভিযোগ
app = (rng.random(n) < 0.5).astype(int) # অ্যাপ ব্যবহার করেন কি না
z = (-0.3 + 2.2 * (recency > 45) - 0.45 * orders - 0.03 * tenure
+ 3.5 * late * (complaints > 0) - 0.6 * app + 0.15 * np.log(basket / 1100))
y = (rng.random(n) < 1 / (1 + np.exp(-z))).astype(int) # 1 = পরের ৬০ দিনে অর্ডার নেই
X = pd.DataFrame({"tenure": tenure, "orders_90d": orders, "recency": recency, "basket": basket,
"late_share": late, "complaints": complaints, "app": app})
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # সবার জন্য একই ৫টি fold
models = {"baseline": DummyClassifier(),
"logistic": make_pipeline(StandardScaler(), LogisticRegression()),
"svm rbf": make_pipeline(StandardScaler(), SVC()),
"hist gb": HistGradientBoostingClassifier(max_depth=3, learning_rate=0.05, random_state=42)}
print("X", X.shape, "| churn rate", round(y.mean(), 3))
auc = {}
for name, m in models.items():
r = cross_validate(m, X, y, cv=cv, scoring=["roc_auc", "accuracy"])
auc[name] = r["test_roc_auc"]
print(f"{name:8s} AUC {auc[name].mean():.3f} ± {auc[name].std():.3f} | acc {r['test_accuracy'].mean():.3f}")
d = auc["hist gb"] - auc["logistic"]
print("hist gb - logistic, fold by fold:", d.round(3), "| wins", (d > 0).sum(), "of 5")আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):
X (800, 7) | churn rate 0.201
baseline AUC 0.500 ± 0.000 | acc 0.799
logistic AUC 0.757 ± 0.037 | acc 0.815
svm rbf AUC 0.716 ± 0.058 | acc 0.816
hist gb AUC 0.773 ± 0.040 | acc 0.826
hist gb - logistic, fold by fold: [ 0.025 0.026 -0.002 0.014 0.012] | wins 4 of 5
Baseline আগে পড়ুন। DummyClassifier সবাইকে একই সম্ভাবনা দেয়, তাই AUC ঠিক ০.৫০০, আর accuracy ০.৭৯৯: সবাইকে “থাকবেন” বলেই প্রায় ৮০%! Accuracy কলামে তিন model ০.৮১৫ থেকে ০.৮২৬, baseline থেকে সামান্য ওপরে; এই কাজের জন্য accuracy প্রায় কিছুই আলাদা করে না। AUC কলামেই আসল পার্থক্য।
তিন পরিবার। Gradient boosting ০.৭৭৩, logistic ০.৭৫৭, SVM ০.৭১৬। Boosting আর logistic-এর পার্থক্য ০.০১৬, অথচ প্রতিটির fold-এর ছড়ানো প্রায় ০.০৪। ছড়ানোর চেয়ে ছোট পার্থক্য দেখে “boosting ভালো” বলা যায় না। শেষ লাইন জোড়া তুলনা: একই fold-এ দুজনেই একই সহজ বা কঠিন প্রশ্নপত্র পায়, তাই fold ধরে পার্থক্য বেশি তথ্য দেয়। Boosting ৫টির ৪টিতে এগিয়ে, তবে পাঁচটি সংখ্যা দিয়ে জোরালো সিদ্ধান্ত হয় না; এর পরিসংখ্যান পর্ব ২২-এ। SVM-এর পিছিয়ে থাকাকে “SVM খারাপ” পড়বেন না: তার C আর gamma একবারও খোঁজা হয়নি, আর দরকারহীন feature-ও RBF দূরত্বে সমান ওজন পাচ্ছে। কেন, তা পর্ব ২৯-এ।
একটি সৎ স্বীকারোক্তি: ডেটার লুকোনো নিয়মে threshold (৪৫ দিন) আর interaction (দেরি × অভিযোগ) আমরা নিজেরাই বসিয়েছি, যা গাছের inductive bias-এর সঙ্গে মেলে। তাই gradient boosting-এর সামান্য এগিয়ে থাকা খানিকটা আমাদের বানানো। বাস্তবের ডেটার নিয়ম কেউ জানে না; এজন্যই প্রতিটি নতুন সমস্যায় তুলনাটা নতুন করে চালাতে হয়।
৬ · ছবিতে পার্থক্য — decision boundary আর learning curve
সংখ্যা বলে কে কতটা ভালো; ছবি বলে কেন। একটি model ইনপুটের জায়গাকে যে রেখা দিয়ে “churn” আর “থাকবেন” অংশে ভাগ করে, তাকে বলে decision boundary. সাত মাত্রার জায়গা আঁকা যায় না, তাই নিচের ব্লক শুধু দুটি feature নেয়: শেষ অর্ডারের পর কত দিন, আর গত ৯০ দিনে কতটি অর্ডার। তিন পরিবারকে এই দুটি দিয়েই নতুন করে fit করে, আর প্রতিটির decision_function-এর মান রঙে আঁকে: লাল মানে churn-এর দিকে, নীল মানে থাকার দিকে, কালো রেখা শূন্যের সীমানা। কালো ক্রস হলো সত্যিকারের churn গ্রাহক।
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import HistGradientBoostingClassifier
X2 = X[["recency", "orders_90d"]].to_numpy(dtype=float) # শুধু দুটি feature, যাতে আঁকা যায়
fam = {"logistic regression": make_pipeline(StandardScaler(), LogisticRegression()),
"RBF SVM": make_pipeline(StandardScaler(), SVC()),
"hist gradient boosting": HistGradientBoostingClassifier(max_depth=3, learning_rate=0.05, random_state=42)}
gx, gy = np.meshgrid(np.linspace(0, 240, 241), np.linspace(-0.5, 10, 106))
grid = np.c_[gx.ravel(), gy.ravel()]
probe = np.array([[20, 1], [50, 1], [80, 1], [80, 5]], dtype=float) # চারজন কাল্পনিক গ্রাহক
jit = np.random.default_rng(0).uniform(-0.25, 0.25, len(y)) # শুধু ছবিতে বিন্দু ছড়াতে
ch = y == 1
fig, axes = plt.subplots(1, 3, figsize=(10, 3.4), sharey=True, layout="constrained")
for ax, (name, m) in zip(axes, fam.items()):
s = m.fit(X2, y).decision_function(grid).reshape(gx.shape) # s > 0 মানে churn অনুমান
ax.contourf(gx, gy, s, levels=np.linspace(-4, 4, 17), cmap="RdBu_r", extend="both")
ax.contour(gx, gy, s, levels=[0], colors="k", linewidths=1.5)
ax.scatter(X2[~ch, 0], X2[~ch, 1] + jit[~ch], s=4, c="white", alpha=0.7)
ax.scatter(X2[ch, 0], X2[ch, 1] + jit[ch], s=12, c="black", marker="x", linewidths=0.8)
ax.set_title(name, fontsize=10); ax.set_xlabel("days since last order")
print(f"{name:22s} score:", m.decision_function(probe).round(2))
axes[0].set_ylabel("orders in last 90 days")
plt.show()আসল আউটপুট (ব্রাউজারের Python; ছবিটি ব্লকের নিচে আসে):
logistic regression score: [-1.1 -0.53 0.04 -1.72]
RBF SVM score: [-1.06 -0.36 0.23 -0.82]
hist gradient boosting score: [-2.18 1.28 0.2 -1.87]
তিনটি ছবিতে তিনটি inductive bias চোখে পড়ে। Logistic-এর সীমানা একটি সোজা রেখা, আর রঙ এক দিকে সমানভাবে গাঢ় হয়: “দিন বাড়লে ঝুঁকি সমান হারে বাড়ে।” RBF SVM-এর সীমানা মসৃণ বাঁকা, ঘন বিন্দুর কাছে আকার নেয়। Gradient boosting-এর সীমানা সিঁড়ির মতো, অক্ষের সমান্তরাল ধাপে, আর ৪৫ দিনের কাছে একটি খাড়া দেয়াল: আমাদের লুকোনো threshold সে প্রায় হুবহু খুঁজে পেয়েছে।
চারজন কাল্পনিক গ্রাহকের score দেখুন (শূন্যের বেশি মানে churn অনুমান; ক্রম: ২০ দিন ও ১ অর্ডার, ৫০ দিন ও ১, ৮০ দিন ও ১, ৮০ দিন ও ৫)। ১ অর্ডারের গ্রাহক ২০ থেকে ৫০ দিনে গেলে logistic-এর score −১.১০ থেকে −০.৫৩, ধীরে বাড়ে; boosting-এর score −২.১৮ থেকে লাফিয়ে +১.২৮, কারণ মাঝে ৪৫ দিনের দেয়াল। ৮০ দিন আর ১ অর্ডারে তিনটিই সামান্য ধনাত্মক, অর্থাৎ churn; ৮০ দিন আর ৫ অর্ডারে তিনটিই ঋণাত্মক, “থাকবেন”। তিনটির score-এর মাপও আলাদা: logistic আর boosting-এরটি log-odds, SVM-এরটি সীমানা থেকে দূরত্বের মতো একটি মান, সম্ভাবনা নয়। Model-এর ভেতরের সংখ্যা পড়ার আগে জানতে হয় সেটি কী মাপে।
Learning curve — ডেটা বাড়লে ক্রম বদলায়
একটি learning curve দেখায়, train ডেটা বাড়ালে validation score কীভাবে বদলায় (AI-এর ভিত্তি কোর্সের পর্ব ৬১-এ এর পরিচয়)। নিচের ব্লক আগের ব্লকের models, X, y আর cv ব্যবহার করে (data-shared), আর একই ৫টি fold-এর প্রতিটির train অংশ থেকে ৬০, ১৫০, ৩০০ আর ৬৪০ জন নিয়ে তিন পরিবার শেখায়। মোট ৬০টি fit, তাই কয়েক সেকেন্ড লাগতে পারে।
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
sizes = [60, 150, 300, 640] # train-এ কতজন গ্রাহক
plt.figure(figsize=(6, 3.6), layout="constrained")
for name in ["logistic", "svm rbf", "hist gb"]: # আগের ব্লকের models, X, y, cv
sz, tr, va = learning_curve(models[name], X, y, cv=cv, scoring="roc_auc",
train_sizes=sizes, shuffle=True, random_state=0)
print(f"{name:8s} val AUC {va.mean(axis=1).round(3)} | train AUC {tr.mean(axis=1).round(3)}")
plt.plot(sz, va.mean(axis=1), "o-", label=name)
plt.xlabel("training customers"); plt.ylabel("mean validation ROC AUC")
plt.title("Learning curves on the same 5 folds"); plt.legend(fontsize=8)
plt.show()আসল আউটপুট (ব্রাউজারের Python):
logistic val AUC [0.683 0.742 0.748 0.757] | train AUC [0.815 0.772 0.765 0.768]
svm rbf val AUC [0.666 0.667 0.699 0.716] | train AUC [0.96 0.936 0.886 0.843]
hist gb val AUC [0.64 0.73 0.743 0.773] | train AUC [0.877 0.967 0.941 0.908]
ছোট ডেটায় সরল model জেতে। ৬০ জনে logistic ০.৬৮৩, boosting ০.৬৪০; ১৫০ আর ৩০০ জনেও logistic এগিয়ে। ৬৪০ জনে ক্রম উল্টে যায়: boosting ০.৭৭৩, logistic ০.৭৫৭। কারণটি bias–variance (AI-এর ভিত্তি কোর্সের পর্ব ৬১): নমনীয় model-এর অনেক কিছু শেখার ক্ষমতা আছে, কিন্তু অল্প ডেটায় সেই ক্ষমতা noise মুখস্থে খরচ হয়। Train AUC কলাম সেটাই দেখায়: ৬০ জনে boosting-এর train ০.৮৭৭ আর validation ০.৬৪০, বড় ফাঁক; logistic-এর ফাঁক ছোট।
বক্ররেখার ঢাল দেখুন। Logistic ৩০০ থেকে ৬৪০ জনে মাত্র ০.০০৯ বাড়ে, প্রায় সমতল: আরও ডেটা দিলেও সে খুব বেশি এগোবে না, কারণ তার সোজা রেখা threshold ধরতে পারে না (উচ্চ bias). Boosting তখনো উঠছে। “ডেটা বাড়ালে লাভ হবে কি না” প্রশ্নের উত্তর এই ঢাল থেকে আসে, আর ডেটা সংগ্রহে টাকা খরচের আগে এই প্রশ্ন জরুরি।
কোন model ভালো, প্রশ্নটি অসম্পূর্ণ। সম্পূর্ণ প্রশ্ন: কোন ডেটায়, কত ডেটায়, কোন metric-এ, আর কতটা অনিশ্চয়তাসহ? এই কোর্সের প্রতিটি পরিবারের পর্বে এই চারটি প্রশ্ন ফিরে আসবে।
৭ · টুল আর version — পাতায় কী চলে, ডেস্কটপে কী
এই কোর্সের প্রধান টুল আপনার ব্রাউজারেই চলে। চালানো যায় এমন প্রতিটি Python ব্লক Pyodide-এ চলে, তাতে NumPy, SciPy, pandas, scikit-learn, matplotlib আর statsmodels আছে; কিছুই install করতে হয় না। কিছু টুল পাতায় চলে না, বা চললেও ভারী: XGBoost, LightGBM, CatBoost, SHAP, Optuna, MLflow, FastAPI, Streamlit, Polars, DuckDB. এগুলো আমরা ডেস্কটপে সত্যিই চালিয়ে আউটপুট পাতায় দিই, “সত্যিকারের run” লেখাসহ। কোনো কিছু চালানো না গেলে তা স্পষ্ট লেখা থাকবে, আর অনুমানের আউটপুটে লেখা থাকবে “নমুনা”।
| কোথায় | টুল | লেখার সময়ের version |
|---|---|---|
| পাতায় (Pyodide 314.0.7) | Python, NumPy, pandas, SciPy, scikit-learn, matplotlib | 3.14.2, 2.4.6, 3.0.2, 1.18.0, 1.8.0, 3.10.8; statsmodels-ও আছে |
| ডেস্কটপে (একটি venv) | Python, NumPy, pandas, scikit-learn | 3.14.4, 2.5.4, 3.1.1, 1.9.1 |
| ডেস্কটপে, boosting | XGBoost, LightGBM, CatBoost | 3.4.1, 4.7.0, 1.2.10 |
| ডেস্কটপে, ব্যাখ্যা আর tuning | SHAP, Optuna, statsmodels | 0.54.1, 5.0.0, 0.15.0 |
পাতা আর ডেস্কটপের scikit-learn-এর version আলাদা (1.8.0 বনাম 1.9.1), তাই একই কোডের শেষ দশমিকে মাঝে মাঝে তফাত হতে পারে। API-ও বদলায়: যেমন scikit-learn 1.9-এ SVC(probability=True) deprecated হয়েছে, ভবিষ্যতে সরানো হবে বলে ঘোষণা আছে; এই পর্বের ছবিতে তাই SVM-এর decision_function ব্যবহার হয়েছে। নিজের কম্পিউটারে একই পরিবেশ বানাতে uv (AI-এর ভিত্তি কোর্সের পর্ব ৭):
uv venv --python 3.14
uv pip install numpy pandas scipy scikit-learn matplotlib statsmodels
uv pip install xgboost lightgbm catboost shap optunaনিচে সেই venv-এ একটি সত্যিকারের run (Windows-এর ডেস্কটপ, Python 3.14.4). স্ক্রিপ্টটি পাতার হুবহু একই ৮০০ জন গ্রাহক আর একই ৫টি fold নেয়, আর তিনটি জনপ্রিয় boosting library চালায়, প্রায় একই সেটিংয়ে (২০০টি গাছ, অগভীর, learning rate 0.05). এরা কী, কোথায় আলাদা, তা পর্ব ৩৬-এ; এখানে শুধু দেখা যে পাতার বাইরের টুলও একই কাঠামোয় মাপা হয়।
~/bazarghar-ml$ python boosters.py
Python 3.14.4
numpy 2.5.4
pandas 3.1.1
scikit-learn 1.9.1
xgboost 3.4.1
lightgbm 4.7.0
catboost 1.2.10
shap 0.54.1
optuna 5.0.0
statsmodels 0.15.0
xgboost AUC 0.774 ± 0.036
lightgbm AUC 0.767 ± 0.030
catboost AUC 0.779 ± 0.029
তিনটিই পাতার HistGradientBoostingClassifier-এর ০.৭৭৩-এর আশেপাশে, ±০.০৩-এর মধ্যে। এই ডেটায় library বদলে প্রায় কিছুই লাভ নেই; বড় ডেটা, category-ভরা কলাম বা গতির প্রশ্নে পার্থক্য আসে। এটি একটি ডেটাসেটে একবারের স্থানীয় run, সাধারণ ফলাফল নয়।
আরও গভীরে: scikit-learn-এর একই fit/predict/transform কাঠামো (estimator API) কেন এমন, তা এর নির্মাতারা ব্যাখ্যা করেছেন Buitinck ও সহকর্মীদের ২০১৩ সালের “API design for machine learning software” প্রবন্ধে; মূল library-র পরিচয় Pedregosa ও সহকর্মীদের ২০১১ সালের JMLR প্রবন্ধে। HistGradientBoostingClassifier-এর নকশা LightGBM থেকে অনুপ্রাণিত বলে scikit-learn-এর docs-এ লেখা আছে। Pyodide CPython-কে WebAssembly-তে compile করে; সেই কারণেই পাতায় পূর্ণসংখ্যার default আকার 32-bit, আর floating-point exception-এর flag নেই।
৮ · একটি পর্ব কীভাবে সাজানো, আর কীভাবে পড়বেন
এই কোর্সের প্রতিটি পর্ব একই ছাঁচে তৈরি, যাতে আপনি জানেন কোথায় কী পাবেন, আর কোন অংশ নিজের স্তর অনুযায়ী আগে-পরে পড়বেন। নিচের ডায়াগ্রামে ছাঁচটি, আর প্রতিটি অংশ পড়ার পরামর্শ।
- TL;DRলক্ষ্য
- অন্তর্দৃষ্টিউপমা
- প্রক্রিয়াসূত্র, ধাপ
- কোডআগে অনুমান
- আরও গভীরেঐচ্ছিক
- প্রশ্নঅনুশীলন
- যাচাইquiz, মনে রাখুন
- TL;DR আর লক্ষ্য। শুরুতেই পাঁচ লাইনে পুরো পর্ব। পড়ার আগে এগুলো দেখে নিজেকে জিজ্ঞেস করুন, কোনটা আগে থেকে জানি, কোনটা নতুন। পর্ব শেষে আবার পড়ুন; প্রতিটি লাইন নিজের ভাষায় বোঝাতে পারলে পর্বটি আপনার হয়েছে।
- অন্তর্দৃষ্টি। নতুন ধারণা আসে একটি পরিচিত ছবি দিয়ে: বাজারের দরদাম, ক্রিকেটের স্কোরকার্ড, ডাক্তারের রোগনির্ণয়। নতুনদের জন্য এই অংশ সবচেয়ে জরুরি; অভিজ্ঞরা দ্রুত পার হতে পারেন, কিন্তু উপমার সীমা কোথায়, তা খেয়াল করা ভালো।
- প্রক্রিয়া আর সংখ্যা। সূত্র, derivation আর ধাপে ধাপে ডায়াগ্রাম। এখানে গতি কমান। খাতা-কলম নিয়ে প্রতিটি সূত্রের প্রতিটি চিহ্ন কী বোঝায় লিখুন, একটি ছোট উদাহরণে নিজে হিসাব করুন, তারপর ডায়াগ্রামের সংখ্যার সঙ্গে মেলান। একটি পর্বের গণিতে এক ঘণ্টা লাগলেও তা স্বাভাবিক।
- কোড। প্রতিটি ব্লক চালানোর আগে আউটপুট অনুমান করে লিখুন। অনুমান মিলে গেলে ধারণা পাকা; না মিললে সেটাই শেখার জায়গা। তারপর একটি সংখ্যা বদলে আবার চালান: seed, ডেটার আকার, একটি hyperparameter. কোডের নিচের ব্যাখ্যায় আসল আউটপুট দেওয়া আছে।
- আরও গভীরে। প্রবন্ধ, মানদণ্ড আর library-র ভেতরের খবর। প্রথম পড়ায় বাদ দিলে কিছু হারাবেন না। গবেষণা বা সিনিয়র পদের ইন্টারভিউয়ের প্রস্তুতি নিলে পরে ফিরে এসে মূল প্রবন্ধটি অন্তত একবার খুলে দেখুন।
- ভাবনার প্রশ্ন আর অনুশীলন। ভাবনার প্রশ্নে ইতিহাস আর বাস্তবের trade-off; অনুশীলনে হিসাব, আউটপুট অনুমান, নকশা আর সমালোচনা। উত্তর খোলার আগে অন্তত পাঁচ মিনিট নিজে চেষ্টা করুন; কঠিন numerical লিখে সমাধান করুন, মনে মনে নয়।
- যাচাই আর মনে রাখুন। শেষে MCQ, একটি ক্রম সাজানোর ধাঁধা আর পাঁচটি মূল কথা। ভুল হলে ব্যাখ্যা পড়ে সংশ্লিষ্ট অংশে ফিরে যান। এক সপ্তাহ পরে শুধু “মনে রাখুন” অংশটি আবার পড়লে ভুলে যাওয়া অনেক কমে।
গণিতের গতি আর অভ্যাস
- প্রথম পড়ায় সব প্রমাণ নয়। মডিউল ২–৪-এর কোনো derivation আটকে গেলে আগে তার ফলটি একটি ছোট সংখ্যার উদাহরণে যাচাই করুন, তারপর প্রমাণে ফিরুন। ফল কী বলে তা জানলে প্রমাণ অনেক সহজ লাগে।
- সপ্তাহে তিন-চারটি পর্ব যথেষ্ট। প্রতিদিন অল্প, নিয়মিত পড়া এক দিনে অনেক পড়ার চেয়ে ভালো কাজ করে। মডিউল শেষে ভাবনার প্রশ্নগুলো আবার ঝালিয়ে নিন।
- নিজের খাতা রাখুন। প্রতিটি নতুন সূত্র, তার প্রতিটি চিহ্নের মানে, আর একটি করে হাতে করা উদাহরণ। পরীক্ষা বা ইন্টারভিউর আগে এই খাতাটিই সবচেয়ে কাজের।
- নিজের ডেটায় চালান। বাজারঘরের ডেটা আমাদের বানানো; প্রতিটি মডিউলের পর একটি খোলা ডেটাসেটে (যেমন scikit-learn-এর সঙ্গে আসা
load_breast_cancerবা California housing) একই কাজ চালালে শেখা পাকা হয়।
পরীক্ষা ও ইন্টারভিউতে: এই পর্বের বিষয়ে যে ধরনের প্রশ্ন প্রায়ই আসে:
- Logistic, SVM আর tree ensemble-এর decision boundary-র আকার কেমন? সোজা রেখা বা সমতল; kernel অনুযায়ী মসৃণ বাঁকা; অক্ষের সমান্তরাল সিঁড়ি।
- Tabular ডেটায় প্রথম কোন model চালাবেন? একটি baseline, একটি regularized linear model আর একটি gradient boosting, একই fold-এ; তারপর ফল দেখে সিদ্ধান্ত।
- Imbalanced ডেটায় accuracy কেন বিভ্রান্তিকর? সংখ্যাগুরু শ্রেণি বললেই উঁচু accuracy আসে; ক্রমের জন্য AUC, ধরার জন্য precision/recall.
- Learning curve থেকে কী বোঝেন? Train আর validation-এর ফাঁক বড় হলে variance, দুটিই নিচু আর সমতল হলে bias; validation তখনো উঠতে থাকলে আরও ডেটা কাজে লাগবে।
- দুই model-এর CV গড় ০.৭৭ আর ০.৭৬; কোনটি নেবেন? ছড়ানো আর fold ধরে পার্থক্য না দেখে বলা যায় না; সমান হলে সরল, দ্রুত আর ব্যাখ্যাযোগ্যটি।
৯ · AI-এর যুগে — AI assistant দিয়ে ML কাজ, যাচাইসহ
এই কোর্সের কোড AI assistant দিয়েও লেখানো যায়, আর অনেক কাজে তা সময় বাঁচায়। কিন্তু ML-এর কোডে AI-এর ভুল প্রায়ই চুপচাপ হয়: কোড চলে, নম্বর আসে, আর নম্বরটি ভুল। যেমন, AI প্রায়ই পুরোনো API দেয় (সরানো scikit-learn parameter, পুরোনো XGBoost বা LightGBM-এর argument, pandas-এর append), এমন function বা hyperparameter বানায় যা নেই, test set-এ tuning করে, train বা একটি মাত্র ভাগের score-কে চূড়ান্ত বলে, class imbalance আর calibration উপেক্ষা করে, SHAP-এর মানকে কারণ বলে পড়ে, আর বিশ্বাসযোগ্য দেখতে কিন্তু ভুল derivation লেখে।
AI-কে কাজ দেওয়ার সময় version, যাচাইয়ের নিয়ম আর আউটপুটের রূপ বলে দিন। নিচের prompt-টি এই পর্বের তুলনার কাজের জন্য:
AI-এর লেখা ML কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Leo Breiman “দুই সংস্কৃতি”-র কথা বলেছিলেন। সেগুলো কী, আর এই কোর্স কোন সংস্কৃতির?
২০০১ সালে Statistical Science জার্নালে Leo Breiman “Statistical Modeling: The Two Cultures” নামে একটি প্রবন্ধ লেখেন, যা আজও বহুল আলোচিত। তাঁর মতে ডেটা থেকে সিদ্ধান্তে পৌঁছানোর দুটি সংস্কৃতি আছে। Data modeling সংস্কৃতি ধরে নেয় ডেটা একটি নির্দিষ্ট সম্ভাবনার model থেকে এসেছে, যেমন linear বা logistic regression, তারপর তার parameter অনুমান করে আর তাদের ব্যাখ্যা করে। Algorithmic modeling সংস্কৃতি ডেটা তৈরির প্রক্রিয়াকে অজানা ধরে নেয়, আর এমন একটি algorithm খোঁজে যা নতুন ডেটায় ভালো অনুমান করে, যেমন decision tree, random forest বা neural network. তাঁর নিজের মোটা দাগের হিসাবে সেই সময়ের পরিসংখ্যানবিদদের প্রায় সবাই প্রথম সংস্কৃতির।
Breiman বহু বছর পরামর্শক হিসেবে কাজ করে এসে যুক্তি দেন যে, model-এর অনুমান ভুল হলে সুন্দর ব্যাখ্যাও ভুল, আর অনুমানের নির্ভুলতা যাচাই না করে model বিশ্বাস করা বিপজ্জনক। একই সংখ্যায় David Cox আর Bradley Efron-এর মতো পরিসংখ্যানবিদ মন্তব্য লেখেন; তাঁরা মেনে নেন যে নির্ভুলতা গুরুত্বপূর্ণ, কিন্তু মনে করিয়ে দেন যে বিজ্ঞানের অনেক প্রশ্নে ব্যাখ্যা আর কারণই আসল লক্ষ্য, শুধু অনুমান নয়।
এই কোর্স দুটিকেই নেয়, আর কেন, তা এই পর্বের তুলনাতেই দেখা গেছে। Gradient boosting অনুমানে সামান্য এগিয়ে, কিন্তু logistic regression-এর coefficient সরাসরি বলে কোন feature ঝুঁকি কতটা বাড়ায়। মডিউল ৪ আর ৯ data modeling-এর ভাষা শেখায় (likelihood, GLM, posterior); মডিউল ৬ আর ৭ algorithmic modeling-এর (kernel, ensemble). মডিউল ১১ দুটিকে জোড়ে: জটিল model-কে ব্যাখ্যা করা, আর অনুমানের সঙ্গে অনিশ্চয়তা দেওয়া। আজকের বাস্তবে সীমারেখা অনেক ঝাপসা; gradient boosting-ও একটি loss কমায়, আর Bayesian পদ্ধতিও অনুমানের নির্ভুলতায় মাপা হয়।
মূল উপলব্ধি: প্রশ্নটি ঠিক করে কোন সংস্কৃতি। “কে চলে যাবেন” অনুমানের প্রশ্ন; “ডেলিভারি দ্রুত করলে churn কমবে কি না” কারণের প্রশ্ন, আর তার জন্য অনুমানের নির্ভুলতা যথেষ্ট নয় (পর্ব ৬৪)।
প্র ০২No free lunch বলে কোনো algorithm সব জায়গায় সেরা নয়। তবু অনেক benchmark-এ tabular ডেটায় tree ensemble বারবার এগিয়ে থাকে কেন?
David Wolpert ১৯৯৬ সালে Neural Computation-এ দেখান, সব সম্ভাব্য লক্ষ্য-function-এর ওপর সমান গড় নিলে, train ডেটার বাইরে কোনো শেখার পদ্ধতির প্রত্যাশিত ভুল অন্যটির চেয়ে কম নয়; ১৯৯৭ সালে Wolpert আর William Macready optimization-এর জন্য একই রকম ফল প্রকাশ করেন। গুরুত্বপূর্ণ শব্দটি “সব সম্ভাব্য”। বাস্তবের সমস্যা সেই বিশাল জগতের খুব ছোট, নিয়মিত একটি অংশ।
বাস্তবের ডেটায় তুলনা কী বলে? ২০১৪ সালে Fernández-Delgado ও সহকর্মীরা JMLR-এ ১২১টি ডেটাসেটে ১৭৯টি classifier তুলনা করে দেখান, random forest-এর পরিবার সামগ্রিকভাবে শীর্ষে, Gaussian kernel-এর SVM কাছাকাছি। পরে Wainberg, Alipanahi আর Frey একটি মন্তব্যে পদ্ধতিগত সমস্যা তোলেন, বিশেষ করে মূল্যায়নের ভাগ নিয়ে, আর দেখান যে শীর্ষের কয়েকটির পার্থক্য পরিসংখ্যানে খুব স্পষ্ট নয়। ২০২২ সালে Grinsztajn, Oyallon আর Varoquaux NeurIPS-এ মাঝারি আকারের tabular ডেটায় দেখান, tree-ভিত্তিক model তখনো deep learning-এর চেয়ে ভালো; তাঁদের ব্যাখ্যায় কারণ হিসেবে আসে অনিয়মিত, খাঁজকাটা লক্ষ্য-function, দরকারহীন feature-এর উপস্থিতি, আর tabular কলামের অর্থ ঘুরিয়ে দিলে নষ্ট হয় এমন গঠন।
অর্থাৎ tree ensemble জেতে কারণ তার inductive bias (অক্ষ ধরে ভাগ, threshold, interaction) অনেক ব্যবসায়িক ডেটার গঠনের সঙ্গে মেলে, কোনো সর্বজনীন শ্রেষ্ঠত্বের কারণে নয়। এই পর্বের তুলনাতেই উল্টো দিকও দেখেছেন: ৬০ থেকে ৩০০ জন গ্রাহকে logistic এগিয়ে ছিল। আর আমাদের ডেটার threshold আমরা নিজেরাই বসিয়েছিলাম, তাই গাছের সুবিধা খানিকটা বানানো।
মূল উপলব্ধি: benchmark-এর ফল একটি “ডেটাসেটের জনসংখ্যা”-র ওপর গড়, আপনার ডেটার ওপর নয়। Benchmark দিয়ে প্রার্থী তালিকা বানান, সিদ্ধান্ত নিন নিজের ডেটার তুলনায়।
প্র ০৩Learning curve-এ ছোট ডেটায় logistic আর বড় ডেটায় gradient boosting জিতল। এটা কি কাকতালীয়, নাকি গবেষণায় এমন ধারা আগেও দেখা গেছে?
ধারাটি পরিচিত। ২০০৩ সালে Claudia Perlich, Foster Provost আর Jeffrey Simonoff JMLR-এ “Tree Induction vs. Logistic Regression: A Learning-Curve Analysis” প্রবন্ধে অনেক ডেটাসেটে দুই পদ্ধতির learning curve তুলনা করেন। তাঁদের মূল পর্যবেক্ষণ: ছোট train ডেটায় logistic regression প্রায়ই ভালো, বড় ডেটায় tree প্রায়ই এগিয়ে যায়, আর কোন আকারে ক্রম উল্টায় তা ডেটাসেট ভেদে বদলায়। তাঁদের সতর্কবার্তা ছিল, একটি নির্দিষ্ট আকারের ডেটায় তুলনা করে সাধারণ সিদ্ধান্ত টানা ভুল, কারণ অন্য আকারে ফল উল্টাতে পারে।
আরেকটি বিখ্যাত পর্যবেক্ষণ ভাষার কাজ থেকে। ২০০১ সালে Michele Banko আর Eric Brill একটি শব্দ-বাছাইয়ের কাজে কয়েকটি algorithm-কে কয়েক লাখ থেকে প্রায় একশো কোটি শব্দের ডেটা পর্যন্ত শেখান। ডেটা বাড়ার সঙ্গে সব algorithm উন্নত হয়, আর ছোট ডেটায় দুর্বল কিছু পদ্ধতি বড় ডেটায় অন্যদের ছাড়িয়ে যায়। ২০০৯ সালে Alon Halevy, Peter Norvig আর Fernando Pereira “The Unreasonable Effectiveness of Data” প্রবন্ধে এই ধরনের অভিজ্ঞতা থেকে যুক্তি দেন যে অনেক কাজে বেশি ডেটা জটিল model-এর চেয়ে বেশি লাভ দেয়।
তবে “ডেটা সব সমাধান করে” বলাটাও অতিরঞ্জন। Label জোগাড়ে খরচ আছে (পর্ব ৫), ডেটা বাড়লে পুরোনো আর নতুন ডেটার বণ্টন আলাদা হতে পারে (পর্ব ৫৯), আর উচ্চ bias-এর model-এ আরও ডেটা প্রায় কিছুই দেয় না, যেমন এই পর্বে ৩০০ থেকে ৬৪০ জনে logistic মাত্র ০.০০৯ বেড়েছে। Bias–variance-এর ভাষায়: নমনীয় model-এর variance ডেটা বাড়লে কমে, কিন্তু সরল model-এর bias ডেটা দিয়ে কমে না।
মূল উপলব্ধি: model তুলনার ফল সবসময় একটি নির্দিষ্ট ডেটার আকারের ফল। সিদ্ধান্তের আগে learning curve আঁকুন, আর ঢাল দেখে ঠিক করুন টাকা খরচ হবে ডেটায় না model-এ।
প্র ০৪scikit-learn তো সব করে দেয়। তাহলে SVM-এর dual problem বা boosting-এর gradient কেন হাতে derive করতে শিখবেন?
২০০২ সালে Joel Spolsky “The Law of Leaky Abstractions” প্রবন্ধে লেখেন, গুরুত্বপূর্ণ সব abstraction কোনো না কোনো সময় ফুটো হয়, অর্থাৎ ভেতরের জটিলতা বাইরে বেরিয়ে আসে। SVC().fit(X, y) একটি চমৎকার abstraction, যতক্ষণ না ফল খারাপ আসে। এই পর্বে SVM ০.৭১৬ পেয়েছে, সবার নিচে। কেন? উত্তর দিতে জানতে হয় RBF kernel দুটি বিন্দুর মিল মাপে exp(−γ‖x − x′‖²) দিয়ে, যেখানে γ (gamma) ঠিক করে “কাছে” মানে কতটা কাছে, আর সব feature সেই দূরত্বে সমান ভাগ পায়, দরকারি হোক বা না হোক। তাহলেই বোঝা যায় কোন নব ঘোরাতে হবে, আর কেন scaling ছাড়া SVM প্রায়ই অর্থহীন ফল দেয়।
SVM-এর ইতিহাসও এই কথা বলে। Bernhard Boser, Isabelle Guyon আর Vladimir Vapnik ১৯৯২ সালে বড় margin-এর classifier-এ kernel ব্যবহার দেখান, আর Corinna Cortes ও Vapnik ১৯৯৫ সালে soft margin-এর রূপ প্রকাশ করেন। Dual problem-এর গঠন থেকেই বোঝা যায়, কেন শুধু সীমানার কাছের কয়েকটি বিন্দু (support vector) সিদ্ধান্ত নেয়, আর কেন train-এর খরচ সারির সংখ্যার সঙ্গে দ্রুত বাড়ে। এই জ্ঞান না থাকলে লাখো সারির ডেটায় SVM চালিয়ে ঘণ্টার পর ঘণ্টা অপেক্ষার কারণ বোঝা যায় না।
Derivation-এর আরেকটি লাভ যাচাই। AI assistant বা কোনো ব্লগ ভুল gradient লিখলে, ছোট একটি উদাহরণে নিজে derive করে মেলানোই একমাত্র নির্ভরযোগ্য পরীক্ষা। আর ইন্টারভিউতে “logistic loss-এর gradient লিখুন” বা “কেন hinge loss sparse সমাধান দেয়” ধরনের প্রশ্ন সাধারণ, কারণ এগুলো দেখায় কে library-র বাইরে ভাবতে পারেন।
মূল উপলব্ধি: গণিত আপনাকে library-র জায়গা নিতে শেখায় না; শেখায় library যখন চুপচাপ ভুল করে, তখন কোথায় খুঁজতে হবে।
প্র ০৫ML কোর্সের শেষ দিকে SQL, A/B test আর production কেন? model বানানোই কি আসল কাজ নয়?
২০১৫ সালে D. Sculley ও তাঁর সহকর্মীরা NeurIPS-এ “Hidden Technical Debt in Machine Learning Systems” প্রবন্ধে একটি বিখ্যাত ছবি দেন: একটি বাস্তব ML system-এর মাঝখানে ছোট্ট একটি বাক্স “ML code”, আর তার চারপাশে অনেক বড় বড় বাক্স: ডেটা সংগ্রহ, feature বের করা, ডেটা যাচাই, configuration, serving-এর পরিকাঠামো, নজরদারি। তাঁদের যুক্তি, ML system-এ এমন কিছু ঋণ জমে যা সাধারণ সফটওয়্যারে নেই। একটি উদাহরণ তাঁরা বলেন “Changing Anything Changes Everything”: একটি feature-এর বণ্টন বদলালে পুরো model-এর আচরণ বদলে যেতে পারে, কোনো কোড না বদলেও।
বাজারঘরের churn model-এর কথা ভাবুন। AUC ০.৭৭ পেলেন। কিন্তু ফোন করার পর churn সত্যিই কমল কি না, তা জানতে A/B test লাগবে (পর্ব ৬২–৬৩), কারণ model শুধু ঝুঁকি চেনে, ফোনের প্রভাব নয়। ডেটা আসে database থেকে, তাই SQL-এর window function আর cohort (পর্ব ৬১)। Model চালু হলে নতুন গ্রাহকের ধরন বদলায়, ঈদের মৌসুমে অর্ডারের ধাঁচ বদলায়; তাই drift-এর নজরদারি (পর্ব ৬৯)। আর সিদ্ধান্ত নেবেন ব্যবস্থাপক, তাই ফলটি বোঝানোর দক্ষতা (পর্ব ৬৭)।
AI-এর ভিত্তি কোর্সের পর্ব ৭৪-এ এই জীবনচক্রের প্রথম দেখা হয়েছে; এই কোর্সের মডিউল ১২ আর ১৩ প্রতিটি ধাপে গভীরে যায়, আর ক্যাপস্টোনে (পর্ব ৭২) সব একসঙ্গে লাগবে। পুরো deploy আর retrain-এর পরিকাঠামো অবশ্য পরের MLOps কোর্সের বিষয়।
মূল উপলব্ধি: ভালো model একটি ভালো ML system-এর প্রয়োজনীয় শর্ত, যথেষ্ট শর্ত নয়। যিনি পুরো পথটি বোঝেন, তাঁর model-ই বাস্তবে কাজে লাগে।
অনুশীলন
হিসাব, আউটপুট অনুমান, সমালোচনা আর নকশা। উত্তর খোলার আগে নিজে চেষ্টা করুন।
-
Numerical, mean ± sd আর জোড়া পার্থক্য: একই ৫টি fold-এ model A-র AUC: 0.70, 0.81, 0.74, 0.76, 0.79; model B-র: 0.72, 0.80, 0.71, 0.73, 0.77. (ক) দুটির গড় আর A-র sd বের করুন, n দিয়ে ভাগ (NumPy-র default) আর n − 1 দিয়ে ভাগ, দুভাবেই। (খ) fold ধরে A − B-র পার্থক্য, তার গড় আর sd (n − 1) কত? A কয়টি fold-এ জেতে? (গ) জোড়া পার্থক্যের sd কেন A আর B-র নিজস্ব sd-র চেয়ে অনেক ছোট?
(ক) A-র গড় 3.80 / 5 = ০.৭৬০, B-র 3.73 / 5 = ০.৭৪৬। A-র বিচ্যুতি −0.06, 0.05, −0.02, 0, 0.03; বর্গের যোগ 0.0074. n দিয়ে ভাগে sd = √(0.0074 / 5) = √0.00148 ≈ ০.০৩৮ (
np.std); n − 1 দিয়ে √(0.0074 / 4) ≈ ০.০৪৩ (np.std(ddof=1), pandas-এর.std())। রিপোর্টে কোনটি, তা লিখে দেওয়া ভালো অভ্যাস।(খ) পার্থক্য −0.02, 0.01, 0.03, 0.03, 0.02; গড় ০.০১৪; গড় থেকে বিচ্যুতির বর্গের যোগ 0.00172, sd = √(0.00172 / 4) ≈ ০.০২১। A ৫টির ৪টিতে জেতে।
(গ) কোনো fold সবার জন্য সহজ, কোনোটি কঠিন: দ্বিতীয় fold-এ দুজনেই ০.৮০-র ওপরে, তৃতীয়টিতে দুজনেই নিচে। এই “fold-এর কঠিনতা” দুজনের score-এ একসঙ্গে ওঠানামা করে, আর পার্থক্য নিলে বাদ পড়ে যায়। তাই জোড়া তুলনা একই ডেটায় বেশি সূক্ষ্ম পার্থক্য ধরতে পারে। তবে fold-গুলো train অংশ ভাগ করে নেয় বলে পাঁচটি পার্থক্য পুরো স্বাধীন নয়; সঠিক পরীক্ষা পর্ব ২২-এ।
-
আউটপুট অনুমান করুন: ১২টি সারির label সাজানো অবস্থায় আছে: প্রথম ৮টি 0, শেষ ৪টি 1. নিচের কোড প্রতিটি test fold-এর সূচক আর তাতে 0 ও 1-এর সংখ্যা ছাপে। দুটি loop কী ছাপবে?
y = np.array([0]*8 + [1]*4) for tr, te in StratifiedKFold(n_splits=4).split(np.zeros(12), y): print(te, np.bincount(y[te], minlength=2)) for tr, te in KFold(n_splits=4).split(np.zeros(12)): print(te, np.bincount(y[te], minlength=2))সত্যিকারের run (ডেস্কটপ, scikit-learn 1.9.1):
[0 1 8] [2 1] [2 3 9] [2 1] [ 4 5 10] [2 1] [ 6 7 11] [2 1] [0 1 2] [3 0] [3 4 5] [3 0] [6 7 8] [2 1] [ 9 10 11] [0 3]Stratified ভাগ প্রতিটি fold-এ ৮:৪-এর অনুপাত রাখে, তাই প্রতিটিতে দুটি 0 আর একটি 1. সাধারণ
KFoldshuffle ছাড়া শুধু ক্রম ধরে কাটে: প্রথম দুটি fold-এ একটিও positive নেই (সেখানে AUC হিসাবই করা যায় না), আর শেষ fold-এ শুধু positive. ডেটা কোনো ক্রমে সাজানো থাকলে এটি একটি নীরব ফাঁদ। -
সমালোচনা করুন: একজন সহকর্মীর রিপোর্ট: “১২টি model চেষ্টা করেছি। প্রতিটিকে ৮০% ডেটায় train করে বাকি ২০% test set-এ মেপেছি। SVM-এর test accuracy ০.৮৩, সবার চেয়ে বেশি, তাই SVM deploy করব। আমাদের churn-এর হার ১৮%.” কমপক্ষে চারটি সমস্যা চিহ্নিত করুন আর প্রতিটির প্রতিকার বলুন।
- Test set দিয়ে বাছাই: ১২টির মধ্যে সেরাটি test-এ বাছা হয়েছে, তাই ০.৮৩ আশাবাদী; test আর সৎ অনুমান নয়। প্রতিকার: বাছাই cross-validation-এ, test শেষে একবার।
- ভুল metric: churn ১৮% হলে সবাইকে “থাকবেন” বললেই accuracy ০.৮২; ০.৮৩ প্রায় baseline-এর সমান। প্রতিকার: AUC বা কাজের সঙ্গে মেলে এমন metric, আর baseline-এর সারি।
- ছড়ানো নেই: একটি ভাগের একটি সংখ্যা; ভাগ বদলালে ক্রম বদলাতে পারে। প্রতিকার: একই fold-এ গড় ± sd, জোড়া পার্থক্য।
- সিদ্ধান্তের অন্য শর্ত অনুপস্থিত: ব্যাখ্যা, গতি, সম্ভাবনার calibration, কতজনকে ফোন করা যাবে, কিছুই নেই। প্রতিকার: ব্যবসার শর্ত আগে লিখে তার ভিত্তিতে বাছাই; এ নিয়ে পর্ব ২।
- বাড়তি: stratify করা হয়েছে কি না, seed, scaling কোথায় fit হয়েছে, এসবও লেখা নেই; পর্ব ৪-এর experiment রিপোর্টের কাঠামো এখানে কাজে লাগবে।
-
নকশা: বাজারঘরের তিনটি নতুন কাজ। প্রতিটির জন্য ML-এর কোন পরিবার থেকে প্রথম দুটি প্রার্থী নেবেন, কোন metric, আর মূল্যায়নের ভাগ কীভাবে করবেন? (ক) প্রতিটি অর্ডারের ডেলিভারিতে কত দিন লাগবে, ২০ লাখ অতীত অর্ডার থেকে। (খ) ৫০ হাজার বাংলা রিভিউয়ে মানুষ কোন কোন বিষয়ে কথা বলছেন, কোনো label ছাড়া। (গ) আগামী ৮ সপ্তাহে প্রতিটি জেলার দৈনিক অর্ডার।
(ক) সংখ্যার অনুমান, বড় tabular ডেটা: প্রার্থী regularized linear regression (baseline হিসেবেও) আর gradient boosting (LightGBM বা
HistGradientBoostingRegressor). Kernel SVM এত সারিতে ধীর। Metric MAE (দিনে বোঝা সহজ), দরকার হলে quantile loss দিয়ে পরিসর (পর্ব ২৪)। ভাগ সময় ধরে: পুরোনো মাসে train, পরের মাসে যাচাই।(খ) Label নেই, তাই unsupervised: topic modeling (LDA বা NMF, পর্ব ৪৪) আর embedding-এর ওপর clustering. “ঠিক উত্তর” নেই, তাই মূল্যায়ন মানুষের চোখে প্রতিটি topic-এর শীর্ষ শব্দ আর নমুনা রিভিউ দেখে, সঙ্গে coherence-এর মতো মাপ।
(গ) Time series: seasonal naive baseline (গত সপ্তাহের একই দিন), exponential smoothing বা ARIMA (পর্ব ৫১), আর lag feature-সহ gradient boosting (পর্ব ৫২)। Metric MAE বা MASE; মূল্যায়ন rolling backtest-এ, কখনো এলোমেলো ভাগে নয়, কারণ তাতে ভবিষ্যতের তথ্য অতীতে ঢোকে।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমকয়েকটি model পরিবারের ন্যায্য তুলনার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- কাজ আর metric ঠিক করা (যেমন ক্রমের জন্য ROC AUC)
- Test set আলাদা করে তালাবন্ধ রাখা
- সব প্রার্থীর জন্য একই stratified fold ঠিক করা
- Baseline-সহ সব প্রার্থী একই fold-এ চালানো, scaling pipeline-এর ভেতরে
- গড় ± sd আর fold ধরে পার্থক্য দেখে প্রার্থী বাছাই
- বাছাই করা model test set-এ একবার মাপা
দুটি সংখ্যার feature-এর ছবিতে একটি classifier-এর সীমানা অক্ষের সমান্তরাল ছোট ছোট সিঁড়ির মতো, আর এক জায়গায় খাড়া দেয়াল। কোন পরিবারের model-এর সীমানা সাধারণত এমন হয়?
- Logistic regression
- RBF kernel-এর SVM
- Decision tree-ভিত্তিক ensemble, যেমন gradient boosting
- Gaussian Naive Bayes
একই ৫টি fold-এ model P-র ROC AUC ০.৭৭৩ ± ০.০৪০ আর model Q-র ০.৭৫৭ ± ০.০৩৭। সবচেয়ে যুক্তিসঙ্গত সিদ্ধান্ত কোনটি?
- P স্পষ্টভাবে ভালো, কারণ গড় বেশি
- পার্থক্য ছড়ানোর তুলনায় ছোট; fold ধরে পার্থক্য আর বাড়তি পরীক্ষা ছাড়া জোরালো সিদ্ধান্ত নয়
- Test set-এ দুটিই চালিয়ে যেটি বেশি পায় সেটি নেওয়া
- দুটিই অকেজো, কারণ sd ০.০৪-এর কাছে
একটি pipeline-এ logistic regression আর RBF SVM-এর আগে StandardScaler রাখা হলো, কিন্তু gradient boosting-এর আগে নয়। এর সবচেয়ে ভালো ব্যাখ্যা কোনটি?
- দূরত্ব বা ওজনের আকারনির্ভর model কলামের মাপে সংবেদনশীল, আর গাছের threshold-ভিত্তিক ভাগ মাপ বদলালেও একই থাকে
- Gradient boosting scaling করা ডেটায় error দেয়
- ডেটা ছোট বলে শুধু কিছু model-এ scaling দরকার
- Scaling সবসময় leakage ঘটায়, তাই যত কম তত ভালো
একটি learning curve-এ ৬০টি train সারিতে logistic regression-এর validation AUC ০.৬৮ আর gradient boosting-এর ০.৬৪; ৬৪০টিতে logistic ০.৭৬ আর boosting ০.৭৭। এর সবচেয়ে ভালো ব্যাখ্যা কোনটি?
- Boosting-এর implementation-এ ভুল আছে
- বড় ডেটায় AUC-এর হিসাবের নিয়ম বদলে যায়
- Logistic-এর variance বেশি, তাই ছোট ডেটায় সে ভালো
- নমনীয় model-এর অল্প ডেটায় variance বেশি, ডেটা বাড়লে তা কমে আর তার নমনীয়তা কাজে লাগে
২০% churn-এর একটি ডেটায় DummyClassifier() (সবাইকে একই সম্ভাবনা দেয়) চালানো হলো। তার ROC AUC আর accuracy প্রায় কত আশা করবেন?
- AUC ০.২, accuracy ০.২
- AUC ০.৫, accuracy প্রায় ০.৮
- AUC ০.৮, accuracy ০.৮
- AUC ০.৫, accuracy ০.৫
ব্রাউজারে Pyodide-এ np.arange(6).dtype ছাপে int32, অথচ বেশিরভাগ 64-bit ডেস্কটপে int64. কেন?
- ব্রাউজারের NumPy পুরোনো version
- ব্রাউজারের কোনো সেটিং বদলালে int64 হবে
- Pyodide 32-bit WebAssembly-তে চলে, সেখানে default পূর্ণসংখ্যা 32-bit
- ছোট সংখ্যা বলে NumPy নিজে থেকে int32 বাছে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- এই কোর্স AI-এর ভিত্তি কোর্সের ওপর দাঁড়িয়ে: আগে তত্ত্ব, তারপর গণিত (linear algebra, optimization, সম্ভাবনা), তারপর model-এর পরিবার, শেষে বাস্তবের কাজ আর প্রস্তুতি।
- প্রতিটি পরিবারের একটি inductive bias আছে: linear-এর সোজা সীমানা, kernel-এর মসৃণ বাঁক, tree-র অক্ষ-সমান্তরাল সিঁড়ি। ডেটার গঠনের সঙ্গে মিললেই ভালো ফল।
- ন্যায্য তুলনা মানে একই fold, একই metric, baseline-সহ, গড় ± sd আর জোড়া পার্থক্য; ছড়ানোর চেয়ে ছোট পার্থক্যে সিদ্ধান্ত নয়।
- Learning curve বলে ডেটা বাড়লে ক্রম বদলায় কি না, আর আরও ডেটায় লাভ হবে কি না।
- প্রতিটি পর্বে আগে অন্তর্দৃষ্টি, তারপর খাতা-কলমে প্রক্রিয়া, তারপর অনুমান করে কোড চালানো; AI-এর লেখা ML কোড সবসময় docs, baseline আর locked test দিয়ে যাচাই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০২ · সমস্যা থেকে ML task — label, loss, metric আর baselineপরবর্তী পর্বব্যবসার প্রশ্ন থেকে target, loss আর baseline.
- মেশিন লার্নিং · কোর্স হোম৭৭টি পর্ব১৪টি মডিউলের পুরো সূচি।
- AI-এর ভিত্তি আর Python for AIপূর্বশর্তNumPy, pandas, সম্ভাবনা আর প্রথম model; এই কোর্সের ভিত।
- Python প্রোগ্রামিংপাশের ট্র্যাকভাষাটি নিজে: function, OOP, test আর packaging.
- DBMS ও SQLপাশের ট্র্যাকডেটা যেখানে থাকে: query, join আর window function.